privateboard 0.1.32 → 0.1.37

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.
@@ -0,0 +1 @@
1
+ <svg viewBox="120 128 272 272" xmlns="http://www.w3.org/2000/svg" shape-rendering="crispEdges" preserveAspectRatio="xMidYMid meet"><rect x="192" y="160" width="16" height="16" fill="#ce8a5a"/><rect x="208" y="160" width="16" height="16" fill="#ce8a5a"/><rect x="224" y="160" width="16" height="16" fill="#a35a32"/><rect x="240" y="160" width="16" height="16" fill="#a35a32"/><rect x="256" y="160" width="16" height="16" fill="#a35a32"/><rect x="272" y="160" width="16" height="16" fill="#a35a32"/><rect x="288" y="160" width="16" height="16" fill="#a35a32"/><rect x="304" y="160" width="16" height="16" fill="#a35a32"/><rect x="176" y="176" width="16" height="16" fill="#ce8a5a"/><rect x="192" y="176" width="16" height="16" fill="#ce8a5a"/><rect x="208" y="176" width="16" height="16" fill="#a35a32"/><rect x="224" y="176" width="16" height="16" fill="#a35a32"/><rect x="240" y="176" width="16" height="16" fill="#a35a32"/><rect x="256" y="176" width="16" height="16" fill="#a35a32"/><rect x="272" y="176" width="16" height="16" fill="#a35a32"/><rect x="288" y="176" width="16" height="16" fill="#a35a32"/><rect x="304" y="176" width="16" height="16" fill="#a35a32"/><rect x="320" y="176" width="16" height="16" fill="#a35a32"/><rect x="160" y="192" width="16" height="16" fill="#ce8a5a"/><rect x="176" y="192" width="16" height="16" fill="#ce8a5a"/><rect x="192" y="192" width="16" height="16" fill="#a35a32"/><rect x="208" y="192" width="16" height="16" fill="#a35a32"/><rect x="224" y="192" width="16" height="16" fill="#a35a32"/><rect x="240" y="192" width="16" height="16" fill="#a35a32"/><rect x="256" y="192" width="16" height="16" fill="#a35a32"/><rect x="272" y="192" width="16" height="16" fill="#a35a32"/><rect x="288" y="192" width="16" height="16" fill="#a35a32"/><rect x="304" y="192" width="16" height="16" fill="#a35a32"/><rect x="320" y="192" width="16" height="16" fill="#a35a32"/><rect x="336" y="192" width="16" height="16" fill="#a35a32"/><rect x="160" y="208" width="16" height="16" fill="#a35a32"/><rect x="176" y="208" width="16" height="16" fill="#a35a32"/><rect x="192" y="208" width="16" height="16" fill="#a35a32"/><rect x="208" y="208" width="16" height="16" fill="#a35a32"/><rect x="224" y="208" width="16" height="16" fill="#a35a32"/><rect x="240" y="208" width="16" height="16" fill="#a35a32"/><rect x="256" y="208" width="16" height="16" fill="#a35a32"/><rect x="272" y="208" width="16" height="16" fill="#a35a32"/><rect x="288" y="208" width="16" height="16" fill="#a35a32"/><rect x="304" y="208" width="16" height="16" fill="#a35a32"/><rect x="320" y="208" width="16" height="16" fill="#a35a32"/><rect x="336" y="208" width="16" height="16" fill="#a35a32"/><rect x="160" y="224" width="16" height="16" fill="#a35a32"/><rect x="176" y="224" width="16" height="16" fill="#a35a32"/><rect x="192" y="224" width="16" height="16" fill="#a35a32"/><rect x="208" y="224" width="16" height="16" fill="#1a0805"/><rect x="224" y="224" width="16" height="16" fill="#a35a32"/><rect x="240" y="224" width="16" height="16" fill="#a35a32"/><rect x="256" y="224" width="16" height="16" fill="#a35a32"/><rect x="272" y="224" width="16" height="16" fill="#a35a32"/><rect x="288" y="224" width="16" height="16" fill="#1a0805"/><rect x="304" y="224" width="16" height="16" fill="#a35a32"/><rect x="320" y="224" width="16" height="16" fill="#a35a32"/><rect x="336" y="224" width="16" height="16" fill="#a35a32"/><rect x="160" y="240" width="16" height="16" fill="#a35a32"/><rect x="176" y="240" width="16" height="16" fill="#a35a32"/><rect x="192" y="240" width="16" height="16" fill="#a35a32"/><rect x="208" y="240" width="16" height="16" fill="#a35a32"/><rect x="224" y="240" width="16" height="16" fill="#a35a32"/><rect x="240" y="240" width="16" height="16" fill="#a35a32"/><rect x="256" y="240" width="16" height="16" fill="#a35a32"/><rect x="272" y="240" width="16" height="16" fill="#a35a32"/><rect x="288" y="240" width="16" height="16" fill="#a35a32"/><rect x="304" y="240" width="16" height="16" fill="#a35a32"/><rect x="320" y="240" width="16" height="16" fill="#a35a32"/><rect x="336" y="240" width="16" height="16" fill="#a35a32"/><rect x="160" y="256" width="16" height="16" fill="#a35a32"/><rect x="176" y="256" width="16" height="16" fill="#a35a32"/><rect x="192" y="256" width="16" height="16" fill="#a35a32"/><rect x="208" y="256" width="16" height="16" fill="#a35a32"/><rect x="224" y="256" width="16" height="16" fill="#a35a32"/><rect x="240" y="256" width="16" height="16" fill="#a35a32"/><rect x="256" y="256" width="16" height="16" fill="#a35a32"/><rect x="272" y="256" width="16" height="16" fill="#a35a32"/><rect x="288" y="256" width="16" height="16" fill="#a35a32"/><rect x="304" y="256" width="16" height="16" fill="#a35a32"/><rect x="320" y="256" width="16" height="16" fill="#a35a32"/><rect x="336" y="256" width="16" height="16" fill="#a35a32"/><rect x="160" y="272" width="16" height="16" fill="#5a2a10"/><rect x="176" y="272" width="16" height="16" fill="#5a2a10"/><rect x="192" y="272" width="16" height="16" fill="#5a2a10"/><rect x="208" y="272" width="16" height="16" fill="#5a2a10"/><rect x="224" y="272" width="16" height="16" fill="#5a2a10"/><rect x="240" y="272" width="16" height="16" fill="#cfb56a"/><rect x="256" y="272" width="16" height="16" fill="#cfb56a"/><rect x="272" y="272" width="16" height="16" fill="#5a2a10"/><rect x="288" y="272" width="16" height="16" fill="#5a2a10"/><rect x="304" y="272" width="16" height="16" fill="#5a2a10"/><rect x="320" y="272" width="16" height="16" fill="#5a2a10"/><rect x="336" y="272" width="16" height="16" fill="#5a2a10"/><rect x="160" y="288" width="16" height="16" fill="#a35a32"/><rect x="176" y="288" width="16" height="16" fill="#a35a32"/><rect x="192" y="288" width="16" height="16" fill="#a35a32"/><rect x="208" y="288" width="16" height="16" fill="#a35a32"/><rect x="224" y="288" width="16" height="16" fill="#a35a32"/><rect x="240" y="288" width="16" height="16" fill="#a35a32"/><rect x="256" y="288" width="16" height="16" fill="#a35a32"/><rect x="272" y="288" width="16" height="16" fill="#a35a32"/><rect x="288" y="288" width="16" height="16" fill="#a35a32"/><rect x="304" y="288" width="16" height="16" fill="#a35a32"/><rect x="320" y="288" width="16" height="16" fill="#6e3814"/><rect x="336" y="288" width="16" height="16" fill="#6e3814"/><rect x="160" y="304" width="16" height="16" fill="#a35a32"/><rect x="176" y="304" width="16" height="16" fill="#a35a32"/><rect x="192" y="304" width="16" height="16" fill="#a35a32"/><rect x="208" y="304" width="16" height="16" fill="#a35a32"/><rect x="224" y="304" width="16" height="16" fill="#a35a32"/><rect x="240" y="304" width="16" height="16" fill="#a35a32"/><rect x="256" y="304" width="16" height="16" fill="#a35a32"/><rect x="272" y="304" width="16" height="16" fill="#a35a32"/><rect x="288" y="304" width="16" height="16" fill="#a35a32"/><rect x="304" y="304" width="16" height="16" fill="#6e3814"/><rect x="320" y="304" width="16" height="16" fill="#6e3814"/><rect x="336" y="304" width="16" height="16" fill="#a35a32"/><rect x="176" y="320" width="16" height="16" fill="#a35a32"/><rect x="192" y="320" width="16" height="16" fill="#a35a32"/><rect x="208" y="320" width="16" height="16" fill="#a35a32"/><rect x="224" y="320" width="16" height="16" fill="#a35a32"/><rect x="240" y="320" width="16" height="16" fill="#a35a32"/><rect x="256" y="320" width="16" height="16" fill="#a35a32"/><rect x="272" y="320" width="16" height="16" fill="#a35a32"/><rect x="288" y="320" width="16" height="16" fill="#a35a32"/><rect x="304" y="320" width="16" height="16" fill="#a35a32"/><rect x="320" y="320" width="16" height="16" fill="#6e3814"/><rect x="192" y="336" width="16" height="16" fill="#a35a32"/><rect x="208" y="336" width="16" height="16" fill="#a35a32"/><rect x="288" y="336" width="16" height="16" fill="#a35a32"/><rect x="304" y="336" width="16" height="16" fill="#6e3814"/><rect x="192" y="352" width="16" height="16" fill="#3e1c08"/><rect x="208" y="352" width="16" height="16" fill="#3e1c08"/><rect x="288" y="352" width="16" height="16" fill="#3e1c08"/><rect x="304" y="352" width="16" height="16" fill="#3e1c08"/></svg>
@@ -90,6 +90,12 @@
90
90
  elevationDeg: 24, // soft top-down lean (default 30 was steep, 18 too flat)
