openclacky 1.5.4 → 1.5.5
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 +31 -0
- data/lib/clacky/agent/message_compressor_helper.rb +4 -1
- data/lib/clacky/agent/session_serializer.rb +1 -0
- data/lib/clacky/agent.rb +1 -1
- data/lib/clacky/agent_config.rb +4 -2
- data/lib/clacky/agent_profile.rb +25 -3
- data/lib/clacky/default_extensions/ext-studio/ext.yml +2 -2
- data/lib/clacky/default_extensions/ext-studio/panels/studio/view.js +42 -33
- data/lib/clacky/default_extensions/ext-studio/skills/ext-develop/SKILL.md +4 -2
- data/lib/clacky/default_extensions/git/ext.yml +3 -0
- data/lib/clacky/default_extensions/meeting/ext.yml +3 -0
- data/lib/clacky/default_extensions/time_machine/ext.yml +4 -0
- data/lib/clacky/default_skills/new/SKILL.md +17 -12
- data/lib/clacky/extension/api_extension.rb +2 -0
- data/lib/clacky/extension/loader.rb +1 -0
- data/lib/clacky/extension/packager.rb +60 -15
- data/lib/clacky/extension/verifier.rb +1 -1
- data/lib/clacky/message_format/anthropic.rb +1 -1
- data/lib/clacky/message_format/bedrock.rb +1 -1
- data/lib/clacky/message_format/open_ai.rb +8 -0
- data/lib/clacky/providers.rb +61 -0
- data/lib/clacky/server/http_server.rb +154 -15
- data/lib/clacky/server/web_ui_controller.rb +12 -2
- data/lib/clacky/session_manager.rb +1 -0
- data/lib/clacky/tools/terminal.rb +30 -3
- data/lib/clacky/version.rb +1 -1
- data/lib/clacky/web/app.css +301 -171
- data/lib/clacky/web/app.js +16 -2
- data/lib/clacky/web/features/extensions/store.js +214 -9
- data/lib/clacky/web/features/extensions/view.js +156 -11
- data/lib/clacky/web/features/new-session/store.js +25 -3
- data/lib/clacky/web/features/new-session/view.js +337 -140
- data/lib/clacky/web/features/skills/view.js +1 -1
- data/lib/clacky/web/i18n.js +29 -11
- data/lib/clacky/web/index.html +36 -64
- data/lib/clacky/web/sessions.js +2 -1
- data/lib/clacky/web/utils.js +1 -0
- data/lib/clacky/web/ws-dispatcher.js +39 -3
- metadata +1 -1
data/lib/clacky/web/i18n.js
CHANGED
|
@@ -21,7 +21,7 @@ const I18n = (() => {
|
|
|
21
21
|
"sidebar.skills": "Skill Management",
|
|
22
22
|
"sidebar.channels": "Channel Management",
|
|
23
23
|
"sidebar.mcp": "MCP Servers",
|
|
24
|
-
"sidebar.extensions": "Extension
|
|
24
|
+
"sidebar.extensions": "Extension Management",
|
|
25
25
|
"sidebar.trash": "File Recall",
|
|
26
26
|
"sidebar.profile": "Assistant Memory",
|
|
27
27
|
"sidebar.memories": "Memories",
|
|
@@ -56,7 +56,7 @@ const I18n = (() => {
|
|
|
56
56
|
|
|
57
57
|
// ── Welcome screen ──
|
|
58
58
|
"sessions.new.title": "Start a new session",
|
|
59
|
-
"sessions.new.subtitle": "Pick
|
|
59
|
+
"sessions.new.subtitle": "Pick an agent to chat with, then tell it what you'd like to do.",
|
|
60
60
|
"sessions.new.placeholder": "Type your first message to {{agent}}…",
|
|
61
61
|
"sessions.new.moreOptions": "More options",
|
|
62
62
|
"sessions.new.tryAsking": "Try asking",
|
|
@@ -201,6 +201,7 @@ const I18n = (() => {
|
|
|
201
201
|
"sib.reasoning.medium": "Medium",
|
|
202
202
|
"sib.reasoning.high": "High",
|
|
203
203
|
"sib.reasoning.xhigh": "XHigh",
|
|
204
|
+
"sib.reasoning.max": "Max",
|
|
204
205
|
"sessions.thinking": "Thinking…",
|
|
205
206
|
"sessions.default_name": "Session {{n}}",
|
|
206
207
|
"sessions.cronGroup": "Scheduled Tasks",
|
|
@@ -312,7 +313,7 @@ const I18n = (() => {
|
|
|
312
313
|
|
|
313
314
|
// ── Creator trash ──
|
|
314
315
|
"trash.title": "File Recall",
|
|
315
|
-
"trash.subtitle": "Files the
|
|
316
|
+
"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.",
|
|
316
317
|
"trash.refresh": "Refresh",
|
|
317
318
|
"trash.refresh.tooltip": "Reload the trash list",
|
|
318
319
|
"trash.emptyOld": "Empty >7 days",
|
|
@@ -365,7 +366,7 @@ const I18n = (() => {
|
|
|
365
366
|
"trash.filterCron": "Scheduled",
|
|
366
367
|
"trash.filterManual": "Regular",
|
|
367
368
|
"trash.filterAllProjects": "All Projects",
|
|
368
|
-
"trash.sessionAutoCleanHint": "The system keeps the most recent 200 sessions; older ones are moved here.",
|
|
369
|
+
"trash.sessionAutoCleanHint": "The system keeps the most recent 200 sessions; older ones are moved here and permanently deleted after 7 days.",
|
|
369
370
|
|
|
370
371
|
// ── Relative time (used by _humanTime helper) ──
|
|
371
372
|
"time.justNow": "just now",
|
|
@@ -544,12 +545,14 @@ const I18n = (() => {
|
|
|
544
545
|
// ── MCP panel ──
|
|
545
546
|
"mcp.title": "MCP Servers",
|
|
546
547
|
"mcp.subtitle": "Standard Model Context Protocol servers (Claude Desktop / Cursor compatible). Edit ~/.clacky/mcp.json to add or remove servers.",
|
|
547
|
-
"extensions.title": "
|
|
548
|
+
"extensions.title": "Extensions",
|
|
548
549
|
"extensions.subtitle": "Browse and manage extensions — add agents, skills, and panels to supercharge your workflow.",
|
|
549
550
|
"extensions.searchPlaceholder": "Search extensions…",
|
|
550
551
|
"extensions.sort.newest": "Newest",
|
|
551
552
|
"extensions.sort.updated": "Recently updated",
|
|
552
553
|
"extensions.sort.downloads": "Most installed",
|
|
554
|
+
"extensions.filter.system": "System",
|
|
555
|
+
"extensions.filter.market": "Marketplace",
|
|
553
556
|
"extensions.filter.all": "All",
|
|
554
557
|
"extensions.filter.installed": "Installed",
|
|
555
558
|
"extensions.filter.brand": "Brand",
|
|
@@ -581,13 +584,19 @@ const I18n = (() => {
|
|
|
581
584
|
"extensions.disabled": "Disabled",
|
|
582
585
|
"extensions.action.install": "Install",
|
|
583
586
|
"extensions.action.installing": "Installing…",
|
|
587
|
+
"extensions.action.downloading": "Downloading",
|
|
588
|
+
"extensions.action.extracting": "Extracting",
|
|
589
|
+
"extensions.action.verifying": "Verifying",
|
|
584
590
|
"extensions.action.update": "Update",
|
|
585
591
|
"extensions.action.updating": "Updating…",
|
|
592
|
+
"extensions.action.installTimeout": "Install timed out. Please try again.",
|
|
586
593
|
"extensions.action.disable": "Disable",
|
|
587
594
|
"extensions.action.enable": "Enable",
|
|
588
595
|
"extensions.action.remove": "Remove",
|
|
589
596
|
"extensions.action.removeConfirm": "Remove this extension? Its files will be deleted. You can reinstall it later.",
|
|
590
597
|
"extensions.action.removePurgeData": "Also delete this extension's data (kept by default; reinstalling restores it)",
|
|
598
|
+
"extensions.newExt.btn": "New Extension",
|
|
599
|
+
"extensions.newExt.seed": "I want to build a new extension. Help me get started: ask me what the extension should do, then scaffold it and build it out step by step.",
|
|
591
600
|
"ext.refresh_hint": "Reload Extensions",
|
|
592
601
|
"mcp.loading": "Loading…",
|
|
593
602
|
"mcp.empty.title": "No MCP servers configured",
|
|
@@ -1067,7 +1076,7 @@ const I18n = (() => {
|
|
|
1067
1076
|
"sidebar.skills": "技能管理",
|
|
1068
1077
|
"sidebar.channels": "频道管理",
|
|
1069
1078
|
"sidebar.mcp": "MCP 工具",
|
|
1070
|
-
"sidebar.extensions": "
|
|
1079
|
+
"sidebar.extensions": "扩展管理",
|
|
1071
1080
|
"sidebar.trash": "文件召回",
|
|
1072
1081
|
"sidebar.profile": "助理记忆",
|
|
1073
1082
|
"sidebar.memories": "记忆",
|
|
@@ -1101,7 +1110,7 @@ const I18n = (() => {
|
|
|
1101
1110
|
|
|
1102
1111
|
// ── Welcome screen ──
|
|
1103
1112
|
"sessions.new.title": "开始新会话",
|
|
1104
|
-
"sessions.new.subtitle": "
|
|
1113
|
+
"sessions.new.subtitle": "选一个想聊的 Agent,说说你想做什么。",
|
|
1105
1114
|
"sessions.new.placeholder": "输入第一条消息发给 {{agent}}…",
|
|
1106
1115
|
"sessions.new.moreOptions": "更多选项",
|
|
1107
1116
|
"sessions.new.tryAsking": "试试这样问我",
|
|
@@ -1244,6 +1253,7 @@ const I18n = (() => {
|
|
|
1244
1253
|
"sib.reasoning.medium": "中",
|
|
1245
1254
|
"sib.reasoning.high": "高",
|
|
1246
1255
|
"sib.reasoning.xhigh": "超高",
|
|
1256
|
+
"sib.reasoning.max": "Max",
|
|
1247
1257
|
"sessions.thinking": "思考中…",
|
|
1248
1258
|
"sessions.default_name": "会话 {{n}}",
|
|
1249
1259
|
"sessions.cronGroup": "定时任务",
|
|
@@ -1353,7 +1363,7 @@ const I18n = (() => {
|
|
|
1353
1363
|
|
|
1354
1364
|
// ── Creator trash ──
|
|
1355
1365
|
"trash.title": "文件召回",
|
|
1356
|
-
"trash.subtitle": "AI
|
|
1366
|
+
"trash.subtitle": "AI Agent 在各个项目里丢进回收站的文件。可以把它们召回到原位置,或彻底清理不再需要的。",
|
|
1357
1367
|
"trash.refresh": "刷新",
|
|
1358
1368
|
"trash.refresh.tooltip": "重新加载回收站列表",
|
|
1359
1369
|
"trash.emptyOld": "清理 >7 天",
|
|
@@ -1408,7 +1418,7 @@ const I18n = (() => {
|
|
|
1408
1418
|
"trash.filterCron": "定时任务",
|
|
1409
1419
|
"trash.filterManual": "普通会话",
|
|
1410
1420
|
"trash.filterAllProjects": "所有项目",
|
|
1411
|
-
"trash.sessionAutoCleanHint": "系统自动保留最近 200
|
|
1421
|
+
"trash.sessionAutoCleanHint": "系统自动保留最近 200 个会话,超出后自动移入此处,超出 7 天的会话将永久删除。",
|
|
1412
1422
|
|
|
1413
1423
|
// ── Relative time (used by _humanTime helper) ──
|
|
1414
1424
|
"time.justNow": "刚刚",
|
|
@@ -1586,15 +1596,17 @@ const I18n = (() => {
|
|
|
1586
1596
|
// ── MCP panel ──
|
|
1587
1597
|
"mcp.title": "MCP 工具",
|
|
1588
1598
|
"mcp.subtitle": "标准 Model Context Protocol 服务(与 Claude Desktop / Cursor 兼容)。编辑 ~/.clacky/mcp.json 添加或移除服务。",
|
|
1589
|
-
"extensions.title": "
|
|
1599
|
+
"extensions.title": "扩展管理",
|
|
1590
1600
|
"extensions.subtitle": "浏览并管理扩展,用 Agent、技能与面板增强你的工作流。",
|
|
1591
1601
|
"extensions.searchPlaceholder": "搜索扩展…",
|
|
1592
1602
|
"extensions.sort.newest": "最新",
|
|
1593
1603
|
"extensions.sort.updated": "最近更新",
|
|
1594
1604
|
"extensions.sort.downloads": "安装最多",
|
|
1605
|
+
"extensions.filter.system": "系统",
|
|
1606
|
+
"extensions.filter.market": "市场",
|
|
1595
1607
|
"extensions.filter.all": "全部",
|
|
1596
1608
|
"extensions.filter.installed": "已安装",
|
|
1597
|
-
"extensions.filter.brand": "
|
|
1609
|
+
"extensions.filter.brand": "品牌",
|
|
1598
1610
|
"extensions.empty": "暂无可用扩展。",
|
|
1599
1611
|
"extensions.noResults": "没有匹配的扩展。",
|
|
1600
1612
|
"extensions.loadFailed": "无法连接扩展市场。",
|
|
@@ -1623,13 +1635,19 @@ const I18n = (() => {
|
|
|
1623
1635
|
"extensions.disabled": "已禁用",
|
|
1624
1636
|
"extensions.action.install": "安装",
|
|
1625
1637
|
"extensions.action.installing": "安装中…",
|
|
1638
|
+
"extensions.action.downloading": "下载中",
|
|
1639
|
+
"extensions.action.extracting": "解压中",
|
|
1640
|
+
"extensions.action.verifying": "校验中",
|
|
1626
1641
|
"extensions.action.update": "更新",
|
|
1627
1642
|
"extensions.action.updating": "更新中…",
|
|
1643
|
+
"extensions.action.installTimeout": "安装超时,请重试。",
|
|
1628
1644
|
"extensions.action.disable": "禁用",
|
|
1629
1645
|
"extensions.action.enable": "启用",
|
|
1630
1646
|
"extensions.action.remove": "移除",
|
|
1631
1647
|
"extensions.action.removeConfirm": "确定移除此扩展?相关文件会被删除,之后可重新安装。",
|
|
1632
1648
|
"extensions.action.removePurgeData": "同时删除该扩展的数据(默认保留,重新安装会自动恢复)",
|
|
1649
|
+
"extensions.newExt.btn": "新建扩展",
|
|
1650
|
+
"extensions.newExt.seed": "我想开发一个新的扩展。请引导我开始:先问清楚这个扩展要做什么,然后帮我搭好骨架并一步步开发出来。",
|
|
1633
1651
|
"ext.refresh_hint": "刷新扩展",
|
|
1634
1652
|
"mcp.loading": "加载中…",
|
|
1635
1653
|
"mcp.empty.title": "尚未配置 MCP 服务",
|
data/lib/clacky/web/index.html
CHANGED
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
</svg>
|
|
34
34
|
</button>
|
|
35
35
|
<div id="header-brand" class="has-logo" style="cursor:pointer" onclick="Router.navigate('chat')">
|
|
36
|
-
<img class="header-logo-img" id="header-logo-img" src="
|
|
36
|
+
<img class="header-logo-img" id="header-logo-img" src="{{BRAND_LOGO_URL}}" alt="OpenClacky">
|
|
37
37
|
<span class="header-logo-divider"></span>
|
|
38
38
|
<span class="header-logo" id="header-logo">{{BRAND_NAME}}</span>
|
|
39
39
|
<!-- Owner badge: visible only for creator-tier licenses (user_licensed=true).
|
|
@@ -226,6 +226,17 @@
|
|
|
226
226
|
</div>
|
|
227
227
|
</div>
|
|
228
228
|
</div>
|
|
229
|
+
<div id="extensions-sidebar-item" class="task-item task-item-summary">
|
|
230
|
+
<div class="task-row">
|
|
231
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="task-icon">
|
|
232
|
+
<path d="M20 7h-9"/><path d="M14 17H5"/>
|
|
233
|
+
<circle cx="17" cy="17" r="3"/><circle cx="7" cy="7" r="3"/>
|
|
234
|
+
</svg>
|
|
235
|
+
<div class="task-info">
|
|
236
|
+
<span class="task-name" id="extensions-sidebar-label" data-i18n="sidebar.extensions">Extension Management</span>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
229
240
|
<div id="channels-sidebar-item" class="task-item task-item-summary">
|
|
230
241
|
<div class="task-row">
|
|
231
242
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="task-icon">
|
|
@@ -249,17 +260,6 @@
|
|
|
249
260
|
</div>
|
|
250
261
|
</div>
|
|
251
262
|
</div>
|
|
252
|
-
<div id="extensions-sidebar-item" class="task-item task-item-summary">
|
|
253
|
-
<div class="task-row">
|
|
254
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="task-icon">
|
|
255
|
-
<path d="M20 7h-9"/><path d="M14 17H5"/>
|
|
256
|
-
<circle cx="17" cy="17" r="3"/><circle cx="7" cy="7" r="3"/>
|
|
257
|
-
</svg>
|
|
258
|
-
<div class="task-info">
|
|
259
|
-
<span class="task-name" id="extensions-sidebar-label" data-i18n="sidebar.extensions">Extension Market</span>
|
|
260
|
-
</div>
|
|
261
|
-
</div>
|
|
262
|
-
</div>
|
|
263
263
|
</div>
|
|
264
264
|
</div>
|
|
265
265
|
|
|
@@ -362,51 +362,9 @@
|
|
|
362
362
|
<!-- Starter prompts shown when selected agent provides suggestions -->
|
|
363
363
|
<div id="new-session-starter-prompts" class="new-session-starter-prompts" style="display:none"></div>
|
|
364
364
|
|
|
365
|
-
<!-- Panels the selected agent exposes (filled when an agent is picked) -->
|
|
366
|
-
<div id="new-session-agent-panels" class="new-session-agent-panels" style="display:none"></div>
|
|
367
|
-
|
|
368
|
-
<div class="new-session-advanced-wrap">
|
|
369
|
-
<button id="new-session-toggle-advanced" class="new-session-advanced-toggle" type="button" aria-expanded="false">
|
|
370
|
-
<span data-i18n="sessions.new.moreOptions">More options</span>
|
|
371
|
-
<svg class="new-session-advanced-caret" width="10" height="10" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 6l4 4 4-4"/></svg>
|
|
372
|
-
</button>
|
|
373
|
-
|
|
374
|
-
<div id="new-session-advanced" class="new-session-advanced" hidden>
|
|
375
|
-
<div class="new-session-field">
|
|
376
|
-
<label class="new-session-label" data-i18n="sessions.modal.name">Session Name</label>
|
|
377
|
-
<input id="new-session-name" type="text" class="new-session-input"
|
|
378
|
-
data-i18n-placeholder="sessions.modal.name.placeholder"
|
|
379
|
-
placeholder="Leave empty to auto-generate">
|
|
380
|
-
</div>
|
|
381
|
-
|
|
382
|
-
<div class="new-session-field">
|
|
383
|
-
<label class="new-session-label" data-i18n="sessions.modal.model">Model</label>
|
|
384
|
-
<select id="new-session-model" class="new-session-select"></select>
|
|
385
|
-
</div>
|
|
386
|
-
|
|
387
|
-
<div class="new-session-field">
|
|
388
|
-
<label class="new-session-label" data-i18n="sessions.modal.directory">Working Directory</label>
|
|
389
|
-
<div class="new-session-input-row">
|
|
390
|
-
<input id="new-session-directory" type="text" class="new-session-input"
|
|
391
|
-
data-i18n-placeholder="sessions.modal.directory.placeholder"
|
|
392
|
-
placeholder="~/workspace/my-project">
|
|
393
|
-
<button id="new-session-browse-btn" type="button" class="new-session-browse-btn"
|
|
394
|
-
data-i18n-title="sessions.modal.directory.browse" title="Browse…" aria-label="Browse">
|
|
395
|
-
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>
|
|
396
|
-
</button>
|
|
397
|
-
</div>
|
|
398
|
-
</div>
|
|
399
|
-
|
|
400
|
-
<div id="new-session-init-project-field" class="new-session-checkbox-field" style="display:none">
|
|
401
|
-
<label class="new-session-checkbox-label">
|
|
402
|
-
<input id="new-session-init-project" type="checkbox" class="new-session-checkbox">
|
|
403
|
-
<span data-i18n="sessions.modal.initProject">Initialize full-stack project (/new)</span>
|
|
404
|
-
</label>
|
|
405
|
-
</div>
|
|
406
|
-
</div>
|
|
407
|
-
</div>
|
|
408
365
|
</div><!-- /.new-session-body -->
|
|
409
366
|
|
|
367
|
+
|
|
410
368
|
<div class="new-session-composer">
|
|
411
369
|
<!-- Skill autocomplete dropdown (shown when user types /xxx) -->
|
|
412
370
|
<div id="ns-skill-autocomplete" class="skill-autocomplete" style="display:none" role="listbox" aria-label="Skills">
|
|
@@ -422,9 +380,14 @@
|
|
|
422
380
|
</div>
|
|
423
381
|
<div id="ns-skill-autocomplete-list"></div>
|
|
424
382
|
</div>
|
|
425
|
-
<!--
|
|
426
|
-
<div
|
|
427
|
-
|
|
383
|
+
<!-- Composer frame: context bar card (offset) + input bar card (full width) -->
|
|
384
|
+
<div class="ns-composer-frame">
|
|
385
|
+
<div id="ns-context-bar" class="ns-context-bar"></div>
|
|
386
|
+
<!-- Input bar card -->
|
|
387
|
+
<div class="ns-input-bar-card">
|
|
388
|
+
<!-- Attachment preview strip (hidden when empty) -->
|
|
389
|
+
<div id="ns-image-preview-strip" style="display:none"></div>
|
|
390
|
+
<div id="ns-input-bar" class="new-session-input-bar">
|
|
428
391
|
<input type="file" id="ns-file-input" accept="*/*" multiple style="display:none">
|
|
429
392
|
<button id="ns-btn-attach" type="button" class="new-session-composer-btn"
|
|
430
393
|
title="Attach file (image, pdf, docx, md, tar.gz…) — drag & drop / Ctrl+V also work">
|
|
@@ -443,8 +406,10 @@
|
|
|
443
406
|
<button id="new-session-send" class="new-session-send" type="button" title="Send message" disabled>
|
|
444
407
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="12" x2="19" y2="12"></line><polyline points="12 5 19 12 12 19"></polyline></svg>
|
|
445
408
|
</button>
|
|
446
|
-
</div
|
|
447
|
-
|
|
409
|
+
</div><!-- /.new-session-input-bar -->
|
|
410
|
+
</div><!-- /.ns-input-bar-card -->
|
|
411
|
+
</div><!-- /.ns-composer-frame -->
|
|
412
|
+
</div><!-- /.new-session-composer -->
|
|
448
413
|
</div>
|
|
449
414
|
</div>
|
|
450
415
|
|
|
@@ -704,15 +669,18 @@
|
|
|
704
669
|
<div id="extensions-panel" style="display:none">
|
|
705
670
|
<div id="extensions-body">
|
|
706
671
|
<div class="channels-page-header">
|
|
707
|
-
<
|
|
708
|
-
|
|
672
|
+
<div class="channels-page-header-main">
|
|
673
|
+
<h2 class="channels-page-title" data-i18n="extensions.title">Extensions</h2>
|
|
674
|
+
<p class="channels-page-subtitle" data-i18n="extensions.subtitle">Browse and manage extensions — add agents, skills, and panels to supercharge your workflow.</p>
|
|
675
|
+
</div>
|
|
676
|
+
<button type="button" id="extensions-new-btn" class="extension-action extension-action-install" data-i18n="extensions.newExt.btn">新建扩展</button>
|
|
709
677
|
</div>
|
|
710
678
|
|
|
711
679
|
<div class="extensions-toolbar">
|
|
712
680
|
<div class="extensions-filter-tabs">
|
|
713
|
-
<button type="button" class="extensions-filter-tab extensions-filter-tab-active" data-filter="
|
|
681
|
+
<button type="button" class="extensions-filter-tab extensions-filter-tab-active" data-filter="market" data-i18n="extensions.filter.market">Marketplace</button>
|
|
682
|
+
<button type="button" class="extensions-filter-tab" data-filter="system" data-i18n="extensions.filter.system">System</button>
|
|
714
683
|
<button type="button" class="extensions-filter-tab" data-filter="brand" id="tab-extensions-brand" data-i18n="extensions.filter.brand" style="display:none">Brand</button>
|
|
715
|
-
<button type="button" class="extensions-filter-tab" data-filter="installed" data-i18n="extensions.filter.installed">Installed</button>
|
|
716
684
|
</div>
|
|
717
685
|
<div class="extensions-toolbar-right">
|
|
718
686
|
<input type="text" id="extensions-search-input" class="extensions-search" placeholder="Search extensions…" />
|
|
@@ -721,6 +689,10 @@
|
|
|
721
689
|
<option value="newest" data-i18n="extensions.sort.newest">Newest</option>
|
|
722
690
|
<option value="updated" data-i18n="extensions.sort.updated">Recently updated</option>
|
|
723
691
|
</select>
|
|
692
|
+
<select id="extensions-installed-filter" class="extensions-sort">
|
|
693
|
+
<option value="all" data-i18n="extensions.filter.all">All</option>
|
|
694
|
+
<option value="installed" data-i18n="extensions.filter.installed">Installed</option>
|
|
695
|
+
</select>
|
|
724
696
|
</div>
|
|
725
697
|
</div>
|
|
726
698
|
|
data/lib/clacky/web/sessions.js
CHANGED
|
@@ -679,6 +679,7 @@ const Sessions = (() => {
|
|
|
679
679
|
.then(dataUrl => {
|
|
680
680
|
_pendingImages.push({ dataUrl, name: displayName, mimeType: file.type === "image/png" ? "image/png" : "image/jpeg", seq });
|
|
681
681
|
_renderAttachmentPreviews();
|
|
682
|
+
$("user-input").focus();
|
|
682
683
|
})
|
|
683
684
|
.catch(err => alert(I18n.t("chat.file.processFailed", { msg: err.message })));
|
|
684
685
|
}
|
|
@@ -5351,7 +5352,7 @@ const Sessions = (() => {
|
|
|
5351
5352
|
// ── Session Info Bar Reasoning Effort Switcher ────────────────────────────
|
|
5352
5353
|
(function() {
|
|
5353
5354
|
let _isOpen = false;
|
|
5354
|
-
const LEVELS = ["off", "low", "medium", "high", "xhigh"];
|
|
5355
|
+
const LEVELS = ["off", "low", "medium", "high", "xhigh", "max"];
|
|
5355
5356
|
|
|
5356
5357
|
document.addEventListener("click", async (e) => {
|
|
5357
5358
|
const el = e.target.closest("#sib-reasoning");
|
data/lib/clacky/web/utils.js
CHANGED
|
@@ -73,6 +73,7 @@ const Tooltip = (() => {
|
|
|
73
73
|
|
|
74
74
|
const text = anchor.getAttribute("data-tooltip");
|
|
75
75
|
if (!text) return;
|
|
76
|
+
if (anchor.hasAttribute("data-tooltip-overflow") && anchor.scrollWidth <= anchor.clientWidth) return;
|
|
76
77
|
|
|
77
78
|
const pos = anchor.getAttribute("data-tooltip-pos") || "top";
|
|
78
79
|
tip.textContent = text;
|
|
@@ -16,6 +16,36 @@
|
|
|
16
16
|
// Guard: restore hash routing only once after initial session_list arrives.
|
|
17
17
|
let _initialRestoreDone = false;
|
|
18
18
|
|
|
19
|
+
// WS event -> Clacky.ext event name. Mirrored so panels can subscribe
|
|
20
|
+
// without touching the raw WS layer (keeps extension isolation).
|
|
21
|
+
const SESSION_EXT_EVENTS = {
|
|
22
|
+
phase_start: "session:phase-start",
|
|
23
|
+
phase_end: "session:phase-end",
|
|
24
|
+
session_list: "session:list",
|
|
25
|
+
subscribed: "session:subscribed",
|
|
26
|
+
session_update: "session:update",
|
|
27
|
+
task_finished: "session:task-finished",
|
|
28
|
+
session_renamed: "session:renamed",
|
|
29
|
+
session_deleted: "session:deleted",
|
|
30
|
+
session_restored: "session:restored",
|
|
31
|
+
history_user_message: "session:user-message",
|
|
32
|
+
assistant_message: "session:assistant-message",
|
|
33
|
+
tool_call: "session:tool-call",
|
|
34
|
+
tool_result: "session:tool-result",
|
|
35
|
+
tool_stdout: "session:tool-stdout",
|
|
36
|
+
tool_error: "session:tool-error",
|
|
37
|
+
token_usage: "session:token-usage",
|
|
38
|
+
progress: "session:progress",
|
|
39
|
+
complete: "session:complete",
|
|
40
|
+
request_feedback: "session:request-feedback",
|
|
41
|
+
request_confirmation: "session:request-confirmation",
|
|
42
|
+
interrupted: "session:interrupted",
|
|
43
|
+
info: "session:info",
|
|
44
|
+
warning: "session:warning",
|
|
45
|
+
success: "session:success",
|
|
46
|
+
error: "session:error",
|
|
47
|
+
};
|
|
48
|
+
|
|
19
49
|
// ── Phase grouping (folds subagent runs like skill evolution) ───────────
|
|
20
50
|
//
|
|
21
51
|
// Strategy: when a phase_start arrives, we append a foldable card to the
|
|
@@ -137,6 +167,15 @@ WS.onEvent(ev => {
|
|
|
137
167
|
_closeAllPhases("incomplete");
|
|
138
168
|
}
|
|
139
169
|
|
|
170
|
+
// Bridge before the switch: per-case active-session guards must not block
|
|
171
|
+
// the extension bus. All received events mirror onto Clacky.ext here.
|
|
172
|
+
if (window.Clacky && Clacky.ext) {
|
|
173
|
+
const extName = SESSION_EXT_EVENTS[ev.type];
|
|
174
|
+
if (extName) {
|
|
175
|
+
Clacky.ext.emit(extName, { sessionId: ev.session_id, ...ev });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
140
179
|
switch (ev.type) {
|
|
141
180
|
|
|
142
181
|
// ── Phase grouping ─────────────────────────────────────────────────
|
|
@@ -326,9 +365,6 @@ WS.onEvent(ev => {
|
|
|
326
365
|
if (ev.session_id !== Sessions.activeId) break;
|
|
327
366
|
Sessions.clearProgress();
|
|
328
367
|
Sessions.appendMsg("assistant", ev.content);
|
|
329
|
-
if (window.Clacky && Clacky.ext) {
|
|
330
|
-
Clacky.ext.emit("session:assistant-message", { sessionId: ev.session_id, content: ev.content });
|
|
331
|
-
}
|
|
332
368
|
break;
|
|
333
369
|
|
|
334
370
|
case "tool_call":
|