openclacky 1.2.18 → 1.3.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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +35 -0
  3. data/lib/clacky/agent/time_machine.rb +256 -74
  4. data/lib/clacky/agent/tool_executor.rb +12 -0
  5. data/lib/clacky/agent.rb +15 -20
  6. data/lib/clacky/agent_config.rb +18 -0
  7. data/lib/clacky/cli.rb +55 -3
  8. data/lib/clacky/default_skills/media-gen/SKILL.md +172 -5
  9. data/lib/clacky/media/base.rb +93 -0
  10. data/lib/clacky/media/gemini.rb +10 -0
  11. data/lib/clacky/media/generator.rb +57 -0
  12. data/lib/clacky/media/openai_compat.rb +160 -0
  13. data/lib/clacky/message_history.rb +12 -7
  14. data/lib/clacky/providers.rb +29 -1
  15. data/lib/clacky/rich_ui_controller.rb +3 -1
  16. data/lib/clacky/server/backup_manager.rb +200 -0
  17. data/lib/clacky/server/channel/adapters/feishu/adapter.rb +10 -2
  18. data/lib/clacky/server/channel/adapters/feishu/bot.rb +68 -15
  19. data/lib/clacky/server/channel/channel_manager.rb +65 -50
  20. data/lib/clacky/server/http_server.rb +356 -14
  21. data/lib/clacky/server/scheduler.rb +19 -0
  22. data/lib/clacky/server/session_registry.rb +8 -4
  23. data/lib/clacky/session_manager.rb +40 -2
  24. data/lib/clacky/tools/trash_manager.rb +14 -0
  25. data/lib/clacky/ui2/components/command_suggestions.rb +1 -0
  26. data/lib/clacky/ui2/components/modal_component.rb +34 -7
  27. data/lib/clacky/ui2/ui_controller.rb +150 -19
  28. data/lib/clacky/utils/file_processor.rb +75 -4
  29. data/lib/clacky/version.rb +1 -1
  30. data/lib/clacky/web/app.css +2283 -1277
  31. data/lib/clacky/web/app.js +73 -1
  32. data/lib/clacky/web/backup.js +119 -0
  33. data/lib/clacky/web/billing.js +224 -11
  34. data/lib/clacky/web/channels.js +81 -11
  35. data/lib/clacky/web/design-sample.css +247 -0
  36. data/lib/clacky/web/design-sample.html +127 -0
  37. data/lib/clacky/web/favicon.svg +16 -0
  38. data/lib/clacky/web/i18n.js +167 -31
  39. data/lib/clacky/web/index.html +176 -55
  40. data/lib/clacky/web/logo_nav_dark.png +0 -0
  41. data/lib/clacky/web/onboard.js +121 -28
  42. data/lib/clacky/web/sessions.js +447 -192
  43. data/lib/clacky/web/settings.js +21 -1
  44. data/lib/clacky/web/skills.js +34 -1
  45. data/lib/clacky/web/tasks.js +129 -61
  46. data/lib/clacky/web/utils.js +72 -0
  47. data/lib/clacky/web/ws-dispatcher.js +6 -0
  48. data/lib/clacky.rb +1 -0
  49. metadata +9 -8
  50. data/lib/clacky/server/channel/group_message_buffer.rb +0 -53