91
91
  lookAtY: 0.75, // target slightly above the table top so seated heads centre
92
92
  },
93
+ // Suppress the built-in loading veil · the marketing hero
94
+ // already shows a static poster (`home-3d-poster.*`) which
95
+ // covers the mount → first-frame gap. Layering the veil on
96
+ // top of the poster would just darken it before the canvas
97
+ // takes over.
98
+ loading: false,
93
99
  })) return;
94
100
 
95
101
  // Pull the cast + start the rotating-speaker driver. The mock
package/public/home.html CHANGED
@@ -1622,7 +1622,7 @@
1622
1622
 
1623
1623
  <div class="hero-actions">
1624
1624
  <a href="#install" class="big-btn primary">[ ◆ Convene a Room ]</a>
1625
- <a href="https://github.com/kaysaith1900/privateboard/releases/download/v0.1.31/PrivateBoard-0.1.31-arm64.dmg"
1625
+ <a href="https://github.com/kaysaith1900/privateboard/releases/download/v0.1.36/PrivateBoard-0.1.36-arm64.dmg"
1626
1626
  class="big-btn secondary"
1627
1627
  download
1628
1628
  aria-label="Download PrivateBoard for macOS (Apple Silicon)"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M12 3v12"/><polyline points="6 11 12 17 18 11"/><path d="M5 21h14"/></svg> Download for Mac</a>
