dsh-cool-session 0.1.0 → 0.1.1

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 CHANGED
@@ -104,6 +104,49 @@ window.__ModuleLoader__.load({
104
104
  }
105
105
  // src/client/reason.ts
106
106
  /**
107
+ * The activity families a dictionary names, keyed by the Host's kind.
108
+ *
109
+ * The Host sends `turn`, `subagent`, `job` and `schedule` because those are the
110
+ * provider identifiers it works with, not prose. Only this half knows the
111
+ * language to read them in, so the translation happens here; a kind a future
112
+ * build adds stays as its identifier rather than disappearing.
113
+ */
114
+ const ACTIVITY_KEYS = {
115
+ turn: "activity.turn",
116
+ subagent: "activity.subagent",
117
+ job: "activity.job",
118
+ schedule: "activity.schedule"
119
+ };
120
+ /**
121
+ * Word the work a refusal names, in the active language.
122
+ *
123
+ * @param t - the page's translate seat.
124
+ * @param raw - the Host's comma-separated kind list, when it named any.
125
+ * @returns the phrase to put in the sentence's `{activity}` position.
126
+ */
127
+ function activityPhrase(t, raw) {
128
+ const kinds = typeof raw === "string" ? raw.split(",").map((kind) => kind.trim()).filter((kind) => kind !== "") : [];
129
+ if (kinds.length === 0) return t("error.activityFallback");
130
+ return kinds.map((kind) => {
131
+ const key = ACTIVITY_KEYS[kind];
132
+ return key === void 0 ? kind : t(key);
133
+ }).join(t("activity.separator"));
134
+ }
135
+ /**
136
+ * Word one coded refusal as a sentence.
137
+ *
138
+ * @param t - the page's translate seat.
139
+ * @param failure - the refusal code and the values its sentence interpolates.
140
+ * @returns the sentence to show.
141
+ */
142
+ function failureText(t, failure) {
143
+ if (failure.code === "delete-active") return t("error.delete-active", {
144
+ ...failure.params,
145
+ activity: activityPhrase(t, failure.params?.activity)
146
+ });
147
+ return t(`error.${failure.code}`, failure.params);
148
+ }
149
+ /**
107
150
  * Word one refused answer.
108
151
  *
109
152
  * @param t - the page's translate seat.
@@ -113,7 +156,7 @@ window.__ModuleLoader__.load({
113
156
  */
114
157
  function reasonOf(t, payload, fallback) {
115
158
  if (payload.failure !== void 0) {
116
- const sentence = t(`error.${payload.failure.code}`, payload.failure.params);
159
+ const sentence = failureText(t, payload.failure);
117
160
  if (payload.failure.code === "delete-partial" && typeof payload.error === "string" && payload.error !== "") return `${sentence} ${payload.error}`;
118
161
  return sentence;
119
162
  }
@@ -313,20 +356,86 @@ window.__ModuleLoader__.load({
313
356
  * color reaches it; the fixed 12px keeps it clear of the control's 13px text.
314
357
  */
315
358
  const ARROW_DOWN_MARKUP = iconMarkup("arrow-down", CARET_SIZE);
316
- // src/client/locales.ts
317
- /** The dictionary namespace this page owns. */
318
- const NS = "coolSession";
319
- /**
320
- * Pick the singular or plural spelling of a count-bearing message.
321
- *
322
- * @param base - the message family, whose `.one` and `.other` entries exist.
323
- * @param count - the number the sentence reports.
324
- * @returns the key to translate.
325
- */
326
- function countKey(base, count) {
327
- return `${base}.${count === 1 ? "one" : "other"}`;
328
- }
329
- /** The English copy, which is also the fallback every lookup ends at. */
359
+ // src/client/locales/zh.ts
360
+ const zh = {
361
+ "action.delete": "删除会话",
362
+ "action.cancel": "取消",
363
+ "action.close": "关闭",
364
+ "settings.nav": "会话管理",
365
+ "settings.title": "会话管理",
366
+ "settings.description": "搜索、筛选、归档或删除会话。",
367
+ "sessions.search": "搜索会话标题",
368
+ "sessions.searchPlaceholder": "搜索...",
369
+ "sessions.allWorkspaces": "全部工作区",
370
+ "sessions.noWorkspace": "未关联工作区",
371
+ "sessions.allSessions": "全部会话",
372
+ "sessions.unarchived": "未归档",
373
+ "sessions.archived": "已归档",
374
+ "sessions.running": "运行中",
375
+ "sessions.selectAll": "全选",
376
+ "sessions.selectOne": "选择 {title}",
377
+ "sessions.archiveSelected": "归档已选",
378
+ "sessions.deleteSelected": "删除已选",
379
+ "sessions.selectedCount": "已选择 {count} 个",
380
+ "sessions.columnTitle": "会话标题",
381
+ "sessions.columnStatus": "状态",
382
+ "sessions.columnActions": "操作",
383
+ "sessions.archive": "归档",
384
+ "sessions.unarchive": "取消归档",
385
+ "sessions.delete": "删除",
386
+ "sessions.loading": "正在载入会话…",
387
+ "sessions.empty": "暂无会话",
388
+ "sessions.noMatches": "没有匹配的会话",
389
+ "sessions.loadFailed": "无法读取会话列表",
390
+ "sessions.retry": "重试",
391
+ "sessions.unavailable": "会话服务尚未就绪,无法归档",
392
+ "sessions.actionFailed": "操作失败",
393
+ "sessions.bulkPartial.one": "已删除 1 个会话,{failed} 个删除失败。",
394
+ "sessions.bulkPartial.other": "已删除 {deleted} 个会话,{failed} 个删除失败。",
395
+ "sessions.bulkStopped.one": "已删除 1 个会话,其余未能继续处理。",
396
+ "sessions.bulkStopped.other": "已删除 {deleted} 个会话,其余未能继续处理。",
397
+ "sessions.bulkArchivePartial.one": "已归档 1 个会话,{skipped} 个运行中的会话已跳过。",
398
+ "sessions.bulkArchivePartial.other": "已归档 {archived} 个会话,{skipped} 个运行中的会话已跳过。",
399
+ "sessions.bulkArchiveFailed.one": "已归档 1 个会话,{failed} 个归档失败。",
400
+ "sessions.bulkArchiveFailed.other": "已归档 {archived} 个会话,{failed} 个归档失败。",
401
+ "sessions.deleteSelectedTitle": "删除选中的会话",
402
+ "sessions.deleteBatchDescription": "从磁盘移除选中的 {count} 个会话及其所有子会话的日志,正在运行的会话将被终止。此操作不可撤销!",
403
+ "sessions.archiveStopTitle": "停止并归档此会话?",
404
+ "sessions.archiveStopDescription": "“{title}”仍有正在进行的工作。归档会先停止这些工作,停止的工作不会自动继续。",
405
+ "sessions.archiveActivity": "将被停止的工作",
406
+ "sessions.activityTurn": "进行中的回合",
407
+ "sessions.activitySubagents.one": "1 个运行中的子智能体",
408
+ "sessions.activitySubagents.other": "{count} 个运行中的子智能体",
409
+ "sessions.activityJobs.one": "1 个后台任务",
410
+ "sessions.activityJobs.other": "{count} 个后台任务",
411
+ "sessions.activitySchedules.one": "1 条定时提醒",
412
+ "sessions.activitySchedules.other": "{count} 条定时提醒",
413
+ "sessions.activityOther.one": "1 项其他工作({kind})",
414
+ "sessions.activityOther.other": "{count} 项其他工作({kind})",
415
+ "sessions.archiveStopAction": "停止并归档",
416
+ "sessions.archiveStopPending": "正在停止并归档…",
417
+ "delete.title": "删除会话",
418
+ "delete.description": "从磁盘移除此会话及其所有子会话的日志,正在运行的会话将被终止。此操作不可撤销!",
419
+ "delete.pending": "正在停止并删除…",
420
+ "delete.confirm": "删除",
421
+ "error.host-stale": "Host 端仍在运行旧版本,请重启 DSH 后重试。",
422
+ "error.missing-session": "未指定会话",
423
+ "error.unknown-session": "该会话已不存在",
424
+ "error.subagent-delete": "子代理会话不能单独删除,请删除其父会话",
425
+ "error.delete-failed": "无法删除该会话",
426
+ "error.delete-unsupported": "当前 Harness 未暴露删除会话所需的磁盘目录信息",
427
+ "error.delete-active": "会话仍在运行({activity}),无法停止,因此未删除",
428
+ "error.session-live": "会话仍处于活动状态,无法释放",
429
+ "error.delete-partial": "已删除 {deleted} 个会话,但还有 {remaining} 个未能删除;请重试剩余项",
430
+ "error.session-running": "会话仍在运行,无法归档",
431
+ "error.activityFallback": "进行中的工作",
432
+ "activity.turn": "进行中的回合",
433
+ "activity.subagent": "运行中的子智能体",
434
+ "activity.job": "后台任务",
435
+ "activity.schedule": "定时提醒",
436
+ "activity.separator": "、"
437
+ };
438
+ // src/client/locales/en.ts
330
439
  const en = {
331
440
  "action.delete": "Delete session",
332
441
  "action.cancel": "Cancel",
@@ -396,80 +505,527 @@ window.__ModuleLoader__.load({
396
505
  "error.delete-unsupported": "This Harness does not expose the on-disk session layout needed for deletion",
397
506
  "error.delete-active": "The session is still running ({activity}) and could not be stopped, so it was not deleted",
398
507
  "error.session-live": "The session is still live and could not be released",
399
- "error.delete-partial": "Some sessions could not be deleted: {deleted} removed, {remaining} still present. Retry the remaining ones"
508
+ "error.delete-partial": "Some sessions could not be deleted: {deleted} removed, {remaining} still present. Retry the remaining ones",
509
+ "error.session-running": "The session is still running and could not be archived",
510
+ "error.activityFallback": "work in progress",
511
+ "activity.turn": "the turn in progress",
512
+ "activity.subagent": "running subagents",
513
+ "activity.job": "background jobs",
514
+ "activity.schedule": "scheduled reminders",
515
+ "activity.separator": ", "
400
516
  };
401
- /** The Chinese copy, key for key the same page. */
402
- const zh = {
403
- "action.delete": "删除会话",
404
- "action.cancel": "取消",
405
- "action.close": "关闭",
406
- "settings.nav": "会话管理",
407
- "settings.title": "会话管理",
408
- "settings.description": "搜索、筛选、归档或删除会话。",
409
- "sessions.search": "搜索会话标题",
410
- "sessions.searchPlaceholder": "搜索...",
411
- "sessions.allWorkspaces": "全部工作区",
412
- "sessions.noWorkspace": "未关联工作区",
413
- "sessions.allSessions": "全部会话",
414
- "sessions.unarchived": "未归档",
415
- "sessions.archived": "已归档",
416
- "sessions.running": "运行中",
417
- "sessions.selectAll": "全选",
418
- "sessions.selectOne": "选择 {title}",
419
- "sessions.archiveSelected": "归档已选",
420
- "sessions.deleteSelected": "删除已选",
421
- "sessions.selectedCount": "已选择 {count} 个",
422
- "sessions.columnTitle": "会话标题",
423
- "sessions.columnStatus": "状态",
517
+ // src/client/locales/ja.ts
518
+ const ja = {
519
+ "action.delete": "セッションを削除",
520
+ "action.cancel": "キャンセル",
521
+ "action.close": "閉じる",
522
+ "settings.nav": "セッション",
523
+ "settings.title": "セッション",
524
+ "settings.description": "セッションの検索・絞り込み・アーカイブ・削除を行います。",
525
+ "sessions.search": "セッション名を検索",
526
+ "sessions.searchPlaceholder": "検索...",
527
+ "sessions.allWorkspaces": "すべてのワークスペース",
528
+ "sessions.noWorkspace": "ワークスペースなし",
529
+ "sessions.allSessions": "すべてのセッション",
530
+ "sessions.unarchived": "未アーカイブ",
531
+ "sessions.archived": "アーカイブ済み",
532
+ "sessions.running": "実行中",
533
+ "sessions.selectAll": "すべて選択",
534
+ "sessions.selectOne": "{title} を選択",
535
+ "sessions.archiveSelected": "選択項目をアーカイブ",
536
+ "sessions.deleteSelected": "選択項目を削除",
537
+ "sessions.selectedCount": "{count} 件選択中",
538
+ "sessions.columnTitle": "セッション名",
539
+ "sessions.columnStatus": "状態",
424
540
  "sessions.columnActions": "操作",
425
- "sessions.archive": "归档",
426
- "sessions.unarchive": "取消归档",
427
- "sessions.delete": "删除",
428
- "sessions.loading": "正在载入会话…",
429
- "sessions.empty": "暂无会话",
430
- "sessions.noMatches": "没有匹配的会话",
431
- "sessions.loadFailed": "无法读取会话列表",
432
- "sessions.retry": "重试",
433
- "sessions.unavailable": "会话服务尚未就绪,无法归档",
434
- "sessions.actionFailed": "操作失败",
435
- "sessions.bulkPartial.one": "已删除 1 个会话,{failed} 个删除失败。",
436
- "sessions.bulkPartial.other": "已删除 {deleted} 个会话,{failed} 个删除失败。",
437
- "sessions.bulkStopped.one": "已删除 1 个会话,其余未能继续处理。",
438
- "sessions.bulkStopped.other": "已删除 {deleted} 个会话,其余未能继续处理。",
439
- "sessions.bulkArchivePartial.one": "已归档 1 个会话,{skipped} 个运行中的会话已跳过。",
440
- "sessions.bulkArchivePartial.other": "已归档 {archived} 个会话,{skipped} 个运行中的会话已跳过。",
441
- "sessions.bulkArchiveFailed.one": "已归档 1 个会话,{failed} 个归档失败。",
442
- "sessions.bulkArchiveFailed.other": "已归档 {archived} 个会话,{failed} 个归档失败。",
443
- "sessions.deleteSelectedTitle": "删除选中的会话",
444
- "sessions.deleteBatchDescription": "从磁盘移除选中的 {count} 个会话及其所有子会话的日志,正在运行的会话将被终止。此操作不可撤销!",
445
- "sessions.archiveStopTitle": "停止并归档此会话?",
446
- "sessions.archiveStopDescription": "“{title}”仍有正在进行的工作。归档会先停止这些工作,停止的工作不会自动继续。",
447
- "sessions.archiveActivity": "将被停止的工作",
448
- "sessions.activityTurn": "进行中的回合",
449
- "sessions.activitySubagents.one": "1 个运行中的子智能体",
450
- "sessions.activitySubagents.other": "{count} 个运行中的子智能体",
451
- "sessions.activityJobs.one": "1 个后台任务",
452
- "sessions.activityJobs.other": "{count} 个后台任务",
453
- "sessions.activitySchedules.one": "1 条定时提醒",
454
- "sessions.activitySchedules.other": "{count} 条定时提醒",
455
- "sessions.activityOther.one": "1 项其他工作({kind})",
456
- "sessions.activityOther.other": "{count} 项其他工作({kind})",
457
- "sessions.archiveStopAction": "停止并归档",
458
- "sessions.archiveStopPending": "正在停止并归档…",
459
- "delete.title": "删除会话",
460
- "delete.description": "从磁盘移除此会话及其所有子会话的日志,正在运行的会话将被终止。此操作不可撤销!",
461
- "delete.pending": "正在停止并删除…",
462
- "delete.confirm": "删除",
463
- "error.host-stale": "Host 端仍在运行旧版本,请重启 DSH 后重试。",
464
- "error.missing-session": "未指定会话",
465
- "error.unknown-session": "该会话已不存在",
466
- "error.subagent-delete": "子代理会话不能单独删除,请删除其父会话",
467
- "error.delete-failed": "无法删除该会话",
468
- "error.delete-unsupported": "当前 Harness 未暴露删除会话所需的磁盘目录信息",
469
- "error.delete-active": "会话仍在运行({activity}),无法停止,因此未删除",
470
- "error.session-live": "会话仍处于活动状态,无法释放",
471
- "error.delete-partial": "已删除 {deleted} 个会话,但还有 {remaining} 个未能删除;请重试剩余项"
541
+ "sessions.archive": "アーカイブ",
542
+ "sessions.unarchive": "アーカイブを解除",
543
+ "sessions.delete": "削除",
544
+ "sessions.loading": "セッションを読み込み中…",
545
+ "sessions.empty": "セッションはまだありません",
546
+ "sessions.noMatches": "一致するセッションはありません",
547
+ "sessions.loadFailed": "セッション一覧を読み込めませんでした",
548
+ "sessions.retry": "再試行",
549
+ "sessions.unavailable": "セッションサービスが準備できていないため、アーカイブできません",
550
+ "sessions.actionFailed": "操作に失敗しました",
551
+ "sessions.bulkPartial.one": "セッションを 1 件削除しました。{failed} 件は削除できませんでした。",
552
+ "sessions.bulkPartial.other": "セッションを {deleted} 件削除しました。{failed} 件は削除できませんでした。",
553
+ "sessions.bulkStopped.one": "セッションを 1 件削除しました。残りは処理できませんでした。",
554
+ "sessions.bulkStopped.other": "セッションを {deleted} 件削除しました。残りは処理できませんでした。",
555
+ "sessions.bulkArchivePartial.one": "セッションを 1 件アーカイブしました。{skipped} 件は作業中のためスキップしました。",
556
+ "sessions.bulkArchivePartial.other": "セッションを {archived} 件アーカイブしました。{skipped} 件は作業中のためスキップしました。",
557
+ "sessions.bulkArchiveFailed.one": "セッションを 1 件アーカイブしました。{failed} 件はアーカイブできませんでした。",
558
+ "sessions.bulkArchiveFailed.other": "セッションを {archived} 件アーカイブしました。{failed} 件はアーカイブできませんでした。",
559
+ "sessions.deleteSelectedTitle": "選択したセッションを削除",
560
+ "sessions.deleteBatchDescription": "選択した {count} 件のセッションとそのすべてのサブエージェントセッションを、ログを含めてディスクから削除します。実行中のセッションは終了されます。この操作は元に戻せません!",
561
+ "sessions.archiveStopTitle": "このセッションを停止してアーカイブしますか?",
562
+ "sessions.archiveStopDescription": "「{title}」には進行中の作業があります。アーカイブするとまず停止され、停止された作業は自動的に再開されません。",
563
+ "sessions.archiveActivity": "停止される作業",
564
+ "sessions.activityTurn": "進行中のターン",
565
+ "sessions.activitySubagents.one": "実行中のサブエージェント 1 件",
566
+ "sessions.activitySubagents.other": "実行中のサブエージェント {count} 件",
567
+ "sessions.activityJobs.one": "バックグラウンドジョブ 1 件",
568
+ "sessions.activityJobs.other": "バックグラウンドジョブ {count} 件",
569
+ "sessions.activitySchedules.one": "スケジュールされたリマインダー 1 件",
570
+ "sessions.activitySchedules.other": "スケジュールされたリマインダー {count} 件",
571
+ "sessions.activityOther.one": "その他の作業 1 件({kind})",
572
+ "sessions.activityOther.other": "その他の作業 {count} 件({kind})",
573
+ "sessions.archiveStopAction": "停止してアーカイブ",
574
+ "sessions.archiveStopPending": "停止してアーカイブ中…",
575
+ "delete.title": "セッションを削除",
576
+ "delete.description": "このセッションとそのすべてのサブエージェントセッションを、ログを含めてディスクから削除します。実行中のセッションは終了されます。この操作は元に戻せません!",
577
+ "delete.pending": "停止して削除中…",
578
+ "delete.confirm": "削除",
579
+ "error.host-stale": "Host 側が古いビルドのままです。DSH を再起動してから再試行してください。",
580
+ "error.missing-session": "セッションが指定されていません",
581
+ "error.unknown-session": "そのセッションは既に存在しません",
582
+ "error.subagent-delete": "サブエージェントのセッションは単独では削除できません。親の会話を削除してください",
583
+ "error.delete-failed": "セッションを削除できませんでした",
584
+ "error.delete-unsupported": "この Harness は削除に必要なディスク上のセッション配置を公開していません",
585
+ "error.delete-active": "セッションはまだ実行中({activity})で停止できなかったため、削除しませんでした",
586
+ "error.session-live": "セッションがまだ活動中で、解放できませんでした",
587
+ "error.delete-partial": "一部のセッションを削除できませんでした:{deleted} 件を削除、{remaining} 件が残っています。残りを再試行してください",
588
+ "error.session-running": "セッションはまだ実行中で、アーカイブできませんでした",
589
+ "error.activityFallback": "進行中の作業",
590
+ "activity.turn": "進行中のターン",
591
+ "activity.subagent": "実行中のサブエージェント",
592
+ "activity.job": "バックグラウンドジョブ",
593
+ "activity.schedule": "スケジュールされたリマインダー",
594
+ "activity.separator": "、"
595
+ };
596
+ // src/client/locales/es.ts
597
+ const es = {
598
+ "action.delete": "Eliminar sesión",
599
+ "action.cancel": "Cancelar",
600
+ "action.close": "Cerrar",
601
+ "settings.nav": "Sesiones",
602
+ "settings.title": "Sesiones",
603
+ "settings.description": "Busca, filtra, archiva o elimina sesiones.",
604
+ "sessions.search": "Buscar títulos de sesión",
605
+ "sessions.searchPlaceholder": "Buscar...",
606
+ "sessions.allWorkspaces": "Todos los espacios de trabajo",
607
+ "sessions.noWorkspace": "Sin espacio de trabajo",
608
+ "sessions.allSessions": "Todas las sesiones",
609
+ "sessions.unarchived": "Sin archivar",
610
+ "sessions.archived": "Archivadas",
611
+ "sessions.running": "En ejecución",
612
+ "sessions.selectAll": "Seleccionar todo",
613
+ "sessions.selectOne": "Seleccionar {title}",
614
+ "sessions.archiveSelected": "Archivar seleccionadas",
615
+ "sessions.deleteSelected": "Eliminar seleccionadas",
616
+ "sessions.selectedCount": "Seleccionadas: {count}",
617
+ "sessions.columnTitle": "Sesión",
618
+ "sessions.columnStatus": "Estado",
619
+ "sessions.columnActions": "Acciones",
620
+ "sessions.archive": "Archivar",
621
+ "sessions.unarchive": "Desarchivar",
622
+ "sessions.delete": "Eliminar",
623
+ "sessions.loading": "Cargando sesiones…",
624
+ "sessions.empty": "Aún no hay sesiones",
625
+ "sessions.noMatches": "No hay sesiones coincidentes",
626
+ "sessions.loadFailed": "No se pudo cargar la lista de sesiones",
627
+ "sessions.retry": "Reintentar",
628
+ "sessions.unavailable": "Los servicios de sesiones no están listos, por lo que no se puede archivar",
629
+ "sessions.actionFailed": "La acción falló",
630
+ "sessions.bulkPartial.one": "Se eliminó 1 sesión; {failed} no se pudo eliminar.",
631
+ "sessions.bulkPartial.other": "Se eliminaron {deleted} sesiones; {failed} no se pudieron eliminar.",
632
+ "sessions.bulkStopped.one": "Se eliminó 1 sesión; el resto no se pudo procesar.",
633
+ "sessions.bulkStopped.other": "Se eliminaron {deleted} sesiones; el resto no se pudo procesar.",
634
+ "sessions.bulkArchivePartial.one": "Se archivó 1 sesión; {skipped} se omitió porque seguía trabajando.",
635
+ "sessions.bulkArchivePartial.other": "Se archivaron {archived} sesiones; {skipped} se omitieron porque seguían trabajando.",
636
+ "sessions.bulkArchiveFailed.one": "Se archivó 1 sesión; {failed} no se pudo archivar.",
637
+ "sessions.bulkArchiveFailed.other": "Se archivaron {archived} sesiones; {failed} no se pudieron archivar.",
638
+ "sessions.deleteSelectedTitle": "Eliminar las sesiones seleccionadas",
639
+ "sessions.deleteBatchDescription": "Esto elimina del disco las {count} sesiones seleccionadas y todas sus sesiones de subagente, incluidos sus registros. Las sesiones en ejecución se terminarán. ¡Esta acción no se puede deshacer!",
640
+ "sessions.archiveStopTitle": "¿Detener y archivar esta sesión?",
641
+ "sessions.archiveStopDescription": "«{title}» todavía tiene trabajo en progreso. Al archivarla se detiene primero; el trabajo detenido no se reanudará por sí solo.",
642
+ "sessions.archiveActivity": "Trabajo que se detendrá",
643
+ "sessions.activityTurn": "El turno en progreso",
644
+ "sessions.activitySubagents.one": "1 subagente en ejecución",
645
+ "sessions.activitySubagents.other": "{count} subagentes en ejecución",
646
+ "sessions.activityJobs.one": "1 tarea en segundo plano",
647
+ "sessions.activityJobs.other": "{count} tareas en segundo plano",
648
+ "sessions.activitySchedules.one": "1 recordatorio programado",
649
+ "sessions.activitySchedules.other": "{count} recordatorios programados",
650
+ "sessions.activityOther.one": "1 elemento de trabajo más ({kind})",
651
+ "sessions.activityOther.other": "{count} elementos de trabajo más ({kind})",
652
+ "sessions.archiveStopAction": "Detener y archivar",
653
+ "sessions.archiveStopPending": "Deteniendo y archivando…",
654
+ "delete.title": "Eliminar sesión",
655
+ "delete.description": "Esto elimina del disco esta sesión y todas sus sesiones de subagente, incluidos sus registros. Las sesiones en ejecución se terminarán. ¡Esta acción no se puede deshacer!",
656
+ "delete.pending": "Deteniendo y eliminando…",
657
+ "delete.confirm": "Eliminar",
658
+ "error.host-stale": "La mitad Host sigue ejecutando una compilación anterior; reinicia DSH y vuelve a intentarlo.",
659
+ "error.missing-session": "No se indicó ninguna sesión",
660
+ "error.unknown-session": "Esa sesión ya no existe",
661
+ "error.subagent-delete": "Una sesión de subagente no se puede eliminar por sí sola; elimina su conversación principal",
662
+ "error.delete-failed": "No se pudo eliminar la sesión",
663
+ "error.delete-unsupported": "Este Harness no expone la disposición de sesiones en disco necesaria para eliminarlas",
664
+ "error.delete-active": "La sesión sigue en ejecución ({activity}) y no se pudo detener, por lo que no se eliminó",
665
+ "error.session-live": "La sesión sigue activa y no se pudo liberar",
666
+ "error.delete-partial": "No se pudieron eliminar algunas sesiones: {deleted} eliminadas, {remaining} aún presentes. Reintenta las restantes",
667
+ "error.session-running": "La sesión sigue en ejecución y no se pudo archivar",
668
+ "error.activityFallback": "trabajo en progreso",
669
+ "activity.turn": "el turno en progreso",
670
+ "activity.subagent": "subagentes en ejecución",
671
+ "activity.job": "tareas en segundo plano",
672
+ "activity.schedule": "recordatorios programados",
673
+ "activity.separator": ", "
674
+ };
675
+ // src/client/locales/fr.ts
676
+ const fr = {
677
+ "action.delete": "Supprimer la séance",
678
+ "action.cancel": "Annuler",
679
+ "action.close": "Fermer",
680
+ "settings.nav": "Séances",
681
+ "settings.title": "Séances",
682
+ "settings.description": "Recherchez, filtrez, archivez ou supprimez des séances.",
683
+ "sessions.search": "Rechercher les titres de séance",
684
+ "sessions.searchPlaceholder": "Rechercher...",
685
+ "sessions.allWorkspaces": "Tous les espaces de travail",
686
+ "sessions.noWorkspace": "Aucun espace de travail",
687
+ "sessions.allSessions": "Toutes les séances",
688
+ "sessions.unarchived": "Non archivées",
689
+ "sessions.archived": "Archivées",
690
+ "sessions.running": "En cours",
691
+ "sessions.selectAll": "Tout sélectionner",
692
+ "sessions.selectOne": "Sélectionner {title}",
693
+ "sessions.archiveSelected": "Archiver la sélection",
694
+ "sessions.deleteSelected": "Supprimer la sélection",
695
+ "sessions.selectedCount": "Sélection : {count}",
696
+ "sessions.columnTitle": "Séance",
697
+ "sessions.columnStatus": "État",
698
+ "sessions.columnActions": "Actions",
699
+ "sessions.archive": "Archiver",
700
+ "sessions.unarchive": "Désarchiver",
701
+ "sessions.delete": "Supprimer",
702
+ "sessions.loading": "Chargement des séances…",
703
+ "sessions.empty": "Aucune séance pour l’instant",
704
+ "sessions.noMatches": "Aucune séance correspondante",
705
+ "sessions.loadFailed": "Impossible de charger la liste des séances",
706
+ "sessions.retry": "Réessayer",
707
+ "sessions.unavailable": "Les services de séance ne sont pas prêts, l’archivage est donc indisponible",
708
+ "sessions.actionFailed": "L’action a échoué",
709
+ "sessions.bulkPartial.one": "1 séance supprimée ; {failed} n’a pas pu l’être.",
710
+ "sessions.bulkPartial.other": "{deleted} séances supprimées ; {failed} n’ont pas pu l’être.",
711
+ "sessions.bulkStopped.one": "1 séance supprimée ; le reste n’a pas pu être traité.",
712
+ "sessions.bulkStopped.other": "{deleted} séances supprimées ; le reste n’a pas pu être traité.",
713
+ "sessions.bulkArchivePartial.one": "1 séance archivée ; {skipped} ignorée car elle travaillait encore.",
714
+ "sessions.bulkArchivePartial.other": "{archived} séances archivées ; {skipped} ignorées car elles travaillaient encore.",
715
+ "sessions.bulkArchiveFailed.one": "1 séance archivée ; {failed} n’a pas pu l’être.",
716
+ "sessions.bulkArchiveFailed.other": "{archived} séances archivées ; {failed} n’ont pas pu l’être.",
717
+ "sessions.deleteSelectedTitle": "Supprimer les séances sélectionnées",
718
+ "sessions.deleteBatchDescription": "Cela supprime du disque les {count} séances sélectionnées et toutes leurs séances de sous-agent, journaux compris. Les séances en cours seront interrompues. Cette action est irréversible !",
719
+ "sessions.archiveStopTitle": "Arrêter et archiver cette séance ?",
720
+ "sessions.archiveStopDescription": "« {title} » a encore du travail en cours. L’archivage l’arrête d’abord ; le travail arrêté ne reprendra pas de lui-même.",
721
+ "sessions.archiveActivity": "Travail qui sera arrêté",
722
+ "sessions.activityTurn": "Le tour en cours",
723
+ "sessions.activitySubagents.one": "1 sous-agent en cours d’exécution",
724
+ "sessions.activitySubagents.other": "{count} sous-agents en cours d’exécution",
725
+ "sessions.activityJobs.one": "1 tâche en arrière-plan",
726
+ "sessions.activityJobs.other": "{count} tâches en arrière-plan",
727
+ "sessions.activitySchedules.one": "1 rappel programmé",
728
+ "sessions.activitySchedules.other": "{count} rappels programmés",
729
+ "sessions.activityOther.one": "1 autre élément de travail ({kind})",
730
+ "sessions.activityOther.other": "{count} autres éléments de travail ({kind})",
731
+ "sessions.archiveStopAction": "Arrêter et archiver",
732
+ "sessions.archiveStopPending": "Arrêt et archivage…",
733
+ "delete.title": "Supprimer la séance",
734
+ "delete.description": "Cela supprime du disque cette séance et toutes ses séances de sous-agent, journaux compris. Les séances en cours seront interrompues. Cette action est irréversible !",
735
+ "delete.pending": "Arrêt et suppression…",
736
+ "delete.confirm": "Supprimer",
737
+ "error.host-stale": "La moitié Host exécute encore une compilation plus ancienne ; redémarrez DSH et réessayez.",
738
+ "error.missing-session": "Aucune séance n’a été indiquée",
739
+ "error.unknown-session": "Cette séance n’existe plus",
740
+ "error.subagent-delete": "Une séance de sous-agent ne peut pas être supprimée seule ; supprimez sa conversation parente",
741
+ "error.delete-failed": "La séance n’a pas pu être supprimée",
742
+ "error.delete-unsupported": "Ce Harness n’expose pas la disposition des séances sur disque nécessaire à la suppression",
743
+ "error.delete-active": "La séance est encore en cours ({activity}) et n’a pas pu être arrêtée ; elle n’a donc pas été supprimée",
744
+ "error.session-live": "La séance est encore active et n’a pas pu être libérée",
745
+ "error.delete-partial": "Certaines séances n’ont pas pu être supprimées : {deleted} supprimées, {remaining} encore présentes. Réessayez les restantes",
746
+ "error.session-running": "La séance est encore en cours et n’a pas pu être archivée",
747
+ "error.activityFallback": "travail en cours",
748
+ "activity.turn": "le tour en cours",
749
+ "activity.subagent": "sous-agents en cours d’exécution",
750
+ "activity.job": "tâches en arrière-plan",
751
+ "activity.schedule": "rappels programmés",
752
+ "activity.separator": ", "
472
753
  };
754
+ // src/client/locales/de.ts
755
+ const de = {
756
+ "action.delete": "Sitzung löschen",
757
+ "action.cancel": "Abbrechen",
758
+ "action.close": "Schließen",
759
+ "settings.nav": "Sitzungen",
760
+ "settings.title": "Sitzungen",
761
+ "settings.description": "Sitzungen suchen, filtern, archivieren oder löschen.",
762
+ "sessions.search": "Sitzungstitel suchen",
763
+ "sessions.searchPlaceholder": "Suchen...",
764
+ "sessions.allWorkspaces": "Alle Arbeitsbereiche",
765
+ "sessions.noWorkspace": "Kein Arbeitsbereich",
766
+ "sessions.allSessions": "Alle Sitzungen",
767
+ "sessions.unarchived": "Nicht archiviert",
768
+ "sessions.archived": "Archiviert",
769
+ "sessions.running": "Läuft",
770
+ "sessions.selectAll": "Alle auswählen",
771
+ "sessions.selectOne": "{title} auswählen",
772
+ "sessions.archiveSelected": "Ausgewählte archivieren",
773
+ "sessions.deleteSelected": "Ausgewählte löschen",
774
+ "sessions.selectedCount": "{count} ausgewählt",
775
+ "sessions.columnTitle": "Sitzung",
776
+ "sessions.columnStatus": "Status",
777
+ "sessions.columnActions": "Aktionen",
778
+ "sessions.archive": "Archivieren",
779
+ "sessions.unarchive": "Dearchivieren",
780
+ "sessions.delete": "Löschen",
781
+ "sessions.loading": "Sitzungen werden geladen…",
782
+ "sessions.empty": "Noch keine Sitzungen",
783
+ "sessions.noMatches": "Keine passenden Sitzungen",
784
+ "sessions.loadFailed": "Die Sitzungsliste konnte nicht geladen werden",
785
+ "sessions.retry": "Erneut versuchen",
786
+ "sessions.unavailable": "Die Sitzungsdienste sind noch nicht bereit, daher ist das Archivieren nicht möglich",
787
+ "sessions.actionFailed": "Die Aktion ist fehlgeschlagen",
788
+ "sessions.bulkPartial.one": "1 Sitzung gelöscht; {failed} konnte nicht gelöscht werden.",
789
+ "sessions.bulkPartial.other": "{deleted} Sitzungen gelöscht; {failed} konnten nicht gelöscht werden.",
790
+ "sessions.bulkStopped.one": "1 Sitzung gelöscht; der Rest konnte nicht verarbeitet werden.",
791
+ "sessions.bulkStopped.other": "{deleted} Sitzungen gelöscht; der Rest konnte nicht verarbeitet werden.",
792
+ "sessions.bulkArchivePartial.one": "1 Sitzung archiviert; {skipped} übersprungen, weil noch Arbeit lief.",
793
+ "sessions.bulkArchivePartial.other": "{archived} Sitzungen archiviert; {skipped} übersprungen, weil noch Arbeit lief.",
794
+ "sessions.bulkArchiveFailed.one": "1 Sitzung archiviert; {failed} konnte nicht archiviert werden.",
795
+ "sessions.bulkArchiveFailed.other": "{archived} Sitzungen archiviert; {failed} konnten nicht archiviert werden.",
796
+ "sessions.deleteSelectedTitle": "Ausgewählte Sitzungen löschen",
797
+ "sessions.deleteBatchDescription": "Dadurch werden die {count} ausgewählten Sitzungen und alle ihre Subagenten-Sitzungen samt Protokollen von der Festplatte entfernt. Laufende Sitzungen werden beendet. Dies kann nicht rückgängig gemacht werden!",
798
+ "sessions.archiveStopTitle": "Diese Sitzung stoppen und archivieren?",
799
+ "sessions.archiveStopDescription": "„{title}“ hat noch laufende Arbeit. Das Archivieren stoppt sie zuerst; die gestoppte Arbeit wird nicht von selbst fortgesetzt.",
800
+ "sessions.archiveActivity": "Arbeit, die gestoppt wird",
801
+ "sessions.activityTurn": "Die laufende Runde",
802
+ "sessions.activitySubagents.one": "1 laufender Subagent",
803
+ "sessions.activitySubagents.other": "{count} laufende Subagenten",
804
+ "sessions.activityJobs.one": "1 Hintergrundjob",
805
+ "sessions.activityJobs.other": "{count} Hintergrundjobs",
806
+ "sessions.activitySchedules.one": "1 geplante Erinnerung",
807
+ "sessions.activitySchedules.other": "{count} geplante Erinnerungen",
808
+ "sessions.activityOther.one": "1 weiterer Arbeitsschritt ({kind})",
809
+ "sessions.activityOther.other": "{count} weitere Arbeitsschritte ({kind})",
810
+ "sessions.archiveStopAction": "Stoppen und archivieren",
811
+ "sessions.archiveStopPending": "Wird gestoppt und archiviert…",
812
+ "delete.title": "Sitzung löschen",
813
+ "delete.description": "Dadurch werden diese Sitzung und alle ihre Subagenten-Sitzungen samt Protokollen von der Festplatte entfernt. Laufende Sitzungen werden beendet. Dies kann nicht rückgängig gemacht werden!",
814
+ "delete.pending": "Wird gestoppt und gelöscht…",
815
+ "delete.confirm": "Löschen",
816
+ "error.host-stale": "Die Host-Hälfte läuft noch mit einem älteren Build; starte DSH neu und versuche es erneut.",
817
+ "error.missing-session": "Es wurde keine Sitzung benannt",
818
+ "error.unknown-session": "Diese Sitzung existiert nicht mehr",
819
+ "error.subagent-delete": "Eine Subagenten-Sitzung kann nicht allein gelöscht werden; lösche ihre übergeordnete Unterhaltung",
820
+ "error.delete-failed": "Die Sitzung konnte nicht gelöscht werden",
821
+ "error.delete-unsupported": "Dieses Harness legt die für das Löschen nötige Sitzungsablage auf der Festplatte nicht offen",
822
+ "error.delete-active": "Die Sitzung läuft noch ({activity}) und konnte nicht gestoppt werden, daher wurde sie nicht gelöscht",
823
+ "error.session-live": "Die Sitzung ist noch aktiv und konnte nicht freigegeben werden",
824
+ "error.delete-partial": "Einige Sitzungen konnten nicht gelöscht werden: {deleted} entfernt, {remaining} weiterhin vorhanden. Versuche es bei den restlichen erneut",
825
+ "error.session-running": "Die Sitzung läuft noch und konnte nicht archiviert werden",
826
+ "error.activityFallback": "laufende Arbeit",
827
+ "activity.turn": "die laufende Runde",
828
+ "activity.subagent": "laufende Subagenten",
829
+ "activity.job": "Hintergrundjobs",
830
+ "activity.schedule": "geplante Erinnerungen",
831
+ "activity.separator": ", "
832
+ };
833
+ // src/client/locales/ru.ts
834
+ const ru = {
835
+ "action.delete": "Удалить сеанс",
836
+ "action.cancel": "Отмена",
837
+ "action.close": "Закрыть",
838
+ "settings.nav": "Сеансы",
839
+ "settings.title": "Сеансы",
840
+ "settings.description": "Поиск, фильтрация, архивирование и удаление сеансов.",
841
+ "sessions.search": "Поиск по названиям сеансов",
842
+ "sessions.searchPlaceholder": "Поиск...",
843
+ "sessions.allWorkspaces": "Все рабочие области",
844
+ "sessions.noWorkspace": "Без рабочей области",
845
+ "sessions.allSessions": "Все сеансы",
846
+ "sessions.unarchived": "Неархивированные",
847
+ "sessions.archived": "Архивированные",
848
+ "sessions.running": "Выполняется",
849
+ "sessions.selectAll": "Выбрать все",
850
+ "sessions.selectOne": "Выбрать {title}",
851
+ "sessions.archiveSelected": "Архивировать выбранные",
852
+ "sessions.deleteSelected": "Удалить выбранные",
853
+ "sessions.selectedCount": "Выбрано: {count}",
854
+ "sessions.columnTitle": "Сеанс",
855
+ "sessions.columnStatus": "Состояние",
856
+ "sessions.columnActions": "Действия",
857
+ "sessions.archive": "Архивировать",
858
+ "sessions.unarchive": "Разархивировать",
859
+ "sessions.delete": "Удалить",
860
+ "sessions.loading": "Загрузка сеансов…",
861
+ "sessions.empty": "Сеансов пока нет",
862
+ "sessions.noMatches": "Подходящих сеансов нет",
863
+ "sessions.loadFailed": "Не удалось загрузить список сеансов",
864
+ "sessions.retry": "Повторить",
865
+ "sessions.unavailable": "Службы сеансов не готовы, поэтому архивирование недоступно",
866
+ "sessions.actionFailed": "Действие не выполнено",
867
+ "sessions.bulkPartial.one": "Удалён 1 сеанс; {failed} удалить не удалось.",
868
+ "sessions.bulkPartial.other": "Удалено сеансов: {deleted}; удалить не удалось: {failed}.",
869
+ "sessions.bulkStopped.one": "Удалён 1 сеанс; остальные обработать не удалось.",
870
+ "sessions.bulkStopped.other": "Удалено сеансов: {deleted}; остальные обработать не удалось.",
871
+ "sessions.bulkArchivePartial.one": "Архивирован 1 сеанс; {skipped} пропущен, так как в нём ещё шла работа.",
872
+ "sessions.bulkArchivePartial.other": "Архивировано сеансов: {archived}; пропущено из-за незавершённой работы: {skipped}.",
873
+ "sessions.bulkArchiveFailed.one": "Архивирован 1 сеанс; {failed} архивировать не удалось.",
874
+ "sessions.bulkArchiveFailed.other": "Архивировано сеансов: {archived}; архивировать не удалось: {failed}.",
875
+ "sessions.deleteSelectedTitle": "Удалить выбранные сеансы",
876
+ "sessions.deleteBatchDescription": "Это удалит с диска {count} выбранных сеансов и все их сеансы субагентов вместе с журналами. Выполняющиеся сеансы будут прерваны. Отменить это невозможно!",
877
+ "sessions.archiveStopTitle": "Остановить и заархивировать этот сеанс?",
878
+ "sessions.archiveStopDescription": "В «{title}» ещё идёт работа. Архивирование сначала остановит её; остановленная работа не возобновится сама по себе.",
879
+ "sessions.archiveActivity": "Работа, которая будет остановлена",
880
+ "sessions.activityTurn": "Текущий ход",
881
+ "sessions.activitySubagents.one": "1 работающий субагент",
882
+ "sessions.activitySubagents.other": "Работающих субагентов: {count}",
883
+ "sessions.activityJobs.one": "1 фоновое задание",
884
+ "sessions.activityJobs.other": "Фоновых заданий: {count}",
885
+ "sessions.activitySchedules.one": "1 запланированное напоминание",
886
+ "sessions.activitySchedules.other": "Запланированных напоминаний: {count}",
887
+ "sessions.activityOther.one": "1 другой элемент работы ({kind})",
888
+ "sessions.activityOther.other": "Других элементов работы: {count} ({kind})",
889
+ "sessions.archiveStopAction": "Остановить и заархивировать",
890
+ "sessions.archiveStopPending": "Остановка и архивирование…",
891
+ "delete.title": "Удалить сеанс",
892
+ "delete.description": "Это удалит с диска этот сеанс и все его сеансы субагентов вместе с журналами. Выполняющиеся сеансы будут прерваны. Отменить это невозможно!",
893
+ "delete.pending": "Остановка и удаление…",
894
+ "delete.confirm": "Удалить",
895
+ "error.host-stale": "Host-часть всё ещё работает на старой сборке; перезапустите DSH и повторите попытку.",
896
+ "error.missing-session": "Сеанс не указан",
897
+ "error.unknown-session": "Такого сеанса больше нет",
898
+ "error.subagent-delete": "Сеанс субагента нельзя удалить отдельно; удалите его родительский диалог",
899
+ "error.delete-failed": "Не удалось удалить сеанс",
900
+ "error.delete-unsupported": "Этот Harness не предоставляет раскладку сеансов на диске, необходимую для удаления",
901
+ "error.delete-active": "Сеанс всё ещё выполняется ({activity}) и остановить его не удалось, поэтому он не удалён",
902
+ "error.session-live": "Сеанс всё ещё активен, и освободить его не удалось",
903
+ "error.delete-partial": "Часть сеансов удалить не удалось: удалено {deleted}, осталось {remaining}. Повторите попытку для оставшихся",
904
+ "error.session-running": "Сеанс всё ещё выполняется, и заархивировать его не удалось",
905
+ "error.activityFallback": "идущая работа",
906
+ "activity.turn": "текущий ход",
907
+ "activity.subagent": "работающие субагенты",
908
+ "activity.job": "фоновые задания",
909
+ "activity.schedule": "запланированные напоминания",
910
+ "activity.separator": ", "
911
+ };
912
+ // src/client/locales/pt.ts
913
+ const pt = {
914
+ "action.delete": "Excluir sessão",
915
+ "action.cancel": "Cancelar",
916
+ "action.close": "Fechar",
917
+ "settings.nav": "Sessões",
918
+ "settings.title": "Sessões",
919
+ "settings.description": "Pesquise, filtre, arquive ou exclua sessões.",
920
+ "sessions.search": "Pesquisar títulos de sessão",
921
+ "sessions.searchPlaceholder": "Pesquisar...",
922
+ "sessions.allWorkspaces": "Todos os espaços de trabalho",
923
+ "sessions.noWorkspace": "Sem espaço de trabalho",
924
+ "sessions.allSessions": "Todas as sessões",
925
+ "sessions.unarchived": "Não arquivadas",
926
+ "sessions.archived": "Arquivadas",
927
+ "sessions.running": "Em execução",
928
+ "sessions.selectAll": "Selecionar tudo",
929
+ "sessions.selectOne": "Selecionar {title}",
930
+ "sessions.archiveSelected": "Arquivar selecionadas",
931
+ "sessions.deleteSelected": "Excluir selecionadas",
932
+ "sessions.selectedCount": "Selecionadas: {count}",
933
+ "sessions.columnTitle": "Sessão",
934
+ "sessions.columnStatus": "Status",
935
+ "sessions.columnActions": "Ações",
936
+ "sessions.archive": "Arquivar",
937
+ "sessions.unarchive": "Desarquivar",
938
+ "sessions.delete": "Excluir",
939
+ "sessions.loading": "Carregando sessões…",
940
+ "sessions.empty": "Ainda não há sessões",
941
+ "sessions.noMatches": "Nenhuma sessão correspondente",
942
+ "sessions.loadFailed": "Não foi possível carregar a lista de sessões",
943
+ "sessions.retry": "Tentar novamente",
944
+ "sessions.unavailable": "Os serviços de sessão não estão prontos, então o arquivamento não está disponível",
945
+ "sessions.actionFailed": "A ação falhou",
946
+ "sessions.bulkPartial.one": "1 sessão excluída; {failed} não pôde ser excluída.",
947
+ "sessions.bulkPartial.other": "{deleted} sessões excluídas; {failed} não puderam ser excluídas.",
948
+ "sessions.bulkStopped.one": "1 sessão excluída; o restante não pôde ser processado.",
949
+ "sessions.bulkStopped.other": "{deleted} sessões excluídas; o restante não pôde ser processado.",
950
+ "sessions.bulkArchivePartial.one": "1 sessão arquivada; {skipped} ignorada porque ainda havia trabalho em andamento.",
951
+ "sessions.bulkArchivePartial.other": "{archived} sessões arquivadas; {skipped} ignoradas porque ainda havia trabalho em andamento.",
952
+ "sessions.bulkArchiveFailed.one": "1 sessão arquivada; {failed} não pôde ser arquivada.",
953
+ "sessions.bulkArchiveFailed.other": "{archived} sessões arquivadas; {failed} não puderam ser arquivadas.",
954
+ "sessions.deleteSelectedTitle": "Excluir as sessões selecionadas",
955
+ "sessions.deleteBatchDescription": "Isso remove do disco as {count} sessões selecionadas e todas as suas sessões de subagente, incluindo seus registros. As sessões em execução serão encerradas. Esta ação não pode ser desfeita!",
956
+ "sessions.archiveStopTitle": "Parar e arquivar esta sessão?",
957
+ "sessions.archiveStopDescription": "“{title}” ainda tem trabalho em andamento. Arquivar interrompe esse trabalho primeiro; o trabalho interrompido não será retomado sozinho.",
958
+ "sessions.archiveActivity": "Trabalho que será interrompido",
959
+ "sessions.activityTurn": "O turno em andamento",
960
+ "sessions.activitySubagents.one": "1 subagente em execução",
961
+ "sessions.activitySubagents.other": "{count} subagentes em execução",
962
+ "sessions.activityJobs.one": "1 tarefa em segundo plano",
963
+ "sessions.activityJobs.other": "{count} tarefas em segundo plano",
964
+ "sessions.activitySchedules.one": "1 lembrete agendado",
965
+ "sessions.activitySchedules.other": "{count} lembretes agendados",
966
+ "sessions.activityOther.one": "1 outro item de trabalho ({kind})",
967
+ "sessions.activityOther.other": "{count} outros itens de trabalho ({kind})",
968
+ "sessions.archiveStopAction": "Parar e arquivar",
969
+ "sessions.archiveStopPending": "Parando e arquivando…",
970
+ "delete.title": "Excluir sessão",
971
+ "delete.description": "Isso remove do disco esta sessão e todas as suas sessões de subagente, incluindo seus registros. As sessões em execução serão encerradas. Esta ação não pode ser desfeita!",
972
+ "delete.pending": "Parando e excluindo…",
973
+ "delete.confirm": "Excluir",
974
+ "error.host-stale": "A metade Host ainda está executando uma compilação mais antiga; reinicie o DSH e tente novamente.",
975
+ "error.missing-session": "Nenhuma sessão foi indicada",
976
+ "error.unknown-session": "Essa sessão não existe mais",
977
+ "error.subagent-delete": "Uma sessão de subagente não pode ser excluída sozinha; exclua a conversa principal dela",
978
+ "error.delete-failed": "Não foi possível excluir a sessão",
979
+ "error.delete-unsupported": "Este Harness não expõe o layout de sessões em disco necessário para excluir",
980
+ "error.delete-active": "A sessão ainda está em execução ({activity}) e não pôde ser interrompida, então não foi excluída",
981
+ "error.session-live": "A sessão ainda está ativa e não pôde ser liberada",
982
+ "error.delete-partial": "Algumas sessões não puderam ser excluídas: {deleted} removidas, {remaining} ainda presentes. Tente novamente as restantes",
983
+ "error.session-running": "A sessão ainda está em execução e não pôde ser arquivada",
984
+ "error.activityFallback": "trabalho em andamento",
985
+ "activity.turn": "o turno em andamento",
986
+ "activity.subagent": "subagentes em execução",
987
+ "activity.job": "tarefas em segundo plano",
988
+ "activity.schedule": "lembretes agendados",
989
+ "activity.separator": ", "
990
+ };
991
+ // src/client/locales.ts
992
+ /** The dictionary namespace this page owns. */
993
+ const NS = "coolSession";
994
+ /** Every dictionary, in the shape the locale service registers. */
995
+ const DICTIONARIES = {
996
+ zh,
997
+ en,
998
+ ja,
999
+ es,
1000
+ fr,
1001
+ de,
1002
+ ru,
1003
+ pt
1004
+ };
1005
+ /**
1006
+ * Pick the singular or plural spelling of a count-bearing message.
1007
+ *
1008
+ * @param base - the message family, whose `.one` and `.other` entries exist.
1009
+ * @param count - the number the sentence reports.
1010
+ * @returns the key to translate.
1011
+ */
1012
+ function countKey(base, count) {
1013
+ return `${base}.${count === 1 ? "one" : "other"}`;
1014
+ }
1015
+ /**
1016
+ * Every spelling of the Settings navigation label this package ships.
1017
+ *
1018
+ * The Settings navigation glyph is patched by matching the rendered label, and
1019
+ * the shell's CSS module class names rotate between releases, so the label is
1020
+ * the only stable handle on that cell. A language switch can land between
1021
+ * registration and that read, so the set covers all eight dictionaries rather
1022
+ * than only the active one.
1023
+ *
1024
+ * @returns the distinct navigation labels, in dictionary order.
1025
+ */
1026
+ function navLabels() {
1027
+ return [...new Set(Object.values(DICTIONARIES).map((dict) => dict["settings.nav"]))];
1028
+ }
473
1029
  // src/client/settings-section.tsx
474
1030
  /**
475
1031
  * The Sessions page of the Settings panel: list, search, filter, selection,
@@ -555,7 +1111,7 @@ window.__ModuleLoader__.load({
555
1111
  function problemText(t, problem) {
556
1112
  const parts = [];
557
1113
  if (problem.prefix !== void 0) parts.push(t(problem.prefix.key, problem.prefix.params));
558
- if (problem.failure !== void 0) parts.push(t(`error.${problem.failure.code}`, problem.failure.params));
1114
+ if (problem.failure !== void 0) parts.push(failureText(t, problem.failure));
559
1115
  else if (typeof problem.error === "string" && problem.error !== "") parts.push(problem.error === "HTTP 405" ? t("error.host-stale") : problem.error);
560
1116
  else if (problem.prefix === void 0) parts.push(t(problem.fallback ?? "sessions.actionFailed"));
561
1117
  return parts.join(" ");
@@ -932,7 +1488,7 @@ window.__ModuleLoader__.load({
932
1488
  return;
933
1489
  }
934
1490
  if (result.failure !== void 0) {
935
- setArchiveError(t(`error.${result.failure.code}`, result.failure.params));
1491
+ setArchiveError(failureText(t, result.failure));
936
1492
  return;
937
1493
  }
938
1494
  setArchiveError(typeof result.message === "string" && result.message !== "" ? result.message : t("sessions.actionFailed"));
@@ -1277,7 +1833,7 @@ window.__ModuleLoader__.load({
1277
1833
  };
1278
1834
  return {
1279
1835
  ok: false,
1280
- message: typeof failure.rpcError?.message === "string" && failure.rpcError.message !== "" ? failure.rpcError.message : "the session is still running"
1836
+ failure: { code: "session-running" }
1281
1837
  };
1282
1838
  }
1283
1839
  if (code === "session/not-found") return {
@@ -1312,17 +1868,14 @@ window.__ModuleLoader__.load({
1312
1868
  const ICON_ATTRIBUTE = "data-dsh-cs-nav-icon";
1313
1869
  /** Marks the gear this module hid, so disposal can restore it. */
1314
1870
  const HIDDEN_ATTRIBUTE = "data-dsh-cs-nav-hidden";
1315
- /** The nav label in every locale, plus the one this render is reading. */
1871
+ /** The nav label in every translated language, plus the one this render is reading. */
1316
1872
  function settingsLabels(t) {
1317
- let current = "";
1873
+ const labels = new Set(navLabels());
1318
1874
  try {
1319
- current = t("settings.nav");
1875
+ const current = t("settings.nav");
1876
+ if (current !== "") labels.add(current);
1320
1877
  } catch {}
1321
- return [
1322
- zh["settings.nav"],
1323
- en["settings.nav"],
1324
- current
1325
- ];
1878
+ return [...labels];
1326
1879
  }
1327
1880
  /**
1328
1881
  * Find the settings navigation cells, tolerating a rotated class hash.
@@ -1523,10 +2076,7 @@ window.__ModuleLoader__.load({
1523
2076
  if (slots === void 0) return;
1524
2077
  const locale = ctx.get("locale");
1525
2078
  ctx.effect(() => insertStyles(), "dsh-cool-session: styles");
1526
- ctx.effect(() => locale.register(NS, {
1527
- zh,
1528
- en
1529
- }), "dsh-cool-session: dictionaries");
2079
+ ctx.effect(() => locale.register(NS, DICTIONARIES), "dsh-cool-session: dictionaries");
1530
2080
  const t = locale.bind(NS);
1531
2081
  const afterDelete = (sessionId) => {
1532
2082
  const uiWorkspace = ctx.get("uiWorkspace");