privateboard 0.1.37 → 0.1.40

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.
Files changed (76) hide show
  1. package/dist/boot.js +1415 -91
  2. package/dist/boot.js.map +1 -1
  3. package/dist/cli.js +1415 -91
  4. package/dist/cli.js.map +1 -1
  5. package/dist/server.js +1271 -81
  6. package/dist/server.js.map +1 -1
  7. package/dist/version.d.ts +1 -1
  8. package/dist/version.js +1 -1
  9. package/dist/version.js.map +1 -1
  10. package/package.json +1 -1
  11. package/public/__avatar3d_test.html +156 -0
  12. package/public/adjourn-overlay.css +2 -2
  13. package/public/agent-overlay.css +27 -15
  14. package/public/agent-overlay.js +3 -1
  15. package/public/agent-profile.css +331 -41
  16. package/public/agent-profile.js +499 -75
  17. package/public/app-updater.css +1 -1
  18. package/public/app.js +2090 -547
  19. package/public/avatar-3d-snap.js +205 -0
  20. package/public/avatar-3d.js +792 -0
  21. package/public/avatar-customizer.html +274 -0
  22. package/public/avatar3d-editor.css +240 -0
  23. package/public/avatar3d-editor.js +481 -0
  24. package/public/avatars/3d/chair.png +0 -0
  25. package/public/avatars/3d/first-principles.png +0 -0
  26. package/public/avatars/3d/historian.png +0 -0
  27. package/public/avatars/3d/long-horizon.png +0 -0
  28. package/public/avatars/3d/phenomenologist.png +0 -0
  29. package/public/avatars/3d/socrates.png +0 -0
  30. package/public/avatars/3d/user-empathy.png +0 -0
  31. package/public/avatars/3d/value-investor.png +0 -0
  32. package/public/core-avatars.js +86 -0
  33. package/public/home-3d-loader.js +15 -4
  34. package/public/home-3d-mock.js +18 -7
  35. package/public/home.html +80 -18
  36. package/public/i18n.js +279 -4
  37. package/public/icons/avatar_1779855104027.glb +0 -0
  38. package/public/icons/logo.png +0 -0
  39. package/public/icons/new-style.glb +0 -0
  40. package/public/icons/new-style2.glb +0 -0
  41. package/public/icons/new-style3.glb +0 -0
  42. package/public/icons/new-style4.glb +0 -0
  43. package/public/icons/new-style5.glb +0 -0
  44. package/public/icons/office.glb +0 -0
  45. package/public/icons/stuff.glb +0 -0
  46. package/public/index.html +203 -182
  47. package/public/mention-picker.js +1 -1
  48. package/public/new-agent.css +7 -7
  49. package/public/new-agent.js +46 -20
  50. package/public/office-viewer.html +340 -0
  51. package/public/onboarding.css +5 -5
  52. package/public/quote-cta.css +5 -4
  53. package/public/quote-cta.js +50 -5
  54. package/public/room-settings.css +24 -9
  55. package/public/stuff-viewer.html +330 -0
  56. package/public/thread.css +1211 -0
  57. package/public/user-settings.css +16 -19
  58. package/public/user-settings.js +86 -78
  59. package/public/vendor/BufferGeometryUtils.js +1434 -0
  60. package/public/vendor/DRACOLoader.js +739 -0
  61. package/public/vendor/GLTFLoader.js +4860 -0
  62. package/public/vendor/RoomEnvironment.js +185 -0
  63. package/public/vendor/SkeletonUtils.js +496 -0
  64. package/public/vendor/draco/draco_decoder.js +34 -0
  65. package/public/vendor/draco/draco_decoder.wasm +0 -0
  66. package/public/vendor/draco/draco_encoder.js +33 -0
  67. package/public/vendor/draco/draco_wasm_wrapper.js +117 -0
  68. package/public/vendor/meshopt_decoder.module.js +196 -0
  69. package/public/voice-3d-banner.js +12 -0
  70. package/public/voice-3d.js +1407 -432
  71. package/public/voice-clone.css +875 -0
  72. package/public/voice-clone.js +1351 -0
  73. package/public/voice-replay.css +3 -3
  74. package/public/voice-replay.js +21 -0
  75. package/public/avatar-skill.js +0 -629
  76. package/public/icons/folded-sidebar.png +0 -0