package/public/i18n.js CHANGED
@@ -24,6 +24,13 @@
24
24
  locale_es: "Español",
25
25
  aria_language: "Language",
26
26
 
27
+ // Search overlay · floating command-palette palette over the
28
+ // current view (sidebar Search nav, Cmd+K).
29
+ search_overlay_placeholder: "Search rooms and messages",
30
+ search_overlay_empty_title: "Search across rooms and messages",
31
+ search_overlay_empty_hint: "Type to filter live · click a result to jump",
32
+ search_overlay_close: "Close",
33
+
27
34
  brand_privateboard: "PRIVATEBOARD",
28
35
  brand_control: "CONTROL",
29
36
  classification: "PRIVATE ACCESS",
@@ -384,6 +391,24 @@
384
391
  ap_voice_modify_intensity: "intensity trim",
385
392
  ap_voice_modify_timbre: "timbre trim",
386
393
  ap_voice_preview_btn_title: "Preview sample",
394
+ /* Sample line spoken by the preview button on the Voice Setup
395
+ panel. Localised per active UI locale so an English-locale
396
+ user doesn't get a Chinese sample read back to them. Kept
397
+ short (under 200 chars · server caps anyway) and self-
398
+ describing so the voice's character lands quickly. */
399
+ ap_voice_preview_sample: "Hello, I'm a member of your boardroom. Looking forward to working with you.",
400
+ /* Voice catalogue fetch errors surfaced inside the picker · the
401
+ backend returns a structured `error` field with a `code` and
402
+ optional `fixUrl`; these keys form the human-readable banner. */
403
+ ap_voice_err_missing_permissions_title: "API key missing voices_read permission",
404
+ ap_voice_err_missing_permissions_body: "Regenerate the key with the voices_read scope enabled, then re-add it in Voice Setup.",
405
+ ap_voice_err_auth_failed_title: "ElevenLabs rejected the API key",
406
+ ap_voice_err_auth_failed_body: "Open the API key settings to verify the key is active.",
407
+ ap_voice_err_rate_limited_title: "ElevenLabs rate limit hit",
408
+ ap_voice_err_rate_limited_body: "Wait a minute and try again.",
409
+ ap_voice_err_fetch_failed_title: "Couldn't load voices",
410
+ ap_voice_err_fetch_failed_body: "Check your network or try again later.",
411
+ ap_voice_err_fix_cta: "Open API key settings →",
387
412
  ap_voice_no_provider: "No voice provider configured.",
