openclacky 1.5.20 → 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 +49 -0
- data/README.md +18 -0
- 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 +1 -0
- data/lib/clacky/agent/message_compressor_helper.rb +28 -2
- data/lib/clacky/agent/session_serializer.rb +20 -2
- data/lib/clacky/agent.rb +56 -43
- data/lib/clacky/agent_config.rb +82 -4
- data/lib/clacky/billing/platform_billing.rb +5 -1
- data/lib/clacky/brand_config.rb +1 -1
- data/lib/clacky/cli.rb +3 -2
- data/lib/clacky/client.rb +5 -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 +21 -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 +21 -3
- data/lib/clacky/platform_http_client.rb +6 -2
- data/lib/clacky/providers.rb +23 -14
- 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 +194 -47
- data/lib/clacky/server/model_prices.rb +5 -3
- 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 +19 -7
- data/lib/clacky/server/web_ui_controller.rb +61 -38
- data/lib/clacky/session_manager.rb +7 -1
- 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 +132 -13
- data/lib/clacky/version.rb +1 -1
- data/lib/clacky/web/app.css +366 -105
- data/lib/clacky/web/components/chat-navigator.js +8 -1
- data/lib/clacky/web/components/mentions.js +2 -13
- data/lib/clacky/web/components/model-picker.js +3 -1
- data/lib/clacky/web/components/onboard.js +13 -10
- data/lib/clacky/web/features/archive/store.js +30 -16
- data/lib/clacky/web/features/archive/view.js +20 -10
- data/lib/clacky/web/features/backup/view.js +5 -5
- data/lib/clacky/web/features/new-session/store.js +3 -3
- data/lib/clacky/web/features/trash/store.js +10 -7
- data/lib/clacky/web/features/trash/view.js +9 -4
- data/lib/clacky/web/i18n.js +106 -30
- data/lib/clacky/web/index.html +90 -60
- data/lib/clacky/web/projects.js +56 -1
- data/lib/clacky/web/sessions.js +244 -131
- data/lib/clacky/web/settings.js +143 -8
- data/lib/clacky/web/ws-dispatcher.js +9 -13
- data/lib/clacky.rb +1 -0
- metadata +4 -1
data/lib/clacky/web/i18n.js
CHANGED
|
@@ -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",
|
|
@@ -330,8 +339,14 @@ const I18n = (() => {
|
|
|
330
339
|
"sib.status.idle": "idle",
|
|
331
340
|
"sib.status.running": "running",
|
|
332
341
|
"sib.status.error": "error",
|
|
333
|
-
"sib.status.awaiting_feedback": "
|
|
334
|
-
"sib.mode.
|
|
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.",
|
|
335
350
|
"sib.cost.tooltip": "Estimated token cost for this session",
|
|
336
351
|
"sib.reasoning.label": "Reasoning",
|
|
337
352
|
"sib.reasoning.heading": "Reasoning effort",
|
|
@@ -378,6 +393,7 @@ const I18n = (() => {
|
|
|
378
393
|
"sessions.loadMore": "Load more sessions",
|
|
379
394
|
"sessions.loadingMore": "Loading…",
|
|
380
395
|
"sessions.search.placeholder": "Search sessions…",
|
|
396
|
+
"sessions.search.clear": "Clear",
|
|
381
397
|
"sessions.search.typeAll": "All types",
|
|
382
398
|
"sessions.search.typeManual": "Default",
|
|
383
399
|
"sessions.search.typeCron": "Scheduled",
|
|
@@ -1040,6 +1056,14 @@ const I18n = (() => {
|
|
|
1040
1056
|
"settings.browser.btn": "Configure Browser",
|
|
1041
1057
|
"settings.browser.btn.reconfigure": "Reconfigure Browser",
|
|
1042
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",
|
|
1043
1067
|
"settings.network.title": "Network",
|
|
1044
1068
|
"settings.network.desc": "Proxy is disabled by default. To enable, enter an HTTP/HTTPS proxy URL below (SOCKS5 is not supported).",
|
|
1045
1069
|
"settings.network.proxyUrl": "Proxy URL",
|
|
@@ -1049,9 +1073,10 @@ const I18n = (() => {
|
|
|
1049
1073
|
"settings.network.cleared": "Cleared — direct connection",
|
|
1050
1074
|
"settings.network.invalidUrl": "Invalid URL — use http://host:port or http://user:pass@host:port",
|
|
1051
1075
|
"settings.search.title": "Web Search",
|
|
1052
|
-
"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.",
|
|
1053
1077
|
"settings.search.provider": "Provider",
|
|
1054
|
-
"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.",
|
|
1055
1080
|
"settings.search.key": "API Key",
|
|
1056
1081
|
"settings.search.save": "Save",
|
|
1057
1082
|
"settings.search.saved": "Saved",
|
|
@@ -1059,7 +1084,15 @@ const I18n = (() => {
|
|
|
1059
1084
|
"settings.search.testing": "Testing…",
|
|
1060
1085
|
"settings.search.ok": "Search provider works",
|
|
1061
1086
|
"settings.search.failed": "Search provider test failed",
|
|
1062
|
-
"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",
|
|
1063
1096
|
"settings.backup.title": "Backup",
|
|
1064
1097
|
"settings.backup.autoTitle": "Auto Backup",
|
|
1065
1098
|
"settings.backup.manualTitle": "Manual Backup",
|
|
@@ -1107,7 +1140,8 @@ const I18n = (() => {
|
|
|
1107
1140
|
"settings.brand.badge.active": "Active",
|
|
1108
1141
|
"settings.brand.badge.warning": "Expiring Soon",
|
|
1109
1142
|
"settings.brand.badge.expired": "Expired",
|
|
1110
|
-
"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.",
|
|
1111
1145
|
"settings.brand.desc": "Have a serial number from a brand partner? Enter it below to activate branded mode.",
|
|
1112
1146
|
"settings.brand.descNamed": "Enter your {{name}} serial number to activate branded mode.",
|
|
1113
1147
|
"settings.brand.btn.getSerial": "Get a Serial Number",
|
|
@@ -1166,13 +1200,16 @@ const I18n = (() => {
|
|
|
1166
1200
|
"onboard.key.btn.back": "Back",
|
|
1167
1201
|
"onboard.device.card.title": "OpenClacky AI Keys",
|
|
1168
1202
|
"onboard.device.card.lead": "Sign up and get $1 free credit · no subscription · pay as you go",
|
|
1169
|
-
"onboard.device.card.point1": "One key for all frontier models — Claude,
|
|
1170
|
-
"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",
|
|
1171
1205
|
"onboard.device.btn": "Get started free",
|
|
1172
|
-
"onboard.device.pending": "
|
|
1173
|
-
"onboard.device.code": "Verification code:",
|
|
1206
|
+
"onboard.device.pending": "Finishing the connection in your browser…",
|
|
1174
1207
|
"onboard.device.reopen": "Open browser again",
|
|
1175
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.",
|
|
1176
1213
|
"onboard.device.success.title": "You're in!",
|
|
1177
1214
|
"onboard.device.success.lead": "Your account is connected. Here's what you got:",
|
|
1178
1215
|
"onboard.device.success.credit.label": "Free trial credit:",
|
|
@@ -1185,7 +1222,7 @@ const I18n = (() => {
|
|
|
1185
1222
|
"provider.recommended": "Recommended",
|
|
1186
1223
|
"provider.name.volcengine_ark": "Volcengine Ark (Doubao)",
|
|
1187
1224
|
"provider.promo.openclacky.title": "OpenClacky AI Keys",
|
|
1188
|
-
"provider.promo.openclacky.1": "All frontier models, one key — Claude,
|
|
1225
|
+
"provider.promo.openclacky.1": "All frontier models, one key — Claude, GPT, DeepSeek & more.",
|
|
1189
1226
|
"provider.promo.openclacky.2": "Top reasoning, best value, best vision — unified in one API.",
|
|
1190
1227
|
"provider.promo.openclacky.3": "Same pricing as official APIs, switch models instantly.",
|
|
1191
1228
|
"onboard.key.testing": "Testing…",
|
|
@@ -1315,9 +1352,10 @@ const I18n = (() => {
|
|
|
1315
1352
|
"sib.auto.tag": "Economy",
|
|
1316
1353
|
"sib.auto.tipTitle": "Auto · economy-first routing",
|
|
1317
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.",
|
|
1318
|
-
"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)",
|
|
1319
|
-
"sib.price.tip.
|
|
1320
|
-
"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.",
|
|
1321
1359
|
"sib.discount.tag": "{{percent}}% off",
|
|
1322
1360
|
"sib.bench.running": "Testing…",
|
|
1323
1361
|
"sib.bench.done": "done in {{t}}s",
|
|
@@ -1430,10 +1468,15 @@ const I18n = (() => {
|
|
|
1430
1468
|
"projects.menu.edit": "编辑项目",
|
|
1431
1469
|
"projects.menu.delete": "删除项目",
|
|
1432
1470
|
"projects.menu.deleteSessions": "清空会话",
|
|
1471
|
+
"projects.menu.archiveSessions": "归档会话",
|
|
1433
1472
|
"projects.edit.title": "编辑项目",
|
|
1434
1473
|
"projects.edit.submit": "保存",
|
|
1435
1474
|
"projects.delete.confirm": "删除项目「{{name}}」?该项目下的所有会话也将被删除。",
|
|
1436
1475
|
"projects.deleteSessions.confirm": "清空项目「{{name}}」下的所有会话?项目本身会被保留。",
|
|
1476
|
+
"projects.archiveSessions.confirm": "归档项目「{{name}}」下的所有会话?会话会离开侧边栏,可在「已归档的会话」中恢复。",
|
|
1477
|
+
"projects.archiveSessions.done": "已归档 {{count}} 个会话",
|
|
1478
|
+
"projects.archiveSessions.fail": "归档失败:{{msg}}",
|
|
1479
|
+
"projects.archiveSessions.empty": "该项目下暂无可归档的会话。",
|
|
1437
1480
|
"projects.modal.name": "项目名称",
|
|
1438
1481
|
|
|
1439
1482
|
// ── Welcome screen ──
|
|
@@ -1493,7 +1536,11 @@ const I18n = (() => {
|
|
|
1493
1536
|
"chat.input.sendQueued": "打断并执行",
|
|
1494
1537
|
"chat.input.removeQueued": "撤回",
|
|
1495
1538
|
"chat.interrupted": "已停止生成",
|
|
1496
|
-
"chat.
|
|
1539
|
+
"chat.feedback_countdown": "{{seconds}} 秒后由 AI 决定并继续",
|
|
1540
|
+
"chat.feedback_waiting": "等待你提交",
|
|
1541
|
+
"chat.feedback_answered": "已提交",
|
|
1542
|
+
"chat.feedback_timeout": "已由 AI 决定并继续",
|
|
1543
|
+
"chat.input.placeholderFeedback": "回答问题,或补充说明…",
|
|
1497
1544
|
"chat.feedback_submit": "提交",
|
|
1498
1545
|
"chat.feedback_other": "或自己填写",
|
|
1499
1546
|
"chat.feedback_recommended": "推荐",
|
|
@@ -1700,8 +1747,14 @@ const I18n = (() => {
|
|
|
1700
1747
|
"sib.status.idle": "空闲",
|
|
1701
1748
|
"sib.status.running": "运行",
|
|
1702
1749
|
"sib.status.error": "错误",
|
|
1703
|
-
"sib.status.awaiting_feedback": "
|
|
1704
|
-
"sib.mode.
|
|
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 倒计时结束后继续。运行中也可切换,已开始的工具会正常完成。",
|
|
1705
1758
|
"sib.cost.tooltip": "本次会话的预估 Token 费用",
|
|
1706
1759
|
"sib.reasoning.label": "思考",
|
|
1707
1760
|
"sib.reasoning.heading": "思考等级",
|
|
@@ -1748,6 +1801,7 @@ const I18n = (() => {
|
|
|
1748
1801
|
"sessions.moveToProject.failed": "移动会话失败:{{message}}",
|
|
1749
1802
|
"sessions.loadingMore": "加载中…",
|
|
1750
1803
|
"sessions.search.placeholder": "搜索会话…",
|
|
1804
|
+
"sessions.search.clear": "清除",
|
|
1751
1805
|
"sessions.search.typeAll": "全部类型",
|
|
1752
1806
|
"sessions.search.typeManual": "默认",
|
|
1753
1807
|
"sessions.search.typeCron": "定时",
|
|
@@ -2416,6 +2470,14 @@ const I18n = (() => {
|
|
|
2416
2470
|
"settings.browser.btn": "配置浏览器",
|
|
2417
2471
|
"settings.browser.btn.reconfigure": "重新配置浏览器",
|
|
2418
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": "保存失败",
|
|
2419
2481
|
"settings.network.title": "网络",
|
|
2420
2482
|
"settings.network.desc": "默认不启用代理,如需启用,请填写 HTTP/HTTPS 代理地址(不支持 SOCKS5)。",
|
|
2421
2483
|
"settings.network.proxyUrl": "代理地址",
|
|
@@ -2425,9 +2487,10 @@ const I18n = (() => {
|
|
|
2425
2487
|
"settings.network.cleared": "已清除 — 直连",
|
|
2426
2488
|
"settings.network.invalidUrl": "地址格式不正确,请使用 http://host:port 或 http://user:pass@host:port",
|
|
2427
2489
|
"settings.search.title": "网页搜索",
|
|
2428
|
-
"settings.search.desc": "
|
|
2490
|
+
"settings.search.desc": "Agent 需要最新信息时(新闻、文档、价格等时效性内容)会自动联网搜索并抓取网页正文。",
|
|
2429
2491
|
"settings.search.provider": "服务商",
|
|
2430
|
-
"settings.search.builtin": "
|
|
2492
|
+
"settings.search.builtin": "免费(自动选择可用引擎)",
|
|
2493
|
+
"settings.search.builtinEngines": "免费引擎按 Parallel → DuckDuckGo → Bing 顺序尝试,无需 Key 或配置。",
|
|
2431
2494
|
"settings.search.key": "API Key",
|
|
2432
2495
|
"settings.search.save": "保存",
|
|
2433
2496
|
"settings.search.saved": "已保存",
|
|
@@ -2435,7 +2498,15 @@ const I18n = (() => {
|
|
|
2435
2498
|
"settings.search.testing": "测试中…",
|
|
2436
2499
|
"settings.search.ok": "搜索服务商可用",
|
|
2437
2500
|
"settings.search.failed": "搜索服务商测试失败",
|
|
2438
|
-
"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": "可留空",
|
|
2439
2510
|
"settings.backup.title": "备份",
|
|
2440
2511
|
"settings.backup.autoTitle": "自动备份",
|
|
2441
2512
|
"settings.backup.manualTitle": "手动备份",
|
|
@@ -2483,7 +2554,8 @@ const I18n = (() => {
|
|
|
2483
2554
|
"settings.brand.badge.active": "已激活",
|
|
2484
2555
|
"settings.brand.badge.warning": "即将过期",
|
|
2485
2556
|
"settings.brand.badge.expired": "已过期",
|
|
2486
|
-
"settings.brand.badge.unreachable": "
|
|
2557
|
+
"settings.brand.badge.unreachable": "服务器连接异常",
|
|
2558
|
+
"settings.brand.hint.unreachable": "功能暂不受影响,请检查网络,也可点「更换序列号」重新激活来恢复校验。",
|
|
2487
2559
|
"settings.brand.desc": "有品牌合作伙伴的序列号?在下方输入以激活品牌模式。",
|
|
2488
2560
|
"settings.brand.descNamed": "请输入 {{name}} 的序列号以激活品牌模式。",
|
|
2489
2561
|
"settings.brand.btn.getSerial": "获取序列号",
|
|
@@ -2542,13 +2614,16 @@ const I18n = (() => {
|
|
|
2542
2614
|
"onboard.key.btn.back": "返回",
|
|
2543
2615
|
"onboard.device.card.title": "OpenClacky AI Keys",
|
|
2544
2616
|
"onboard.device.card.lead": "注册即送 $1 额度 · 无需订阅 · 随用随充",
|
|
2545
|
-
"onboard.device.card.point1": "一个 Key 直通全球顶级模型 — Claude、
|
|
2546
|
-
"onboard.device.card.point2": "
|
|
2617
|
+
"onboard.device.card.point1": "一个 Key 直通全球顶级模型 — Claude、GPT、DeepSeek 等",
|
|
2618
|
+
"onboard.device.card.point2": "最低 3 折,模型随心切换",
|
|
2547
2619
|
"onboard.device.btn": "一键获取,免费开始",
|
|
2548
|
-
"onboard.device.pending": "
|
|
2549
|
-
"onboard.device.code": "验证码:",
|
|
2620
|
+
"onboard.device.pending": "正在浏览器中完成连接…",
|
|
2550
2621
|
"onboard.device.reopen": "重新打开浏览器",
|
|
2551
2622
|
"onboard.device.cancel": "取消",
|
|
2623
|
+
"onboard.device.error.denied": "已取消授权,可以重新点击获取。",
|
|
2624
|
+
"onboard.device.error.expired": "链接已过期,请重新点击获取。",
|
|
2625
|
+
"onboard.device.error.failed": "连接失败,请重新点击获取。",
|
|
2626
|
+
"onboard.device.error.startFailed": "无法发起连接,请稍后重试。",
|
|
2552
2627
|
"onboard.device.success.title": "登录成功!",
|
|
2553
2628
|
"onboard.device.success.lead": "账户已连接。你已获得:",
|
|
2554
2629
|
"onboard.device.success.credit.label": "免费试用额度:",
|
|
@@ -2561,7 +2636,7 @@ const I18n = (() => {
|
|
|
2561
2636
|
"provider.recommended": "推荐",
|
|
2562
2637
|
"provider.name.volcengine_ark": "火山方舟(豆包)",
|
|
2563
2638
|
"provider.promo.openclacky.title": "推荐 OpenClacky AI Keys",
|
|
2564
|
-
"provider.promo.openclacky.1": "一个 Key 直通全球顶级模型 — Claude、
|
|
2639
|
+
"provider.promo.openclacky.1": "一个 Key 直通全球顶级模型 — Claude、GPT、DeepSeek 等。",
|
|
2565
2640
|
"provider.promo.openclacky.2": "最强推理 × 最优性价比 × 最佳视觉 — 一站式统一接入。",
|
|
2566
2641
|
"provider.promo.openclacky.3": "国内直连,官方同价,模型随心切换,缓存命中率接近 100%。",
|
|
2567
2642
|
"onboard.key.testing": "测试中…",
|
|
@@ -2691,9 +2766,10 @@ const I18n = (() => {
|
|
|
2691
2766
|
"sib.auto.tag": "经济优先",
|
|
2692
2767
|
"sib.auto.tipTitle": "Auto · 经济优先",
|
|
2693
2768
|
"sib.auto.tip": "从最便宜的开始,只在必要时升级模型。实时选用当下最流行、好用、便宜的模型。倍率随之浮动。",
|
|
2694
|
-
"sib.price.tip": "官方直连,按官方标准价计费。相对 Claude Sonnet 5 的成本(约 ${{in}} 输入 / ${{out}} 输出 / 百万 token
|
|
2695
|
-
"sib.price.tip.
|
|
2696
|
-
"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)。",
|
|
2697
2773
|
"sib.discount.tag": "{{zhe}}折",
|
|
2698
2774
|
"sib.bench.running": "测速中…",
|
|
2699
2775
|
"sib.bench.done": "用时 {{t}} 秒",
|
data/lib/clacky/web/index.html
CHANGED
|
@@ -83,17 +83,20 @@
|
|
|
83
83
|
<div class="cmd-palette" role="dialog" aria-modal="true" aria-label="Search sessions">
|
|
84
84
|
<div class="search-panel-card">
|
|
85
85
|
<!-- Input row -->
|
|
86
|
-
<div class="search-input-
|
|
87
|
-
<
|
|
88
|
-
<
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
<
|
|
86
|
+
<div class="search-input-wrap">
|
|
87
|
+
<div class="search-input-row">
|
|
88
|
+
<span class="search-icon">
|
|
89
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><line x1="20" y1="20" x2="16" y2="16"/></svg>
|
|
90
|
+
</span>
|
|
91
|
+
<input id="session-search-q" type="text" class="search-input"
|
|
92
|
+
data-i18n-placeholder="sessions.search.placeholder" placeholder="Search sessions…"
|
|
93
|
+
autocomplete="off" />
|
|
94
|
+
<button id="btn-search-q-clear" class="btn-search-q-clear" type="button"
|
|
95
|
+
data-i18n="sessions.search.clear" aria-label="Clear text" hidden>Clear</button>
|
|
96
|
+
</div>
|
|
97
|
+
<button id="btn-session-search-close" class="cmd-palette-close" type="button" aria-label="Close">
|
|
98
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><line x1="6" y1="6" x2="18" y2="18"/><line x1="18" y1="6" x2="6" y2="18"/></svg>
|
|
95
99
|
</button>
|
|
96
|
-
<button id="btn-session-search-close" class="cmd-palette-esc" type="button" aria-label="Close">ESC</button>
|
|
97
100
|
</div>
|
|
98
101
|
<!-- Filter row -->
|
|
99
102
|
<div class="search-filter-row">
|
|
@@ -115,7 +118,7 @@
|
|
|
115
118
|
</div>
|
|
116
119
|
<div class="search-date-wrap">
|
|
117
120
|
<button id="session-search-date" class="search-date datepicker-trigger" type="button" data-value="" data-i18n="sessions.search.datePlaceholder"></button>
|
|
118
|
-
<svg class="search-date-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="5" width="18" height="
|
|
121
|
+
<svg class="search-date-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="5.5" width="18" height="15.5" rx="2.5"/><path d="M8 2.75v3.5M16 2.75v3.5M3 10h18"/></svg>
|
|
119
122
|
</div>
|
|
120
123
|
<button id="btn-search-clear-all" class="btn-search-clear-all" aria-label="Clear filters" hidden>
|
|
121
124
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" aria-hidden="true"><line x1="6" y1="6" x2="18" y2="18"/><line x1="18" y1="6" x2="6" y2="18"/></svg>
|
|
@@ -494,7 +497,7 @@
|
|
|
494
497
|
<div id="ext-slot-session-composer" class="session-composer" data-slot="session.composer"></div>
|
|
495
498
|
<!-- Session info bar — mirrors CLI bottom status bar -->
|
|
496
499
|
<div id="session-info-bar" style="display:none">
|
|
497
|
-
<!-- Order: status | id | dir | model | mode | todo | cost -->
|
|
500
|
+
<!-- Order: status | id | dir | model | reasoning | mode | todo | signal | cost -->
|
|
498
501
|
<!-- Pattern: element + separator-after-element (except last) -->
|
|
499
502
|
<span id="sib-status"></span>
|
|
500
503
|
<span class="sib-sep sib-sep-after-status">│</span>
|
|
@@ -515,7 +518,47 @@
|
|
|
515
518
|
<span id="sib-reasoning" class="sib-reasoning-clickable" data-i18n-title="sib.reasoning.tooltip" title="Click to change reasoning effort"><span class="sib-pill-label" data-i18n="sib.reasoning.label">Reasoning</span><span id="sib-reasoning-text"></span><span class="sib-caret" aria-hidden="true"><svg viewBox="0 0 16 16" width="9" height="9" aria-hidden="true"><path d="M4 6.5L8 10.5L12 6.5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span></span>
|
|
516
519
|
<div id="sib-reasoning-dropdown" class="clacky-popover sib-reasoning-dropdown" style="display:none" role="menu"></div>
|
|
517
520
|
</span>
|
|
518
|
-
<span
|
|
521
|
+
<span id="sib-mode-wrap">
|
|
522
|
+
<button id="sib-mode" class="sib-mode-clickable" type="button" aria-haspopup="menu" aria-expanded="false" aria-controls="sib-mode-menu" data-i18n-title="sib.mode.tooltip"><span class="sib-pill-label" data-i18n="sib.mode.pill">Mode</span><span id="sib-mode-text"></span><span class="sib-caret" aria-hidden="true"><svg viewBox="0 0 16 16" width="9" height="9" aria-hidden="true"><path d="M4 6.5L8 10.5L12 6.5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span></button>
|
|
523
|
+
<div id="sib-mode-menu" class="clacky-popover" role="menu" hidden>
|
|
524
|
+
<button type="button" role="menuitemradio" data-permission-mode="confirm_all" aria-checked="true">
|
|
525
|
+
<strong data-i18n="sib.mode.confirm_all">Manual</strong>
|
|
526
|
+
<small data-i18n="sib.mode.manualHelp">Confirm actions; wait for your answer.</small>
|
|
527
|
+
</button>
|
|
528
|
+
<button type="button" role="menuitemradio" data-permission-mode="auto_approve" aria-checked="false">
|
|
529
|
+
<strong data-i18n="sib.mode.auto_approve">Auto</strong>
|
|
530
|
+
<small data-i18n="sib.mode.autoHelp">Approve tools automatically; continue after the question countdown.</small>
|
|
531
|
+
</button>
|
|
532
|
+
</div>
|
|
533
|
+
</span>
|
|
534
|
+
<span class="sib-sep sib-sep-after-mode">│</span>
|
|
535
|
+
<span id="todo-panel" class="todo-panel">
|
|
536
|
+
<button id="todo-trigger" class="todo-trigger" type="button"
|
|
537
|
+
aria-controls="todo-popover" aria-expanded="false" disabled>
|
|
538
|
+
<svg class="todo-status-icon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
539
|
+
<circle cx="3" cy="4" r="1"/><path d="M6 4h7"/>
|
|
540
|
+
<circle cx="3" cy="8" r="1"/><path d="M6 8h7"/>
|
|
541
|
+
<circle cx="3" cy="12" r="1"/><path d="M6 12h7"/>
|
|
542
|
+
</svg>
|
|
543
|
+
<span class="todo-trigger-detail" aria-hidden="true">
|
|
544
|
+
<span id="todo-count" class="todo-count"></span>
|
|
545
|
+
<svg class="todo-caret" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 10l4-4 4 4"/></svg>
|
|
546
|
+
</span>
|
|
547
|
+
</button>
|
|
548
|
+
<div id="todo-popover" class="clacky-popover todo-popover" role="dialog" hidden>
|
|
549
|
+
<div class="todo-popover-header">
|
|
550
|
+
<div class="todo-popover-heading">
|
|
551
|
+
<div class="todo-popover-title" data-i18n="chat.todo.title">Tasks</div>
|
|
552
|
+
<div id="todo-summary" class="todo-summary"></div>
|
|
553
|
+
</div>
|
|
554
|
+
<button id="todo-close" class="todo-close" type="button" aria-label="Close task list">
|
|
555
|
+
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8"/></svg>
|
|
556
|
+
</button>
|
|
557
|
+
</div>
|
|
558
|
+
<div id="todo-list" class="todo-list" aria-live="polite"></div>
|
|
559
|
+
</div>
|
|
560
|
+
</span>
|
|
561
|
+
<span class="sib-sep sib-sep-after-todo">│</span>
|
|
519
562
|
<!-- Latency signal: 4-bar signal + TTFT number. Hidden until the first LLM
|
|
520
563
|
call completes (see updateInfoBar / Sessions.renderSignalBars). Click
|
|
521
564
|
opens a mini benchmark panel (see Step 3/4 — not yet implemented). -->
|
|
@@ -526,39 +569,7 @@
|
|
|
526
569
|
</span>
|
|
527
570
|
</span>
|
|
528
571
|
<span class="sib-sep sib-sep-after-signal" style="display:none">│</span>
|
|
529
|
-
|
|
530
|
-
<span class="sib-detail">
|
|
531
|
-
<span id="sib-mode"></span>
|
|
532
|
-
<span class="sib-sep sib-sep-after-mode">│</span>
|
|
533
|
-
<span id="todo-panel" class="todo-panel">
|
|
534
|
-
<button id="todo-trigger" class="todo-trigger" type="button"
|
|
535
|
-
aria-controls="todo-popover" aria-expanded="false" disabled>
|
|
536
|
-
<svg class="todo-status-icon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
537
|
-
<circle cx="3" cy="4" r="1"/><path d="M6 4h7"/>
|
|
538
|
-
<circle cx="3" cy="8" r="1"/><path d="M6 8h7"/>
|
|
539
|
-
<circle cx="3" cy="12" r="1"/><path d="M6 12h7"/>
|
|
540
|
-
</svg>
|
|
541
|
-
<span class="todo-trigger-detail" aria-hidden="true">
|
|
542
|
-
<span id="todo-count" class="todo-count"></span>
|
|
543
|
-
<svg class="todo-caret" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 10l4-4 4 4"/></svg>
|
|
544
|
-
</span>
|
|
545
|
-
</button>
|
|
546
|
-
<div id="todo-popover" class="clacky-popover todo-popover" role="dialog" hidden>
|
|
547
|
-
<div class="todo-popover-header">
|
|
548
|
-
<div class="todo-popover-heading">
|
|
549
|
-
<div class="todo-popover-title" data-i18n="chat.todo.title">Tasks</div>
|
|
550
|
-
<div id="todo-summary" class="todo-summary"></div>
|
|
551
|
-
</div>
|
|
552
|
-
<button id="todo-close" class="todo-close" type="button" aria-label="Close task list">
|
|
553
|
-
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8"/></svg>
|
|
554
|
-
</button>
|
|
555
|
-
</div>
|
|
556
|
-
<div id="todo-list" class="todo-list" aria-live="polite"></div>
|
|
557
|
-
</div>
|
|
558
|
-
</span>
|
|
559
|
-
<span class="sib-sep sib-sep-after-todo">│</span>
|
|
560
|
-
<span id="sib-cost"></span>
|
|
561
|
-
</span>
|
|
572
|
+
<span id="sib-cost"></span>
|
|
562
573
|
</div>
|
|
563
574
|
|
|
564
575
|
<!-- Composer slot: moved above the session info bar. -->
|
|
@@ -1370,6 +1381,20 @@
|
|
|
1370
1381
|
<button id="btn-browser-setup" class="btn-settings-action" data-i18n="settings.browser.btn">🌐 Configure Browser</button>
|
|
1371
1382
|
</div>
|
|
1372
1383
|
</div>
|
|
1384
|
+
<div class="settings-screenshot" id="browser-screenshot-settings" style="display:none">
|
|
1385
|
+
<div class="settings-screenshot-head">
|
|
1386
|
+
<span class="settings-screenshot-title" data-i18n="settings.browser.screenshot.title">Screenshot quality</span>
|
|
1387
|
+
<p class="settings-screenshot-desc" data-i18n="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.</p>
|
|
1388
|
+
</div>
|
|
1389
|
+
<div class="settings-screenshot-row">
|
|
1390
|
+
<span class="settings-screenshot-label" data-i18n="settings.browser.screenshot.quality">Quality</span>
|
|
1391
|
+
<div class="settings-segmented" id="browser-screenshot-quality">
|
|
1392
|
+
<button type="button" class="settings-segmented-btn" data-bytes="150000" data-i18n="settings.browser.screenshot.standard">Standard</button>
|
|
1393
|
+
<button type="button" class="settings-segmented-btn" data-bytes="300000" data-i18n="settings.browser.screenshot.high">High</button>
|
|
1394
|
+
</div>
|
|
1395
|
+
</div>
|
|
1396
|
+
<p class="settings-screenshot-hint" data-i18n="settings.browser.screenshot.qualityHint">Standard is enough for most pages and saves space. High keeps more detail on long pages.</p>
|
|
1397
|
+
</div>
|
|
1373
1398
|
</section>
|
|
1374
1399
|
|
|
1375
1400
|
<!-- Network / Proxy section -->
|
|
@@ -1397,24 +1422,24 @@
|
|
|
1397
1422
|
<span data-i18n="settings.search.title">Web Search</span>
|
|
1398
1423
|
</div>
|
|
1399
1424
|
<div class="settings-network">
|
|
1400
|
-
<p class="settings-network-desc" data-i18n="settings.search.desc">
|
|
1425
|
+
<p class="settings-network-desc" data-i18n="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.</p>
|
|
1401
1426
|
<div class="settings-network-url">
|
|
1402
1427
|
<label class="settings-network-url-label" for="settings-search-provider-trigger" data-i18n="settings.search.provider">Provider</label>
|
|
1403
1428
|
<div class="settings-network-url-row">
|
|
1404
1429
|
<div class="custom-select-wrapper" id="settings-search-provider-wrapper">
|
|
1405
1430
|
<div class="custom-select-trigger" tabindex="0" id="settings-search-provider-trigger">
|
|
1406
|
-
<span class="custom-select-value placeholder" id="settings-search-provider-value" data-i18n="settings.search.builtin">
|
|
1431
|
+
<span class="custom-select-value placeholder" id="settings-search-provider-value" data-i18n="settings.search.builtin">Free (auto-selects a working engine)</span>
|
|
1407
1432
|
<svg class="custom-select-arrow" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
1408
1433
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
|
|
1409
1434
|
</svg>
|
|
1410
1435
|
</div>
|
|
1411
1436
|
<div class="custom-select-dropdown" id="settings-search-provider-dropdown">
|
|
1412
|
-
<div class="custom-select-option" data-value="" data-i18n="settings.search.builtin">
|
|
1437
|
+
<div class="custom-select-option" data-value="" data-i18n="settings.search.builtin">Free (auto-selects a working engine)</div>
|
|
1438
|
+
<div class="custom-select-option" data-value="deepseek_web" data-i18n="settings.search.deepseek">DeepSeek (search & page fetch)</div>
|
|
1413
1439
|
</div>
|
|
1414
1440
|
</div>
|
|
1415
1441
|
<button type="button" id="btn-save-search" class="btn-settings-action" data-i18n="settings.search.save">Save</button>
|
|
1416
1442
|
</div>
|
|
1417
|
-
<div id="settings-search-status" class="model-test-result"></div>
|
|
1418
1443
|
</div>
|
|
1419
1444
|
<div class="settings-network-url" id="search-key-wrap" style="display:none">
|
|
1420
1445
|
<label class="settings-network-url-label" for="settings-search-key" data-i18n="settings.search.key">API Key</label>
|
|
@@ -1422,8 +1447,14 @@
|
|
|
1422
1447
|
<input type="password" id="settings-search-key" class="field-input" placeholder="tvly-..." autocomplete="off" spellcheck="false">
|
|
1423
1448
|
<button type="button" id="btn-test-search" class="btn-settings-action" data-i18n="settings.search.test">Test</button>
|
|
1424
1449
|
</div>
|
|
1450
|
+
<p class="settings-network-note" id="search-deepseek-hint" data-i18n="settings.search.deepseekHintFree" style="display:none">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.</p>
|
|
1451
|
+
</div>
|
|
1452
|
+
<p class="settings-network-note" id="search-builtin-note" data-i18n="settings.search.builtinEngines">Tries Parallel → DuckDuckGo → Bing in order. No key or configuration needed.</p>
|
|
1453
|
+
<div id="settings-search-status" class="model-test-result"></div>
|
|
1454
|
+
<div class="settings-network-url-row settings-network-divider" id="custom-searcher-row">
|
|
1455
|
+
<span class="settings-network-note" data-i18n="settings.search.customHint">Need another search provider? Put a script in ~/.clacky/searchers/, see tavily.rb.</span>
|
|
1456
|
+
<button type="button" id="btn-custom-searcher" class="btn-settings-action" data-i18n="settings.search.customBtn">Build with Agent</button>
|
|
1425
1457
|
</div>
|
|
1426
|
-
<p class="settings-network-desc" data-i18n="settings.search.custom">Add your own provider by dropping a script into ~/.clacky/searchers/ — see tavily.rb for the interface.</p>
|
|
1427
1458
|
</div>
|
|
1428
1459
|
</section>
|
|
1429
1460
|
|
|
@@ -1463,7 +1494,10 @@
|
|
|
1463
1494
|
</div>
|
|
1464
1495
|
<div class="brand-status-row">
|
|
1465
1496
|
<span class="brand-status-label" data-i18n="settings.brand.label.status">Status</span>
|
|
1466
|
-
<span class="brand-status-
|
|
1497
|
+
<span class="brand-status-state">
|
|
1498
|
+
<span class="brand-status-value" id="brand-status-badge">—</span>
|
|
1499
|
+
<span class="brand-status-hint" id="brand-status-hint" style="display:none"></span>
|
|
1500
|
+
</span>
|
|
1467
1501
|
</div>
|
|
1468
1502
|
<div class="brand-status-row">
|
|
1469
1503
|
<span class="brand-status-label" data-i18n="settings.brand.label.expires">Expires</span>
|
|
@@ -1501,7 +1535,7 @@
|
|
|
1501
1535
|
<div class="qr-lightbox-backdrop" id="qr-lightbox-backdrop"></div>
|
|
1502
1536
|
<div class="qr-lightbox-content">
|
|
1503
1537
|
<img id="qr-lightbox-img" src="" alt="Support QR Code" class="qr-lightbox-img">
|
|
1504
|
-
<p class="qr-lightbox-label" id="qr-lightbox-label">Tech Support</p>
|
|
1538
|
+
<p class="qr-lightbox-label" id="qr-lightbox-label" data-i18n="settings.brand.label.supportQr">Tech Support</p>
|
|
1505
1539
|
<p class="qr-lightbox-hint" data-i18n="settings.brand.label.qrHint">Scan with your phone camera</p>
|
|
1506
1540
|
<button class="qr-lightbox-close" id="qr-lightbox-close" aria-label="Close">
|
|
1507
1541
|
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
|
|
@@ -1754,8 +1788,8 @@
|
|
|
1754
1788
|
</div>
|
|
1755
1789
|
<p class="setup-device-card-lead" data-i18n="onboard.device.card.lead">Sign up and get $1 free credit · no subscription · pay as you go</p>
|
|
1756
1790
|
<ul class="setup-device-card-points">
|
|
1757
|
-
<li data-i18n="onboard.device.card.point1">One key for all frontier models — Claude,
|
|
1758
|
-
<li data-i18n="onboard.device.card.point2">
|
|
1791
|
+
<li data-i18n="onboard.device.card.point1">One key for all frontier models — Claude, GPT, DeepSeek & more</li>
|
|
1792
|
+
<li data-i18n="onboard.device.card.point2">Up to 70% off, switch models instantly</li>
|
|
1759
1793
|
</ul>
|
|
1760
1794
|
<button id="setup-btn-device-login" class="setup-submit-btn setup-device-btn">
|
|
1761
1795
|
<span data-i18n="onboard.device.btn">Get started free</span>
|
|
@@ -1766,11 +1800,7 @@
|
|
|
1766
1800
|
<!-- Pending state: shown while waiting for browser approval -->
|
|
1767
1801
|
<div id="setup-device-pending" style="display:none">
|
|
1768
1802
|
<div class="setup-device-spinner"></div>
|
|
1769
|
-
<p class="setup-device-pending-text" data-i18n="onboard.device.pending">
|
|
1770
|
-
<p class="setup-device-code">
|
|
1771
|
-
<span data-i18n="onboard.device.code">Verification code:</span>
|
|
1772
|
-
<strong id="setup-device-usercode">—</strong>
|
|
1773
|
-
</p>
|
|
1803
|
+
<p class="setup-device-pending-text" data-i18n="onboard.device.pending">Finishing the connection in your browser…</p>
|
|
1774
1804
|
<a id="setup-device-link" href="#" target="_blank" rel="noopener" class="setup-device-reopen"><span data-i18n="onboard.device.reopen">Open browser again</span><svg class="setup-btn-icon" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.25" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14"/><path d="M13 6l6 6-6 6"/></svg></a>
|
|
1775
1805
|
<button id="setup-device-cancel" class="setup-back-btn" data-i18n="onboard.device.cancel">Cancel</button>
|
|
1776
1806
|
</div>
|