package/public/i18n.js CHANGED
@@ -386,6 +386,74 @@
386
386
  ap_voice_locked_title: "Configure a voice provider to let this director speak with their own register.",
387
387
  ap_voice_locked_body: "Configure a voice provider to unlock TTS — your director will be able to speak in their own register, with adjustable pitch, speed and emotion.",
388
388
  ap_voice_locked_cta: "Unlock voice",
389
+ // ── Voice cloning ───────────────────────────────────────────
390
+ voice_clone_btn: "FORGE VOICE",
391
+ voice_clone_btn_kicker: "// VOICE · CLONE-FORGE",
392
+ voice_clone_btn_hint: "Train a new voice for this director from an audio or video sample.",
393
+ voice_clone_kicker: "// CLONE",
394
+ voice_clone_classification_left: "// VOICE CLONE · CLASSIFIED",
395
+ voice_clone_classification_right: "private board",
396
+ voice_clone_head_meta: "// CLONE · ACTIVE",
397
+ voice_clone_modal_title: "Clone voice · {name}",
398
+ voice_clone_source_label: "Voice source",
399
+ voice_clone_trim_decoding: "Decoding audio…",
400
+ voice_clone_trim_unsupported: "Can't preview this format; the file will be uploaded as-is.",
401
+ voice_clone_trim_video_unsupported: "Couldn't extract audio from this video. Re-export it as mp4/mov (AAC) or convert to a plain audio file (mp3 / m4a / wav) and try again.",
402
+ voice_clone_trim_selected: "· {sel} of {total}",
403
+ voice_clone_trimming: "Trimming selection…",
404
+ voice_clone_file_pick: "Choose an audio or video file",
405
+ voice_clone_file_hint: "Audio: mp3 / m4a / wav · Video: mp4 / mov / webm — we'll pull the audio track in your browser.",
406
+ voice_clone_mode_upload: "Upload file",
407
+ voice_clone_mode_record: "Record voice",
408
+ voice_clone_record_script: "Read this aloud — it covers a wide phoneme range so the clone captures your timbre well:",
409
+ voice_clone_record_script_text: "The quick brown fox jumps over the lazy dog. She sells seashells by the seashore. How vexingly quick daft zebras jump! Sphinx of black quartz, judge my vow.",
410
+ voice_clone_record_start: "Start recording",
411
+ voice_clone_record_idle: "Tap to record",
412
+ voice_clone_record_recording: "Recording… tap to stop",
413
+ voice_clone_record_ready: "Recording ready. Confirm to clone.",
414
+ voice_clone_record_empty: "No audio captured. Try again.",
415
+ voice_clone_record_play: "Play back",
416
+ voice_clone_record_redo: "Re-record",
417
+ voice_clone_record_mic_err: "Microphone access denied: {msg}",
418
+ voice_clone_record_init_err: "Recorder init failed: {msg}",
419
+ voice_clone_label_label: "Label · required",
420
+ voice_clone_label_placeholder: "Name this cloned voice (e.g. Chloe)",
421
+ voice_clone_minimax_group_label: "MiniMax Group ID",
422
+ voice_clone_minimax_group_placeholder: "e.g. 1838xxxxxx · required if your key isn't a JWT",
423
+ voice_clone_hint: "Use a clean 10s–3min sample of the target voice. <strong>Only one clone runs at a time.</strong>",
424
+ voice_clone_confirm: "Start cloning",
425
+ voice_clone_dismiss: "Cancel",
426
+ voice_clone_cancel: "Cancel clone",
427
+ voice_clone_minimize: "Minimize",
428
+ voice_clone_minimize_btn: "Run in background",
429
+ voice_clone_close: "Close",
430
+ voice_clone_stage_fetch: "Fetch audio",
431
+ voice_clone_stage_upload: "Upload to provider",
432
+ voice_clone_stage_train: "Wait for clone",
433
+ voice_clone_uploading_file: "Uploading file…",
434
+ voice_clone_success: "Voice cloned and applied to the director.",
435
+ voice_clone_failed: "Clone failed.",
436
+ voice_clone_retry: "Retry",
437
+ voice_clone_done_btn: "Done",
438
+ voice_clone_apply_close_btn: "Apply and close",
439
+ voice_clone_success_kicker: "// CLONED",
440
+ voice_clone_success_title: "Cloned · {name}",
441
+ voice_clone_preview_default_name: "this voice",
442
+ voice_clone_preview_default_text: "I'm {name}, a member of your private boardroom. Looking forward to working with you.",
443
+ voice_clone_preview_sample_placeholder: "Sample line for preview",
444
+ voice_clone_preview_btn_aria: "Preview cloned voice",
445
+ voice_clone_preview_hint: "Edit the line above, then tap the play button to hear the cloned voice.",
446
+ voice_clone_preview_err: "Preview failed: {msg}",
447
+ voice_clone_preview_audio_err: "Browser couldn't decode the audio. Try a different sample line.",
448
+ voice_clone_preview_missing_voice: "No voice_id captured — re-open the clone modal.",
449
+ voice_clone_pill_label_short: "Cloning",
450
+ voice_clone_pill_done: "Cloned",
451
+ voice_clone_pill_failed: "Clone failed",
452
+ voice_clone_pill_aria: "Open voice cloning panel",
453
+ voice_clone_err_provider_auth: "The provider rejected the API key. Re-check it in voice settings.",
454
+ voice_clone_err_provider_quota: "Provider balance or subscription doesn't allow cloning.",
455
+ voice_clone_err_audio_too_short: "Audio sample is too short to clone from.",
456
+ voice_clone_err_audio_too_long: "Audio sample is too long.",
389
457
  ap_voice_locked_providers: "supports <b>MiniMax</b> · <b>ElevenLabs</b>",
