dsh-session-guard 3.2.3 → 3.2.5

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.
@@ -11,6 +11,7 @@
11
11
  *
12
12
  * 构建:tsdown → lib/client.js(__ModuleLoader__.load 注册,与 input-traffic 同构)。
13
13
  */
14
+ import { NS, dictionaries } from './locales'
14
15
  import { StatusBadge } from './status-badge'
15
16
  import { PauseButton } from './pause-button'
16
17
  import { SessionGuardCard } from './settings-card'
@@ -20,9 +21,19 @@ import { GuardFamilySection, type FamilyTabEntry } from './family-section'
20
21
  // (id `dsh-family`)并声明 `dsh-family.tab` 子席位,本插件贡献卡片。宿主缺席
21
22
  // 时本插件按下载量排名接管该节(见 apply 内的选举逻辑),节名仍为
22
23
  // 「起子插件设置」;宿主在场时本插件只贡献卡片。
24
+ // 类型导入(构建时擦除,bundle 无 value-import 平台包):让下方 `declare
25
+ // module` 增补能解析到 @deepseek-ai/dsh-client-ui-slots 的 SlotMap。
26
+ import type {} from '@deepseek-ai/dsh-client-ui-slots'
23
27
  declare module '@deepseek-ai/dsh-client-ui-slots' {
24
28
  interface SlotMap {
25
29
  'dsh-family.tab': { kind: 'list'; scope: 'root' }
30
+ /**
31
+ * 插件页配置卡(官方 ui-plugin-manager 契约,key = 包名):Plugins 页
32
+ * 不自动渲染 volatile 配置表单,bundle 详情页只渲染注册在本 keyed 席位
33
+ * 下的卡片;owner props 由页面给(`{ view: 'page', form }`),本卡片改经
34
+ * inject 工厂拿自己的 scope(与 dsh-family.tab 注册同源)。
35
+ */
36
+ 'plugins.bundle.config': { kind: 'keyed'; scope: 'root'; owner: Record<string, unknown> }
26
37
  }
27
38
  }
28
39
 