@@ -30,9 +30,18 @@ const I18n = (() => {
30
30
  "sidebar.billing": "Usage",
31
31
 
32
32
  // ── Welcome screen ──
33
- "welcome.title": "Welcome to {{brand}}",
34
- "welcome.body": "Create a new session or select one from the sidebar.",
35
- "welcome.btn": "New Session",
33
+ "welcome.title": "What should we build?",
34
+ "welcome.body": "Your agent is standing by. Pick a starting point or just type.",
35
+ "welcome.btn": "Start a blank session",
36
+ "welcome.chip.code.title": "Write code",
37
+ "welcome.chip.code.desc": "build, refactor, debug",
38
+ "welcome.chip.code.prompt": "Help me write some code. ",
39
+ "welcome.chip.task.title": "Automate a task",
40
+ "welcome.chip.task.desc": "schedule, run, repeat",
41
+ "welcome.chip.task.prompt": "I want to automate a recurring task. ",
42
+ "welcome.chip.research.title": "Research",
43
+ "welcome.chip.research.desc": "search, read, summarize",
44
+ "welcome.chip.research.prompt":"Research this for me: ",
36
45
 
37
46
  // ── Chat panel ──
38
47
  "chat.status.idle": "idle",
@@ -44,6 +53,7 @@ const I18n = (() => {
44
53
  "chat.input.placeholderRunningMobile": "Add more info…",
45
54
  "chat.btn.send": "Send",
46
55
  "chat.thinking": "Thinking…",
56
+ "chat.vision": "Reading image…",
47
57
  "chat.retrying": "Retrying",
48
58
  "chat.history_load_failed": "Could not load history",
49
59
  "chat.history_start": "No more history",
@@ -72,6 +82,8 @@ const I18n = (() => {
72
82
  "sessions.search.byName": "Title matches ({{n}})",
73
83
  "sessions.search.byContent": "Content matches ({{n}})",
74
84
  "sessions.search.contentEmpty": "No content matches",
85
+ "sessions.search.hint": "Type to search your sessions by title or content.",
86
+ "sessions.search.loading": "Searching…",
75
87
  "sessions.meta": "{{tasks}} tasks · ${{cost}}",
76
88
  "sessions.metaTasks": "{{n}} tasks",
77
89
  "sessions.deleteTitle": "Delete session",
@@ -85,6 +97,7 @@ const I18n = (() => {
85
97
  "sib.dir.tooltip": "Click to change directory",
86
98
  "sib.dir.changePrompt": "Change working directory",
87
99
  "sib.dir.home": "Home",
100
+ "sib.dir.up": "Up",
88
101
  "sib.dir.root": "Root",
89
102
  "sib.dir.default": "Default workspace",
90
103
  "sib.dir.current": "Current workspace", "sib.dir.inputPlaceholder": "Type or select a directory path",
@@ -92,7 +105,8 @@ const I18n = (() => {
92
105
  "sib.dir.empty": "Empty directory",
93
106
  "sib.dir.loadError": "Failed to load",
94
107
  "sib.dir.confirm": "Confirm",
95
- "sib.dir.cancel": "Cancel", "workspace.title": "Workspace",
108
+ "sib.dir.cancel": "Cancel",
109
+ "sib.dir.showHidden": "Show hidden files", "workspace.title": "Workspace",
96
110
  "workspace.expand": "Open workspace",
97
111
  "workspace.collapse": "Collapse workspace",
98
112
  "workspace.refresh": "Refresh",
@@ -160,6 +174,8 @@ const I18n = (() => {
160
174
  "sessions.modal.model": "Model",
161
175
  "sessions.modal.directory": "Working Directory",
162
176
  "sessions.modal.directory.placeholder": "~/clacky_workspace",
177
+ "sessions.modal.directory.browse": "Browse folders",
178
+ "sessions.modal.dirpicker.title": "Select Working Directory",
163
179
  "sessions.modal.initProject": "Initialize full-stack project (/new)",
164
180
  "sessions.modal.create": "Create Session",
165
181
 
@@ -205,6 +221,7 @@ const I18n = (() => {
205
221
  "tasks.btn.edit": "Edit",
206
222
  "tasks.btn.pause": "Pause",
207
223
  "tasks.btn.resume": "Resume",
224
+ "tasks.btn.delete": "Delete",
208
225
  "tasks.paused": "Paused",
209
226
  "tasks.toggleError": "Error updating task.",
210
227
  "tasks.runError": "Error: ",
@@ -417,6 +434,10 @@ const I18n = (() => {
417
434
  "skills.toggle.disableDesc": "AI can auto-invoke. Disable to prevent auto-triggering (manual use still available)",
418
435
  "skills.toggle.enableDesc": "AI cannot auto-invoke. Enable to allow auto-triggering",
419
436
  "skills.toggleError": "Error: ",
437
+ "skills.deleteConfirm": "Are you sure you want to delete \"{{name}}\"? This cannot be undone.",
438
+ "skills.deleteError": "Delete failed.",
439
+ "skills.deleted": "Skill \"{{name}}\" deleted.",
440
+ "skills.btn.delete": "Delete skill",
420
441
  "skills.ac.empty": "No skills available",
421
442
  "skills.upload.uploading": "Uploading…",
422
443
  "skills.upload.uploaded": "Uploaded",
@@ -455,6 +476,13 @@ const I18n = (() => {
455
476
  "channels.telegram.desc": "Connect via Telegram Bot API (HTTPS long-poll, token from @BotFather)",
456
477
  "channels.dingtalk.desc": "Connect via DingTalk Stream Mode WebSocket",
457
478
 
479
+ "channels.section.connected": "Connected",
480
+ "channels.section.unconfigured": "Not Configured",
481
+ "channels.customDev.title": "Build Your Own Adapter",
482
+ "channels.customDev.desc": "Clacky's channel system has an open adapter interface. Implement a few methods and your IM platform gets first-class support — WebSocket connection, session binding, and Agent-powered chat.",
483
+ "channels.customDev.btn": "Develop with Agent",
484
+ "channels.customDev.prompt": "Read the documentation at https://www.openclacky.com/docs/extend-channel-adapter and help me develop a new IM adapter. Read the docs first to understand the adapter interface, then guide me through it.",
485
+
458
486
  // ── MCP panel ──
459
487
  "mcp.title": "MCP Servers",
460
488
  "mcp.subtitle": "Standard Model Context Protocol servers (Claude Desktop / Cursor compatible). Edit ~/.clacky/mcp.json to add or remove servers.",
@@ -497,21 +525,21 @@ const I18n = (() => {
497
525
  "settings.about.links": "Links",
498
526
  "settings.about.website": "Website",
499
527
  "settings.about.docs": "Documentation",
500
- "settings.models.title": "AI Models",
528
+ "settings.models.title": "Primary Model",
501
529
  "settings.models.add": "+ Add Model",
502
530
  "settings.models.loading": "Loading models…",
503
531
  "settings.models.error": "Failed to load: {{msg}}",
504
532
  "settings.models.empty": "No models configured. Click \"+ Add Model\" to add one.",
505
533
  "settings.models.badge.default": "Default",
506
534
  "settings.models.badge.lite": "Lite",
507
- "settings.media.title": "Media Generation",
508
- "settings.media.desc": "Optional. Image / video / audio / OCR sidecar models.",
535
+ "settings.media.title": "Secondary Models",
536
+ "settings.media.desc": "Optional. Image / video / audio / vision models.",
509
537
  "settings.media.loading": "Loading…",
510
538
  "settings.media.error": "Failed to load: {{msg}}",
511
539
  "settings.media.kind.image": "Image",
512
540
  "settings.media.kind.video": "Video",
513
541
  "settings.media.kind.audio": "Audio",
514
- "settings.media.kind.ocr": "OCR",
542
+ "settings.media.kind.ocr": "Vision",
515
543
  "settings.media.source.off": "Off",
516
544
  "settings.media.source.auto": "Auto",
517
545
  "settings.media.source.custom": "Custom",
@@ -521,6 +549,7 @@ const I18n = (() => {
521
549
  "settings.media.field.provider":"Provider",
522
550
  "settings.media.off.hint": "Disabled.",
523
551
  "settings.media.auto.followsDefault": "Auto-enabled via your default provider",
552
+ "settings.media.vision.primary": "Your default model supports vision — enabled automatically.",
524
553
  "settings.media.auto.stale": "Selected model {{requested}} is unavailable on the current provider — using {{current}} instead.",
525
554
  "settings.media.auto.noDefaultModel": "Set a default chat model first.",
526
555
  "settings.media.auto.unsupported": "Current provider has no built-in model for this kind. Switch to Custom.",
@@ -588,15 +617,15 @@ const I18n = (() => {
588
617
  "settings.models.confirmRemove": "Remove model \"{{model}}\"?",
589
618
  "settings.personalize.title": "Personalize",
590
619
  "settings.personalize.desc": "Re-run the onboarding to update your assistant's personality and user profile (SOUL.md & USER.md).",
591
- "settings.personalize.btn": "Re-run Onboard",
620
+ "settings.personalize.btn": "Re-run Onboard",
592
621
  "settings.personalize.btn.starting": "Starting…",
593
- "settings.personalize.btn.rerun": "Re-run Onboard",
622
+ "settings.personalize.btn.rerun": "Re-run Onboard",
594
623
  "settings.browser.title": "Browser",
595
624
  "settings.browser.desc": "Connect your browser to enable browser automation.",
596
- "settings.browser.configured": "Browser connected",
597
- "settings.browser.disabled": "⏸ Browser disabled",
598
- "settings.browser.btn": "🌐 Configure Browser",
599
- "settings.browser.btn.reconfigure": "🌐 Reconfigure Browser",
625
+ "settings.browser.configured": "Browser connected",
626
+ "settings.browser.disabled": "⏸Browser disabled",
627
+ "settings.browser.btn": "Configure Browser",
628
+ "settings.browser.btn.reconfigure": "Reconfigure Browser",
600
629
  "settings.browser.btn.starting": "Starting…",
601
630
  "settings.network.title": "Network",
602
631
  "settings.network.desc": "Proxy is disabled by default. To enable, enter an HTTP/HTTPS proxy URL below (SOCKS5 is not supported).",
@@ -606,6 +635,16 @@ const I18n = (() => {
606
635
  "settings.network.clear": "Clear",
607
636
  "settings.network.cleared": "Cleared — direct connection",
608
637
  "settings.network.invalidUrl": "Invalid URL — use http://host:port or http://user:pass@host:port",
638
+ "settings.backup.title": "Backup",
639
+ "settings.backup.desc": "Back up your ~/.clacky directory (config, skills, memories, tasks, sessions). Regenerable caches and logs are excluded.",
640
+ "settings.backup.includeSessions": "Include session history (larger archive)",
641
+ "settings.backup.autoLabel": "Automatic backup",
642
+ "settings.backup.autoHint": "Daily at 03:00, keeps the latest 7",
643
+ "settings.backup.runNow": "Download backup",
644
+ "settings.backup.running": "Preparing backup…",
645
+ "settings.backup.downloaded": "Backup downloaded.",
646
+ "settings.backup.lastOk": "Last backup: {{time}}",
647
+ "settings.backup.lastError": "Backup failed: {{msg}}",
609
648
  "settings.brand.title": "Brand & License",
610
649
  "settings.brand.label.brand": "Brand",
611
650
  "settings.brand.label.status": "Status",
@@ -670,6 +709,23 @@ const I18n = (() => {
670
709
  "onboard.key.docsGuide.cta": "See the guide →",
671
710
  "onboard.key.btn.test": "Test & Continue →",
672
711
  "onboard.key.btn.back": "← Back",
712
+ "onboard.device.card.title": "OpenClacky AI Keys",
713
+ "onboard.device.card.lead": "Sign up and get $1 free credit · no subscription · pay as you go",
714
+ "onboard.device.card.point1": "One key for all frontier models — Claude, Gemini, DeepSeek & more",
715
+ "onboard.device.card.point2": "Same pricing as official APIs, switch models instantly",
716
+ "onboard.device.btn": "Get started free →",
717
+ "onboard.device.pending": "Waiting for confirmation in your browser…",
718
+ "onboard.device.code": "Verification code:",
719
+ "onboard.device.reopen": "Open browser again →",
720
+ "onboard.device.cancel": "Cancel",
721
+ "onboard.device.success.title": "You're in!",
722
+ "onboard.device.success.lead": "Your account is connected. Here's what you got:",
723
+ "onboard.device.success.credit.label": "Free trial credit:",
724
+ "onboard.device.success.credit.value": "$1.00 (one-time, on us)",
725
+ "onboard.device.success.model.label": "Trial model:",
726
+ "onboard.device.success.note": "During the trial only Gemini 3.5 Flash is available — top up any amount to unlock all frontier models on this same key.",
727
+ "onboard.device.success.btn": "Start using Clacky →",
728
+ "onboard.manual.toggle": "Configure manually with your own API key",
673
729
  "onboard.provider.custom": "Custom",
674
730
  "provider.recommended": "Recommended",
675
731
  "provider.promo.openclacky.title": "OpenClacky AI Keys",
@@ -706,6 +762,7 @@ const I18n = (() => {
706
762
  "brand.banner.freePromptBoth": "Welcome to {{name}} — {{free}} free skill{{freePlural}} ready to use, plus {{paid}} premium skill{{paidPlural}} unlockable with a serial number.",
707
763
 
708
764
  "header.owner.tooltip": "Creator — click to open Creator Hub",
765
+ "header.cmdbar.placeholder": "Search sessions…",
709
766
  "notify.tooltip.on": "Sound on task complete: ON (click to mute)",
710
767
  "notify.tooltip.off": "Sound on task complete: OFF (click to enable)",
711
768
 
@@ -777,6 +834,17 @@ const I18n = (() => {
777
834
  "sib.bench.done": "done in {{t}}s",
778
835
  "sib.bench.failed": "failed: {{msg}}",
779
836
  "sib.bench.latencyTooltip": "TTFT {{ttft}} · tested {{time}}",
837
+ "sib.vision.ok": "vision",
838
+ "sib.vision.missing": "no vision",
839
+ "sib.vision.okTip": "This model can read images.",
840
+ "sib.vision.missingTip": "This model can't read images. Configure a vision model in Settings.",
841
+ "sib.gen.title": "Generation",
842
+ "sib.gen.config": "Configure",
843
+ "sib.gen.kind.image": "Image",
844
+ "sib.gen.kind.video": "Video",
845
+ "sib.gen.kind.audio": "Audio",
846
+ "sib.gen.okTip": "Configured: {{model}}",
847
+ "sib.gen.offTip": "Not configured — click to set up in Settings.",
780
848
 
781
849
  "onboard.welcome": "Welcome to {{name}}",
782
850
 
@@ -849,9 +917,18 @@ const I18n = (() => {
849
917
  "sidebar.billing": "用量信息",
850
918
 
851
919
  // ── Welcome screen ──
852
- "welcome.title": "欢迎使用 {{brand}}",
853
- "welcome.body": "新建会话,或从左侧选择一个已有会话。",
854
- "welcome.btn": "新建会话",
920
+ "welcome.title": "今天想做点什么?",
921
+ "welcome.body": "Agent 已就绪。选一个起点,或者直接开始输入。",
922
+ "welcome.btn": "新建空白会话",
923
+ "welcome.chip.code.title": "写代码",
924
+ "welcome.chip.code.desc": "开发、重构、调试",
925
+ "welcome.chip.code.prompt": "帮我写一段代码:",
926
+ "welcome.chip.task.title": "自动化任务",
927
+ "welcome.chip.task.desc": "定时、执行、重复",
928
+ "welcome.chip.task.prompt": "我想把一个重复性任务自动化:",
929
+ "welcome.chip.research.title": "做调研",
930
+ "welcome.chip.research.desc": "搜索、阅读、汇总",
931
+ "welcome.chip.research.prompt":"帮我调研一下:",
855
932
 
856
933
  // ── Chat panel ──
857
934
  "chat.status.idle": "空闲",
@@ -863,6 +940,7 @@ const I18n = (() => {
863
940
  "chat.input.placeholderRunningMobile": "可输入补充消息…",
864
941
  "chat.btn.send": "发送",
865
942
  "chat.thinking": "思考中…",
943
+ "chat.vision": "识别图片内容…",
866
944
  "chat.retrying": "正在重试",
867
945
  "chat.history_load_failed": "历史记录加载失败",
868
946
  "chat.history_start": "没有更多历史了",
@@ -889,6 +967,8 @@ const I18n = (() => {
889
967
  "sessions.search.byName": "标题匹配 ({{n}})",
890
968
  "sessions.search.byContent": "内容匹配 ({{n}})",
891
969
  "sessions.search.contentEmpty": "没有内容匹配",
970
+ "sessions.search.hint": "输入关键词,按标题或内容搜索会话。",
971
+ "sessions.search.loading": "正在搜索…",
892
972
  "sessions.meta": "{{tasks}} 个任务 · ${{cost}}",
893
973
  "sessions.metaTasks": "{{n}} 个任务",
894
974
  "sessions.deleteTitle": "删除会话",
@@ -902,6 +982,7 @@ const I18n = (() => {
902
982
  "sib.dir.tooltip": "点击切换工作目录",
903
983
  "sib.dir.changePrompt": "切换工作目录",
904
984
  "sib.dir.home": "主目录",
985
+ "sib.dir.up": "上一级",
905
986
  "sib.dir.root": "根目录",
906
987
  "sib.dir.default": "默认工作目录",
907
988
  "sib.dir.current": "当前工作目录", "sib.dir.inputPlaceholder": "输入或选择目录路径",
@@ -909,7 +990,8 @@ const I18n = (() => {
909
990
  "sib.dir.empty": "空目录",
910
991
  "sib.dir.loadError": "加载失败",
911
992
  "sib.dir.confirm": "确认",
912
- "sib.dir.cancel": "取消", "workspace.title": "工作区",
993
+ "sib.dir.cancel": "取消",
994
+ "sib.dir.showHidden": "显示隐藏文件", "workspace.title": "工作区",
913
995
  "workspace.expand": "打开工作区",
914
996
  "workspace.collapse": "收起工作区",
915
997
  "workspace.refresh": "刷新",
@@ -975,6 +1057,8 @@ const I18n = (() => {
975
1057
  "sessions.modal.model": "模型",
976
1058
  "sessions.modal.directory": "工作目录",
977
1059
  "sessions.modal.directory.placeholder": "~/clacky_workspace",
1060
+ "sessions.modal.directory.browse": "选择文件夹",
1061
+ "sessions.modal.dirpicker.title": "选择工作目录",
978
1062
  "sessions.modal.initProject": "初始化全栈项目 (/new)",
979
1063
  "sessions.modal.create": "创建会话",
980
1064
 
@@ -1020,6 +1104,7 @@ const I18n = (() => {
1020
1104
  "tasks.btn.edit": "编辑",
1021
1105
  "tasks.btn.pause": "暂停",
1022
1106
  "tasks.btn.resume": "启用",
1107
+ "tasks.btn.delete": "删除",
1023
1108
  "tasks.paused": "已暂停",
1024
1109
  "tasks.toggleError": "更新任务失败。",
1025
1110
  "tasks.runError": "错误:",
@@ -1233,6 +1318,10 @@ const I18n = (() => {
1233
1318
  "skills.toggle.disableDesc": "AI 可自动调用。关闭后 AI 不会主动触发(手动使用仍可用)",
1234
1319
  "skills.toggle.enableDesc": "AI 不会自动调用。开启后允许 AI 主动触发",
1235
1320
  "skills.toggleError": "错误:",
1321
+ "skills.deleteConfirm": "确定要删除 \"{{name}}\" 吗?此操作不可撤销。",
1322
+ "skills.deleteError": "删除失败。",
1323
+ "skills.deleted": "技能 \"{{name}}\" 已删除。",
1324
+ "skills.btn.delete": "删除技能",
1236
1325
  "skills.ac.empty": "暂无可用技能",
1237
1326
  "skills.upload.uploading": "上传中…",
1238
1327
  "skills.upload.uploaded": "已上传",
@@ -1271,6 +1360,13 @@ const I18n = (() => {
1271
1360
  "channels.telegram.desc": "通过 Telegram Bot API 接入(HTTPS 长轮询,token 来自 @BotFather)",
1272
1361
  "channels.dingtalk.desc": "通过钉钉 Stream 模式 WebSocket 接入",
1273
1362
 
1363
+ "channels.section.connected": "已连接",
1364
+ "channels.section.unconfigured": "未配置",
1365
+ "channels.customDev.title": "开发自己的适配器",
1366
+ "channels.customDev.desc": "Clacky 频道系统提供开放的适配器接口,只需实现几个方法,你的 IM 平台就能获得完整支持——WebSocket 长连接、会话绑定、Agent 智能对话。",
1367
+ "channels.customDev.btn": "用 Agent 开发",
1368
+ "channels.customDev.prompt": "参考 https://www.openclacky.com/docs/extend-channel-adapter 这篇文档,帮我开发一个新的 IM 适配器。请先读取这篇文档了解适配器的接口规范,然后引导我完成开发。",
1369
+
1274
1370
  // ── MCP panel ──
1275
1371
  "mcp.title": "MCP 工具",
1276
1372
  "mcp.subtitle": "标准 Model Context Protocol 服务(与 Claude Desktop / Cursor 兼容)。编辑 ~/.clacky/mcp.json 添加或移除服务。",
@@ -1313,21 +1409,21 @@ const I18n = (() => {
1313
1409
  "settings.about.links": "链接",
1314
1410
  "settings.about.website": "官网",
1315
1411
  "settings.about.docs": "文档",
1316
- "settings.models.title": "AI 模型",
1412
+ "settings.models.title": "配置主模型",
1317
1413
  "settings.models.add": "+ 添加模型",
1318
1414
  "settings.models.loading": "加载模型中…",
1319
1415
  "settings.models.error": "加载失败:{{msg}}",
1320
1416
  "settings.models.empty": "暂未配置模型,点击「+ 添加模型」添加。",
1321
1417
  "settings.models.badge.default": "默认",
1322
1418
  "settings.models.badge.lite": "轻量",
1323
- "settings.media.title": "媒体生成",
1324
- "settings.media.desc": "可选。图片 / 视频 / 音频 / 图片理解(OCR)副模型。",
1419
+ "settings.media.title": "配置副模型",
1420
+ "settings.media.desc": "可选。图片生成 / 视频生成 / 音频生成 / 视觉理解。",
1325
1421
  "settings.media.loading": "加载中…",
1326
1422
  "settings.media.error": "加载失败:{{msg}}",
1327
- "settings.media.kind.image": "图片",
1328
- "settings.media.kind.video": "视频",
1329
- "settings.media.kind.audio": "音频",
1330
- "settings.media.kind.ocr": "OCR",
1423
+ "settings.media.kind.image": "图片生成",
1424
+ "settings.media.kind.video": "视频生成",
1425
+ "settings.media.kind.audio": "音频生成",
1426
+ "settings.media.kind.ocr": "视觉理解",
1331
1427
  "settings.media.source.off": "关闭",
1332
1428
  "settings.media.source.auto": "自动",
1333
1429
  "settings.media.source.custom": "自定义",
@@ -1337,6 +1433,7 @@ const I18n = (() => {
1337
1433
  "settings.media.field.provider":"服务商",
1338
1434
  "settings.media.off.hint": "已关闭。",
1339
1435
  "settings.media.auto.followsDefault": "该服务商已支持,已自动启用",
1436
+ "settings.media.vision.primary": "主模型已支持视觉,已自动启用",
1340
1437
  "settings.media.auto.stale": "你选定的 {{requested}} 在当前服务商不可用,已临时使用 {{current}}。",
1341
1438
  "settings.media.auto.noDefaultModel": "请先设置默认聊天模型。",
1342
1439
  "settings.media.auto.unsupported": "当前服务商无内置模型,请切换到「自定义」。",
@@ -1404,15 +1501,15 @@ const I18n = (() => {
1404
1501
  "settings.models.confirmRemove": "删除模型「{{model}}」?",
1405
1502
  "settings.personalize.title": "个性化",
1406
1503
  "settings.personalize.desc": "重新运行引导流程,更新助手的个性和用户档案(SOUL.md & USER.md)。",
1407
- "settings.personalize.btn": "重新引导",
1504
+ "settings.personalize.btn": "重新引导",
1408
1505
  "settings.personalize.btn.starting": "启动中…",
1409
- "settings.personalize.btn.rerun": "重新引导",
1506
+ "settings.personalize.btn.rerun": "重新引导",
1410
1507
  "settings.browser.title": "浏览器",
1411
1508
  "settings.browser.desc": "连接浏览器以启用浏览器自动化功能。",
1412
- "settings.browser.configured": "浏览器已连接",
1413
- "settings.browser.disabled": "⏸ 浏览器已禁用",
1414
- "settings.browser.btn": "🌐 配置浏览器",
1415
- "settings.browser.btn.reconfigure": "🌐 重新配置浏览器",
1509
+ "settings.browser.configured": "浏览器已连接",
1510
+ "settings.browser.disabled": "⏸浏览器已禁用",
1511
+ "settings.browser.btn": "配置浏览器",
1512
+ "settings.browser.btn.reconfigure": "重新配置浏览器",
1416
1513
  "settings.browser.btn.starting": "启动中…",
1417
1514
  "settings.network.title": "网络",
1418
1515
  "settings.network.desc": "默认不启用代理,如需启用,请填写 HTTP/HTTPS 代理地址(不支持 SOCKS5)。",
@@ -1422,6 +1519,16 @@ const I18n = (() => {
1422
1519
  "settings.network.clear": "清除",
1423
1520
  "settings.network.cleared": "已清除 — 直连",
1424
1521
  "settings.network.invalidUrl": "地址格式不正确,请使用 http://host:port 或 http://user:pass@host:port",
1522
+ "settings.backup.title": "备份",
1523
+ "settings.backup.desc": "备份你的 ~/.clacky 目录(配置、技能、记忆、任务、会话)。可重新生成的缓存和日志会被排除。",
1524
+ "settings.backup.includeSessions": "包含会话历史(归档更大)",
1525
+ "settings.backup.autoLabel": "自动备份",
1526
+ "settings.backup.autoHint": "每天 03:00 自动备份,保留最近 7 份",
1527
+ "settings.backup.runNow": "下载备份",
1528
+ "settings.backup.running": "正在准备备份…",
1529
+ "settings.backup.downloaded": "备份已下载。",
1530
+ "settings.backup.lastOk": "上次备份:{{time}}",
1531
+ "settings.backup.lastError": "备份失败:{{msg}}",
1425
1532
  "settings.brand.title": "品牌 & 授权",
1426
1533
  "settings.brand.label.brand": "品牌",
1427
1534
  "settings.brand.label.status": "状态",
@@ -1486,6 +1593,23 @@ const I18n = (() => {
1486
1593
  "onboard.key.docsGuide.cta": "查看指南 →",
1487
1594
  "onboard.key.btn.test": "测试并继续 →",
1488
1595
  "onboard.key.btn.back": "← 返回",
1596
+ "onboard.device.card.title": "OpenClacky AI Keys",
1597
+ "onboard.device.card.lead": "注册即送 $1 额度 · 无需订阅 · 随用随充",
1598
+ "onboard.device.card.point1": "一个 Key 直通全球顶级模型 — Claude、Gemini、DeepSeek 等",
1599
+ "onboard.device.card.point2": "官方同价,模型随心切换,即开即用",
1600
+ "onboard.device.btn": "一键获取,免费开始 →",
1601
+ "onboard.device.pending": "正在等待浏览器中确认授权…",
1602
+ "onboard.device.code": "验证码:",
1603
+ "onboard.device.reopen": "重新打开浏览器 →",
1604
+ "onboard.device.cancel": "取消",
1605
+ "onboard.device.success.title": "登录成功!",
1606
+ "onboard.device.success.lead": "账户已连接。你已获得:",
1607
+ "onboard.device.success.credit.label": "免费试用额度:",
1608
+ "onboard.device.success.credit.value": "$1.00(一次性赠送)",
1609
+ "onboard.device.success.model.label": "试用模型:",
1610
+ "onboard.device.success.note": "试用期内仅可使用 Gemini 3.5 Flash —— 任意金额充值后,同一 Key 立即解锁全部前沿模型。",
1611
+ "onboard.device.success.btn": "开始使用",
1612
+ "onboard.manual.toggle": "使用自己的 API Key 手动配置",
1489
1613
  "onboard.provider.custom": "自定义",
1490
1614
  "provider.recommended": "推荐",
1491
1615
  "provider.promo.openclacky.title": "推荐 OpenClacky AI Keys",
@@ -1522,6 +1646,7 @@ const I18n = (() => {
1522
1646
  "brand.banner.freePromptBoth": "欢迎使用 {{name}} — 已自动安装 {{free}} 个免费技能,还有 {{paid}} 个增值技能可输入序列号解锁。",
1523
1647
 
1524
1648
  "header.owner.tooltip": "创作者 — 点击进入创作者中心",
1649
+ "header.cmdbar.placeholder": "搜索会话…",
1525
1650
  "notify.tooltip.on": "任务完成提示音:已开启(点击关闭)",
1526
1651
  "notify.tooltip.off": "任务完成提示音:已关闭(点击开启)",
1527
1652
 
@@ -1593,6 +1718,17 @@ const I18n = (() => {
1593
1718
  "sib.bench.done": "用时 {{t}} 秒",
1594
1719
  "sib.bench.failed": "失败:{{msg}}",
1595
1720
  "sib.bench.latencyTooltip": "TTFT {{ttft}} · 测试于 {{time}}",
1721
+ "sib.vision.ok": "可识图",
1722
+ "sib.vision.missing": "不可识图",
1723
+ "sib.vision.okTip": "当前模型可识别图片内容。",
1724
+ "sib.vision.missingTip": "当前模型不能识别图片,可在设置中配置视觉模型。",
1725
+ "sib.gen.title": "生成能力",
1726
+ "sib.gen.config": "去配置",
1727
+ "sib.gen.kind.image": "图片",
1728
+ "sib.gen.kind.video": "视频",
1729
+ "sib.gen.kind.audio": "音频",
1730
+ "sib.gen.okTip": "已配置:{{model}}",
1731
+ "sib.gen.offTip": "未配置 — 点击前往设置配置。",
1596
1732
 
1597
1733
  "onboard.welcome": "欢迎使用 {{name}}",
1598
1734