390
458
  ap_voice_modify_pitch: "pitch trim",
391
459
  ap_voice_modify_intensity: "intensity trim",
@@ -397,6 +465,15 @@
397
465
  short (under 200 chars · server caps anyway) and self-
398
466
  describing so the voice's character lands quickly. */
399
467
  ap_voice_preview_sample: "Hello, I'm a member of your boardroom. Looking forward to working with you.",
468
+ ap_voice_preview_text_label: "Preview line",
469
+ ap_voice_section_voice: "Voice",
470
+ ap_voice_section_emotion: "Emotion",
471
+ ap_voice_section_preview: "Preview line",
472
+ ap_voice_group_cloned_provider: "// cloned · {provider}",
473
+ ap_voice_rename_btn: "Rename voice",
474
+ ap_voice_rename_prompt: "Display name for voice {id}",
475
+ ap_voice_rename_clear_confirm: "Clear the custom name and fall back to the provider's label?",
476
+ ap_voice_rename_err: "Rename failed: {msg}",
400
477
  /* Voice catalogue fetch errors surfaced inside the picker · the
401
478
  backend returns a structured `error` field with a `code` and
402
479
  optional `fixUrl`; these keys form the human-readable banner. */
@@ -462,6 +539,35 @@
462
539
 
463
540
  convene_show_more: "Show more ↓",
464
541
  convene_show_less: "Show less ↑",
542
+ // Thread feature · private 1:1 director aside (Slack-DM-style float)
543
+ thread_trigger: "// thread",
544
+ thread_trigger_short: "Reply privately",
545
+ thread_trigger_label: "Thread",
546
+ thread_trigger_tip: "Pull {name} aside privately",
547
+ thread_head_kicker: "private with you",
548
+ thread_minimize: "—",
549
+ thread_minimize_tip: "Minimize",
550
+ thread_close: "✕",
551
+ thread_close_tip: "Close",
552
+ thread_empty_title: "Pull them aside",
553
+ thread_empty_deck: "What does {name} know that you want to dig into? They have the full room context up to this point.",
554
+ thread_composer_placeholder: "Ask {name} anything…",
555
+ thread_send: "Send",
556
+ thread_stop: "Stop",
557
+ thread_stop_tip: "Interrupt the director's reply",
558
+ thread_maximize: "⛶",
559
+ thread_maximize_tip: "Maximize to side panel",
560
+ thread_restore: "⊟",
561
+ thread_restore_tip: "Restore as floating window",
562
+ thread_dock_resize_tip: "Drag to resize panel",
563
+ head_threads_tip: "All private threads in this room",
564
+ head_threads_label: "All threads",
565
+ threads_list_title: "// Private threads",
566
+ threads_list_loading: "Loading…",
567
+ threads_list_empty: "No private threads yet · open one from the // Thread button on any director's message.",
568
+ threads_list_active: "open",
569
+ threads_list_delete_tip: "Delete this thread",
570
+ threads_list_delete_confirm: "Delete the private thread with {name}? This can't be undone.",
465
571
  convene_eyebrow: "▸ Convene · Initial Question",