388
413
  ap_voice_loading: "loading voices…",
389
414
  ap_voice_fallback_voice: "voice",
@@ -528,6 +553,16 @@
528
553
  reload_soft_deck: "Let {name} complete this turn, then refresh the page automatically.",
529
554
  reload_cancel_mark: "↩ Cancel",
530
555
  reload_cancel_deck: "Stay on the page · keep the discussion running.",
556
+ // Cast-edit popover · room head "Add director" button + overlay.
557
+ head_add_cast_tip: "Add or remove directors",
558
+ head_add_cast_label: "Edit cast",
559
+ cast_edit_title: "Select directors",
560
+ cast_edit_hint: "Check to add · uncheck to remove",
561
+ cast_edit_empty: "No directors available · create one in Agents.",
562
+ cast_edit_cancel: "Cancel",
563
+ cast_edit_confirm: "Confirm",
564
+ cast_edit_min_floor: "Keep at least one director.",
565
+ cast_edit_saving: "Saving…",
531
566
  // Meeting recording · head button + REC pill + exit modal.
532
567
  head_record_tip: "Record meeting",
533
568
  head_record_label: "Record meeting",
@@ -1164,6 +1199,8 @@ When the room ___, raise an objection.`,
1164
1199
  us_active_llm_save_btn: "Save & activate",
1165
1200
  us_active_llm_save_failed: "Could not save the credential — check the key and try again.",
1166
1201
  us_active_llm_delete_active_confirm: "Removing the active provider — the boardroom will fall back to another added provider, or stop working until you add a new one. Continue?",
1202
+ us_llm_delete_confirm: "Remove this LLM credential? This can't be undone.",
1203
+ us_provider_key_delete_confirm: "Remove this {label} API key? This can't be undone.",
1167
1204
  us_active_llm_switch_confirm: "Switch active LLM provider to {label}? Every director will be reassigned to the new provider's models.",
1168
1205
  voice_cred_section_title: "▸ Voice provider",
1169
1206
  voice_cred_section_deck: "Powers spoken meetings · directors pull voices from the active provider's catalog only.",
@@ -1175,6 +1212,7 @@ When the room ___, raise an objection.`,
1175
1212
  voice_cred_picker_title: "Choose a voice provider",
1176
1213
  voice_cred_switch_confirm: "Switch active voice provider to {label}? Each director's voice will be reshuffled from the new provider's catalog.",
1177
1214
  voice_cred_delete_confirm_active: "Remove the active voice credential? Director voices reshuffle from the next available credential.",