@@ -51,12 +62,23 @@ interface SlotsFace {
51
62
  interface ConfigFormsFace {
52
63
  get: <T>(_entryId: string) => import('./scope-face').SettingsScope<T>
53
64
  }
65
+ interface LocaleFace {
66
+ register(ns: string, dicts: Record<string, Record<string, string>>): () => void
67
+ }
54
68
  interface ClientCtx {
55
69
  slots: SlotsFace
56
70
  configForms: ConfigFormsFace
71
+ locale?: LocaleFace
72
+ effect: (fn: () => (() => void) | void, label: string) => void
57
73
  }
58
74
 
59
75
  export function apply(ctx: ClientCtx) {
76
+ // 注册全部 9 种语言字典(guarded:throw 不会逃逸)。
77
+ if (ctx.locale) {
78
+ const locale = ctx.locale
79
+ ctx.effect(() => locale.register(NS, dictionaries), 'dsh-session-guard: dictionaries')
80
+ }
81
+
60
82
  // 暂停会话按钮(v0.2.0):step 级门控的状态显示 + 手动解除。
61
83
  // order 20 < input-traffic 冻结按钮的 30 → 排在左侧,两者并列互不取代(ADR-001/002)。
62
84
  ctx.slots.inject('conversation.input.right', () => ctx.slots.register({
@@ -84,6 +106,17 @@ export function apply(ctx: ClientCtx) {
84
106
  inject: () => ({ scope: ctx.configForms.get<Record<string, unknown>>('session-guard') }),
85
107
  }, SessionGuardCard))
86
108
 
109
+ // 插件页配置卡:Plugins 页不自动渲染 volatile 配置表单,须注册
110
+ // `plugins.bundle.config` 席位(key = 包名),配置卡才渲染在 bundle 详情页。
111
+ // 卡片组件与 props(scope)与上方 dsh-family.tab 注册完全同源:同一张
112
+ // SessionGuardCard、同一 inject 工厂,配置仍写入 entry `session-guard` 的
113
+ // volatile config;页面注入的 owner props(form 等)本卡不消费。
114
+ ctx.slots.inject('plugins.bundle.config', () => ctx.slots.register({
115
+ name: 'plugins.bundle.config',
116
+ key: 'dsh-session-guard',
117
+ inject: () => ({ scope: ctx.configForms.get<Record<string, unknown>>('session-guard') }),
118
+ }, SessionGuardCard))
119
+
87
120
  // 家族节宿主选举:宿主 dsh-thinking-levels 缺席时顶上「起子插件设置」节。
88
121
  // 宽限期后若 `settings.section` 里没有 id `dsh-family` 的条目,则按同一 id
89
122
  // 接管(声明同一个 dsh-family.tab 子席位,节内通用渲染全部贡献卡)。与
@@ -1,4 +1,4 @@
1
- /** `session-guard` client dictionaries (zh / en / ja / ko). */
1
+ /** `session-guard` client dictionaries (zh / en / ja / ko / fr / de / it / ru / es). */
2
2
 
3
3
  /** Dictionary namespace owned by this plugin. */
4
4
  export const NS = 'session-guard'
@@ -159,5 +159,203 @@ export const ko: Record<keyof typeof zh, string> = {
159
159
  'status.peak_all': '피크·전체 정지',
160
160
  }
161
161
 
162
+ /** French dictionary (keys mirror zh). */
163
+ export const fr: Record<keyof typeof zh, string> = {
164
+ 'badge.normal': 'Normal',
165
+ 'badge.paused': 'En pause (pic)',
166
+ 'badge_paused_peak': 'Pause pic en cours',
167
+ 'settings.enabled': 'Pause auto en période de pic',
168
+ 'settings.enabled.desc': 'Mettre automatiquement en pause les sessions actives pendant les heures de pic',
169
+ 'settings.offPeakAutoResume': 'Reprise auto hors pic',
170
+ 'settings.offPeakAutoResume.desc': 'Reprendre automatiquement les sessions en pause pendant les heures creuses',
171
+ 'settings.weekendMode': 'Mode week-end',
172
+ 'settings.weekendMode.desc': 'Détecter les week-ends → pas de pause auto le week-end',
173
+ 'settings.queueFallback': 'File d\u2019attente de secours',
174
+ 'settings.queueFallback.desc': 'Repli sur la file d\u2019attente verrouillée quand la passerelle personnalisée est indisponible (fail-open)',
175
+ 'settings.retryEnabled': 'Nouvelle tentative auto',
176
+ 'settings.retryEnabled.desc': 'Reprise auto après échec transitoire (désactivé par défaut, conservateur)',
177
+ 'settings.timezone': 'Fuseau horaire',
178
+ 'settings.peakWindows': 'Plages horaires de pic',
179
+ 'settings.providerGuard': 'Garde source officielle',
180
+ 'settings.providerGuard.desc': 'En période de pic, seules les sources officielles DeepSeek sont bloquées ; les fournisseurs locaux/tiers continuent',
181
+ 'settings.officialProviders': 'IDs de fournisseur officiels supplémentaires',
182
+ 'settings.officialProviders.desc': 'Correspondance exacte, priorité maximale (séparés par des virgules)',
183
+ 'settings.officialBaseURLs': 'Hôtes des points de terminaison officiels',
184
+ 'settings.officialBaseURLs.desc': 'Hôtes après normalisation de la baseURL (séparés par des virgules)',
185
+ 'settings.deferredMode': 'Mode d\u2019interception',
186
+ 'settings.deferredMode.desc': 'Suspendre sans erreur, ou générer une erreur et mettre en file différée',
187
+ 'settings.deferredResume': 'Reprise auto après le pic',
188
+ 'settings.deferredResume.desc': 'Si désactivé, les requêtes/sessions différées restent en attente jusqu\u2019à un /resume manuel',
189
+ 'settings.deferredResumeText': 'Message de reprise',
190
+ 'settings.deferredResumeText.desc': 'Texte envoyé lorsqu\u2019une session en mode erreur reprend hors pic',
191
+ 'settings.guardSubagents': 'Inclure les sous-agents',
192
+ 'settings.guardSubagents.desc': 'Les requêtes des sous-agents sont aussi facturées ; gardées par défaut',
193
+ 'settings.officialHint': 'Ordre de décision : liste d\u2019ids explicites → point de terminaison baseURL → point de terminaison par défaut du catalogue → id intégré. Pour un verdict erroné, ouvrez /session-guard/provider?provider=<id> et consultez matchedBy.',
194
+ 'settings.unavailable': 'Paramètres indisponibles : assurez-vous que dsh-session-guard est assemblé dans ce profil.',
195
+ 'status.normal': 'Fonctionnement normal',
196
+ 'status.paused_peak': 'Pause pic en cours',
197
+ 'status.peak_official': 'Pic · officiel uniquement',
198
+ 'status.peak_all': 'Pic · tout en pause',
199
+ }
200
+
201
+ /** German dictionary (keys mirror zh). */
202
+ export const de: Record<keyof typeof zh, string> = {
203
+ 'badge.normal': 'Normal',
204
+ 'badge.paused': 'Pausiert (Spitzenzeit)',
205
+ 'badge_paused_peak': 'Spitzenzeit-Pause aktiv',
206
+ 'settings.enabled': 'Auto-Pause zur Spitzenzeit',
207
+ 'settings.enabled.desc': 'Laufende Sitzungen während der Spitzenzeiten automatisch pausieren',
208
+ 'settings.offPeakAutoResume': 'Auto-Fortsetzung außerhalb der Spitzenzeit',
209
+ 'settings.offPeakAutoResume.desc': 'Pausierte Sitzungen außerhalb der Spitzenzeiten automatisch fortsetzen',
210
+ 'settings.weekendMode': 'Wochenendmodus',
211
+ 'settings.weekendMode.desc': 'Wochenenden erkennen → keine Auto-Pause am Wochenende',
212
+ 'settings.queueFallback': 'Fallback-Warteschlange',
213
+ 'settings.queueFallback.desc': 'Auf Sperr-Warteschlange zurückgreifen, wenn eigenes Sitzungs-Gate nicht verfügbar ist (fail-open)',
214
+ 'settings.retryEnabled': 'Automatischer Wiederholungsversuch',
215
+ 'settings.retryEnabled.desc': 'Automatische Fortsetzung nach kurzzeitigem Fehler (standardmäßig aus, konservativ)',
216
+ 'settings.timezone': 'Zeitzone',
217
+ 'settings.peakWindows': 'Spitzenzeitfenster',
218
+ 'settings.providerGuard': 'Offizielle-Quellen-Prüfung',
219
+ 'settings.providerGuard.desc': 'Zur Spitzenzeit nur DeepSeek-offizielle Quellen blockieren; lokale/Dritt-Anbieter laufen weiter',
220
+ 'settings.officialProviders': 'Zusätzliche offizielle Provider-IDs',
221
+ 'settings.officialProviders.desc': 'Exakte Übereinstimmung, höchste Priorität (kommagetrennt)',
222
+ 'settings.officialBaseURLs': 'Offizielle Endpunkt-Hosts',
223
+ 'settings.officialBaseURLs.desc': 'Hosts nach baseURL-Normalisierung (kommagetrennt)',
224
+ 'settings.deferredMode': 'Abfangmodus',
225
+ 'settings.deferredMode.desc': 'Ohne Fehler anhalten oder Fehler erzeugen und in Warteschlange stellen',
226
+ 'settings.deferredResume': 'Auto-Fortsetzung nach Spitzenzeit',
227
+ 'settings.deferredResume.desc': 'Wenn aus, bleiben zurückgestellte Anfragen/Sitzungen bis zum manuellen /resume geparkt',
228
+ 'settings.deferredResumeText': 'Fortsetzungsnachricht',
229
+ 'settings.deferredResumeText.desc': 'Text, der gesendet wird, wenn eine Sitzung im Fehlermodus nach der Spitzenzeit fortgesetzt wird',
230
+ 'settings.guardSubagents': 'Unteragenten einbeziehen',
231
+ 'settings.guardSubagents.desc': 'Anfragen von Unteragenten werden ebenfalls abgerechnet; standardmäßig überwacht',
232
+ 'settings.officialHint': 'Entscheidungsreihenfolge: explizite ID-Liste → baseURL-Endpunkt → Katalog-Standardendpunkt → eingebaute ID. Bei Fehlentscheidung /session-guard/provider?provider=<id> öffnen und matchedBy prüfen.',
233
+ 'settings.unavailable': 'Einstellungen nicht verfügbar: Stellen Sie sicher, dass dsh-session-guard in diesem Profil eingebunden ist.',
234
+ 'status.normal': 'Normaler Betrieb',
235
+ 'status.paused_peak': 'Spitzenzeit-Pause aktiv',
236
+ 'status.peak_official': 'Spitzenzeit · nur offizielle',
237
+ 'status.peak_all': 'Spitzenzeit · alle pausiert',
238
+ }
239
+
240
+ /** Italian dictionary (keys mirror zh). */
241
+ export const it: Record<keyof typeof zh, string> = {
242
+ 'badge.normal': 'Normale',
243
+ 'badge.paused': 'In pausa (picco)',
244
+ 'badge_paused_peak': 'Pausa di picco attiva',
245
+ 'settings.enabled': 'Pausa automatica durante il picco',
246
+ 'settings.enabled.desc': 'Metti automaticamente in pausa le sessioni attive durante le ore di picco',
247
+ 'settings.offPeakAutoResume': 'Ripresa automatica fuori picco',
248
+ 'settings.offPeakAutoResume.desc': 'Riprendi automaticamente le sessioni in pausa durante le ore fuori picco',
249
+ 'settings.weekendMode': 'Modalità fine settimana',
250
+ 'settings.weekendMode.desc': 'Rileva i fine settimana → nessuna pausa automatica nel weekend',
251
+ 'settings.queueFallback': 'Coda di riserva con blocco',
252
+ 'settings.queueFallback.desc': 'Ripiega sulla coda di attesa bloccata quando il gate di sessione personalizzato non è disponibile (fail-open)',
253
+ 'settings.retryEnabled': 'Nuovo tentativo automatico',
254
+ 'settings.retryEnabled.desc': 'Ripresa automatica dopo errore transitorio (disattivato per impostazione predefinita, conservativo)',
255
+ 'settings.timezone': 'Fuso orario',
256
+ 'settings.peakWindows': 'Finestre temporali di picco',
257
+ 'settings.providerGuard': 'Guardia sorgente ufficiale',
258
+ 'settings.providerGuard.desc': 'Durante il picco blocca solo le sorgenti ufficiali DeepSeek; i provider locali/terzi continuano a funzionare',
259
+ 'settings.officialProviders': 'ID provider ufficiali aggiuntivi',
260
+ 'settings.officialProviders.desc': 'Corrispondenza esatta, priorità massima (separati da virgola)',
261
+ 'settings.officialBaseURLs': 'Host degli endpoint ufficiali',
262
+ 'settings.officialBaseURLs.desc': 'Host dopo la normalizzazione della baseURL (separati da virgola)',
263
+ 'settings.deferredMode': 'Modalità di intercettazione',
264
+ 'settings.deferredMode.desc': 'Sospendi senza errore, oppure genera errore e accoda come differito',
265
+ 'settings.deferredResume': 'Ripresa automatica dopo il picco',
266
+ 'settings.deferredResume.desc': 'Se disattivato, le richieste/sessioni differite restano in attesa fino a un /resume manuale',
267
+ 'settings.deferredResumeText': 'Messaggio di ripresa',
268
+ 'settings.deferredResumeText.desc': 'Testo inviato quando una sessione in modalità errore riprende fuori picco',
269
+ 'settings.guardSubagents': 'Includi sottoagenti',
270
+ 'settings.guardSubagents.desc': 'Anche le richieste dei sottoagenti sono fatturate; protette per impostazione predefinita',
271
+ 'settings.officialHint': 'Ordine di decisione: elenco id espliciti → endpoint baseURL → endpoint predefinito del catalogo → id integrato. Per un verdetto errato apri /session-guard/provider?provider=<id> e controlla matchedBy.',
272
+ 'settings.unavailable': 'Impostazioni non disponibili: assicurati che dsh-session-guard sia integrato in questo profilo.',
273
+ 'status.normal': 'Funzionamento normale',
274
+ 'status.paused_peak': 'Pausa di picco attiva',
275
+ 'status.peak_official': 'Picco · solo ufficiale',
276
+ 'status.peak_all': 'Picco · tutto in pausa',
277
+ }
278
+
279
+ /** Russian dictionary (keys mirror zh). */
280
+ export const ru: Record<keyof typeof zh, string> = {
281
+ 'badge.normal': 'Норма',
282
+ 'badge.paused': 'Приостановлено (пик)',
283
+ 'badge_paused_peak': 'Пиковая пауза активна',
284
+ 'settings.enabled': 'Автопауза в час пик',
285
+ 'settings.enabled.desc': 'Автоматически приостанавливать активные сессии в часы пиковой нагрузки',
286
+ 'settings.offPeakAutoResume': 'Автопродолжение вне пика',
287
+ 'settings.offPeakAutoResume.desc': 'Автоматически возобновлять приостановленные сессии в непиковые часы',
288
+ 'settings.weekendMode': 'Режим выходных',
289
+ 'settings.weekendMode.desc': 'Определять выходные → не приостанавливать автоматически в выходные',
290
+ 'settings.queueFallback': 'Резервная очередь блокировки',
291
+ 'settings.queueFallback.desc': 'Откат к очереди блокировки, когда собственный гейт сессий недоступен (fail-open)',
292
+ 'settings.retryEnabled': 'Автоповтор',
293
+ 'settings.retryEnabled.desc': 'Автоматическое продолжение после временного сбоя (по умолчанию выключено, консервативно)',
294
+ 'settings.timezone': 'Часовой пояс',
295
+ 'settings.peakWindows': 'Пиковые временные окна',
296
+ 'settings.providerGuard': 'Проверка официального источника',
297
+ 'settings.providerGuard.desc': 'В час пик блокируются только официальные источники DeepSeek; локальные/сторонние провайдеры работают',
298
+ 'settings.officialProviders': 'Дополнительные ID официальных провайдеров',
299
+ 'settings.officialProviders.desc': 'Точное совпадение, наивысший приоритет (через запятую)',
300
+ 'settings.officialBaseURLs': 'Хосты официальных эндпоинтов',
301
+ 'settings.officialBaseURLs.desc': 'Хосты после нормализации baseURL (через запятую)',
302
+ 'settings.deferredMode': 'Режим перехвата',
303
+ 'settings.deferredMode.desc': 'Приостановить без ошибки, или выдать ошибку и поставить в отложенную очередь',
304
+ 'settings.deferredResume': 'Автопродолжение после пика',
305
+ 'settings.deferredResume.desc': 'Если выключено, отложенные запросы/сессии ожидают ручного /resume',
306
+ 'settings.deferredResumeText': 'Сообщение возобновления',
307
+ 'settings.deferredResumeText.desc': 'Текст, отправляемый при возобновлении сессии в режиме ошибки после пика',
308
+ 'settings.guardSubagents': 'Включить субагентов',
309
+ 'settings.guardSubagents.desc': 'Запросы субагентов также тарифицируются; по умолчанию защищаются',
310
+ 'settings.officialHint': 'Порядок принятия решения: явный список id → эндпоинт baseURL → эндпоинт по умолчанию из каталога → встроенный id. При ошибочном вердикте откройте /session-guard/provider?provider=<id> и проверьте matchedBy.',
311
+ 'settings.unavailable': 'Настройки недоступны: убедитесь, что dsh-session-guard подключён к этому профилю.',
312
+ 'status.normal': 'Штатная работа',
313
+ 'status.paused_peak': 'Пиковая пауза активна',
314
+ 'status.peak_official': 'Пик · только официальные',
315
+ 'status.peak_all': 'Пик · все приостановлены',
316
+ }
317
+
318
+ /** Spanish dictionary (keys mirror zh). */
319
+ export const es: Record<keyof typeof zh, string> = {
320
+ 'badge.normal': 'Normal',
321
+ 'badge.paused': 'Pausado (pico)',
322
+ 'badge_paused_peak': 'Pausa por pico activa',
323
+ 'settings.enabled': 'Pausa automática en hora pico',
324
+ 'settings.enabled.desc': 'Pausar automáticamente las sesiones activas durante las horas pico',
325
+ 'settings.offPeakAutoResume': 'Reanudación automática fuera de pico',
326
+ 'settings.offPeakAutoResume.desc': 'Reanudar automáticamente las sesiones pausadas durante las horas valle',
327
+ 'settings.weekendMode': 'Modo fin de semana',
328
+ 'settings.weekendMode.desc': 'Detectar fines de semana → sin pausa automática el fin de semana',
329
+ 'settings.queueFallback': 'Cola de bloqueo de reserva',
330
+ 'settings.queueFallback.desc': 'Alternativa a la cola de bloqueo cuando la puerta de sesión personalizada no está disponible (fail-open)',
331
+ 'settings.retryEnabled': 'Reintento automático',
332
+ 'settings.retryEnabled.desc': 'Reanudación automática tras fallo transitorio (desactivado por defecto, conservador)',
333
+ 'settings.timezone': 'Zona horaria',
334
+ 'settings.peakWindows': 'Ventanas horarias de pico',
335
+ 'settings.providerGuard': 'Protección de fuente oficial',
336
+ 'settings.providerGuard.desc': 'En hora pico solo se bloquean las fuentes oficiales de DeepSeek; los proveedores locales/terceros siguen funcionando',
337
+ 'settings.officialProviders': 'IDs de proveedor oficiales adicionales',
338
+ 'settings.officialProviders.desc': 'Coincidencia exacta, prioridad máxima (separados por comas)',
339
+ 'settings.officialBaseURLs': 'Hosts de endpoints oficiales',
340
+ 'settings.officialBaseURLs.desc': 'Hosts tras normalización de la baseURL (separados por comas)',
341
+ 'settings.deferredMode': 'Modo de intercepción',
342
+ 'settings.deferredMode.desc': 'Suspender sin error, o generar error y encolar como diferido',
343
+ 'settings.deferredResume': 'Reanudación automática tras el pico',
344
+ 'settings.deferredResume.desc': 'Si se desactiva, las solicitudes/sesiones diferidas quedan en espera hasta un /resume manual',
345
+ 'settings.deferredResumeText': 'Mensaje de reanudación',
346
+ 'settings.deferredResumeText.desc': 'Texto enviado cuando una sesión en modo error se reanuda fuera de pico',
347
+ 'settings.guardSubagents': 'Incluir subagentes',
348
+ 'settings.guardSubagents.desc': 'Las solicitudes de subagentes también se facturan; protegidas por defecto',
349
+ 'settings.officialHint': 'Orden de decisión: lista explícita de ids → endpoint de baseURL → endpoint predeterminado del catálogo → id integrado. Para un veredicto erróneo abra /session-guard/provider?provider=<id> y consulte matchedBy.',
350
+ 'settings.unavailable': 'Configuración no disponible: asegúrese de que dsh-session-guard esté integrado en este perfil.',
351
+ 'status.normal': 'Funcionamiento normal',
352
+ 'status.paused_peak': 'Pausa por pico activa',
353
+ 'status.peak_official': 'Pico · solo oficial',
354
+ 'status.peak_all': 'Pico · todo pausado',
355
+ }
356
+
162
357
  /** Dictionary key union. */
163
358
  export type SessionGuardKey = keyof typeof zh
359
+
360
+ /** Combined dictionary map — all 9 languages, for one-call registration. */
361
+ export const dictionaries: Record<string, Record<string, string>> = { zh, en, ja, ko, fr, de, it, ru, es }
@@ -0,0 +1,21 @@
1
+ /** Minimal type stubs for optional peer deps not installed locally. */
2
+ declare module '@deepseek-ai/dsh-client-ui-slots' {
3
+ export interface SlotMap {}
4
+ }
5
+ declare module '@deepseek-ai/dsh-client-locale' {
6
+ export interface LocaleService {
7
+ register(ns: string, dicts: Record<string, Record<string, string>>): () => void
8
+ }
9
+ }
10
+ declare module '@deepseek-ai/dsh-client-ui-settings' {
11
+ export {}
12
+ }
13
+ declare module '@deepseek-ai/dsh-client-ui-renderer' {
14
+ export {}
15
+ }
16
+ declare module '@deepseek-ai/dsh-client-ui-conversation' {
17
+ export {}
18
+ }
19
+ declare module '@deepseek-ai/dsh-client-runtime' {
20
+ export {}
21
+ }