466
572
  convene_meta_to: "to",
467
573
 
@@ -481,6 +587,7 @@
481
587
  msg_ws_query_label: "query",
482
588
  msg_ws_expand_hide: "Collapse",
483
589
  msg_ws_secs: "{n}s",
590
+ msg_ws_card_body: "Searched \"{query}\"",
484
591
  msg_chair_direct_kicker: "▸ chair · responding to you",
485
592
  msg_chair_intervention_kicker: "▸ chair note",
486
593
  msg_chair_billing_kicker: "▸ billing · attention needed",
@@ -568,6 +675,7 @@
568
675
  head_record_label: "Record meeting",
569
676
  head_record_stop_tip: "Stop recording · save .mp4",
570
677
  head_record_stop_label: "Stop recording",
678
+ head_replay_stop_label: "Stop",
571
679
  rec_pill_label: "REC",
572
680
  rec_error_toast: "Couldn't start the meeting recording. Check screen-capture permission and try again.",
573
681
  rec_exit_class: "recording · choose",
@@ -594,6 +702,20 @@
594
702
  rec_stop_cancel_mark: "↩ Cancel",
595
703
  rec_stop_cancel_deck: "Stay here · the recording keeps running.",
596
704
  rec_saved_toast: "Recording saved · file downloaded",
705
+ // Pause-after-current save modal · the room reached soft-pause
706
+ // while a recording was still capturing. Ask the user what to
707
+ // do with the in-flight clip before it starts recording silence.
708
+ rec_pause_save_class: "pause-after-current · save?",
709
+ rec_pause_save_right: "// in-flight recording",
710
+ rec_pause_save_tag: "▸ recording",
711
+ rec_pause_save_title: "Save the recording?",
712
+ rec_pause_save_deck: "The current director just finished and the room is paused. Your recording is still rolling — pick how to handle it.",
713
+ rec_pause_save_adjourn_mark: "✓ Save & adjourn room",
714
+ rec_pause_save_adjourn_deck: "Stop the recording, download the file, then end the room.",
715
+ rec_pause_save_keep_mark: "✓ Save & keep paused",
716
+ rec_pause_save_keep_deck: "Stop the recording and download. Room stays paused so you can resume later.",
717
+ rec_pause_save_continue_mark: "↩ Keep recording",
718
+ rec_pause_save_continue_deck: "Stay paused; the recording keeps running (warning: it'll capture silence).",
597
719
  // Resume-choice modal · shown when user clicks Resume on a
598
720
  // voice room with no voice key configured. Same 3-button
599
721
  // shape as the pause / reload modals.
@@ -1139,7 +1261,8 @@ When the room ___, raise an objection.`,
1139
1261
  us_user_tag: "▸ User",
1140
1262
  us_user_deck: "how the boardroom addresses you and what it knows about your context.",
1141
1263
  us_avatar: "Avatar",
1142
- us_regen_avatar: "generate 8-bit avatar",
1264
+ us_regen_avatar: "8-bit avatar",
1265
+ us_avatar3d: "3D avatar",
1143
1266
  us_name: "Name",
1144
1267
  us_about: "About you",
1145
1268
  us_intro_ph: "A line or two about your role, what you tend to think about, what you're working on. Directors will keep this in mind across rooms.",
@@ -1647,12 +1770,89 @@ When the room ___, raise an objection.`,
1647
1770
  ap_voice_locked_title: "配置一个语音服务商,董事就能以自己的音色发声。",
1648
1771
  ap_voice_locked_body: "配置一个语音服务商即可解锁 TTS — 董事将以自己的音色发声,可调语速、语调与情绪。",
1649
1772
  ap_voice_locked_cta: "解锁声音",
