diff --git a/package.json b/package.json index 6e81b75..1e17533 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hermes-web-ui", - "version": "0.6.1", + "version": "0.6.2", "description": "Self-hosted AI chat dashboard for Hermes Agent — multi-model web UI with multi-platform integration", "repository": { "type": "git", diff --git a/packages/client/src/components/hermes/chat/ChatInput.vue b/packages/client/src/components/hermes/chat/ChatInput.vue index 2f103b9..ee6a266 100644 --- a/packages/client/src/components/hermes/chat/ChatInput.vue +++ b/packages/client/src/components/hermes/chat/ChatInput.vue @@ -148,12 +148,12 @@ function selectBridgeCommand(command: { name: string; args: string; insertText?: // --- Context info --- -const contextLength = ref(200000) -const FALLBACK_CONTEXT = 200000 +const contextLength = ref(256000) +const FALLBACK_CONTEXT = 256000 // Context length editing const showContextEditModal = ref(false) -const editingContextLimit = ref(200000) +const editingContextLimit = ref(256000) const isSavingContextLimit = ref(false) async function handleEditContextLimit() { diff --git a/packages/client/src/data/changelog.ts b/packages/client/src/data/changelog.ts index ee6df4c..16eb5b1 100644 --- a/packages/client/src/data/changelog.ts +++ b/packages/client/src/data/changelog.ts @@ -5,6 +5,22 @@ export interface ChangelogEntry { } export const changelog: ChangelogEntry[] = [ + { + version: '0.6.2', + date: '2026-05-26', + changes: [ + 'changelog.new_0_6_2_1', + 'changelog.new_0_6_2_2', + 'changelog.new_0_6_2_3', + 'changelog.new_0_6_2_4', + 'changelog.new_0_6_2_5', + 'changelog.new_0_6_2_6', + 'changelog.new_0_6_2_7', + 'changelog.new_0_6_2_8', + 'changelog.new_0_6_2_9', + 'changelog.new_0_6_2_10', + ], + }, { version: '0.6.1', date: '2026-05-25', diff --git a/packages/client/src/i18n/locales/de.ts b/packages/client/src/i18n/locales/de.ts index 0c5cbb4..aedae17 100644 --- a/packages/client/src/i18n/locales/de.ts +++ b/packages/client/src/i18n/locales/de.ts @@ -197,7 +197,7 @@ export default { contextEditTitle: 'Kontextlänge bearbeiten', contextEditDesc: 'Kontextlängenlimit für aktuelles Modell festlegen (in Tokens)', contextEditPlaceholder: 'Kontextlänge eingeben', - contextEditHint: 'Häufige Werte: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)', + contextEditHint: 'Häufige Werte: 256k (Hermes-Standard), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: 'Speichern', contextEditCancel: 'Abbrechen', contextEditInvalid: 'Bitte geben Sie eine gültige Kontextlänge ein', @@ -588,7 +588,7 @@ jobTriggered: 'Job ausgelost', customType: 'Benutzerdefiniert', provider: 'Anbieter', contextLength: 'Kontextlange', - contextLengthPlaceholder: 'z.B. 200000 (optional)', + contextLengthPlaceholder: 'z.B. 256000 (optional)', local: 'Lokal ({host})', selectProviderRequired: 'Bitte wahlen Sie einen Anbieter', baseUrlRequired: 'Basis-URL ist erforderlich', @@ -1068,6 +1068,16 @@ jobTriggered: 'Job ausgelost', // Anderungsprotokoll changelog: { + new_0_6_2_1: 'Web Bridge unterstützt jetzt /plan-Befehle mit korrektem Run-Start und sichtbarem Befehlsstatus', + new_0_6_2_2: 'Das Befehlsmenü im Chat-Eingabefeld enthält jetzt /goal und /subgoal mit Status, Pause, Resume, Done und Clear', + new_0_6_2_3: 'Goal- und Subgoal-Workflows sind jetzt in Chat-Sessions integriert, inklusive Ziel-Fortsetzungen und Statusupdates', + new_0_6_2_4: 'Zielkanaloptionen für Job-Zustellung sind wiederhergestellt, damit geplante Jobs das richtige Ziel auswählen können', + new_0_6_2_5: 'Kontext-token-Nutzung wird nach Reconnects mit snapshot-bewusster Berechnung korrekt fortgesetzt', + new_0_6_2_6: 'Kontext-Checkpoint-Komprimierung ist bei langsamer Codex-Zusammenfassung zuverlässiger: Web UI wartet 5 Minuten und der Python bridge broker beendet worker-Anfragen nicht mehr nach 2 Minuten', + new_0_6_2_7: 'Chat-Queue-Promotion ist korrigiert, sodass queued-Nachrichten nicht zu früh in die Nachrichtenliste springen, auch in synchronisierten Fenstern', + new_0_6_2_8: 'Clarify-Dialoge senden Freitext nicht mehr per Enter ab und beantwortete Prompts öffnen nach Sessionwechsel nicht erneut', + new_0_6_2_9: 'Bridge-Terminal-Umgebungsrefresh und stale-pid-Cleanup sind enger begrenzt und reduzieren veraltete Laufzeitstatus in der UI', + new_0_6_2_10: 'Die Standard-Kontextlänge folgt jetzt dem Hermes-Standard von 256.000 Tokens', new_0_5_31_1: 'Bridge-Broker-Neustarts gehärtet, finale Gruppenchat-Stream-Darstellung korrigiert und {\'@\'}all-Routing für Gruppenchats hinzugefügt', new_0_5_31_2: 'Dateimanager kann absolute Pfade kopieren; mobile Session-Schublade liegt nicht mehr hinter Chat-Inhalten', new_0_5_31_3: 'Profilauswahl zeigt jetzt Avatare, eigene Avatar-Uploads, Laufzeitstatus-Dialog sowie Gateway-/Profil-Neustartaktionen', diff --git a/packages/client/src/i18n/locales/en.ts b/packages/client/src/i18n/locales/en.ts index fedb9bd..7beae3a 100644 --- a/packages/client/src/i18n/locales/en.ts +++ b/packages/client/src/i18n/locales/en.ts @@ -197,7 +197,7 @@ export default { contextEditTitle: 'Edit Context Length', contextEditDesc: 'Set context length limit for current model (in tokens)', contextEditPlaceholder: 'Enter context length', - contextEditHint: 'Common values: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)', + contextEditHint: 'Common values: 256k (Hermes default), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: 'Save', contextEditCancel: 'Cancel', contextEditInvalid: 'Please enter a valid context length', @@ -712,7 +712,7 @@ export default { customType: 'Custom', provider: 'Provider', contextLength: 'Context Length', - contextLengthPlaceholder: 'e.g. 200000 (optional)', + contextLengthPlaceholder: 'e.g. 256000 (optional)', local: 'Local ({host})', selectProviderRequired: 'Please select a provider', baseUrlRequired: 'Base URL is required', @@ -1290,6 +1290,16 @@ export default { // Changelog changelog: { + new_0_6_2_1: 'Web Bridge now supports /plan commands with correct run startup and visible command state', + new_0_6_2_2: 'The chat input command menu now includes /goal and /subgoal commands, including status, pause, resume, done, and clear actions', + new_0_6_2_3: 'Goal and subgoal workflows now integrate with chat sessions, including goal continuations and status updates', + new_0_6_2_4: 'Job delivery target channel options are restored so scheduled jobs can pick the intended destination', + new_0_6_2_5: 'Context token usage now resumes accurately with snapshot-aware calculations after reconnects', + new_0_6_2_6: 'Context checkpoint compression is more reliable for slow Codex summarization: Web UI waits 5 minutes and the Python bridge broker no longer cuts off worker requests after 2 minutes', + new_0_6_2_7: 'Chat queue promotion is fixed so queued messages do not jump into the message list early, including synced windows', + new_0_6_2_8: 'Clarify prompts no longer submit open-text replies on Enter and answered prompts no longer reopen after switching sessions', + new_0_6_2_9: 'Bridge terminal environment refresh and stale pid cleanup are scoped more tightly, reducing stale runtime status in the UI', + new_0_6_2_10: 'The default context length now follows the Hermes standard of 256,000 tokens', new_0_5_31_1: "Harden Bridge broker restarts, fix final group-chat stream rendering, and add {'@'}all routing for group chat", new_0_5_31_2: 'File manager can copy absolute paths, and the mobile session drawer overlay no longer falls behind chat content', new_0_5_31_3: 'Profile selector now shows avatars, custom avatar uploads, runtime status modal, and gateway/profile restart actions', diff --git a/packages/client/src/i18n/locales/es.ts b/packages/client/src/i18n/locales/es.ts index 19a63ef..be87234 100644 --- a/packages/client/src/i18n/locales/es.ts +++ b/packages/client/src/i18n/locales/es.ts @@ -197,7 +197,7 @@ export default { contextEditTitle: 'Editar longitud del contexto', contextEditDesc: 'Establecer el límite de longitud del contexto para el modelo actual (en tokens)', contextEditPlaceholder: 'Ingresa la longitud del contexto', - contextEditHint: 'Valores comunes: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)', + contextEditHint: 'Valores comunes: 256k (Hermes predeterminado), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: 'Guardar', contextEditCancel: 'Cancelar', contextEditInvalid: 'Por favor ingresa una longitud de contexto válida', @@ -588,7 +588,7 @@ jobTriggered: 'Job ejecutado', customType: 'Personalizado', provider: 'Proveedor', contextLength: 'Longitud del contexto', - contextLengthPlaceholder: 'ej. 200000 (opcional)', + contextLengthPlaceholder: 'ej. 256000 (opcional)', local: 'Local ({host})', selectProviderRequired: 'Por favor, selecciona un proveedor', baseUrlRequired: 'La URL base es obligatoria', @@ -1068,6 +1068,16 @@ jobTriggered: 'Job ejecutado', // Registro de cambios changelog: { + new_0_6_2_1: 'Web Bridge ahora soporta comandos /plan con inicio correcto del run y estado visible del comando', + new_0_6_2_2: 'El menú de comandos del input de chat ahora incluye /goal y /subgoal, con acciones de estado, pausa, reanudar, finalizar y limpiar', + new_0_6_2_3: 'Los flujos de Goal y subgoal se integran con sesiones de chat, incluyendo continuaciones de objetivos y actualizaciones de estado', + new_0_6_2_4: 'Se restauran las opciones de canal destino para jobs, permitiendo que los jobs programados elijan el destino previsto', + new_0_6_2_5: 'El uso de tokens de contexto se reanuda con precisión tras reconexiones mediante cálculos conscientes del snapshot', + new_0_6_2_6: 'La compresión de checkpoints de contexto es más fiable con resúmenes Codex lentos: Web UI espera 5 minutos y el Python bridge broker ya no corta requests de worker a los 2 minutos', + new_0_6_2_7: 'La promoción de cola de chat está corregida para que los mensajes queued no salten antes de tiempo a la lista, incluso en ventanas sincronizadas', + new_0_6_2_8: 'Los prompts Clarify ya no envían respuestas de texto libre con Enter y los prompts respondidos no se reabren al cambiar de sesión', + new_0_6_2_9: 'El refresco de entorno del terminal Bridge y la limpieza de stale pid quedan mejor acotados, reduciendo estados runtime obsoletos en la UI', + new_0_6_2_10: 'La longitud de contexto predeterminada ahora sigue el estándar Hermes de 256.000 tokens', new_0_5_31_1: 'Reinicios del Bridge broker reforzados, renderizado final del stream de chat grupal corregido y enrutamiento {\'@\'}all agregado', new_0_5_31_2: 'El gestor de archivos puede copiar rutas absolutas y el cajón móvil de sesiones ya no queda detrás del chat', new_0_5_31_3: 'Selector de perfiles con avatares, subida de avatar personalizado, modal de estado runtime y acciones de reinicio de gateway/perfil', diff --git a/packages/client/src/i18n/locales/fr.ts b/packages/client/src/i18n/locales/fr.ts index ead74cd..e115ce5 100644 --- a/packages/client/src/i18n/locales/fr.ts +++ b/packages/client/src/i18n/locales/fr.ts @@ -197,7 +197,7 @@ export default { contextEditTitle: 'Modifier la longueur du contexte', contextEditDesc: 'Définir la limite de longueur du contexte pour le modèle actuel (en tokens)', contextEditPlaceholder: 'Entrez la longueur du contexte', - contextEditHint: 'Valeurs courantes : 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)', + contextEditHint: 'Valeurs courantes : 256k (Hermes par défaut), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: 'Enregistrer', contextEditCancel: 'Annuler', contextEditInvalid: 'Veuillez entrer une longueur de contexte valide', @@ -588,7 +588,7 @@ jobTriggered: 'Job declenche', customType: 'Personnalise', provider: 'Fournisseur', contextLength: 'Longueur du contexte', - contextLengthPlaceholder: 'ex. 200000 (facultatif)', + contextLengthPlaceholder: 'ex. 256000 (facultatif)', local: 'Local ({host})', selectProviderRequired: 'Veuillez selectionner un fournisseur', baseUrlRequired: 'L\'URL de base est requise', @@ -1068,6 +1068,16 @@ jobTriggered: 'Job declenche', // Journal des modifications changelog: { + new_0_6_2_1: 'Web Bridge prend désormais en charge les commandes /plan avec démarrage correct du run et état de commande visible', + new_0_6_2_2: 'Le menu de commandes du champ de chat inclut maintenant /goal et /subgoal, avec les actions état, pause, reprise, terminé et effacer', + new_0_6_2_3: 'Les workflows Goal et subgoal sont intégrés aux sessions de chat, avec reprises de goal et mises à jour de statut', + new_0_6_2_4: 'Les options de canal cible des jobs sont restaurées afin que les jobs planifiés choisissent la bonne destination', + new_0_6_2_5: 'L’usage des tokens de contexte reprend correctement après reconnexion grâce aux calculs tenant compte des snapshots', + new_0_6_2_6: 'La compression des checkpoints de contexte est plus fiable quand le résumé Codex est lent : Web UI attend 5 minutes et le Python bridge broker ne coupe plus les requêtes worker après 2 minutes', + new_0_6_2_7: 'La promotion de la file du chat est corrigée afin que les messages queued n’entrent plus trop tôt dans la liste, y compris dans les fenêtres synchronisées', + new_0_6_2_8: 'Les prompts Clarify n’envoient plus les réponses texte avec Entrée, et les prompts déjà répondus ne se rouvrent plus après changement de session', + new_0_6_2_9: 'Le refresh d’environnement terminal Bridge et le nettoyage stale pid sont mieux limités, réduisant les états runtime obsolètes dans l’UI', + new_0_6_2_10: 'La longueur de contexte par défaut suit désormais le standard Hermes de 256 000 tokens', new_0_5_31_1: 'Redémarrages Bridge broker renforcés, rendu final du flux de chat de groupe corrigé et routage {\'@\'}all ajouté', new_0_5_31_2: 'Le gestionnaire de fichiers peut copier les chemins absolus et le tiroir mobile des sessions ne passe plus derrière le chat', new_0_5_31_3: 'Sélecteur de profils avec avatars, upload d’avatar personnalisé, modal d’état runtime et actions de redémarrage gateway/profil', diff --git a/packages/client/src/i18n/locales/ja.ts b/packages/client/src/i18n/locales/ja.ts index 85933cc..e237314 100644 --- a/packages/client/src/i18n/locales/ja.ts +++ b/packages/client/src/i18n/locales/ja.ts @@ -197,7 +197,7 @@ export default { contextEditTitle: 'コンテキスト長を編集', contextEditDesc: '現在のモデルのコンテキスト長制限を設定(トークン数)', contextEditPlaceholder: 'コンテキスト長を入力', - contextEditHint: '一般的な値:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)', + contextEditHint: '一般的な値:256k (Hermes 既定), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: '保存', contextEditCancel: 'キャンセル', contextEditInvalid: '有効なコンテキスト長を入力してください', @@ -588,7 +588,7 @@ export default { customType: 'カスタム', provider: 'プロバイダー', contextLength: 'コンテキスト長', - contextLengthPlaceholder: '例: 200000(任意)', + contextLengthPlaceholder: '例: 256000(任意)', local: 'ローカル ({host})', selectProviderRequired: 'プロバイダーを選択してください', baseUrlRequired: 'ベース URL は必須です', @@ -1068,6 +1068,16 @@ export default { // 更新履歴 changelog: { + new_0_6_2_1: 'Web Bridge が /plan コマンドに対応し、run の開始とコマンド状態の表示が正しく動作するようになりました', + new_0_6_2_2: 'チャット入力のコマンドメニューに /goal と /subgoal を追加し、status、pause、resume、done、clear 操作に対応しました', + new_0_6_2_3: 'Goal と subgoal のワークフローをチャットセッションに統合し、目標の継続とステータス更新に対応しました', + new_0_6_2_4: 'ジョブ配信先チャネルの選択肢を復元し、スケジュール済みジョブが意図した宛先を選べるようになりました', + new_0_6_2_5: '再接続後のコンテキスト token 使用量を snapshot 対応の計算で正確に復元します', + new_0_6_2_6: 'Codex の要約が遅い場合でもコンテキスト checkpoint 圧縮が安定します。Web UI は 5 分待機し、Python bridge broker は 2 分で worker request を打ち切りません', + new_0_6_2_7: 'チャットキューの昇格処理を修正し、同期された複数ウィンドウを含め queued メッセージが早くメッセージ一覧へ入らないようにしました', + new_0_6_2_8: 'Clarify プロンプトは Enter で自由入力を送信せず、回答済みプロンプトはセッション切り替え後に再表示されません', + new_0_6_2_9: 'Bridge terminal の環境更新と stale pid cleanup の範囲を絞り、UI に古い runtime 状態が残りにくくしました', + new_0_6_2_10: '既定のコンテキスト長を Hermes 標準に合わせて 256,000 tokens に変更しました', new_0_5_31_1: 'Bridge broker の再起動を強化し、グループチャット最終ストリーム表示を修正し、{\'@\'}all ルーティングを追加', new_0_5_31_2: 'ファイルマネージャーで絶対パスをコピー可能にし、モバイルセッションドロワーがチャット内容の背面に回らないよう修正', new_0_5_31_3: 'Profile セレクターにアバター、カスタムアバターアップロード、実行状態モーダル、gateway/Profile 再起動操作を追加', diff --git a/packages/client/src/i18n/locales/ko.ts b/packages/client/src/i18n/locales/ko.ts index 4cbd1d2..3ba291d 100644 --- a/packages/client/src/i18n/locales/ko.ts +++ b/packages/client/src/i18n/locales/ko.ts @@ -197,7 +197,7 @@ export default { contextEditTitle: '컨텍스트 길이 편집', contextEditDesc: '현재 모델의 컨텍스트 길이 제한 설정 (토큰 수)', contextEditPlaceholder: '컨텍스트 길이 입력', - contextEditHint: '일반적인 값: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)', + contextEditHint: '일반적인 값: 256k (Hermes 기본값), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: '저장', contextEditCancel: '취소', contextEditInvalid: '유효한 컨텍스트 길이를 입력하세요', @@ -588,7 +588,7 @@ export default { customType: '사용자 지정', provider: '공급자', contextLength: '컨텍스트 길이', - contextLengthPlaceholder: '예: 200000 (선택사항)', + contextLengthPlaceholder: '예: 256000 (선택사항)', local: '로컬 ({host})', selectProviderRequired: 'Provider를 선택해 주세요', baseUrlRequired: 'Base URL을 입력해 주세요', @@ -1068,6 +1068,16 @@ export default { // 변경 이력 changelog: { + new_0_6_2_1: 'Web Bridge가 /plan 명령을 지원하며 run 시작과 명령 상태 표시가 올바르게 동작합니다', + new_0_6_2_2: '채팅 입력 명령 메뉴에 /goal 및 /subgoal이 추가되어 상태, 일시정지, 재개, 완료, 초기화 작업을 지원합니다', + new_0_6_2_3: 'Goal 및 subgoal 워크플로가 채팅 세션에 통합되어 목표 이어가기와 상태 업데이트를 지원합니다', + new_0_6_2_4: '작업 전달 대상 채널 옵션을 복원해 예약 작업이 의도한 대상을 선택할 수 있습니다', + new_0_6_2_5: '재연결 후 컨텍스트 token 사용량이 snapshot 인식 계산으로 정확하게 복원됩니다', + new_0_6_2_6: 'Codex 요약이 느릴 때도 컨텍스트 checkpoint 압축이 더 안정적입니다. Web UI는 5분 동안 대기하고 Python bridge broker는 2분 후 worker request를 끊지 않습니다', + new_0_6_2_7: '채팅 큐 승격을 수정해 동기화된 창을 포함해 queued 메시지가 너무 일찍 메시지 목록에 들어가지 않습니다', + new_0_6_2_8: 'Clarify 프롬프트는 Enter로 자유 입력 답변을 제출하지 않으며, 답변된 프롬프트는 세션 전환 후 다시 열리지 않습니다', + new_0_6_2_9: 'Bridge terminal 환경 갱신과 stale pid 정리 범위를 더 정확히 제한해 UI의 오래된 runtime 상태를 줄입니다', + new_0_6_2_10: '기본 컨텍스트 길이가 Hermes 표준에 맞춰 256,000 tokens로 변경되었습니다', new_0_5_31_1: 'Bridge broker 재시작 안정화, 그룹 채팅 최종 스트림 렌더링 수정, 그룹 채팅 {\'@\'}all 라우팅 추가', new_0_5_31_2: '파일 관리자가 절대 경로를 복사할 수 있고 모바일 세션 드로어가 채팅 콘텐츠 뒤로 가지 않음', new_0_5_31_3: 'Profile 선택기에 아바타, 사용자 지정 아바타 업로드, 런타임 상태 모달, gateway/Profile 재시작 액션 추가', diff --git a/packages/client/src/i18n/locales/pt.ts b/packages/client/src/i18n/locales/pt.ts index ddb7a05..7a840c4 100644 --- a/packages/client/src/i18n/locales/pt.ts +++ b/packages/client/src/i18n/locales/pt.ts @@ -197,7 +197,7 @@ export default { contextEditTitle: 'Editar tamanho do contexto', contextEditDesc: 'Definir o limite de tamanho do contexto para o modelo atual (em tokens)', contextEditPlaceholder: 'Digite o tamanho do contexto', - contextEditHint: 'Valores comuns: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)', + contextEditHint: 'Valores comuns: 256k (Hermes padrão), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: 'Salvar', contextEditCancel: 'Cancelar', contextEditInvalid: 'Por favor, insira um tamanho de contexto válido', @@ -588,7 +588,7 @@ jobTriggered: 'Job acionado', customType: 'Personalizado', provider: 'Provedor', contextLength: 'Tamanho do contexto', - contextLengthPlaceholder: 'ex: 200000 (opcional)', + contextLengthPlaceholder: 'ex: 256000 (opcional)', local: 'Local ({host})', selectProviderRequired: 'Por favor, selecione um provedor', baseUrlRequired: 'A URL base e obrigatoria', @@ -1068,6 +1068,16 @@ jobTriggered: 'Job acionado', // Registro de alteracoes changelog: { + new_0_6_2_1: 'Web Bridge agora suporta comandos /plan com início correto do run e estado visível do comando', + new_0_6_2_2: 'O menu de comandos no input do chat agora inclui /goal e /subgoal, com ações de status, pausar, retomar, concluir e limpar', + new_0_6_2_3: 'Workflows de Goal e subgoal agora integram sessões de chat, incluindo continuações de objetivo e atualizações de status', + new_0_6_2_4: 'Opções de canal destino para jobs foram restauradas para que jobs agendados escolham o destino correto', + new_0_6_2_5: 'O uso de tokens de contexto agora retoma com precisão após reconexões usando cálculos conscientes de snapshot', + new_0_6_2_6: 'A compressão de checkpoints de contexto está mais confiável quando o resumo do Codex é lento: Web UI espera 5 minutos e o Python bridge broker não corta requests de worker após 2 minutos', + new_0_6_2_7: 'A promoção da fila do chat foi corrigida para que mensagens queued não entrem cedo demais na lista, inclusive em janelas sincronizadas', + new_0_6_2_8: 'Prompts Clarify não enviam mais respostas de texto livre com Enter, e prompts respondidos não reabrem após trocar de sessão', + new_0_6_2_9: 'Refresh do ambiente do terminal Bridge e limpeza de stale pid foram melhor delimitados, reduzindo status runtime obsoleto na UI', + new_0_6_2_10: 'O comprimento de contexto padrão agora segue o padrão Hermes de 256.000 tokens', new_0_5_31_1: 'Reinícios do Bridge broker reforçados, renderização final do stream de chat em grupo corrigida e roteamento {\'@\'}all adicionado', new_0_5_31_2: 'Gerenciador de arquivos pode copiar caminhos absolutos e a gaveta móvel de sessões não fica mais atrás do chat', new_0_5_31_3: 'Seletor de Profile mostra avatares, upload de avatar personalizado, modal de status runtime e ações de restart de gateway/Profile', diff --git a/packages/client/src/i18n/locales/zh-TW.ts b/packages/client/src/i18n/locales/zh-TW.ts index 69ebb5b..6ab9324 100644 --- a/packages/client/src/i18n/locales/zh-TW.ts +++ b/packages/client/src/i18n/locales/zh-TW.ts @@ -197,7 +197,7 @@ export default { contextEditTitle: '編輯上下文長度', contextEditDesc: '設定目前模型的上下文長度限制(token 數量)', contextEditPlaceholder: '請輸入上下文長度', - contextEditHint: '常見值:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)', + contextEditHint: '常見值:256k (Hermes 預設), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: '儲存', contextEditCancel: '取消', contextEditInvalid: '請輸入有效的上下文長度', @@ -686,7 +686,7 @@ export default { customType: '自訂', provider: 'Provider', contextLength: '上下文長度', - contextLengthPlaceholder: '例如 200000(選填)', + contextLengthPlaceholder: '例如 256000(選填)', local: '本地 ({host})', selectProviderRequired: '請選擇 Provider', baseUrlRequired: 'Base URL 為必填項', @@ -1295,6 +1295,16 @@ export default { // 更新日誌 changelog: { + new_0_6_2_1: 'Web Bridge 支援 /plan 命令,計畫命令會正確啟動並顯示執行狀態', + new_0_6_2_2: '聊天輸入框指令選單新增 /goal 和 /subgoal,支援狀態、暫停、恢復、完成和清空等操作', + new_0_6_2_3: 'Goal 與 subgoal 工作流接入聊天工作階段,支援目標延續與狀態更新', + new_0_6_2_4: '修復任務投遞目標渠道選項,排程任務可以選擇正確的投遞位置', + new_0_6_2_5: '上下文 token 用量在重新連線後會依快照感知邏輯準確恢復', + new_0_6_2_6: '上下文檢查點壓縮對較慢的 Codex 摘要更穩定:Web UI 等待 5 分鐘,Python bridge broker 不再於 2 分鐘後提前切斷 worker 請求', + new_0_6_2_7: '修復聊天佇列推進,queued 訊息不會提前跳入訊息列表,多視窗同步場景也保持一致', + new_0_6_2_8: 'Clarify 彈窗輸入框不再按 Enter 直接提交,已回覆的 Clarify 也不會在切換工作階段後重複彈出', + new_0_6_2_9: 'Bridge 終端環境刷新與 stale pid 清理收斂到更準確的作用域,減少前端執行狀態殘留', + new_0_6_2_10: '預設上下文長度遵循 Hermes 規範,調整為 256,000 tokens', new_0_5_31_1: "增強 Bridge Broker 重啟穩定性,修復群聊最終串流渲染,並新增群聊 {'@'}all 路由", new_0_5_31_2: '檔案管理支援複製絕對路徑,並修復行動端工作階段抽屜層級遮擋問題', new_0_5_31_3: 'Profile 選擇器新增頭像展示、自訂頭像、執行狀態彈窗,以及網關/Profile 重啟操作', diff --git a/packages/client/src/i18n/locales/zh.ts b/packages/client/src/i18n/locales/zh.ts index 04ea96d..689c81b 100644 --- a/packages/client/src/i18n/locales/zh.ts +++ b/packages/client/src/i18n/locales/zh.ts @@ -197,7 +197,7 @@ export default { contextEditTitle: '编辑上下文长度', contextEditDesc: '设置当前模型的上下文长度限制(token 数量)', contextEditPlaceholder: '请输入上下文长度', - contextEditHint: '常见值:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)', + contextEditHint: '常见值:256k (Hermes 默认), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: '保存', contextEditCancel: '取消', contextEditInvalid: '请输入有效的上下文长度', @@ -712,7 +712,7 @@ export default { customType: '自定义', provider: 'Provider', contextLength: '上下文长度', - contextLengthPlaceholder: '例如 200000(可选)', + contextLengthPlaceholder: '例如 256000(可选)', local: '本地 ({host})', selectProviderRequired: '请选择 Provider', baseUrlRequired: 'Base URL 为必填项', @@ -1292,6 +1292,16 @@ export default { // 更新日志 changelog: { + new_0_6_2_1: 'Web Bridge 支持 /plan 命令,计划命令会正确启动并展示运行状态', + new_0_6_2_2: '聊天输入框指令菜单新增 /goal 和 /subgoal,支持状态、暂停、恢复、完成和清空等操作', + new_0_6_2_3: 'Goal 和 subgoal 工作流接入聊天会话,支持目标延续和状态更新', + new_0_6_2_4: '修复任务投递目标渠道选项,定时任务可以选择正确的投递位置', + new_0_6_2_5: '上下文 token 用量在重连后会按快照感知逻辑准确恢复', + new_0_6_2_6: '上下文检查点压缩对较慢的 Codex 总结更稳定:Web UI 等待 5 分钟,Python bridge broker 不再在 2 分钟后提前切断 worker 请求', + new_0_6_2_7: '修复聊天队列推进,queued 消息不会提前跳入消息列表,多窗口同步场景也保持一致', + new_0_6_2_8: 'Clarify 弹窗输入框不再按 Enter 直接提交,已回复的 Clarify 也不会在切换会话后重复弹出', + new_0_6_2_9: 'Bridge 终端环境刷新和 stale pid 清理收敛到更准确的作用域,减少前端运行状态残留', + new_0_6_2_10: '默认上下文长度遵循 Hermes 规范,调整为 256,000 tokens', new_0_5_31_1: "增强 Bridge Broker 重启稳定性,修复群聊最终流式渲染,并新增群聊 {'@'}all 路由", new_0_5_31_2: '文件管理支持复制绝对路径,并修复移动端会话抽屉层级遮挡问题', new_0_5_31_3: 'Profile 选择器新增头像展示、自定义头像、运行状态弹窗,以及网关/Profile 重启操作', diff --git a/packages/server/src/services/hermes/model-context.ts b/packages/server/src/services/hermes/model-context.ts index df47071..eafbfbf 100644 --- a/packages/server/src/services/hermes/model-context.ts +++ b/packages/server/src/services/hermes/model-context.ts @@ -8,7 +8,7 @@ import { detectHermesHome } from './hermes-path' const HERMES_BASE = detectHermesHome() const MODELS_DEV_CACHE = resolve(HERMES_BASE, 'models_dev_cache.json') -const DEFAULT_CONTEXT_LENGTH = 200_000 +const DEFAULT_CONTEXT_LENGTH = 256_000 export interface ModelContextLengthOptions { profile?: string @@ -112,7 +112,7 @@ function getDefaultProvider(config: any): string | null { /** * Read context_length from config.yaml, only as a sibling of default. - * e.g. model:\n default: gpt-5.4\n context_length: 200000 + * e.g. model:\n default: gpt-5.4\n context_length: 256000 */ function getConfigContextLength(config: any): number | null { const model = config?.model diff --git a/tests/e2e/fixtures.ts b/tests/e2e/fixtures.ts index 03ac1d3..d6ce6f1 100644 --- a/tests/e2e/fixtures.ts +++ b/tests/e2e/fixtures.ts @@ -141,7 +141,7 @@ export async function mockHermesApi(page: Page, options: MockHermesApiOptions = } if (pathname === '/api/hermes/sessions/context-length') { - await route.fulfill(jsonResponse({ context_length: 200000 })) + await route.fulfill(jsonResponse({ context_length: 256000 })) return } diff --git a/tests/server/model-context.test.ts b/tests/server/model-context.test.ts index 6845a6f..fd89fc1 100644 --- a/tests/server/model-context.test.ts +++ b/tests/server/model-context.test.ts @@ -71,7 +71,7 @@ describe('getModelContextLength', () => { const { getModelContextLength } = await loadModelContext() - expect(getModelContextLength()).toBe(200_000) + expect(getModelContextLength()).toBe(256_000) }) it('does not scan other providers when the configured provider exists without that model', async () => { @@ -79,7 +79,7 @@ describe('getModelContextLength', () => { writeModelsCache({ 'openai-codex': { models: { - 'gpt-5.4': { limit: { context: 200_000 } }, + 'gpt-5.4': { limit: { context: 256_000 } }, }, }, openai: { @@ -91,7 +91,7 @@ describe('getModelContextLength', () => { const { getModelContextLength } = await loadModelContext() - expect(getModelContextLength()).toBe(200_000) + expect(getModelContextLength()).toBe(256_000) }) it('uses the configured provider cache entry when the provider matches', async () => { @@ -241,7 +241,7 @@ describe('getModelContextLength', () => { const { getModelContextLength } = await loadModelContext() - expect(getModelContextLength()).toBe(200_000) + expect(getModelContextLength()).toBe(256_000) }) it('does not trust custom:name alone when the matched custom provider entry points at an unknown proxy url', async () => { @@ -256,7 +256,7 @@ describe('getModelContextLength', () => { const { getModelContextLength } = await loadModelContext() - expect(getModelContextLength()).toBe(200_000) + expect(getModelContextLength()).toBe(256_000) }) it('does not fall through to a unique global match after a resolved custom:name provider misses in its scoped cache provider', async () => { @@ -276,7 +276,7 @@ describe('getModelContextLength', () => { const { getModelContextLength } = await loadModelContext() - expect(getModelContextLength()).toBe(200_000) + expect(getModelContextLength()).toBe(256_000) }) it('allows a unique global model-name fallback for unresolved custom providers', async () => { @@ -321,7 +321,7 @@ describe('getModelContextLength', () => { const { getModelContextLength } = await loadModelContext() - expect(getModelContextLength()).toBe(200_000) + expect(getModelContextLength()).toBe(256_000) }) it('does not guess across multiple cache providers when a custom provider remains unresolved', async () => { @@ -341,6 +341,6 @@ describe('getModelContextLength', () => { const { getModelContextLength } = await loadModelContext() - expect(getModelContextLength()).toBe(200_000) + expect(getModelContextLength()).toBe(256_000) }) }) diff --git a/tests/server/run-chat-compression.test.ts b/tests/server/run-chat-compression.test.ts index 5436577..d613001 100644 --- a/tests/server/run-chat-compression.test.ts +++ b/tests/server/run-chat-compression.test.ts @@ -87,7 +87,7 @@ describe('run chat compression trigger', () => { readConfigYamlForProfileMock.mockReset() getSessionMock.mockReturnValue({ id: 'session-1', profile: 'default' }) - getModelContextLengthMock.mockReturnValue(200_000) + getModelContextLengthMock.mockReturnValue(256_000) calcAndUpdateUsageMock.mockResolvedValue({ inputTokens: 1_000, outputTokens: 0 }) estimateUsageTokensFromMessagesMock.mockReturnValue({ inputTokens: 0, outputTokens: 0 }) getCompressionSnapshotMock.mockReturnValue(null) @@ -142,7 +142,7 @@ describe('run chat compression trigger', () => { readConfigYamlForProfileMock.mockResolvedValue({ compression: { threshold: 0.25, target_ratio: 0.1, protect_last_n: 7, protect_first_n: 2 }, }) - calcAndUpdateUsageMock.mockResolvedValue({ inputTokens: 60_000, outputTokens: 0 }) + calcAndUpdateUsageMock.mockResolvedValue({ inputTokens: 70_000, outputTokens: 0 }) compressorCompressMock.mockResolvedValue({ messages: [{ role: 'user', content: 'compressed' }], meta: { @@ -212,7 +212,7 @@ describe('run chat compression trigger', () => { emit, new Map(), {}, - vi.fn(async () => 120_000), + vi.fn(async () => 160_000), ) expect(history).toEqual([{ role: 'user', content: 'compressed by local context estimate' }]) @@ -356,7 +356,7 @@ describe('run chat compression trigger', () => { emit, new Map(), {}, - vi.fn(async () => 120_000), + vi.fn(async () => 160_000), 700, ) @@ -387,7 +387,7 @@ describe('run chat compression trigger', () => { emit, new Map(), {}, - vi.fn(async () => 120_000), + vi.fn(async () => 160_000), )).rejects.toBeInstanceOf(ContextWindowTooSmallError) expect(emit).not.toHaveBeenCalledWith('usage.updated', expect.anything()) @@ -420,7 +420,7 @@ describe('run chat compression trigger', () => { vi.fn(), new Map(), {}, - vi.fn(async () => 120_000), + vi.fn(async () => 160_000), )).rejects.toBeInstanceOf(ContextWindowTooSmallError) expect(compressorCompressMock).not.toHaveBeenCalled() @@ -443,7 +443,7 @@ describe('run chat compression trigger', () => { readConfigYamlForProfileMock.mockResolvedValue({ compression: { protect_last_n: 5 }, }) - calcAndUpdateUsageMock.mockResolvedValue({ inputTokens: 120_000, outputTokens: 0 }) + calcAndUpdateUsageMock.mockResolvedValue({ inputTokens: 160_000, outputTokens: 0 }) compressorCompressMock.mockResolvedValue({ messages: [{ role: 'user', content: 'compressed' }], meta: { @@ -468,8 +468,8 @@ describe('run chat compression trigger', () => { expect(compressorConstructorMock).toHaveBeenCalledWith({ config: { - triggerTokens: 100_000, - summaryBudget: 40_000, + triggerTokens: 128_000, + summaryBudget: 51_200, headMessageCount: 3, tailMessageCount: 5, }, @@ -544,7 +544,7 @@ describe('run chat compression trigger', () => { readConfigYamlForProfileMock.mockResolvedValue({ compression: { protect_first_n: 2, protect_last_n: 3 }, }) - estimateUsageTokensFromMessagesMock.mockReturnValue({ inputTokens: 120_000, outputTokens: 0 }) + estimateUsageTokensFromMessagesMock.mockReturnValue({ inputTokens: 160_000, outputTokens: 0 }) compressorCompressMock.mockResolvedValue({ messages: [{ role: 'user', content: 'updated stale compressed' }], meta: { diff --git a/tests/server/sessions-routes.test.ts b/tests/server/sessions-routes.test.ts index 72f032e..dd9a4fc 100644 --- a/tests/server/sessions-routes.test.ts +++ b/tests/server/sessions-routes.test.ts @@ -16,7 +16,7 @@ const listWorkspaceFoldersMock = vi.fn(async (ctx: any) => { ctx.body = { folder const usageBatchMock = vi.fn(async (ctx: any) => { ctx.body = {} }) const usageSingleMock = vi.fn(async (ctx: any) => { ctx.body = { input_tokens: 0, output_tokens: 0 } }) const usageStatsMock = vi.fn(async (ctx: any) => { ctx.body = { total_input_tokens: 0, total_output_tokens: 0 } }) -const contextLengthMock = vi.fn(async (ctx: any) => { ctx.body = { context_length: 200000 } }) +const contextLengthMock = vi.fn(async (ctx: any) => { ctx.body = { context_length: 256000 } }) const batchRemoveMock = vi.fn(async (ctx: any) => { ctx.body = { deleted: 1, failed: 0, errors: [] } }) const exportSessionMock = vi.fn(async (ctx: any) => { ctx.body = JSON.stringify({ id: ctx.params.id }) })