openclacky 1.3.3 → 1.3.4
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 +26 -0
- data/docs/rich_ui_guide.md +277 -0
- data/docs/rich_ui_refactor_plan.md +396 -0
- data/lib/clacky/agent/llm_caller.rb +10 -4
- data/lib/clacky/agent/session_serializer.rb +3 -2
- data/lib/clacky/agent.rb +3 -2
- data/lib/clacky/agent_config.rb +2 -14
- data/lib/clacky/api_extension.rb +262 -0
- data/lib/clacky/api_extension_loader.rb +156 -0
- data/lib/clacky/cli.rb +93 -3
- data/lib/clacky/client.rb +38 -13
- data/lib/clacky/default_agents/_panels/git/panel.js +1 -1
- data/lib/clacky/default_agents/_panels/time_machine/panel.js +1 -1
- data/lib/clacky/default_skills/media-gen/SKILL.md +9 -6
- data/lib/clacky/idle_compression_timer.rb +3 -1
- data/lib/clacky/locales/en.rb +26 -0
- data/lib/clacky/locales/i18n.rb +26 -0
- data/lib/clacky/locales/zh.rb +26 -0
- data/lib/clacky/rich_ui/components/base_component.rb +50 -0
- data/lib/clacky/rich_ui/components/dialogs/approval_dialog.rb +142 -0
- data/lib/clacky/rich_ui/components/dialogs/config_menu_dialog.rb +106 -0
- data/lib/clacky/rich_ui/components/dialogs/form_dialog.rb +128 -0
- data/lib/clacky/rich_ui/components/sidebar.rb +119 -0
- data/lib/clacky/rich_ui/components/sidebar_panels.rb +134 -0
- data/lib/clacky/rich_ui/components/status_view.rb +58 -0
- data/lib/clacky/rich_ui/components/thinking_live_view.rb +79 -0
- data/lib/clacky/rich_ui/entry_tracker.rb +56 -0
- data/lib/clacky/rich_ui/layout_adapter.rb +16 -0
- data/lib/clacky/rich_ui/progress_handle_adapter.rb +24 -0
- data/lib/clacky/rich_ui/rich_ui_controller.rb +868 -0
- data/lib/clacky/rich_ui/shell/rich_agent_shell.rb +184 -0
- data/lib/clacky/rich_ui/view_renderer.rb +291 -0
- data/lib/clacky/rich_ui.rb +57 -0
- data/lib/clacky/rich_ui_controller.rb +3 -1549
- data/lib/clacky/server/api_extension_dispatcher.rb +120 -0
- data/lib/clacky/server/http_server.rb +150 -103
- data/lib/clacky/server/session_registry.rb +1 -1
- data/lib/clacky/shell_hook_loader.rb +1 -1
- data/lib/clacky/tools/edit.rb +14 -2
- data/lib/clacky/ui2/ui_controller.rb +7 -0
- data/lib/clacky/version.rb +1 -1
- data/lib/clacky/web/app.css +56 -59
- data/lib/clacky/web/app.js +65 -7
- data/lib/clacky/web/components/onboard.js +18 -2
- data/lib/clacky/web/core/aside.js +8 -3
- data/lib/clacky/web/core/ext.js +1 -1
- data/lib/clacky/web/features/skills/store.js +30 -2
- data/lib/clacky/web/features/skills/view.js +32 -1
- data/lib/clacky/web/features/workspace/view.js +1 -1
- data/lib/clacky/web/i18n.js +32 -20
- data/lib/clacky/web/index.html +9 -17
- data/lib/clacky/web/sessions.js +286 -28
- data/lib/clacky/web/settings.js +109 -111
- data/lib/clacky/web/ws-dispatcher.js +7 -3
- data/lib/clacky.rb +17 -2
- metadata +38 -2
- data/lib/clacky/media/output_dir.rb +0 -43
data/lib/clacky/web/i18n.js
CHANGED
|
@@ -73,6 +73,8 @@ const I18n = (() => {
|
|
|
73
73
|
"chat.edit": "Edit",
|
|
74
74
|
"chat.cancel": "Cancel",
|
|
75
75
|
"chat.send": "Send",
|
|
76
|
+
"chat.edit.warn": "Editing this message will discard the conversation history, file snapshots, and token costs after it. Continue?",
|
|
77
|
+
"chat.edit.warnSkip": "Don't show this again",
|
|
76
78
|
"chat.empty.title": "Start the conversation",
|
|
77
79
|
"chat.empty.subtitle": "Ask anything, or use a skill to get going.",
|
|
78
80
|
"chat.empty.tip1": "Type / to browse skills",
|
|
@@ -104,13 +106,18 @@ const I18n = (() => {
|
|
|
104
106
|
"sib.dir.up": "Up",
|
|
105
107
|
"sib.dir.root": "Root",
|
|
106
108
|
"sib.dir.default": "Default workspace",
|
|
107
|
-
"sib.dir.current": "Current workspace",
|
|
109
|
+
"sib.dir.current": "Current workspace",
|
|
110
|
+
"sib.dir.inputPlaceholder": "Type or select a directory path",
|
|
108
111
|
"sib.dir.loading": "Loading…",
|
|
109
112
|
"sib.dir.empty": "Empty directory",
|
|
110
113
|
"sib.dir.loadError": "Failed to load",
|
|
111
114
|
"sib.dir.confirm": "Confirm",
|
|
112
115
|
"sib.dir.cancel": "Cancel",
|
|
113
|
-
"sib.dir.showHidden": "Show hidden files",
|
|
116
|
+
"sib.dir.showHidden": "Show hidden files",
|
|
117
|
+
"sib.dir.newFolder": "New folder",
|
|
118
|
+
"sib.dir.newFolderDefault": "New Folder",
|
|
119
|
+
"sib.dir.mkdirError": "Failed to create folder: {{msg}}",
|
|
120
|
+
"workspace.title": "Files",
|
|
114
121
|
"workspace.expand": "Open workspace",
|
|
115
122
|
"workspace.collapse": "Collapse workspace",
|
|
116
123
|
"workspace.refresh": "Refresh",
|
|
@@ -128,6 +135,8 @@ const I18n = (() => {
|
|
|
128
135
|
"aside.expand": "Open panel",
|
|
129
136
|
"workspace.revealInFinder": "Reveal in Finder",
|
|
130
137
|
"workspace.revealFailed": "Failed to reveal file",
|
|
138
|
+
"changes.tab": "Git",
|
|
139
|
+
"tm.tab": "History",
|
|
131
140
|
"sib.model.tooltip": "Click to switch model",
|
|
132
141
|
"sib.model.tooltip.busy": "Model switching is disabled while the agent is responding",
|
|
133
142
|
"sib.variant.header": "Quick switch",
|
|
@@ -458,6 +467,7 @@ const I18n = (() => {
|
|
|
458
467
|
"skills.deleteError": "Delete failed.",
|
|
459
468
|
"skills.deleted": "Skill \"{{name}}\" deleted.",
|
|
460
469
|
"skills.btn.delete": "Delete skill",
|
|
470
|
+
"skills.btn.edit": "Edit skill",
|
|
461
471
|
"skills.ac.empty": "No skills available",
|
|
462
472
|
"skills.upload.uploading": "Uploading…",
|
|
463
473
|
"skills.upload.uploaded": "Uploaded",
|
|
@@ -465,6 +475,7 @@ const I18n = (() => {
|
|
|
465
475
|
"skills.upload.failed": "Failed",
|
|
466
476
|
"skills.upload.publishTip": "Publish to cloud",
|
|
467
477
|
"skills.btn.refresh": "Refresh",
|
|
478
|
+
"skills.editFail": "Failed to load skill",
|
|
468
479
|
|
|
469
480
|
// ── Channels panel ──
|
|
470
481
|
"channels.title": "Channels",
|
|
@@ -553,7 +564,7 @@ const I18n = (() => {
|
|
|
553
564
|
"settings.models.badge.default": "Default",
|
|
554
565
|
"settings.models.badge.lite": "Lite",
|
|
555
566
|
"settings.media.title": "Secondary Models",
|
|
556
|
-
"settings.media.desc": "Image / video / audio / vision models
|
|
567
|
+
"settings.media.desc": "Optional. Image / video / audio / vision models.",
|
|
557
568
|
"settings.media.loading": "Loading…",
|
|
558
569
|
"settings.media.error": "Failed to load: {{msg}}",
|
|
559
570
|
"settings.media.kind.image": "Image",
|
|
@@ -586,13 +597,6 @@ const I18n = (() => {
|
|
|
586
597
|
"settings.media.apiKey.required": "API key required",
|
|
587
598
|
"settings.media.model.required": "Model name required",
|
|
588
599
|
"settings.media.baseUrl.required": "Base URL required",
|
|
589
|
-
"settings.media.output_dir.desc": "Where generated images, videos and audio are saved (optional)",
|
|
590
|
-
"settings.media.output_dir.browse": "Browse…",
|
|
591
|
-
"settings.media.output_dir.picker": "Select Media Output Directory",
|
|
592
|
-
"settings.media.output_dir.clear": "Clear",
|
|
593
|
-
"settings.media.output_dir.saved": "Saved",
|
|
594
|
-
"settings.media.output_dir.cleared": "Cleared",
|
|
595
|
-
"settings.media.output_dir.invalid": "Invalid directory",
|
|
596
600
|
"settings.models.field.quicksetup": "Quick Setup",
|
|
597
601
|
"settings.models.field.model": "Model",
|
|
598
602
|
"settings.models.field.baseurl": "Base URL",
|
|
@@ -620,6 +624,7 @@ const I18n = (() => {
|
|
|
620
624
|
"settings.models.btn.test": "Test",
|
|
621
625
|
"settings.models.link.topUp": "Top up / Manage account",
|
|
622
626
|
"settings.models.btn.edit": "Edit",
|
|
627
|
+
"settings.models.btn.duplicate": "Duplicate",
|
|
623
628
|
"settings.models.btn.delete": "Delete",
|
|
624
629
|
"settings.models.btn.cancel": "Cancel",
|
|
625
630
|
"settings.models.btn.set_default": "Default",
|
|
@@ -628,6 +633,7 @@ const I18n = (() => {
|
|
|
628
633
|
"settings.models.btn.done": "Done ✓",
|
|
629
634
|
"settings.models.modal.add": "Add Model",
|
|
630
635
|
"settings.models.modal.edit": "Edit Model",
|
|
636
|
+
"settings.models.modal.duplicate": "Duplicate Model",
|
|
631
637
|
"settings.models.field.provider": "Provider",
|
|
632
638
|
"settings.models.provider.custom": "Custom",
|
|
633
639
|
"settings.models.unnamed": "Unnamed Model",
|
|
@@ -985,6 +991,8 @@ const I18n = (() => {
|
|
|
985
991
|
"chat.edit": "编辑",
|
|
986
992
|
"chat.cancel": "取消",
|
|
987
993
|
"chat.send": "发送",
|
|
994
|
+
"chat.edit.warn": "编辑此消息将丢弃后续对话历史、文件快照及已产生的 token 费用,是否继续?",
|
|
995
|
+
"chat.edit.warnSkip": "不再提示",
|
|
988
996
|
"chat.empty.title": "开始新会话",
|
|
989
997
|
"chat.empty.subtitle": "直接提问,或用一个 Skill 启动。",
|
|
990
998
|
"chat.empty.tip1": "输入 / 浏览 Skill",
|
|
@@ -1016,13 +1024,18 @@ const I18n = (() => {
|
|
|
1016
1024
|
"sib.dir.up": "上一级",
|
|
1017
1025
|
"sib.dir.root": "根目录",
|
|
1018
1026
|
"sib.dir.default": "默认工作目录",
|
|
1019
|
-
"sib.dir.current": "当前工作目录",
|
|
1027
|
+
"sib.dir.current": "当前工作目录",
|
|
1028
|
+
"sib.dir.inputPlaceholder": "输入或选择目录路径",
|
|
1020
1029
|
"sib.dir.loading": "加载中…",
|
|
1021
1030
|
"sib.dir.empty": "空目录",
|
|
1022
1031
|
"sib.dir.loadError": "加载失败",
|
|
1023
1032
|
"sib.dir.confirm": "确认",
|
|
1024
1033
|
"sib.dir.cancel": "取消",
|
|
1025
|
-
"sib.dir.showHidden": "显示隐藏文件",
|
|
1034
|
+
"sib.dir.showHidden": "显示隐藏文件",
|
|
1035
|
+
"sib.dir.newFolder": "新建文件夹",
|
|
1036
|
+
"sib.dir.newFolderDefault": "新建文件夹",
|
|
1037
|
+
"sib.dir.mkdirError": "新建文件夹失败:{{msg}}",
|
|
1038
|
+
"workspace.title": "文件",
|
|
1026
1039
|
"workspace.expand": "打开工作区",
|
|
1027
1040
|
"workspace.collapse": "收起工作区",
|
|
1028
1041
|
"workspace.refresh": "刷新",
|
|
@@ -1040,6 +1053,8 @@ const I18n = (() => {
|
|
|
1040
1053
|
"aside.expand": "打开面板",
|
|
1041
1054
|
"workspace.revealInFinder": "打开所在文件夹",
|
|
1042
1055
|
"workspace.revealFailed": "无法打开文件位置",
|
|
1056
|
+
"changes.tab": "Git 管理",
|
|
1057
|
+
"tm.tab": "时光机",
|
|
1043
1058
|
"sib.model.tooltip": "点击切换模型",
|
|
1044
1059
|
"sib.model.tooltip.busy": "Agent 回复中,暂时无法切换模型",
|
|
1045
1060
|
"sib.variant.header": "快速切换",
|
|
@@ -1369,6 +1384,7 @@ const I18n = (() => {
|
|
|
1369
1384
|
"skills.deleteError": "删除失败。",
|
|
1370
1385
|
"skills.deleted": "技能 \"{{name}}\" 已删除。",
|
|
1371
1386
|
"skills.btn.delete": "删除技能",
|
|
1387
|
+
"skills.btn.edit": "编辑技能",
|
|
1372
1388
|
"skills.ac.empty": "暂无可用技能",
|
|
1373
1389
|
"skills.upload.uploading": "上传中…",
|
|
1374
1390
|
"skills.upload.uploaded": "已上传",
|
|
@@ -1376,6 +1392,7 @@ const I18n = (() => {
|
|
|
1376
1392
|
"skills.upload.failed": "失败",
|
|
1377
1393
|
"skills.upload.publishTip": "发布到云端",
|
|
1378
1394
|
"skills.btn.refresh": "刷新",
|
|
1395
|
+
"skills.editFail": "加载技能失败",
|
|
1379
1396
|
|
|
1380
1397
|
// ── Channels panel ──
|
|
1381
1398
|
"channels.title": "频道",
|
|
@@ -1464,7 +1481,7 @@ const I18n = (() => {
|
|
|
1464
1481
|
"settings.models.badge.default": "默认",
|
|
1465
1482
|
"settings.models.badge.lite": "轻量",
|
|
1466
1483
|
"settings.media.title": "配置副模型",
|
|
1467
|
-
"settings.media.desc": "
|
|
1484
|
+
"settings.media.desc": "可选。图片生成 / 视频生成 / 音频生成 / 视觉理解。",
|
|
1468
1485
|
"settings.media.loading": "加载中…",
|
|
1469
1486
|
"settings.media.error": "加载失败:{{msg}}",
|
|
1470
1487
|
"settings.media.kind.image": "图片生成",
|
|
@@ -1497,13 +1514,6 @@ const I18n = (() => {
|
|
|
1497
1514
|
"settings.media.apiKey.required": "请填写 API Key",
|
|
1498
1515
|
"settings.media.model.required": "请填写模型名称",
|
|
1499
1516
|
"settings.media.baseUrl.required": "请填写 Base URL",
|
|
1500
|
-
"settings.media.output_dir.desc": "生成的图片、视频、音频文件保存位置(可选)",
|
|
1501
|
-
"settings.media.output_dir.browse": "选择目录…",
|
|
1502
|
-
"settings.media.output_dir.picker": "选择媒体输出目录",
|
|
1503
|
-
"settings.media.output_dir.clear": "清除",
|
|
1504
|
-
"settings.media.output_dir.saved": "已保存",
|
|
1505
|
-
"settings.media.output_dir.cleared": "已清除",
|
|
1506
|
-
"settings.media.output_dir.invalid": "目录无效",
|
|
1507
1517
|
"settings.models.field.quicksetup": "快速配置",
|
|
1508
1518
|
"settings.models.field.model": "Model",
|
|
1509
1519
|
"settings.models.field.baseurl": "Base URL",
|
|
@@ -1531,6 +1541,7 @@ const I18n = (() => {
|
|
|
1531
1541
|
"settings.models.btn.test": "测试",
|
|
1532
1542
|
"settings.models.link.topUp": "充值 / 账户管理",
|
|
1533
1543
|
"settings.models.btn.edit": "编辑",
|
|
1544
|
+
"settings.models.btn.duplicate": "复制",
|
|
1534
1545
|
"settings.models.btn.delete": "删除",
|
|
1535
1546
|
"settings.models.btn.cancel": "取消",
|
|
1536
1547
|
"settings.models.btn.set_default": "设为默认",
|
|
@@ -1539,6 +1550,7 @@ const I18n = (() => {
|
|
|
1539
1550
|
"settings.models.btn.done": "完成 ✓",
|
|
1540
1551
|
"settings.models.modal.add": "添加模型",
|
|
1541
1552
|
"settings.models.modal.edit": "编辑模型",
|
|
1553
|
+
"settings.models.modal.duplicate": "复制模型",
|
|
1542
1554
|
"settings.models.field.provider": "供应商",
|
|
1543
1555
|
"settings.models.provider.custom": "自定义",
|
|
1544
1556
|
"settings.models.unnamed": "未命名模型",
|
data/lib/clacky/web/index.html
CHANGED
|
@@ -835,19 +835,6 @@
|
|
|
835
835
|
Optional. Image / video / audio / vision models.
|
|
836
836
|
</div>
|
|
837
837
|
<div id="media-rows"></div>
|
|
838
|
-
|
|
839
|
-
<!-- Output directory: scoped under media section -->
|
|
840
|
-
<div class="settings-subsection" id="media-output-dir-section">
|
|
841
|
-
<p class="settings-subsection-desc" data-i18n="settings.media.output_dir.desc">Where generated images, videos and audio are saved (optional)</p>
|
|
842
|
-
<div class="settings-network-url">
|
|
843
|
-
<div class="settings-network-url-row">
|
|
844
|
-
<input type="text" id="settings-media-output-dir" class="field-input" placeholder="" autocomplete="off" spellcheck="false" readonly>
|
|
845
|
-
<button type="button" id="btn-browse-media-output-dir" class="btn-settings-action" data-i18n="settings.media.output_dir.browse">Browse…</button>
|
|
846
|
-
<button type="button" id="btn-clear-media-output-dir" class="btn-settings-action" data-i18n="settings.media.output_dir.clear">Clear</button>
|
|
847
|
-
</div>
|
|
848
|
-
<div id="settings-media-output-dir-status" class="model-test-result"></div>
|
|
849
|
-
</div>
|
|
850
|
-
</div>
|
|
851
838
|
</section>
|
|
852
839
|
</div>
|
|
853
840
|
|
|
@@ -1126,6 +1113,7 @@
|
|
|
1126
1113
|
</div>
|
|
1127
1114
|
<div class="modal-body">
|
|
1128
1115
|
<input type="hidden" id="model-modal-index" value="-1">
|
|
1116
|
+
<input type="hidden" id="model-modal-source-id" value="">
|
|
1129
1117
|
|
|
1130
1118
|
<label class="model-field" id="model-modal-provider-field">
|
|
1131
1119
|
<span class="field-label" data-i18n="settings.models.field.provider">Provider</span>
|
|
@@ -1292,9 +1280,9 @@
|
|
|
1292
1280
|
</div>
|
|
1293
1281
|
|
|
1294
1282
|
<!-- Secondary path: manual key entry, collapsed by default -->
|
|
1295
|
-
<
|
|
1296
|
-
<summary id="setup-manual-summary" data-i18n="onboard.manual.toggle">Configure manually with your own API key</summary>
|
|
1283
|
+
<button id="setup-manual-toggle" class="setup-manual-toggle-btn" data-i18n="onboard.manual.toggle">Configure manually with your own API key</button>
|
|
1297
1284
|
|
|
1285
|
+
<div id="setup-manual-section" style="display:none">
|
|
1298
1286
|
<div class="setup-field">
|
|
1299
1287
|
<label class="setup-label" data-i18n="onboard.key.provider">Provider</label>
|
|
1300
1288
|
<div class="custom-select-wrapper" id="setup-provider-wrapper">
|
|
@@ -1348,7 +1336,7 @@
|
|
|
1348
1336
|
</div>
|
|
1349
1337
|
</div>
|
|
1350
1338
|
|
|
1351
|
-
<div class="setup-docs-hint" style="font-size:0.75rem;margin-top:
|
|
1339
|
+
<div class="setup-docs-hint" style="font-size:0.75rem;margin-top:8px;margin-bottom:10px;text-align:left;">
|
|
1352
1340
|
<span style="color:var(--muted,#6b7280);" data-i18n="onboard.key.docsGuide.question">New to AI keys?</span>
|
|
1353
1341
|
<a id="setup-docs-link" href="https://www.openclacky.com/docs/ai-key-guide" target="_blank" rel="noopener" style="margin-left:0.25rem;color:var(--accent,#6366f1);text-decoration:none;" data-i18n="onboard.key.docsGuide.cta">See the guide →</a>
|
|
1354
1342
|
</div>
|
|
@@ -1359,7 +1347,7 @@
|
|
|
1359
1347
|
<button id="setup-btn-back" class="setup-back-btn" data-i18n="onboard.key.btn.back">← Back</button>
|
|
1360
1348
|
<button id="setup-btn-test" class="setup-submit-btn" data-i18n="onboard.key.btn.test">Test & Continue →</button>
|
|
1361
1349
|
</div>
|
|
1362
|
-
</
|
|
1350
|
+
</div>
|
|
1363
1351
|
</div>
|
|
1364
1352
|
|
|
1365
1353
|
</div>
|
|
@@ -1424,6 +1412,10 @@
|
|
|
1424
1412
|
<div id="modal-overlay" class="modal-overlay" style="display:none">
|
|
1425
1413
|
<div class="modal-box sm">
|
|
1426
1414
|
<div id="modal-message" class="modal-confirm-message"></div>
|
|
1415
|
+
<label id="modal-skip-label" style="display:none;align-items:center;gap:.5rem;font-size:.82rem;margin-bottom:.5rem;cursor:pointer">
|
|
1416
|
+
<input type="checkbox" id="modal-skip-cb">
|
|
1417
|
+
<span id="modal-skip-text"></span>
|
|
1418
|
+
</label>
|
|
1427
1419
|
<div class="modal-actions">
|
|
1428
1420
|
<button id="modal-no" class="btn-secondary" data-i18n="modal.no">No</button>
|
|
1429
1421
|
<button id="modal-yes" class="btn-primary" data-i18n="modal.yes">Yes</button>
|