openclacky 1.5.19 → 1.5.21
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +95 -0
- data/README.md +19 -1
- data/README_CN.md +1 -1
- data/README_JA.md +1 -1
- data/lib/clacky/agent/chunk_index.rb +8 -1
- data/lib/clacky/agent/feedback.rb +30 -0
- data/lib/clacky/agent/history_navigation.rb +17 -3
- data/lib/clacky/agent/hook_manager.rb +6 -1
- data/lib/clacky/agent/llm_caller.rb +17 -3
- data/lib/clacky/agent/message_compressor_helper.rb +36 -2
- data/lib/clacky/agent/session_serializer.rb +45 -4
- data/lib/clacky/agent.rb +135 -55
- data/lib/clacky/agent_config.rb +82 -4
- data/lib/clacky/billing/platform_billing.rb +10 -5
- data/lib/clacky/brand_config.rb +1 -1
- data/lib/clacky/cli.rb +5 -4
- data/lib/clacky/client.rb +12 -5
- data/lib/clacky/deepseek_web_tools.rb +156 -0
- data/lib/clacky/default_extensions/ext-studio/api/handler.rb +8 -0
- data/lib/clacky/default_extensions/ext-studio/panels/studio/view.js +97 -20
- data/lib/clacky/default_extensions/time_machine/panels/time_machine/view.js +1 -0
- data/lib/clacky/default_skills/onboard/SKILL.md +1 -1
- data/lib/clacky/extension/loader.rb +5 -3
- data/lib/clacky/locales/en.rb +5 -5
- data/lib/clacky/locales/zh.rb +5 -5
- data/lib/clacky/message_format/anthropic.rb +20 -0
- data/lib/clacky/message_format/open_ai.rb +31 -14
- data/lib/clacky/message_history.rb +45 -4
- data/lib/clacky/platform_http_client.rb +6 -2
- data/lib/clacky/providers.rb +38 -138
- data/lib/clacky/search_config.rb +47 -13
- data/lib/clacky/server/browser_manager.rb +35 -5
- data/lib/clacky/server/channel/channel_manager.rb +6 -6
- data/lib/clacky/server/discover.rb +5 -4
- data/lib/clacky/server/http_server.rb +285 -53
- data/lib/clacky/server/model_prices.rb +10 -5
- data/lib/clacky/server/pid_files.rb +25 -0
- data/lib/clacky/server/server_master.rb +9 -3
- data/lib/clacky/server/session_registry.rb +37 -7
- data/lib/clacky/server/web_ui_controller.rb +72 -0
- data/lib/clacky/session_manager.rb +28 -6
- data/lib/clacky/skill.rb +1 -1
- data/lib/clacky/tools/ask_user.rb +4 -1
- data/lib/clacky/tools/base.rb +3 -2
- data/lib/clacky/tools/browser.rb +18 -2
- data/lib/clacky/tools/file_reader.rb +1 -1
- data/lib/clacky/tools/terminal/session_manager.rb +19 -1
- data/lib/clacky/tools/terminal.rb +65 -23
- data/lib/clacky/tools/trash_manager.rb +5 -3
- data/lib/clacky/tools/web_fetch.rb +81 -22
- data/lib/clacky/tools/web_search.rb +45 -4
- data/lib/clacky/ui2/ui_controller.rb +1 -1
- data/lib/clacky/ui_interface.rb +4 -3
- data/lib/clacky/utils/file_processor.rb +51 -0
- data/lib/clacky/utils/model_pricing.rb +242 -39
- data/lib/clacky/version.rb +1 -1
- data/lib/clacky/web/app.css +1158 -249
- data/lib/clacky/web/app.js +82 -13
- data/lib/clacky/web/components/chat-navigator.js +8 -1
- data/lib/clacky/web/components/code-editor.js +6 -2
- data/lib/clacky/web/components/mentions.js +2 -13
- data/lib/clacky/web/components/model-picker.js +92 -97
- data/lib/clacky/web/components/onboard.js +13 -10
- data/lib/clacky/web/components/sidebar.js +6 -2
- data/lib/clacky/web/features/archive/store.js +196 -0
- data/lib/clacky/web/features/archive/view.js +409 -0
- data/lib/clacky/web/features/backup/view.js +17 -7
- data/lib/clacky/web/features/billing/view.js +84 -10
- data/lib/clacky/web/features/channels/view.js +75 -29
- data/lib/clacky/web/features/new-session/store.js +3 -3
- data/lib/clacky/web/features/new-session/view.js +1 -0
- data/lib/clacky/web/features/trash/store.js +14 -11
- data/lib/clacky/web/features/trash/view.js +66 -13
- data/lib/clacky/web/features/workspace/view.js +421 -16
- data/lib/clacky/web/i18n.js +242 -70
- data/lib/clacky/web/index.html +270 -117
- data/lib/clacky/web/projects.js +56 -1
- data/lib/clacky/web/sessions.js +609 -267
- data/lib/clacky/web/settings.js +186 -32
- data/lib/clacky/web/ws-dispatcher.js +33 -21
- data/lib/clacky.rb +4 -2
- metadata +6 -1
data/lib/clacky/web/i18n.js
CHANGED
|
@@ -25,7 +25,7 @@ const I18n = (() => {
|
|
|
25
25
|
"sidebar.channels": "Channel Management",
|
|
26
26
|
"sidebar.mcp": "MCP Servers",
|
|
27
27
|
"sidebar.extensions": "Extension Management",
|
|
28
|
-
"sidebar.
|
|
28
|
+
"sidebar.dataManagement": "Data",
|
|
29
29
|
"sidebar.profile": "Assistant Memory",
|
|
30
30
|
"sidebar.memories": "Memories",
|
|
31
31
|
"sidebar.dataSection": "My Data",
|
|
@@ -58,10 +58,15 @@ const I18n = (() => {
|
|
|
58
58
|
"projects.menu.edit": "Edit Project",
|
|
59
59
|
"projects.menu.delete": "Delete Project",
|
|
60
60
|
"projects.menu.deleteSessions": "Clear Sessions",
|
|
61
|
+
"projects.menu.archiveSessions": "Archive Sessions",
|
|
61
62
|
"projects.edit.title": "Edit Project",
|
|
62
63
|
"projects.edit.submit": "Save",
|
|
63
64
|
"projects.delete.confirm": "Delete project \"{{name}}\"? All sessions in this project will also be deleted.",
|
|
64
65
|
"projects.deleteSessions.confirm": "Clear all sessions in project \"{{name}}\"? The project itself will be kept.",
|
|
66
|
+
"projects.archiveSessions.confirm": "Archive all sessions in project \"{{name}}\"? They leave the sidebar and can be restored from Archived sessions.",
|
|
67
|
+
"projects.archiveSessions.done": "{{count}} session(s) archived",
|
|
68
|
+
"projects.archiveSessions.fail": "Archive failed: {{msg}}",
|
|
69
|
+
"projects.archiveSessions.empty": "This project has no sessions to archive.",
|
|
65
70
|
"projects.modal.name": "Project Name",
|
|
66
71
|
|
|
67
72
|
// ── Welcome screen ──
|
|
@@ -121,7 +126,11 @@ const I18n = (() => {
|
|
|
121
126
|
"chat.input.sendQueued": "Interrupt and run",
|
|
122
127
|
"chat.input.removeQueued": "Remove",
|
|
123
128
|
"chat.interrupted": "Generation stopped",
|
|
124
|
-
"chat.
|
|
129
|
+
"chat.feedback_countdown": "AI will decide and continue in {{seconds}}s",
|
|
130
|
+
"chat.feedback_waiting": "Waiting for your submission",
|
|
131
|
+
"chat.feedback_answered": "Submitted",
|
|
132
|
+
"chat.feedback_timeout": "AI decided and continued",
|
|
133
|
+
"chat.input.placeholderFeedback": "Answer the question, or add details…",
|
|
125
134
|
"chat.feedback_submit": "Submit",
|
|
126
135
|
"chat.feedback_other": "Or type your own answer",
|
|
127
136
|
"chat.feedback_recommended": "recommended",
|
|
@@ -142,6 +151,10 @@ const I18n = (() => {
|
|
|
142
151
|
"chat.search.showAll": "Show all {{count}} results ▾",
|
|
143
152
|
"chat.search.showLess": "Show less ▴",
|
|
144
153
|
"chat.todo.title": "Tasks",
|
|
154
|
+
"chat.todo.empty": "No active task list",
|
|
155
|
+
"chat.todo.open": "View task list",
|
|
156
|
+
"chat.todo.progress": "{{completed}} of {{total}} completed",
|
|
157
|
+
"chat.todo.close": "Close task list",
|
|
145
158
|
"chat.todo.spawn": "Start",
|
|
146
159
|
"chat.todo.spawning": "Starting…",
|
|
147
160
|
"chat.todo.spawnFailed": "Failed to start session: {msg}",
|
|
@@ -203,6 +216,7 @@ const I18n = (() => {
|
|
|
203
216
|
"sib.dir.userFavorites": "My favorites",
|
|
204
217
|
"sib.dir.loading": "Loading…",
|
|
205
218
|
"sib.dir.empty": "Empty directory",
|
|
219
|
+
"sib.dir.missing": "This folder no longer exists. Please select a new working directory.",
|
|
206
220
|
"sib.dir.loadError": "Failed to load",
|
|
207
221
|
"sib.dir.confirm": "Confirm",
|
|
208
222
|
"sib.dir.cancel": "Cancel",
|
|
@@ -253,12 +267,19 @@ const I18n = (() => {
|
|
|
253
267
|
"workspace.revealInFinder": "Reveal in Finder",
|
|
254
268
|
"workspace.revealFailed": "Failed to reveal file",
|
|
255
269
|
"workspace.closeTab": "Close",
|
|
270
|
+
"workspace.closeOthers": "Close Others",
|
|
271
|
+
"workspace.closeToTheRight": "Close to the Right",
|
|
272
|
+
"workspace.closeAllTabs": "Close All",
|
|
273
|
+
"workspace.zoomIn": "Zoom in",
|
|
274
|
+
"workspace.zoomOut": "Zoom out",
|
|
275
|
+
"workspace.zoomFit": "Fit to window",
|
|
256
276
|
"workspace.copyContent": "Copy content",
|
|
257
277
|
"workspace.copied": "Copied",
|
|
258
278
|
"workspace.copyFailed": "Copy failed",
|
|
259
279
|
"workspace.saved": "Saved",
|
|
260
280
|
"workspace.saveFailed": "Save failed",
|
|
261
281
|
"workspace.dirtyCloseConfirm": "This file has unsaved changes. Close it anyway?",
|
|
282
|
+
"workspace.dirtyCloseBatchConfirm": "{{count}} files have unsaved changes. Close them anyway?",
|
|
262
283
|
"changes.tab": "Git",
|
|
263
284
|
"changes.loading": "Loading changes…",
|
|
264
285
|
"changes.error": "Failed to load changes",
|
|
@@ -307,9 +328,8 @@ const I18n = (() => {
|
|
|
307
328
|
"tm.tab": "History",
|
|
308
329
|
"sib.model.tooltip": "Click to switch model",
|
|
309
330
|
"sib.model.tooltip.busy": "Model switching is disabled while the agent is responding",
|
|
310
|
-
"sib.
|
|
311
|
-
"sib.
|
|
312
|
-
"sib.picker.current": "Current model",
|
|
331
|
+
"sib.topup": "Top up",
|
|
332
|
+
"sib.topup.tip": "Top up at {{provider}}",
|
|
313
333
|
"sib.variant.header": "Switch model",
|
|
314
334
|
"sib.variant.default": "default",
|
|
315
335
|
"sib.signal.tooltip": "Recent LLM latency",
|
|
@@ -319,9 +339,14 @@ const I18n = (() => {
|
|
|
319
339
|
"sib.status.idle": "idle",
|
|
320
340
|
"sib.status.running": "running",
|
|
321
341
|
"sib.status.error": "error",
|
|
322
|
-
"sib.status.awaiting_feedback": "
|
|
323
|
-
"sib.mode.
|
|
324
|
-
"sib.
|
|
342
|
+
"sib.status.awaiting_feedback": "Waiting for answer",
|
|
343
|
+
"sib.mode.pill": "Mode",
|
|
344
|
+
"sib.mode.label": "Permission mode",
|
|
345
|
+
"sib.mode.manualHelp": "Wait for you when confirmation or an answer is needed.",
|
|
346
|
+
"sib.mode.autoHelp": "Confirm automatically. If you don’t answer a question in time, AI decides and continues.",
|
|
347
|
+
"sib.mode.confirm_all": "Manual",
|
|
348
|
+
"sib.mode.auto_approve": "Auto",
|
|
349
|
+
"sib.mode.tooltip": "Session permissions: Auto approve runs tools without approval and continues after the ask_user countdown. Switch anytime; running tools finish normally.",
|
|
325
350
|
"sib.cost.tooltip": "Estimated token cost for this session",
|
|
326
351
|
"sib.reasoning.label": "Reasoning",
|
|
327
352
|
"sib.reasoning.heading": "Reasoning effort",
|
|
@@ -355,6 +380,8 @@ const I18n = (() => {
|
|
|
355
380
|
"sessions.actions.unpin": "Unpin",
|
|
356
381
|
"sessions.actions.fork": "Fork",
|
|
357
382
|
"sessions.actions.rename": "Rename",
|
|
383
|
+
"sessions.actions.archive": "Archive",
|
|
384
|
+
"sessions.actions.unarchive": "Unarchive",
|
|
358
385
|
"sessions.actions.delete": "Delete",
|
|
359
386
|
"sessions.actions.moveToProject": "Move to Project",
|
|
360
387
|
"sessions.actions.removeFromProject": "Remove from Project",
|
|
@@ -366,6 +393,7 @@ const I18n = (() => {
|
|
|
366
393
|
"sessions.loadMore": "Load more sessions",
|
|
367
394
|
"sessions.loadingMore": "Loading…",
|
|
368
395
|
"sessions.search.placeholder": "Search sessions…",
|
|
396
|
+
"sessions.search.clear": "Clear",
|
|
369
397
|
"sessions.search.typeAll": "All types",
|
|
370
398
|
"sessions.search.typeManual": "Default",
|
|
371
399
|
"sessions.search.typeCron": "Scheduled",
|
|
@@ -480,8 +508,7 @@ const I18n = (() => {
|
|
|
480
508
|
"skills.subtitle": "Extend your assistant's capabilities with custom skills",
|
|
481
509
|
|
|
482
510
|
// ── Creator trash ──
|
|
483
|
-
"trash.title": "
|
|
484
|
-
"trash.subtitle": "Files the AI Agent moved to trash across all projects. Recall them back to where they were, or clear the ones you don't need.",
|
|
511
|
+
"trash.title": "Recycle Bin",
|
|
485
512
|
"trash.refresh": "Refresh",
|
|
486
513
|
"trash.refresh.tooltip": "Reload the trash list",
|
|
487
514
|
"trash.emptyOld": "Empty older than 7 days",
|
|
@@ -530,12 +557,50 @@ const I18n = (() => {
|
|
|
530
557
|
"trash.cleanFail": "Operation failed: {{msg}}",
|
|
531
558
|
|
|
532
559
|
// ── Session type filter ──
|
|
533
|
-
"trash.
|
|
560
|
+
"trash.filterAllTypes": "All types",
|
|
534
561
|
"trash.filterCron": "Scheduled",
|
|
535
562
|
"trash.filterManual": "Regular",
|
|
563
|
+
"trash.filterChannel": "Channel",
|
|
536
564
|
"trash.filterAllProjects": "All Projects",
|
|
537
565
|
"trash.sessionAutoCleanHint": "The system keeps the most recent 200 sessions; older ones are moved here and permanently deleted after 7 days.",
|
|
538
566
|
|
|
567
|
+
// ── Data management page (archive / recycle bin / backup tabs) ──
|
|
568
|
+
"dataManagement.title": "Data",
|
|
569
|
+
"dataManagement.subtitle": "Archiving only hides a session from the sidebar, recycled files can be restored to where they were, and a backup can move your whole ~/.clacky to another machine.",
|
|
570
|
+
|
|
571
|
+
// ── Archive (Archived sessions page) ──
|
|
572
|
+
"archive.title": "Archived sessions",
|
|
573
|
+
"archive.deleteAll": "Delete all",
|
|
574
|
+
"archive.searchPlaceholder": "Search archived sessions",
|
|
575
|
+
"archive.filterAllProjects": "All Projects",
|
|
576
|
+
"archive.filterAllTypes": "All types",
|
|
577
|
+
"archive.filterRegular": "Regular",
|
|
578
|
+
"archive.filterCron": "Scheduled",
|
|
579
|
+
"archive.filterChannel": "Channel",
|
|
580
|
+
"archive.groupNoProject": "No project",
|
|
581
|
+
"archive.empty": "No archived sessions yet.",
|
|
582
|
+
"archive.noMatch": "No archived sessions match your filters.",
|
|
583
|
+
"archive.summary": "{{n}} archived",
|
|
584
|
+
"archive.unarchive": "Unarchive",
|
|
585
|
+
"archive.deleteOne": "Delete",
|
|
586
|
+
"archive.loadMore": "Load more",
|
|
587
|
+
"archive.loadingMore": "Loading…",
|
|
588
|
+
"archive.confirmArchive": "Archive \"{{name}}\"? It leaves the sidebar and can be restored from Archived sessions.",
|
|
589
|
+
"archive.confirmDelete": "Delete \"{{name}}\"? It moves to the recycle bin.",
|
|
590
|
+
"archive.confirmDeleteAll": "Delete all {{count}} archived sessions? They move to the recycle bin.",
|
|
591
|
+
"archive.archived": "\"{{name}}\" archived",
|
|
592
|
+
"archive.unarchived": "\"{{name}}\" restored to the sidebar",
|
|
593
|
+
"archive.unarchivedAction": "Open",
|
|
594
|
+
"archive.deleted": "\"{{name}}\" moved to the recycle bin",
|
|
595
|
+
"archive.deletedAll": "{{count}} chat(s) moved to the recycle bin",
|
|
596
|
+
"archive.undo": "Undo",
|
|
597
|
+
"archive.actionFail": "Archive failed: {{msg}}",
|
|
598
|
+
"archive.unarchiveFail": "Restore failed: {{msg}}",
|
|
599
|
+
"archive.deleteFail": "Delete failed: {{msg}}",
|
|
600
|
+
|
|
601
|
+
// ── Backup (Backup page) ──
|
|
602
|
+
"backup.title": "Data backup",
|
|
603
|
+
|
|
539
604
|
// ── Relative time (used by _humanTime helper) ──
|
|
540
605
|
"time.justNow": "just now",
|
|
541
606
|
"time.minsAgo": "{{n}}m ago",
|
|
@@ -592,7 +657,7 @@ const I18n = (() => {
|
|
|
592
657
|
"memories.delete": "Delete",
|
|
593
658
|
"memories.deleteTitle": "Delete this memory",
|
|
594
659
|
"memories.deleteFail": "Delete failed",
|
|
595
|
-
"memories.confirmDelete": "Delete memory \"{{name}}\"?\nIt will be moved to
|
|
660
|
+
"memories.confirmDelete": "Delete memory \"{{name}}\"?\nIt will be moved to the Recycle Bin and can still be recovered from there.",
|
|
596
661
|
"memories.expandTitle": "Show full content",
|
|
597
662
|
"memories.reloadList": "Reload",
|
|
598
663
|
"memories.loading": "Loading…",
|
|
@@ -738,15 +803,16 @@ const I18n = (() => {
|
|
|
738
803
|
"channels.dingtalk.desc": "Connect via DingTalk Stream Mode WebSocket",
|
|
739
804
|
"channels.qq.desc": "Connect via QQ official bot (QQ Open Platform WebSocket, C2C & group @)",
|
|
740
805
|
"channels.qq.qr.title": "Connect QQ",
|
|
741
|
-
"channels.qq.qr.hint": "
|
|
806
|
+
"channels.qq.qr.hint": "Scan with phone QQ to create/link a bot automatically.",
|
|
742
807
|
"channels.qq.qr.waiting": "Waiting for confirmation…",
|
|
743
|
-
"channels.qq.qr.scanPrompt": "Scan the QR code with phone QQ, then confirm.",
|
|
744
808
|
"channels.qq.qr.open": "Open authorize page",
|
|
745
809
|
"channels.qq.qr.copy": "Copy link",
|
|
746
810
|
"channels.qq.qr.copied": "Copied",
|
|
747
|
-
"channels.qq.qr.success": "
|
|
748
|
-
"channels.qq.qr.
|
|
749
|
-
"channels.qq.qr.
|
|
811
|
+
"channels.qq.qr.success": "QQ connected",
|
|
812
|
+
"channels.qq.qr.successDesc": "The bot is ready. Send it a message in QQ to start chatting.",
|
|
813
|
+
"channels.qq.qr.done": "Done",
|
|
814
|
+
"channels.qq.qr.expired": "QR code expired, click to refresh",
|
|
815
|
+
"channels.qq.qr.sessionExpired": "Session expired, click to refresh",
|
|
750
816
|
|
|
751
817
|
"channels.section.connected": "Connected",
|
|
752
818
|
"channels.section.unconfigured": "Not Configured",
|
|
@@ -854,7 +920,6 @@ const I18n = (() => {
|
|
|
854
920
|
"settings.tabs.models": "Models",
|
|
855
921
|
"settings.tabs.ui": "UI",
|
|
856
922
|
"settings.tabs.general": "General",
|
|
857
|
-
"settings.tabs.data": "Backup Management",
|
|
858
923
|
"settings.tabs.about": "About",
|
|
859
924
|
|
|
860
925
|
"settings.about.version": "Version",
|
|
@@ -947,7 +1012,7 @@ const I18n = (() => {
|
|
|
947
1012
|
"settings.models.btn.saved": "Saved ✓",
|
|
948
1013
|
"settings.models.btn.testing": "Testing…",
|
|
949
1014
|
"settings.models.btn.test": "Test",
|
|
950
|
-
"settings.models.link.topUp": "Top up
|
|
1015
|
+
"settings.models.link.topUp": "Top up",
|
|
951
1016
|
"settings.models.btn.edit": "Edit",
|
|
952
1017
|
"settings.models.btn.duplicate": "Duplicate",
|
|
953
1018
|
"settings.models.btn.delete": "Delete",
|
|
@@ -991,6 +1056,14 @@ const I18n = (() => {
|
|
|
991
1056
|
"settings.browser.btn": "Configure Browser",
|
|
992
1057
|
"settings.browser.btn.reconfigure": "Reconfigure Browser",
|
|
993
1058
|
"settings.browser.btn.starting": "Starting…",
|
|
1059
|
+
"settings.browser.screenshot.title": "Screenshot quality",
|
|
1060
|
+
"settings.browser.screenshot.desc": "When the AI browses a web page it takes screenshots to \"see\" it. Higher quality looks clearer, but each screenshot takes up more of the conversation — long tasks can end up slower and more expensive.",
|
|
1061
|
+
"settings.browser.screenshot.quality": "Quality",
|
|
1062
|
+
"settings.browser.screenshot.qualityHint": "Standard is enough for most pages and saves space. High keeps more detail on long pages.",
|
|
1063
|
+
"settings.browser.screenshot.standard": "Standard",
|
|
1064
|
+
"settings.browser.screenshot.high": "High",
|
|
1065
|
+
"settings.browser.screenshot.saved": "Saved",
|
|
1066
|
+
"settings.browser.screenshot.saveFailed": "Failed to save",
|
|
994
1067
|
"settings.network.title": "Network",
|
|
995
1068
|
"settings.network.desc": "Proxy is disabled by default. To enable, enter an HTTP/HTTPS proxy URL below (SOCKS5 is not supported).",
|
|
996
1069
|
"settings.network.proxyUrl": "Proxy URL",
|
|
@@ -1000,9 +1073,10 @@ const I18n = (() => {
|
|
|
1000
1073
|
"settings.network.cleared": "Cleared — direct connection",
|
|
1001
1074
|
"settings.network.invalidUrl": "Invalid URL — use http://host:port or http://user:pass@host:port",
|
|
1002
1075
|
"settings.search.title": "Web Search",
|
|
1003
|
-
"settings.search.desc": "
|
|
1076
|
+
"settings.search.desc": "The agent searches the web and fetches page content automatically when it needs up-to-date information — news, docs, prices, time-sensitive data.",
|
|
1004
1077
|
"settings.search.provider": "Provider",
|
|
1005
|
-
"settings.search.builtin": "
|
|
1078
|
+
"settings.search.builtin": "Free (auto-selects a working engine)",
|
|
1079
|
+
"settings.search.builtinEngines": "Tries Parallel → DuckDuckGo → Bing in order. No key or configuration needed.",
|
|
1006
1080
|
"settings.search.key": "API Key",
|
|
1007
1081
|
"settings.search.save": "Save",
|
|
1008
1082
|
"settings.search.saved": "Saved",
|
|
@@ -1010,7 +1084,15 @@ const I18n = (() => {
|
|
|
1010
1084
|
"settings.search.testing": "Testing…",
|
|
1011
1085
|
"settings.search.ok": "Search provider works",
|
|
1012
1086
|
"settings.search.failed": "Search provider test failed",
|
|
1013
|
-
"settings.search.
|
|
1087
|
+
"settings.search.keyRequired": "Enter an API Key to use this provider",
|
|
1088
|
+
"settings.search.customBtn": "Build with Agent",
|
|
1089
|
+
"settings.search.customHint": "Need another search provider? Put a script in ~/.clacky/searchers/, see tavily.rb.",
|
|
1090
|
+
"settings.search.customPrompt": "I want to add a custom web search provider. Read ~/.clacky/searchers/tavily.rb first to learn the script contract, then ask me which provider to integrate and what you need from me (API endpoint, key, free tier). After that, write the script under ~/.clacky/searchers/.",
|
|
1091
|
+
"settings.search.customSessionName": "Custom search provider",
|
|
1092
|
+
"settings.search.deepseek": "DeepSeek (search & page fetch)",
|
|
1093
|
+
"settings.search.deepseekHintFree": "Leave the API Key empty to reuse your configured model key; accepts DeepSeek and OpenClacky provider keys. Per-call billing starts Nov 1, 2026 00:00 (Beijing time) at about ¥0.005 per call.",
|
|
1094
|
+
"settings.search.deepseekHint": "Leave the API Key empty to reuse your configured model key; accepts DeepSeek and OpenClacky provider keys. Billed per request at about ¥0.005 per call.",
|
|
1095
|
+
"settings.search.deepseekKeyPlaceholder": "Optional",
|
|
1014
1096
|
"settings.backup.title": "Backup",
|
|
1015
1097
|
"settings.backup.autoTitle": "Auto Backup",
|
|
1016
1098
|
"settings.backup.manualTitle": "Manual Backup",
|
|
@@ -1058,7 +1140,8 @@ const I18n = (() => {
|
|
|
1058
1140
|
"settings.brand.badge.active": "Active",
|
|
1059
1141
|
"settings.brand.badge.warning": "Expiring Soon",
|
|
1060
1142
|
"settings.brand.badge.expired": "Expired",
|
|
1061
|
-
"settings.brand.badge.unreachable": "
|
|
1143
|
+
"settings.brand.badge.unreachable": "License Server Unreachable",
|
|
1144
|
+
"settings.brand.hint.unreachable": "Everything keeps working for now — check your network, or click \u201cChange Serial Number\u201d to re-activate and restore the check.",
|
|
1062
1145
|
"settings.brand.desc": "Have a serial number from a brand partner? Enter it below to activate branded mode.",
|
|
1063
1146
|
"settings.brand.descNamed": "Enter your {{name}} serial number to activate branded mode.",
|
|
1064
1147
|
"settings.brand.btn.getSerial": "Get a Serial Number",
|
|
@@ -1117,13 +1200,16 @@ const I18n = (() => {
|
|
|
1117
1200
|
"onboard.key.btn.back": "Back",
|
|
1118
1201
|
"onboard.device.card.title": "OpenClacky AI Keys",
|
|
1119
1202
|
"onboard.device.card.lead": "Sign up and get $1 free credit · no subscription · pay as you go",
|
|
1120
|
-
"onboard.device.card.point1": "One key for all frontier models — Claude,
|
|
1121
|
-
"onboard.device.card.point2": "
|
|
1203
|
+
"onboard.device.card.point1": "One key for all frontier models — Claude, GPT, DeepSeek & more",
|
|
1204
|
+
"onboard.device.card.point2": "Up to 70% off, switch models instantly",
|
|
1122
1205
|
"onboard.device.btn": "Get started free",
|
|
1123
|
-
"onboard.device.pending": "
|
|
1124
|
-
"onboard.device.code": "Verification code:",
|
|
1206
|
+
"onboard.device.pending": "Finishing the connection in your browser…",
|
|
1125
1207
|
"onboard.device.reopen": "Open browser again",
|
|
1126
1208
|
"onboard.device.cancel": "Cancel",
|
|
1209
|
+
"onboard.device.error.denied": "Cancelled — you can try again.",
|
|
1210
|
+
"onboard.device.error.expired": "This link expired — please try again.",
|
|
1211
|
+
"onboard.device.error.failed": "Couldn't connect — please try again.",
|
|
1212
|
+
"onboard.device.error.startFailed": "Could not start the connection. Please try again.",
|
|
1127
1213
|
"onboard.device.success.title": "You're in!",
|
|
1128
1214
|
"onboard.device.success.lead": "Your account is connected. Here's what you got:",
|
|
1129
1215
|
"onboard.device.success.credit.label": "Free trial credit:",
|
|
@@ -1136,7 +1222,7 @@ const I18n = (() => {
|
|
|
1136
1222
|
"provider.recommended": "Recommended",
|
|
1137
1223
|
"provider.name.volcengine_ark": "Volcengine Ark (Doubao)",
|
|
1138
1224
|
"provider.promo.openclacky.title": "OpenClacky AI Keys",
|
|
1139
|
-
"provider.promo.openclacky.1": "All frontier models, one key — Claude,
|
|
1225
|
+
"provider.promo.openclacky.1": "All frontier models, one key — Claude, GPT, DeepSeek & more.",
|
|
1140
1226
|
"provider.promo.openclacky.2": "Top reasoning, best value, best vision — unified in one API.",
|
|
1141
1227
|
"provider.promo.openclacky.3": "Same pricing as official APIs, switch models instantly.",
|
|
1142
1228
|
"onboard.key.testing": "Testing…",
|
|
@@ -1266,17 +1352,15 @@ const I18n = (() => {
|
|
|
1266
1352
|
"sib.auto.tag": "Economy",
|
|
1267
1353
|
"sib.auto.tipTitle": "Auto · economy-first routing",
|
|
1268
1354
|
"sib.auto.tip": "Starts with the cheapest model and upgrades only when necessary. Picks the most popular, capable and affordable models in real time. The price ratio floats accordingly.",
|
|
1269
|
-
"sib.price.tip": "Connected straight to the vendor's own endpoint, billed at list price. Cost vs Claude Sonnet 5 (≈ ${{in}} in / ${{out}} out per 1M tokens)",
|
|
1270
|
-
"sib.price.tip.
|
|
1355
|
+
"sib.price.tip": "Connected straight to the vendor's own endpoint, billed at list price. Cost vs Claude Sonnet 5 (≈ ${{in}} in / ${{out}} out per 1M tokens).",
|
|
1356
|
+
"sib.price.tip.abs": "Connected straight to the vendor's own endpoint. Cost vs Claude Sonnet 5 (≈ ${{in}} in / ${{out}} out per 1M tokens).",
|
|
1357
|
+
"sib.price.tip.discounted": "Not connected to the vendor's own endpoint — served through a third-party channel, billed at list price, and the {{percent}}% off is a limited-time promotion. Cost vs Claude Sonnet 5 is ≈ ${{in}} in / ${{out}} out per 1M tokens.",
|
|
1358
|
+
"sib.price.tip.promo": "Connected straight to the vendor's own endpoint, billed at list price; the {{percent}}% off is a limited-time promotion. Cost vs Claude Sonnet 5 is ≈ ${{in}} in / ${{out}} out per 1M tokens.",
|
|
1271
1359
|
"sib.discount.tag": "{{percent}}% off",
|
|
1272
1360
|
"sib.bench.running": "Testing…",
|
|
1273
1361
|
"sib.bench.done": "done in {{t}}s",
|
|
1274
1362
|
"sib.bench.failed": "failed: {{msg}}",
|
|
1275
1363
|
"sib.bench.latencyTooltip": "TTFT {{ttft}} · tested {{time}}",
|
|
1276
|
-
"sib.vision.ok": "vision",
|
|
1277
|
-
"sib.vision.missing": "no vision",
|
|
1278
|
-
"sib.vision.okTip": "This model can read images.",
|
|
1279
|
-
"sib.vision.missingTip": "This model can't read images. Configure a vision model in Settings.",
|
|
1280
1364
|
"sib.gen.title": "Generation",
|
|
1281
1365
|
"sib.gen.config": "Configure",
|
|
1282
1366
|
"sib.gen.kind.image": "Image",
|
|
@@ -1323,6 +1407,8 @@ const I18n = (() => {
|
|
|
1323
1407
|
|
|
1324
1408
|
"error.insufficient_credit": "Insufficient LLM credit. Please top up your account to continue.",
|
|
1325
1409
|
"error.insufficient_credit.action": "Top up",
|
|
1410
|
+
"error.check_account.action": "Check account",
|
|
1411
|
+
"error.insufficient_credit.history": "This run stopped because of insufficient LLM credit.",
|
|
1326
1412
|
"error.show_detail": "Show details",
|
|
1327
1413
|
|
|
1328
1414
|
"billing.sessions": "Sessions",
|
|
@@ -1350,7 +1436,7 @@ const I18n = (() => {
|
|
|
1350
1436
|
"sidebar.channels": "频道管理",
|
|
1351
1437
|
"sidebar.mcp": "MCP 工具",
|
|
1352
1438
|
"sidebar.extensions": "扩展管理",
|
|
1353
|
-
"sidebar.
|
|
1439
|
+
"sidebar.dataManagement": "数据管理",
|
|
1354
1440
|
"sidebar.profile": "助理记忆",
|
|
1355
1441
|
"sidebar.memories": "记忆",
|
|
1356
1442
|
"sidebar.dataSection": "我的数据",
|
|
@@ -1382,10 +1468,15 @@ const I18n = (() => {
|
|
|
1382
1468
|
"projects.menu.edit": "编辑项目",
|
|
1383
1469
|
"projects.menu.delete": "删除项目",
|
|
1384
1470
|
"projects.menu.deleteSessions": "清空会话",
|
|
1471
|
+
"projects.menu.archiveSessions": "归档会话",
|
|
1385
1472
|
"projects.edit.title": "编辑项目",
|
|
1386
1473
|
"projects.edit.submit": "保存",
|
|
1387
1474
|
"projects.delete.confirm": "删除项目「{{name}}」?该项目下的所有会话也将被删除。",
|
|
1388
1475
|
"projects.deleteSessions.confirm": "清空项目「{{name}}」下的所有会话?项目本身会被保留。",
|
|
1476
|
+
"projects.archiveSessions.confirm": "归档项目「{{name}}」下的所有会话?会话会离开侧边栏,可在「已归档的会话」中恢复。",
|
|
1477
|
+
"projects.archiveSessions.done": "已归档 {{count}} 个会话",
|
|
1478
|
+
"projects.archiveSessions.fail": "归档失败:{{msg}}",
|
|
1479
|
+
"projects.archiveSessions.empty": "该项目下暂无可归档的会话。",
|
|
1389
1480
|
"projects.modal.name": "项目名称",
|
|
1390
1481
|
|
|
1391
1482
|
// ── Welcome screen ──
|
|
@@ -1445,7 +1536,11 @@ const I18n = (() => {
|
|
|
1445
1536
|
"chat.input.sendQueued": "打断并执行",
|
|
1446
1537
|
"chat.input.removeQueued": "撤回",
|
|
1447
1538
|
"chat.interrupted": "已停止生成",
|
|
1448
|
-
"chat.
|
|
1539
|
+
"chat.feedback_countdown": "{{seconds}} 秒后由 AI 决定并继续",
|
|
1540
|
+
"chat.feedback_waiting": "等待你提交",
|
|
1541
|
+
"chat.feedback_answered": "已提交",
|
|
1542
|
+
"chat.feedback_timeout": "已由 AI 决定并继续",
|
|
1543
|
+
"chat.input.placeholderFeedback": "回答问题,或补充说明…",
|
|
1449
1544
|
"chat.feedback_submit": "提交",
|
|
1450
1545
|
"chat.feedback_other": "或自己填写",
|
|
1451
1546
|
"chat.feedback_recommended": "推荐",
|
|
@@ -1464,6 +1559,10 @@ const I18n = (() => {
|
|
|
1464
1559
|
"chat.search.showAll": "显示全部 {{count}} 条 ▾",
|
|
1465
1560
|
"chat.search.showLess": "收起 ▴",
|
|
1466
1561
|
"chat.todo.title": "任务清单",
|
|
1562
|
+
"chat.todo.empty": "暂无任务清单",
|
|
1563
|
+
"chat.todo.open": "查看任务清单",
|
|
1564
|
+
"chat.todo.progress": "已完成 {{completed}} 项,共 {{total}} 项",
|
|
1565
|
+
"chat.todo.close": "关闭任务清单",
|
|
1467
1566
|
"chat.todo.spawn": "开干",
|
|
1468
1567
|
"chat.todo.spawning": "创建中…",
|
|
1469
1568
|
"chat.todo.spawnFailed": "创建会话失败:{msg}",
|
|
@@ -1525,6 +1624,7 @@ const I18n = (() => {
|
|
|
1525
1624
|
"sib.dir.userFavorites": "我的收藏",
|
|
1526
1625
|
"sib.dir.loading": "加载中…",
|
|
1527
1626
|
"sib.dir.empty": "空目录",
|
|
1627
|
+
"sib.dir.missing": "该文件夹已不存在,请重新选择工作目录。",
|
|
1528
1628
|
"sib.dir.loadError": "加载失败",
|
|
1529
1629
|
"sib.dir.confirm": "确认",
|
|
1530
1630
|
"sib.dir.cancel": "取消",
|
|
@@ -1575,12 +1675,19 @@ const I18n = (() => {
|
|
|
1575
1675
|
"workspace.revealInFinder": "打开所在文件夹",
|
|
1576
1676
|
"workspace.revealFailed": "无法打开文件位置",
|
|
1577
1677
|
"workspace.closeTab": "关闭",
|
|
1678
|
+
"workspace.closeOthers": "关闭其他",
|
|
1679
|
+
"workspace.closeToTheRight": "关闭右侧",
|
|
1680
|
+
"workspace.closeAllTabs": "关闭全部",
|
|
1681
|
+
"workspace.zoomIn": "放大",
|
|
1682
|
+
"workspace.zoomOut": "缩小",
|
|
1683
|
+
"workspace.zoomFit": "适应窗口",
|
|
1578
1684
|
"workspace.copyContent": "复制内容",
|
|
1579
1685
|
"workspace.copied": "已复制",
|
|
1580
1686
|
"workspace.copyFailed": "复制失败",
|
|
1581
1687
|
"workspace.saved": "已保存",
|
|
1582
1688
|
"workspace.saveFailed": "保存失败",
|
|
1583
1689
|
"workspace.dirtyCloseConfirm": "文件有未保存的修改,确定关闭?",
|
|
1690
|
+
"workspace.dirtyCloseBatchConfirm": "有 {{count}} 个文件未保存,确定关闭?",
|
|
1584
1691
|
"changes.tab": "Git 管理",
|
|
1585
1692
|
"changes.loading": "正在读取改动…",
|
|
1586
1693
|
"changes.error": "读取改动失败",
|
|
@@ -1629,9 +1736,8 @@ const I18n = (() => {
|
|
|
1629
1736
|
"tm.tab": "时光机",
|
|
1630
1737
|
"sib.model.tooltip": "点击切换模型",
|
|
1631
1738
|
"sib.model.tooltip.busy": "Agent 回复中,暂时无法切换模型",
|
|
1632
|
-
"sib.
|
|
1633
|
-
"sib.
|
|
1634
|
-
"sib.picker.current": "当前模型",
|
|
1739
|
+
"sib.topup": "去充值",
|
|
1740
|
+
"sib.topup.tip": "前往 {{provider}} 充值",
|
|
1635
1741
|
"sib.variant.header": "切换模型",
|
|
1636
1742
|
"sib.variant.default": "默认",
|
|
1637
1743
|
"sib.signal.tooltip": "最近一次 LLM 响应延迟",
|
|
@@ -1641,9 +1747,14 @@ const I18n = (() => {
|
|
|
1641
1747
|
"sib.status.idle": "空闲",
|
|
1642
1748
|
"sib.status.running": "运行",
|
|
1643
1749
|
"sib.status.error": "错误",
|
|
1644
|
-
"sib.status.awaiting_feedback": "
|
|
1645
|
-
"sib.mode.
|
|
1646
|
-
"sib.
|
|
1750
|
+
"sib.status.awaiting_feedback": "等待回答",
|
|
1751
|
+
"sib.mode.pill": "权限",
|
|
1752
|
+
"sib.mode.label": "权限模式",
|
|
1753
|
+
"sib.mode.manualHelp": "需要你确认或回答时,停下来等你。",
|
|
1754
|
+
"sib.mode.autoHelp": "需要确认时自动同意;提问后若未回答,由 AI 决定并继续。",
|
|
1755
|
+
"sib.mode.confirm_all": "手动",
|
|
1756
|
+
"sib.mode.auto_approve": "自动",
|
|
1757
|
+
"sib.mode.tooltip": "当前会话权限:自动批准会免确认执行工具,并在 ask_user 倒计时结束后继续。运行中也可切换,已开始的工具会正常完成。",
|
|
1647
1758
|
"sib.cost.tooltip": "本次会话的预估 Token 费用",
|
|
1648
1759
|
"sib.reasoning.label": "思考",
|
|
1649
1760
|
"sib.reasoning.heading": "思考等级",
|
|
@@ -1678,6 +1789,8 @@ const I18n = (() => {
|
|
|
1678
1789
|
"sessions.actions.unpin": "取消置顶",
|
|
1679
1790
|
"sessions.actions.fork": "复制会话",
|
|
1680
1791
|
"sessions.actions.rename": "重命名",
|
|
1792
|
+
"sessions.actions.archive": "归档",
|
|
1793
|
+
"sessions.actions.unarchive": "取消归档",
|
|
1681
1794
|
"sessions.actions.delete": "删除",
|
|
1682
1795
|
"sessions.actions.moveToProject": "移入项目",
|
|
1683
1796
|
"sessions.actions.removeFromProject": "移出此项目",
|
|
@@ -1688,6 +1801,7 @@ const I18n = (() => {
|
|
|
1688
1801
|
"sessions.moveToProject.failed": "移动会话失败:{{message}}",
|
|
1689
1802
|
"sessions.loadingMore": "加载中…",
|
|
1690
1803
|
"sessions.search.placeholder": "搜索会话…",
|
|
1804
|
+
"sessions.search.clear": "清除",
|
|
1691
1805
|
"sessions.search.typeAll": "全部类型",
|
|
1692
1806
|
"sessions.search.typeManual": "默认",
|
|
1693
1807
|
"sessions.search.typeCron": "定时",
|
|
@@ -1800,8 +1914,7 @@ const I18n = (() => {
|
|
|
1800
1914
|
"skills.subtitle": "为助手添加自定义能力",
|
|
1801
1915
|
|
|
1802
1916
|
// ── Creator trash ──
|
|
1803
|
-
"trash.title": "
|
|
1804
|
-
"trash.subtitle": "AI Agent 在各个项目里丢进回收站的文件。可以把它们召回到原位置,或彻底清理不再需要的。",
|
|
1917
|
+
"trash.title": "回收站",
|
|
1805
1918
|
"trash.refresh": "刷新",
|
|
1806
1919
|
"trash.refresh.tooltip": "重新加载回收站列表",
|
|
1807
1920
|
"trash.emptyOld": "清理 7 天前",
|
|
@@ -1832,8 +1945,8 @@ const I18n = (() => {
|
|
|
1832
1945
|
"trash.nothingOld": "没有超过 7 天的文件。",
|
|
1833
1946
|
|
|
1834
1947
|
// ── Session trash ──
|
|
1835
|
-
"trash.tabFile": "
|
|
1836
|
-
"trash.tabSession": "
|
|
1948
|
+
"trash.tabFile": "文件",
|
|
1949
|
+
"trash.tabSession": "会话",
|
|
1837
1950
|
"trash.summarySessions": "共 {{count}} 个会话,{{size}}",
|
|
1838
1951
|
"trash.sessionTasks": "{{n}} 个任务",
|
|
1839
1952
|
"trash.sessionMessages": "{{n}} 条消息",
|
|
@@ -1852,12 +1965,50 @@ const I18n = (() => {
|
|
|
1852
1965
|
"trash.cleanFail": "操作失败:{{msg}}",
|
|
1853
1966
|
|
|
1854
1967
|
// ── Session type filter ──
|
|
1855
|
-
"trash.
|
|
1968
|
+
"trash.filterAllTypes": "全部类型",
|
|
1856
1969
|
"trash.filterCron": "定时任务",
|
|
1857
1970
|
"trash.filterManual": "普通会话",
|
|
1971
|
+
"trash.filterChannel": "频道",
|
|
1858
1972
|
"trash.filterAllProjects": "所有项目",
|
|
1859
1973
|
"trash.sessionAutoCleanHint": "系统自动保留最近 200 个会话,超出后自动移入此处,超出 7 天的会话将永久删除。",
|
|
1860
1974
|
|
|
1975
|
+
// ── Data management page (archive / recycle bin / backup tabs) ──
|
|
1976
|
+
"dataManagement.title": "数据管理",
|
|
1977
|
+
"dataManagement.subtitle": "归档只是把会话从侧栏收起来,回收站里的文件能恢复到原位置,备份则能把整个 ~/.clacky 搬到另一台机器。",
|
|
1978
|
+
|
|
1979
|
+
// ── Archive (Archived sessions page) ──
|
|
1980
|
+
"archive.title": "已归档的会话",
|
|
1981
|
+
"archive.deleteAll": "全部删除",
|
|
1982
|
+
"archive.searchPlaceholder": "搜索已归档的会话",
|
|
1983
|
+
"archive.filterAllProjects": "所有项目",
|
|
1984
|
+
"archive.filterAllTypes": "全部类型",
|
|
1985
|
+
"archive.filterRegular": "普通会话",
|
|
1986
|
+
"archive.filterCron": "定时任务",
|
|
1987
|
+
"archive.filterChannel": "频道",
|
|
1988
|
+
"archive.groupNoProject": "未归属项目",
|
|
1989
|
+
"archive.empty": "还没有归档的会话。",
|
|
1990
|
+
"archive.noMatch": "没有符合筛选条件的归档会话。",
|
|
1991
|
+
"archive.summary": "已归档 {{n}} 个",
|
|
1992
|
+
"archive.unarchive": "取消归档",
|
|
1993
|
+
"archive.deleteOne": "删除",
|
|
1994
|
+
"archive.loadMore": "加载更多",
|
|
1995
|
+
"archive.loadingMore": "加载中…",
|
|
1996
|
+
"archive.confirmArchive": "归档「{{name}}」?归档后会离开侧栏,可在「已归档的会话」中恢复。",
|
|
1997
|
+
"archive.confirmDelete": "删除「{{name}}」?删除后会进入回收站。",
|
|
1998
|
+
"archive.confirmDeleteAll": "删除全部 {{count}} 个已归档会话?删除后会进入回收站。",
|
|
1999
|
+
"archive.archived": "「{{name}}」已归档",
|
|
2000
|
+
"archive.unarchived": "「{{name}}」已恢复到侧栏",
|
|
2001
|
+
"archive.unarchivedAction": "去查看",
|
|
2002
|
+
"archive.deleted": "「{{name}}」已移入回收站",
|
|
2003
|
+
"archive.deletedAll": "{{count}} 个会话已移入回收站",
|
|
2004
|
+
"archive.undo": "撤销",
|
|
2005
|
+
"archive.actionFail": "归档失败:{{msg}}",
|
|
2006
|
+
"archive.unarchiveFail": "恢复失败:{{msg}}",
|
|
2007
|
+
"archive.deleteFail": "删除失败:{{msg}}",
|
|
2008
|
+
|
|
2009
|
+
// ── Backup (数据备份页) ──
|
|
2010
|
+
"backup.title": "数据备份",
|
|
2011
|
+
|
|
1861
2012
|
// ── Relative time (used by _humanTime helper) ──
|
|
1862
2013
|
"time.justNow": "刚刚",
|
|
1863
2014
|
"time.minsAgo": "{{n}} 分钟前",
|
|
@@ -1913,7 +2064,7 @@ const I18n = (() => {
|
|
|
1913
2064
|
"memories.delete": "删除",
|
|
1914
2065
|
"memories.deleteTitle": "删除这条记忆",
|
|
1915
2066
|
"memories.deleteFail": "删除失败",
|
|
1916
|
-
"memories.confirmDelete": "删除记忆 \"{{name}}\" 吗?\n
|
|
2067
|
+
"memories.confirmDelete": "删除记忆 \"{{name}}\" 吗?\n会先放入「回收站」,仍可从那里恢复。",
|
|
1917
2068
|
"memories.expandTitle": "展开完整内容",
|
|
1918
2069
|
"memories.reloadList": "刷新列表",
|
|
1919
2070
|
"memories.loading": "加载中…",
|
|
@@ -2059,15 +2210,16 @@ const I18n = (() => {
|
|
|
2059
2210
|
"channels.dingtalk.desc": "通过钉钉 Stream 模式 WebSocket 接入",
|
|
2060
2211
|
"channels.qq.desc": "通过 QQ 官方机器人接入(QQ 开放平台 WebSocket,私聊与群@)",
|
|
2061
2212
|
"channels.qq.qr.title": "连接 QQ",
|
|
2062
|
-
"channels.qq.qr.hint": "
|
|
2213
|
+
"channels.qq.qr.hint": "用手机 QQ 扫码,即可自动创建/绑定机器人。",
|
|
2063
2214
|
"channels.qq.qr.waiting": "等待确认…",
|
|
2064
|
-
"channels.qq.qr.scanPrompt": "请用手机 QQ 扫描二维码并确认。",
|
|
2065
2215
|
"channels.qq.qr.open": "打开授权页",
|
|
2066
2216
|
"channels.qq.qr.copy": "复制链接",
|
|
2067
2217
|
"channels.qq.qr.copied": "已复制",
|
|
2068
|
-
"channels.qq.qr.success": "
|
|
2069
|
-
"channels.qq.qr.
|
|
2070
|
-
"channels.qq.qr.
|
|
2218
|
+
"channels.qq.qr.success": "QQ 已连接",
|
|
2219
|
+
"channels.qq.qr.successDesc": "机器人已就绪,在 QQ 里给它发消息即可开始对话。",
|
|
2220
|
+
"channels.qq.qr.done": "完成",
|
|
2221
|
+
"channels.qq.qr.expired": "二维码已过期,点击刷新",
|
|
2222
|
+
"channels.qq.qr.sessionExpired": "会话已过期,点击刷新",
|
|
2071
2223
|
|
|
2072
2224
|
"channels.section.connected": "已连接",
|
|
2073
2225
|
"channels.section.unconfigured": "未配置",
|
|
@@ -2175,7 +2327,6 @@ const I18n = (() => {
|
|
|
2175
2327
|
"settings.tabs.models": "模型",
|
|
2176
2328
|
"settings.tabs.ui": "界面",
|
|
2177
2329
|
"settings.tabs.general": "通用",
|
|
2178
|
-
"settings.tabs.data": "备份管理",
|
|
2179
2330
|
"settings.tabs.about": "关于",
|
|
2180
2331
|
|
|
2181
2332
|
"settings.about.version": "版本",
|
|
@@ -2275,7 +2426,7 @@ const I18n = (() => {
|
|
|
2275
2426
|
"settings.models.btn.saved": "已保存 ✓",
|
|
2276
2427
|
"settings.models.btn.testing": "测试中…",
|
|
2277
2428
|
"settings.models.btn.test": "测试",
|
|
2278
|
-
"settings.models.link.topUp": "
|
|
2429
|
+
"settings.models.link.topUp": "去充值",
|
|
2279
2430
|
"settings.models.btn.edit": "编辑",
|
|
2280
2431
|
"settings.models.btn.duplicate": "复制",
|
|
2281
2432
|
"settings.models.btn.delete": "删除",
|
|
@@ -2319,6 +2470,14 @@ const I18n = (() => {
|
|
|
2319
2470
|
"settings.browser.btn": "配置浏览器",
|
|
2320
2471
|
"settings.browser.btn.reconfigure": "重新配置浏览器",
|
|
2321
2472
|
"settings.browser.btn.starting": "启动中…",
|
|
2473
|
+
"settings.browser.screenshot.title": "截图质量",
|
|
2474
|
+
"settings.browser.screenshot.desc": "AI 浏览网页时会截图来「看」页面。画质越高看得越清楚,但每张截图会占用更多对话空间,长任务可能因此更慢更费钱。",
|
|
2475
|
+
"settings.browser.screenshot.quality": "画质",
|
|
2476
|
+
"settings.browser.screenshot.qualityHint": "标准:大多数页面够用,最省空间。高清:长页面细节更清楚。",
|
|
2477
|
+
"settings.browser.screenshot.standard": "标准",
|
|
2478
|
+
"settings.browser.screenshot.high": "高清",
|
|
2479
|
+
"settings.browser.screenshot.saved": "已保存",
|
|
2480
|
+
"settings.browser.screenshot.saveFailed": "保存失败",
|
|
2322
2481
|
"settings.network.title": "网络",
|
|
2323
2482
|
"settings.network.desc": "默认不启用代理,如需启用,请填写 HTTP/HTTPS 代理地址(不支持 SOCKS5)。",
|
|
2324
2483
|
"settings.network.proxyUrl": "代理地址",
|
|
@@ -2328,9 +2487,10 @@ const I18n = (() => {
|
|
|
2328
2487
|
"settings.network.cleared": "已清除 — 直连",
|
|
2329
2488
|
"settings.network.invalidUrl": "地址格式不正确,请使用 http://host:port 或 http://user:pass@host:port",
|
|
2330
2489
|
"settings.search.title": "网页搜索",
|
|
2331
|
-
"settings.search.desc": "
|
|
2490
|
+
"settings.search.desc": "Agent 需要最新信息时(新闻、文档、价格等时效性内容)会自动联网搜索并抓取网页正文。",
|
|
2332
2491
|
"settings.search.provider": "服务商",
|
|
2333
|
-
"settings.search.builtin": "
|
|
2492
|
+
"settings.search.builtin": "免费(自动选择可用引擎)",
|
|
2493
|
+
"settings.search.builtinEngines": "免费引擎按 Parallel → DuckDuckGo → Bing 顺序尝试,无需 Key 或配置。",
|
|
2334
2494
|
"settings.search.key": "API Key",
|
|
2335
2495
|
"settings.search.save": "保存",
|
|
2336
2496
|
"settings.search.saved": "已保存",
|
|
@@ -2338,7 +2498,15 @@ const I18n = (() => {
|
|
|
2338
2498
|
"settings.search.testing": "测试中…",
|
|
2339
2499
|
"settings.search.ok": "搜索服务商可用",
|
|
2340
2500
|
"settings.search.failed": "搜索服务商测试失败",
|
|
2341
|
-
"settings.search.
|
|
2501
|
+
"settings.search.keyRequired": "请填写该服务商的 API Key",
|
|
2502
|
+
"settings.search.customBtn": "用 Agent 开发",
|
|
2503
|
+
"settings.search.customHint": "接入其他搜索服务?脚本放进 ~/.clacky/searchers/,参考 tavily.rb。",
|
|
2504
|
+
"settings.search.customPrompt": "我想接入一个自定义网页搜索服务商。请先读 ~/.clacky/searchers/tavily.rb 了解脚本接口约定,然后问我要接入哪家服务、需要我提供什么(接口地址、Key、是否免费),再帮我在 ~/.clacky/searchers/ 下写好脚本。",
|
|
2505
|
+
"settings.search.customSessionName": "自定义搜索服务商",
|
|
2506
|
+
"settings.search.deepseek": "DeepSeek(搜索与网页抓取)",
|
|
2507
|
+
"settings.search.deepseekHintFree": "API Key 留空则用已配置的模型密钥,支持 DeepSeek 和 OpenClacky 服务商的 API Key;将于北京时间 2026 年 11 月 1 日 00:00 开始按次收取调用费用,约 ¥0.005/次。",
|
|
2508
|
+
"settings.search.deepseekHint": "API Key 留空则用已配置的模型密钥,支持 DeepSeek 和 OpenClacky 服务商的 API Key;按请求次数计费,约 ¥0.005/次。",
|
|
2509
|
+
"settings.search.deepseekKeyPlaceholder": "可留空",
|
|
2342
2510
|
"settings.backup.title": "备份",
|
|
2343
2511
|
"settings.backup.autoTitle": "自动备份",
|
|
2344
2512
|
"settings.backup.manualTitle": "手动备份",
|
|
@@ -2386,7 +2554,8 @@ const I18n = (() => {
|
|
|
2386
2554
|
"settings.brand.badge.active": "已激活",
|
|
2387
2555
|
"settings.brand.badge.warning": "即将过期",
|
|
2388
2556
|
"settings.brand.badge.expired": "已过期",
|
|
2389
|
-
"settings.brand.badge.unreachable": "
|
|
2557
|
+
"settings.brand.badge.unreachable": "服务器连接异常",
|
|
2558
|
+
"settings.brand.hint.unreachable": "功能暂不受影响,请检查网络,也可点「更换序列号」重新激活来恢复校验。",
|
|
2390
2559
|
"settings.brand.desc": "有品牌合作伙伴的序列号?在下方输入以激活品牌模式。",
|
|
2391
2560
|
"settings.brand.descNamed": "请输入 {{name}} 的序列号以激活品牌模式。",
|
|
2392
2561
|
"settings.brand.btn.getSerial": "获取序列号",
|
|
@@ -2445,13 +2614,16 @@ const I18n = (() => {
|
|
|
2445
2614
|
"onboard.key.btn.back": "返回",
|
|
2446
2615
|
"onboard.device.card.title": "OpenClacky AI Keys",
|
|
2447
2616
|
"onboard.device.card.lead": "注册即送 $1 额度 · 无需订阅 · 随用随充",
|
|
2448
|
-
"onboard.device.card.point1": "一个 Key 直通全球顶级模型 — Claude、
|
|
2449
|
-
"onboard.device.card.point2": "
|
|
2617
|
+
"onboard.device.card.point1": "一个 Key 直通全球顶级模型 — Claude、GPT、DeepSeek 等",
|
|
2618
|
+
"onboard.device.card.point2": "最低 3 折,模型随心切换",
|
|
2450
2619
|
"onboard.device.btn": "一键获取,免费开始",
|
|
2451
|
-
"onboard.device.pending": "
|
|
2452
|
-
"onboard.device.code": "验证码:",
|
|
2620
|
+
"onboard.device.pending": "正在浏览器中完成连接…",
|
|
2453
2621
|
"onboard.device.reopen": "重新打开浏览器",
|
|
2454
2622
|
"onboard.device.cancel": "取消",
|
|
2623
|
+
"onboard.device.error.denied": "已取消授权,可以重新点击获取。",
|
|
2624
|
+
"onboard.device.error.expired": "链接已过期,请重新点击获取。",
|
|
2625
|
+
"onboard.device.error.failed": "连接失败,请重新点击获取。",
|
|
2626
|
+
"onboard.device.error.startFailed": "无法发起连接,请稍后重试。",
|
|
2455
2627
|
"onboard.device.success.title": "登录成功!",
|
|
2456
2628
|
"onboard.device.success.lead": "账户已连接。你已获得:",
|
|
2457
2629
|
"onboard.device.success.credit.label": "免费试用额度:",
|
|
@@ -2464,7 +2636,7 @@ const I18n = (() => {
|
|
|
2464
2636
|
"provider.recommended": "推荐",
|
|
2465
2637
|
"provider.name.volcengine_ark": "火山方舟(豆包)",
|
|
2466
2638
|
"provider.promo.openclacky.title": "推荐 OpenClacky AI Keys",
|
|
2467
|
-
"provider.promo.openclacky.1": "一个 Key 直通全球顶级模型 — Claude、
|
|
2639
|
+
"provider.promo.openclacky.1": "一个 Key 直通全球顶级模型 — Claude、GPT、DeepSeek 等。",
|
|
2468
2640
|
"provider.promo.openclacky.2": "最强推理 × 最优性价比 × 最佳视觉 — 一站式统一接入。",
|
|
2469
2641
|
"provider.promo.openclacky.3": "国内直连,官方同价,模型随心切换,缓存命中率接近 100%。",
|
|
2470
2642
|
"onboard.key.testing": "测试中…",
|
|
@@ -2594,17 +2766,15 @@ const I18n = (() => {
|
|
|
2594
2766
|
"sib.auto.tag": "经济优先",
|
|
2595
2767
|
"sib.auto.tipTitle": "Auto · 经济优先",
|
|
2596
2768
|
"sib.auto.tip": "从最便宜的开始,只在必要时升级模型。实时选用当下最流行、好用、便宜的模型。倍率随之浮动。",
|
|
2597
|
-
"sib.price.tip": "官方直连,按官方标准价计费。相对 Claude Sonnet 5 的成本(约 ${{in}} 输入 / ${{out}} 输出 / 百万 token
|
|
2598
|
-
"sib.price.tip.
|
|
2769
|
+
"sib.price.tip": "官方直连,按官方标准价计费。相对 Claude Sonnet 5 的成本(约 ${{in}} 输入 / ${{out}} 输出 / 百万 token)。",
|
|
2770
|
+
"sib.price.tip.abs": "官方直连。相对 Claude Sonnet 5 的成本(约 ${{in}} 输入 / ${{out}} 输出 / 百万 token)。",
|
|
2771
|
+
"sib.price.tip.discounted": "非官方直连,由第三方渠道提供服务,按官方标准价计费,{{zhe}} 折为限时优惠。相对 Claude Sonnet 5 的成本(约 ${{in}} 输入 / ${{out}} 输出 / 百万 token)。",
|
|
2772
|
+
"sib.price.tip.promo": "官方直连,按官方标准价计费,{{zhe}} 折为限时优惠。相对 Claude Sonnet 5 的成本(约 ${{in}} 输入 / ${{out}} 输出 / 百万 token)。",
|
|
2599
2773
|
"sib.discount.tag": "{{zhe}}折",
|
|
2600
2774
|
"sib.bench.running": "测速中…",
|
|
2601
2775
|
"sib.bench.done": "用时 {{t}} 秒",
|
|
2602
2776
|
"sib.bench.failed": "失败:{{msg}}",
|
|
2603
2777
|
"sib.bench.latencyTooltip": "TTFT {{ttft}} · 测试于 {{time}}",
|
|
2604
|
-
"sib.vision.ok": "可识图",
|
|
2605
|
-
"sib.vision.missing": "不可识图",
|
|
2606
|
-
"sib.vision.okTip": "当前模型可识别图片内容。",
|
|
2607
|
-
"sib.vision.missingTip": "当前模型不能识别图片,可在设置中配置视觉模型。",
|
|
2608
2778
|
"sib.gen.title": "生成能力",
|
|
2609
2779
|
"sib.gen.config": "去配置",
|
|
2610
2780
|
"sib.gen.kind.image": "图片",
|
|
@@ -2652,6 +2822,8 @@ const I18n = (() => {
|
|
|
2652
2822
|
|
|
2653
2823
|
"error.insufficient_credit": "API Key 账户余额不足,请前往控制台充值后继续使用。",
|
|
2654
2824
|
"error.insufficient_credit.action": "去充值",
|
|
2825
|
+
"error.check_account.action": "去检查",
|
|
2826
|
+
"error.insufficient_credit.history": "本轮因账户余额不足而中止。",
|
|
2655
2827
|
"error.show_detail": "查看详情",
|
|
2656
2828
|
"billing.sessions": "会话消耗",
|
|
2657
2829
|
"billing.sessionId": "会话",
|