1773
+ // ── 音色克隆 ───────────────────────────────────────────
1774
+ voice_clone_btn: "锻造音色",
1775
+ voice_clone_btn_kicker: "// 音色 · 克隆熔炉",
1776
+ voice_clone_btn_hint: "上传音频或视频样本,为这位董事打造专属新音色。",
1777
+ voice_clone_kicker: "// 音色克隆",
1778
+ voice_clone_classification_left: "// 音色克隆 · 机密",
1779
+ voice_clone_classification_right: "私董会",
1780
+ voice_clone_head_meta: "// 克隆 · 进行中",
1781
+ voice_clone_modal_title: "克隆音色 · {name}",
1782
+ voice_clone_source_label: "音色来源",
1783
+ voice_clone_trim_decoding: "正在解码音频…",
1784
+ voice_clone_trim_unsupported: "无法预览这个格式,文件将原样上传。",
1785
+ voice_clone_trim_video_unsupported: "无法从这段视频中提取音频。请改用 mp4/mov(AAC 编码)重新导出,或转成纯音频文件 (mp3 / m4a / wav) 后再试。",
1786
+ voice_clone_trim_selected: "· {sel} / {total}",
1787
+ voice_clone_trimming: "正在裁剪选段…",
1788
+ voice_clone_file_pick: "选择音频或视频文件",
1789
+ voice_clone_file_hint: "音频:mp3 / m4a / wav · 视频:mp4 / mov / webm — 浏览器会在本地从视频里抽取音轨。",
1790
+ voice_clone_mode_upload: "上传文件",
1791
+ voice_clone_mode_record: "录制声音",
1792
+ voice_clone_record_script: "请朗读以下文字 — 它覆盖了较全的音素,能帮助克隆更准确地捕捉你的音色:",
1793
+ voice_clone_record_script_text: "今天天气真好,阳光透过窗户洒在书桌上。请你说说话,让我们听一下你的声音特点。从北京到上海,从清晨到傍晚,每一个故事都值得被认真聆听。",
1794
+ voice_clone_record_start: "开始录制",
1795
+ voice_clone_record_idle: "点击开始录制",
1796
+ voice_clone_record_recording: "录制中… 点击停止",
1797
+ voice_clone_record_ready: "录制完成,可以确认克隆",
1798
+ voice_clone_record_empty: "未捕捉到音频,请重试",
1799
+ voice_clone_record_play: "试听",
1800
+ voice_clone_record_redo: "重录",
1801
+ voice_clone_record_mic_err: "麦克风权限被拒绝: {msg}",
1802
+ voice_clone_record_init_err: "录音初始化失败: {msg}",
1803
+ voice_clone_label_label: "标签 · 必填",
1804
+ voice_clone_label_placeholder: "给这个克隆音色起个名字 (例如 Chloe)",
1805
+ voice_clone_minimax_group_label: "MiniMax Group ID",
1806
+ voice_clone_minimax_group_placeholder: "例如 1838xxxxxx · 当 key 不是 JWT 时必填",
1807
+ voice_clone_hint: "请使用一段干净的 10 秒到 3 分钟目标音色样本。<strong>同一时间只能克隆一个音色。</strong>",
1808
+ voice_clone_confirm: "开始克隆",
1809
+ voice_clone_dismiss: "取消",
1810
+ voice_clone_cancel: "取消克隆",
1811
+ voice_clone_minimize: "最小化",
1812
+ voice_clone_minimize_btn: "在后台继续",
1813
+ voice_clone_close: "关闭",
1814
+ voice_clone_stage_fetch: "抓取音频",
1815
+ voice_clone_stage_upload: "上传到服务商",
1816
+ voice_clone_stage_train: "等待克隆完成",
1817
+ voice_clone_uploading_file: "正在上传文件…",
1818
+ voice_clone_success: "音色已克隆,已应用到该董事。",
1819
+ voice_clone_failed: "克隆失败。",
1820
+ voice_clone_retry: "重试",
1821
+ voice_clone_done_btn: "完成",
1822
+ voice_clone_apply_close_btn: "应用并关闭",
1823
+ voice_clone_success_kicker: "// 克隆完成",
1824
+ voice_clone_success_title: "已克隆 · {name}",
1825
+ voice_clone_preview_default_name: "新音色",
1826
+ voice_clone_preview_default_text: "我是 {name},你的私董会成员,很高兴为你服务。",
1827
+ voice_clone_preview_sample_placeholder: "试听文案",
1828
+ voice_clone_preview_btn_aria: "试听克隆音色",
1829
+ voice_clone_preview_hint: "可以编辑上面的文案,然后点播放按钮听一下克隆出的音色。",
1830
+ voice_clone_preview_err: "试听失败: {msg}",
1831
+ voice_clone_preview_audio_err: "浏览器无法解码音频,请试试不同的文案。",
1832
+ voice_clone_preview_missing_voice: "voice_id 没拿到,请重新打开克隆面板。",
1833
+ voice_clone_pill_label_short: "克隆中",
1834
+ voice_clone_pill_done: "已完成",
1835
+ voice_clone_pill_failed: "克隆失败",
1836
+ voice_clone_pill_aria: "展开音色克隆面板",
1837
+ voice_clone_err_provider_auth: "服务商拒绝了 API key,请到语音设置确认。",
1838
+ voice_clone_err_provider_quota: "服务商余额或订阅不支持克隆。",
1839
+ voice_clone_err_audio_too_short: "音频样本太短,无法用于克隆。",
1840
+ voice_clone_err_audio_too_long: "音频样本太长。",
1650
1841
  ap_voice_locked_providers: "已接入 <b>MiniMax</b> · <b>ElevenLabs</b>",