1215
+ voice_cred_delete_confirm: "Remove this voice credential? This can't be undone.",
1178
1216
  voice_cred_save_failed: "Could not save the voice credential — check the key and try again.",
1179
1217
  ap_voice_empty_no_active: "No active voice provider · open Settings to add one",
1180
1218
  search_cred_section_title: "▸ Search provider",
@@ -1187,6 +1225,7 @@ When the room ___, raise an objection.`,
1187
1225
  search_cred_picker_title: "Choose a search provider",
1188
1226
  search_cred_switch_confirm: "Switch active search provider to {label}? Web Search routes through this credential from now on.",
1189
1227
  search_cred_delete_confirm_active: "Remove the active search credential? Web Search rotates to the next available credential, or stops working until you add one.",
1228
+ search_cred_delete_confirm: "Remove this search credential? This can't be undone.",
1190
1229
  search_cred_save_failed: "Could not save the search credential — check the key and try again.",
1191
1230
  us_ws_backend_tag: "WEB SEARCH BACKEND",
1192
1231
  us_ws_backend_deck:
@@ -1268,6 +1307,11 @@ When the room ___, raise an objection.`,
1268
1307
  locale_es: "Español",
1269
1308
  aria_language: "语言",
1270
1309
 
1310
+ search_overlay_placeholder: "搜索房间和消息",
1311
+ search_overlay_empty_title: "跨房间搜索消息",
1312
+ search_overlay_empty_hint: "输入关键词实时过滤 · 点击结果直接跳转",
1313
+ search_overlay_close: "关闭",
1314
+
1271
1315
  brand_privateboard: "PRIVATEBOARD",
1272
1316
  brand_control: "控制台",
1273
1317
  classification: "私有访问",
@@ -1608,6 +1652,16 @@ When the room ___, raise an objection.`,
1608
1652
  ap_voice_modify_intensity: "力度",
1609
1653
  ap_voice_modify_timbre: "音色",
1610
1654
  ap_voice_preview_btn_title: "试听",
1655
+ ap_voice_preview_sample: "你好,我是你的董事会成员,很高兴为你服务。",
1656
+ ap_voice_err_missing_permissions_title: "API key 缺少 voices_read 权限",
1657
+ ap_voice_err_missing_permissions_body: "重新生成 API key 时勾选 voices_read scope,然后在 Voice Setup 重新粘贴。",
1658
+ ap_voice_err_auth_failed_title: "ElevenLabs 拒绝了这个 API key",
1659
+ ap_voice_err_auth_failed_body: "去 API key 设置页确认这把 key 还有效。",
1660
+ ap_voice_err_rate_limited_title: "ElevenLabs 触发限流",
1661
+ ap_voice_err_rate_limited_body: "等一分钟再试。",
1662
+ ap_voice_err_fetch_failed_title: "音色加载失败",
1663
+ ap_voice_err_fetch_failed_body: "检查网络后再试。",
1664
+ ap_voice_err_fix_cta: "打开 API key 设置 →",
1611
1665
  ap_voice_no_provider: "尚未配置可用的语音提供商。",
1612
1666
  ap_voice_loading: "加载音色中…",
1613
1667
  ap_voice_fallback_voice: "语音",
@@ -1749,6 +1803,16 @@ When the room ___, raise an objection.`,
1749
1803
  reload_soft_deck: "让 {name} 说完这轮,然后自动刷新页面。",
1750
1804
  reload_cancel_mark: "↩ 取消",
1751
1805
  reload_cancel_deck: "留在页面,讨论继续。",
1806
+ // 阵容编辑 · 房间头部"添加董事"按钮 + 弹窗
1807
+ head_add_cast_tip: "添加或移除董事",
1808
+ head_add_cast_label: "编辑阵容",
1809
+ cast_edit_title: "选择董事",
1810
+ cast_edit_hint: "勾选添加 · 取消勾选移除",
1811
+ cast_edit_empty: "暂无可选董事 · 请先在 Agents 中创建。",
1812
+ cast_edit_cancel: "取消",
1813
+ cast_edit_confirm: "确认",
1814
+ cast_edit_min_floor: "请至少保留一位董事。",
1815
+ cast_edit_saving: "保存中…",
1752
1816
  // 会议录制 · header 按钮 + REC 提示牌 + 退出弹窗
1753
1817
  head_record_tip: "录制会议",
1754
1818
  head_record_label: "录制会议",
@@ -2364,6 +2428,8 @@ When the room ___, raise an objection.`,
2364
2428
  us_active_llm_save_btn: "保存并启用",
2365
2429
  us_active_llm_save_failed: "保存失败 —— 请检查 key 后重试。",
2366
2430
  us_active_llm_delete_active_confirm: "正在删除当前使用的服务商 —— 删除后将自动切换到下一个已添加的服务商;如果没有其他服务商,系统将无法正常使用。确定继续吗?",
2431
+ us_llm_delete_confirm: "确认删除这条 LLM 凭证?删除后无法恢复。",
2432
+ us_provider_key_delete_confirm: "确认删除 {label} 的 API key?删除后无法恢复。",
2367
2433
  us_active_llm_switch_confirm: "切换当前服务商为 {label}?所有 director 会被重新分配到新服务商的模型。",
2368
2434
  voice_cred_section_title: "▸ 语音模型",
2369
2435
  voice_cred_section_deck: "支撑语音会议 · 所有 director 只从当前生效的语音模型里抽声音。",
@@ -2375,6 +2441,7 @@ When the room ___, raise an objection.`,
2375
2441
  voice_cred_picker_title: "选择一个语音模型",
2376
2442
  voice_cred_switch_confirm: "切换到 {label}?每位 director 的声音会从新模型的清单里重新分配。",
2377
2443
  voice_cred_delete_confirm_active: "删除正在使用的语音凭证?Director 的声音会从下一个可用凭证里重新分配。",
2444
+ voice_cred_delete_confirm: "确认删除这条语音凭证?删除后无法恢复。",
2378
2445
  voice_cred_save_failed: "保存语音凭证失败 — 请检查 key 后重试。",
2379
2446
  ap_voice_empty_no_active: "还没启用语音模型 · 去 Settings 添加一个",
2380
2447
  search_cred_section_title: "▸ 搜索服务",
@@ -2387,6 +2454,7 @@ When the room ___, raise an objection.`,
2387
2454
  search_cred_picker_title: "选择一个搜索服务",
2388
2455
  search_cred_switch_confirm: "切换到 {label}?之后 Web Search 都会走这把凭证。",
2389
2456
  search_cred_delete_confirm_active: "删除正在使用的搜索凭证?Web Search 会切换到下一个可用凭证;如果都没了就停止工作,直到你重新添加。",
2457
+ search_cred_delete_confirm: "确认删除这条搜索凭证?删除后无法恢复。",
2390
2458
  search_cred_save_failed: "保存搜索凭证失败 — 请检查 key 后重试。",
2391
2459
  us_keys_group_skill: "技能服务",
2392
2460
  us_keys_skill_deck: "为需要外部服务的系统技能授权。每位董事可在档案中单独开关。",
@@ -2438,6 +2506,11 @@ When the room ___, raise an objection.`,
2438
2506
  locale_es: "Español",
2439
2507
  aria_language: "言語",
2440
2508
 
2509
+ search_overlay_placeholder: "ルームとメッセージを検索",
2510
+ search_overlay_empty_title: "ルームを横断して検索",
2511
+ search_overlay_empty_hint: "入力すると即時フィルタ · 結果をクリックで移動",
2512
+ search_overlay_close: "閉じる",
2513
+
2441
2514
  brand_privateboard: "PRIVATEBOARD",
2442
2515
  brand_control: "コントロール",
2443
2516
  classification: "プライベートアクセス",