1651
1842
  ap_voice_modify_pitch: "音高",
1652
1843
  ap_voice_modify_intensity: "力度",
1653
1844
  ap_voice_modify_timbre: "音色",
1654
1845
  ap_voice_preview_btn_title: "试听",
1655
1846
  ap_voice_preview_sample: "你好,我是你的董事会成员,很高兴为你服务。",
1847
+ ap_voice_preview_text_label: "试听文案",
1848
+ ap_voice_section_voice: "音色",
1849
+ ap_voice_section_emotion: "情绪",
1850
+ ap_voice_section_preview: "试听文案",
1851
+ ap_voice_group_cloned_provider: "// 我克隆的音色 · {provider}",
1852
+ ap_voice_rename_btn: "重命名音色",
1853
+ ap_voice_rename_prompt: "为音色 {id} 起一个名字",
1854
+ ap_voice_rename_clear_confirm: "清除自定义名称,使用服务商提供的标签?",
1855
+ ap_voice_rename_err: "重命名失败: {msg}",
1656
1856
  ap_voice_err_missing_permissions_title: "API key 缺少 voices_read 权限",
1657
1857
  ap_voice_err_missing_permissions_body: "重新生成 API key 时勾选 voices_read scope,然后在 Voice Setup 重新粘贴。",
1658
1858
  ap_voice_err_auth_failed_title: "ElevenLabs 拒绝了这个 API key",
@@ -1715,6 +1915,35 @@ When the room ___, raise an objection.`,
1715
1915
 
1716
1916
  convene_show_more: "展开全文 ↓",
1717
1917
  convene_show_less: "收起 ↑",
1918
+ // Thread · 与某位 director 的私聊小窗
1919
+ thread_trigger: "// 私聊",
1920
+ thread_trigger_short: "私聊",
1921
+ thread_trigger_label: "私聊",
1922
+ thread_trigger_tip: "把 {name} 拉到一边单聊",
1923
+ thread_head_kicker: "你和他的私聊",
1924
+ thread_minimize: "—",
1925
+ thread_minimize_tip: "最小化",
1926
+ thread_close: "✕",
1927
+ thread_close_tip: "关闭",
1928
+ thread_empty_title: "拉到一边聊聊",
1929
+ thread_empty_deck: "想从 {name} 那里挖什么?他已经掌握当前房间的全部上下文。",
1930
+ thread_composer_placeholder: "向 {name} 提问…",
1931
+ thread_send: "发送",
1932
+ thread_stop: "停止",
1933
+ thread_stop_tip: "打断当前回复",
1934
+ thread_maximize: "⛶",
1935
+ thread_maximize_tip: "最大化到右侧面板",
1936
+ thread_restore: "⊟",
1937
+ thread_restore_tip: "还原为悬浮窗",
1938
+ thread_dock_resize_tip: "拖动调整面板宽度",
1939
+ head_threads_tip: "查看本房间所有私聊",
1940
+ head_threads_label: "所有私聊",
1941
+ threads_list_title: "// 私聊列表",
1942
+ threads_list_loading: "加载中…",
1943
+ threads_list_empty: "暂无私聊 · 在任意 director 消息上点击 // Thread 按钮开启一个。",
1944
+ threads_list_active: "进行中",
1945
+ threads_list_delete_tip: "删除这条私聊",
1946
+ threads_list_delete_confirm: "确认删除与 {name} 的私聊?删除后无法恢复。",
1718
1947
  convene_eyebrow: "▸ 召开 · 初始问题",
1719
1948
  convene_meta_to: "致",
1720
1949
 
@@ -1734,6 +1963,7 @@ When the room ___, raise an objection.`,
1734
1963
  msg_ws_query_label: "查询",