@@ -2756,6 +2829,16 @@ When the room ___, raise an objection.`,
2756
2829
  ap_voice_modify_intensity: "強度調整",
2757
2830
  ap_voice_modify_timbre: "音色調整",
2758
2831
  ap_voice_preview_btn_title: "サンプル再生",
2832
+ ap_voice_preview_sample: "こんにちは。あなたのボードのメンバーです。どうぞよろしくお願いします。",
2833
+ ap_voice_err_missing_permissions_title: "API キーに voices_read 権限がありません",
2834
+ ap_voice_err_missing_permissions_body: "voices_read スコープを有効にして API キーを作り直し、Voice Setup に貼り直してください。",
2835
+ ap_voice_err_auth_failed_title: "ElevenLabs に API キーが拒否されました",
2836
+ ap_voice_err_auth_failed_body: "API キー設定で有効性を確認してください。",
2837
+ ap_voice_err_rate_limited_title: "ElevenLabs のレート制限に達しました",
2838
+ ap_voice_err_rate_limited_body: "少し待ってから再試行してください。",
2839
+ ap_voice_err_fetch_failed_title: "音声の読み込みに失敗",
2840
+ ap_voice_err_fetch_failed_body: "ネットワークを確認してから再試行してください。",
2841
+ ap_voice_err_fix_cta: "API キー設定を開く →",
2759
2842
  ap_voice_no_provider: "音声プロバイダが未設定です。",
2760
2843
  ap_voice_loading: "音声を読み込み中…",
2761
2844
  ap_voice_fallback_voice: "音声",
@@ -2896,6 +2979,16 @@ When the room ___, raise an objection.`,
2896
2979
  reload_soft_deck: "{name} にこのターンを終えさせてから自動で再読込。",
2897
2980
  reload_cancel_mark: "↩ キャンセル",
2898
2981
  reload_cancel_deck: "ページに留まる · 議論を続行。",
2982
+ // キャスト編集 · ルームヘッダーの「ディレクター追加」ボタン + オーバーレイ
2983
+ head_add_cast_tip: "ディレクターを追加または削除",
2984
+ head_add_cast_label: "キャストを編集",
2985
+ cast_edit_title: "ディレクターを選択",
2986
+ cast_edit_hint: "チェックで追加 · 外すと削除",
2987
+ cast_edit_empty: "選択可能なディレクターがいません · Agents で作成してください。",
2988
+ cast_edit_cancel: "キャンセル",
2989
+ cast_edit_confirm: "確認",
2990
+ cast_edit_min_floor: "少なくとも 1 人のディレクターを残してください。",
2991
+ cast_edit_saving: "保存中…",
2899
2992
  // ミーティング録画 · ヘッダーボタン + REC バッジ + 退出ダイアログ
2900
2993
  head_record_tip: "ミーティングを録画",
2901
2994
  head_record_label: "ミーティングを録画",
@@ -3306,6 +3399,8 @@ When the room ___, raise an objection.`,
3306
3399
  us_active_llm_save_btn: "保存して有効化",
3307
3400
  us_active_llm_save_failed: "保存に失敗しました —— キーを確認して再試行してください。",
3308
3401
  us_active_llm_delete_active_confirm: "現在使用中のプロバイダーを削除します —— 削除後は別の追加済みプロバイダーに切り替わります。他になければシステムは動作しません。続行しますか?",
3402
+ us_llm_delete_confirm: "このLLMクレデンシャルを削除しますか?元には戻せません。",
3403
+ us_provider_key_delete_confirm: "{label} のAPIキーを削除しますか?元には戻せません。",
3309
3404
  us_active_llm_switch_confirm: "現在のプロバイダーを {label} に切り替えますか?全 director が新しいプロバイダーのモデルに再割り当てされます。",
3310
3405
  us_keys_skill_deck: "外部サービスを必要とするシステムスキルを有効化。各エージェントはプロフィール単位で参加可否を選べます。",
3311
3406
  us_ws_backend_tag: "ウェブ検索バックエンド",
@@ -3352,6 +3447,11 @@ When the room ___, raise an objection.`,
3352
3447
  locale_es: "Español",
3353
3448
  aria_language: "Idioma",
3354
3449
 
3450
+ search_overlay_placeholder: "Buscar salas y mensajes",
3451
+ search_overlay_empty_title: "Buscar entre salas y mensajes",
3452
+ search_overlay_empty_hint: "Escribe para filtrar al instante · clic para saltar",
3453
+ search_overlay_close: "Cerrar",
3454
+
3355
3455
  brand_privateboard: "PRIVATEBOARD",
3356
3456
  brand_control: "CONTROL",
3357
3457
  classification: "ACCESO PRIVADO",
@@ -3664,6 +3764,16 @@ When the room ___, raise an objection.`,
3664
3764
  ap_voice_modify_intensity: "ajuste de intensidad",
3665
3765
  ap_voice_modify_timbre: "ajuste de timbre",
3666
3766
  ap_voice_preview_btn_title: "Vista previa",
3767
+ ap_voice_preview_sample: "Hola, soy miembro de tu consejo. Será un placer trabajar contigo.",
3768
+ ap_voice_err_missing_permissions_title: "La API key no tiene permiso voices_read",
3769
+ ap_voice_err_missing_permissions_body: "Regenera la API key con el scope voices_read activado y vuelve a pegarla en Voice Setup.",
3770
+ ap_voice_err_auth_failed_title: "ElevenLabs rechazó la API key",
3771
+ ap_voice_err_auth_failed_body: "Abre la configuración de API keys para verificar la clave.",
3772
+ ap_voice_err_rate_limited_title: "Límite de tasa de ElevenLabs alcanzado",
3773
+ ap_voice_err_rate_limited_body: "Espera un minuto e inténtalo de nuevo.",
3774
+ ap_voice_err_fetch_failed_title: "No se pudieron cargar las voces",
3775
+ ap_voice_err_fetch_failed_body: "Comprueba la red e inténtalo de nuevo.",
3776
+ ap_voice_err_fix_cta: "Abrir configuración de API keys →",
3667
3777
  ap_voice_no_provider: "No hay proveedor de voz configurado.",
3668
3778
  ap_voice_loading: "cargando voces…",
3669
3779
  ap_voice_fallback_voice: "voz",
@@ -3803,6 +3913,16 @@ When the room ___, raise an objection.`,
3803
3913
  reload_soft_deck: "Deja que {name} complete este turno, luego recarga la página automáticamente.",
3804
3914
  reload_cancel_mark: "↩ Cancelar",
3805
3915
  reload_cancel_deck: "Mantente en la página · la discusión continúa.",
3916
+ // Edición del elenco · botón "Añadir director" en la cabecera + popover
3917
+ head_add_cast_tip: "Añadir o quitar directores",
3918
+ head_add_cast_label: "Editar elenco",
3919
+ cast_edit_title: "Selecciona directores",
3920
+ cast_edit_hint: "Marca para añadir · desmarca para quitar",
3921
+ cast_edit_empty: "No hay directores disponibles · crea uno en Agents.",
3922
+ cast_edit_cancel: "Cancelar",
3923
+ cast_edit_confirm: "Confirmar",
3924
+ cast_edit_min_floor: "Mantén al menos un director.",
3925
+ cast_edit_saving: "Guardando…",
3806
3926
  // Grabación de reunión · botón en cabecera + chip REC + modal de salida
3807
3927
  head_record_tip: "Grabar reunión",
3808
3928
  head_record_label: "Grabar reunión",
@@ -4214,6 +4334,8 @@ When the room ___, raise an objection.`,
4214
4334
  us_active_llm_save_btn: "Guardar y activar",
4215
4335
  us_active_llm_save_failed: "No se pudo guardar la credencial — revisa la clave y vuelve a intentarlo.",
4216
4336
  us_active_llm_delete_active_confirm: "Eliminando el proveedor activo — la sala usará otro proveedor añadido, o dejará de funcionar hasta que añadas uno nuevo. ¿Continuar?",
4337
+ us_llm_delete_confirm: "¿Eliminar esta credencial LLM? No se puede deshacer.",
4338
+ us_provider_key_delete_confirm: "¿Eliminar la clave API de {label}? No se puede deshacer.",
4217
4339
  us_active_llm_switch_confirm: "¿Cambiar el proveedor LLM activo a {label}? Todos los directores se reasignarán a los modelos del nuevo proveedor.",
4218
4340
  us_keys_skill_deck: "habilita habilidades de sistema que necesitan un servicio externo. Cada agente puede optar in/out en su perfil.",
4219
4341
  us_ws_backend_tag: "MOTOR DE BÚSQUEDA WEB",
Binary file