1735
1964
  msg_ws_expand_hide: "收起",
1736
1965
  msg_ws_secs: "{n} 秒",
1966
+ msg_ws_card_body: "已搜 \"{query}\"",
1737
1967
  msg_chair_direct_kicker: "▸ 主席 · 直接回复你",
1738
1968
  msg_chair_intervention_kicker: "▸ 主席说明",
1739
1969
  msg_chair_billing_kicker: "▸ 计费 · 需要处理",
@@ -1818,6 +2048,7 @@ When the room ___, raise an objection.`,
1818
2048
  head_record_label: "录制会议",
1819
2049
  head_record_stop_tip: "停止录制 · 保存 .mp4",
1820
2050
  head_record_stop_label: "停止录制",
2051
+ head_replay_stop_label: "停止",
1821
2052
  rec_pill_label: "录制中",
1822
2053
  rec_error_toast: "无法开始会议录制。请检查屏幕录制权限后重试。",
1823
2054
  rec_exit_class: "录制中 · 请选择",
@@ -1844,6 +2075,17 @@ When the room ___, raise an objection.`,
1844
2075
  rec_stop_cancel_mark: "↩ 取消",
1845
2076
  rec_stop_cancel_deck: "留在这里 · 录制继续。",
1846
2077
  rec_saved_toast: "录制已保存 · 文件已下载",
2078
+ rec_pause_save_class: "暂停 · 保存录制?",
2079
+ rec_pause_save_right: "// 进行中的录制",
2080
+ rec_pause_save_tag: "▸ 录制",
2081
+ rec_pause_save_title: "是否保存当前录制?",
2082
+ rec_pause_save_deck: "当前发言的董事已结束,房间已暂停。录制还在进行 — 请选择如何处理。",
2083
+ rec_pause_save_adjourn_mark: "✓ 保存并结束房间",
2084
+ rec_pause_save_adjourn_deck: "停止录制,下载文件,然后结束房间。",
2085
+ rec_pause_save_keep_mark: "✓ 保存并保持暂停",
2086
+ rec_pause_save_keep_deck: "停止录制并下载。房间保持暂停状态,稍后可以恢复。",
2087
+ rec_pause_save_continue_mark: "↩ 继续录制",
2088
+ rec_pause_save_continue_deck: "保持暂停 · 录制继续(注意:会录到一段静音)。",
1847
2089
  resume_class: "继续 · 选择",
1848
2090
  resume_right: "// 缺少语音密钥",
1849
2091
  resume_tag: "▸ 语音模式需要密钥",
@@ -2372,7 +2614,8 @@ When the room ___, raise an objection.`,
2372
2614
  us_user_tag: "▸ 用户",
2373
2615
  us_user_deck: "董事会如何称呼你,以及它需要知道的背景。",
2374
2616
  us_avatar: "头像",
2375
- us_regen_avatar: "生成 8-bit 头像",
2617
+ us_regen_avatar: "8-bit 头像",
2618
+ us_avatar3d: "3D 形象",
2376
2619
  us_name: "姓名",
2377
2620
  us_about: "关于你",
2378
2621
  us_intro_ph: "一两句话写下你的角色、常思考的问题、手头项目。董事在每场会议里都会参考。",
@@ -2892,6 +3135,20 @@ When the room ___, raise an objection.`,
2892
3135
 
2893
3136
  convene_show_more: "もっと見る ↓",
2894
3137
  convene_show_less: "閉じる ↑",
3138
+ // Thread · 1人のディレクターと1対1の個別会話
3139
+ thread_trigger: "// 個別",
3140
+ thread_trigger_short: "個別に返信",
3141
+ thread_trigger_label: "個別",
3142
+ thread_trigger_tip: "{name}を脇に呼んで個別に話す",
3143
+ thread_head_kicker: "あなたとの個別チャット",
3144
+ thread_minimize: "—",
3145
+ thread_minimize_tip: "最小化",
3146
+ thread_close: "✕",
3147
+ thread_close_tip: "閉じる",
3148
+ thread_empty_title: "脇に呼ぶ",
3149
+ thread_empty_deck: "{name}に何を聞きたい?この部屋のここまでの文脈を彼は全部把握しています。",
3150
+ thread_composer_placeholder: "{name}に質問…",
3151
+ thread_send: "送信",
2895
3152
  convene_eyebrow: "▸ 開始 · 最初の質問",
2896
3153
  convene_meta_to: "宛先",
2897
3154
 
@@ -2994,6 +3251,7 @@ When the room ___, raise an objection.`,
2994
3251
  head_record_label: "ミーティングを録画",
2995
3252
  head_record_stop_tip: "録画を停止 · .mp4 を保存",
2996
3253
  head_record_stop_label: "録画を停止",
3254
+ head_replay_stop_label: "停止",
2997
3255
  rec_pill_label: "録画中",
2998
3256
  rec_error_toast: "ミーティングの録画を開始できませんでした。画面録画の権限を確認してください。",
2999
3257
  rec_exit_class: "録画中 · 選択",
@@ -3341,7 +3599,8 @@ When the room ___, raise an objection.`,
3341
3599
  us_user_tag: "▸ ユーザー",
3342
3600
  us_user_deck: "ボードルームでの呼称と、文脈として保持される情報。",
3343
3601
  us_avatar: "アバター",
3344
- us_regen_avatar: "8 ビットアバターを生成",
3602
+ us_regen_avatar: "8ビットアバター",
3603
+ us_avatar3d: "3Dアバター",
3345
3604
  us_name: "名前",
3346
3605
  us_about: "あなたについて",
3347
3606
  us_intro_ph: "あなたの役割、考えていること、取り組んでいることを一文か二文。ディレクターはこれを会議室全体で意識します。",
@@ -3826,6 +4085,20 @@ When the room ___, raise an objection.`,
3826
4085
 
3827
4086
  convene_show_more: "Ver más ↓",
3828
4087
  convene_show_less: "Ver menos ↑",
4088
+ // Thread · conversación privada 1:1 con un director
4089
+ thread_trigger: "// privado",
4090
+ thread_trigger_short: "Responder en privado",
4091
+ thread_trigger_label: "Privado",
4092
+ thread_trigger_tip: "Aparta a {name} en privado",
4093
+ thread_head_kicker: "privado contigo",
4094
+ thread_minimize: "—",
4095
+ thread_minimize_tip: "Minimizar",
4096
+ thread_close: "✕",
4097
+ thread_close_tip: "Cerrar",
4098
+ thread_empty_title: "Apártalo",
4099
+ thread_empty_deck: "¿Qué quieres ahondar con {name}? Tiene todo el contexto de la sala hasta este punto.",
4100
+ thread_composer_placeholder: "Pregúntale a {name}…",
4101
+ thread_send: "Enviar",
3829
4102
  convene_eyebrow: "▸ Convocar · Pregunta inicial",
3830
4103
  convene_meta_to: "para",
3831
4104
 
@@ -3928,6 +4201,7 @@ When the room ___, raise an objection.`,
3928
4201
  head_record_label: "Grabar reunión",
3929
4202
  head_record_stop_tip: "Detener grabación · guardar .mp4",
3930
4203
  head_record_stop_label: "Detener grabación",
4204
+ head_replay_stop_label: "Detener",
3931
4205
  rec_pill_label: "GRAB.",
3932
4206
  rec_error_toast: "No se pudo iniciar la grabación. Revisa el permiso de captura de pantalla e inténtalo de nuevo.",
3933
4207
  rec_exit_class: "grabando · elige",
@@ -4275,7 +4549,8 @@ When the room ___, raise an objection.`,
4275
4549
  us_user_tag: "▸ Usuario",
4276
4550
  us_user_deck: "cómo te llama la sala y qué sabe sobre tu contexto.",
4277
4551
  us_avatar: "Avatar",
4278
- us_regen_avatar: "generar avatar 8-bit",
4552
+ us_regen_avatar: "avatar 8-bit",
4553
+ us_avatar3d: "avatar 3D",
4279
4554
  us_name: "Nombre",
4280
4555
  us_about: "Sobre ti",
4281
4556
  us_intro_ph: "Una línea o dos sobre tu rol, en qué piensas, en qué trabajas. Los directores lo tendrán presente en todas las salas.",
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file