openclacky 1.3.6 → 1.3.8
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 +54 -0
- data/lib/clacky/agent/hook_manager.rb +10 -1
- data/lib/clacky/agent/system_prompt_builder.rb +1 -1
- data/lib/clacky/agent.rb +17 -3
- data/lib/clacky/agent_profile.rb +124 -53
- data/lib/clacky/billing/billing_store.rb +3 -2
- data/lib/clacky/brand_config.rb +309 -6
- data/lib/clacky/cli.rb +4 -57
- data/lib/clacky/default_extensions/coding/agents/coding/avatar.png +0 -0
- data/lib/clacky/default_extensions/coding/ext.yml +19 -0
- data/lib/clacky/default_extensions/ext-studio/agents/ext-developer/avatar.png +0 -0
- data/lib/clacky/default_extensions/ext-studio/agents/ext-developer/system_prompt.md +95 -0
- data/lib/clacky/default_extensions/ext-studio/api/handler.rb +254 -0
- data/lib/clacky/default_extensions/ext-studio/ext.yml +33 -0
- data/lib/clacky/default_extensions/ext-studio/panels/studio/view.js +1288 -0
- data/lib/clacky/default_extensions/ext-studio/skills/ext-debug/SKILL.md +71 -0
- data/lib/clacky/default_extensions/ext-studio/skills/ext-publish/SKILL.md +74 -0
- data/lib/clacky/default_extensions/ext-studio/skills/ext-scaffold/SKILL.md +65 -0
- data/lib/clacky/default_extensions/general/agents/general/avatar.png +0 -0
- data/lib/clacky/default_extensions/general/ext.yml +19 -0
- data/lib/clacky/default_extensions/git/ext.yml +12 -0
- data/lib/clacky/{default_agents/_panels/git/panel.js → default_extensions/git/panels/git/view.js} +4 -5
- data/lib/clacky/default_extensions/meeting/{handler.rb → api/handler.rb} +78 -26
- data/lib/clacky/default_extensions/meeting/ext.yml +15 -0
- data/lib/clacky/default_extensions/meeting/{meeting.js → panels/meeting/view.js} +266 -90
- data/lib/clacky/default_extensions/meeting/skills/meeting-summarizer/SKILL.md +2 -1
- data/lib/clacky/default_extensions/time_machine/ext.yml +12 -0
- data/lib/clacky/{default_agents/_panels/time_machine/panel.js → default_extensions/time_machine/panels/time_machine/view.js} +58 -47
- data/lib/clacky/default_skills/channel-manager/discord_setup.rb +1 -1
- data/lib/clacky/default_skills/extend-openclacky/SKILL.md +83 -18
- data/lib/clacky/{api_extension.rb → extension/api_extension.rb} +27 -11
- data/lib/clacky/extension/api_loader.rb +136 -0
- data/lib/clacky/extension/cli_commands.rb +226 -0
- data/lib/clacky/{server/api_extension_dispatcher.rb → extension/dispatcher.rb} +22 -9
- data/lib/clacky/extension/hook_loader.rb +77 -0
- data/lib/clacky/extension/loader.rb +489 -0
- data/lib/clacky/extension/packager.rb +226 -0
- data/lib/clacky/{patch_loader.rb → extension/patch_loader.rb} +45 -0
- data/lib/clacky/extension/scaffold/template_renderer.rb +64 -0
- data/lib/clacky/extension/scaffold/templates/full/README.md.erb +48 -0
- data/lib/clacky/extension/scaffold/templates/full/agents/designer.md +5 -0
- data/lib/clacky/extension/scaffold/templates/full/api/handler.rb.erb +16 -0
- data/lib/clacky/extension/scaffold/templates/full/channels/noop.rb.erb +40 -0
- data/lib/clacky/extension/scaffold/templates/full/ext.yml.erb +41 -0
- data/lib/clacky/extension/scaffold/templates/full/hooks/audit.rb +9 -0
- data/lib/clacky/extension/scaffold/templates/full/panels/dashboard/view.js.erb +194 -0
- data/lib/clacky/extension/scaffold/templates/full/patches/audit.rb +15 -0
- data/lib/clacky/extension/scaffold/templates/full/skills/__slug__-skill/SKILL.md.erb +8 -0
- data/lib/clacky/extension/scaffold/templates/hello/api/handler.rb.erb +9 -0
- data/lib/clacky/extension/scaffold/templates/hello/ext.yml.erb +12 -0
- data/lib/clacky/extension/scaffold/templates/hello/panels/hello/view.js.erb +31 -0
- data/lib/clacky/extension/scaffold.rb +55 -0
- data/lib/clacky/extension/verifier.rb +196 -0
- data/lib/clacky/identity.rb +70 -0
- data/lib/clacky/locales/en.rb +19 -1
- data/lib/clacky/locales/zh.rb +19 -1
- data/lib/clacky/platform_http_client.rb +18 -15
- data/lib/clacky/server/channel/extension_adapter_loader.rb +32 -0
- data/lib/clacky/server/channel.rb +6 -0
- data/lib/clacky/server/http_server.rb +439 -146
- data/lib/clacky/server/session_registry.rb +9 -2
- data/lib/clacky/shell_hook_loader.rb +266 -22
- data/lib/clacky/skill_loader.rb +28 -1
- data/lib/clacky/ui2/components/welcome_banner.rb +1 -1
- data/lib/clacky/ui2/ui_controller.rb +9 -6
- data/lib/clacky/utils/workspace_rules.rb +2 -2
- data/lib/clacky/version.rb +1 -1
- data/lib/clacky/web/app.css +1034 -675
- data/lib/clacky/web/app.js +63 -15
- data/lib/clacky/web/auth.js +2 -0
- data/lib/clacky/web/components/notify.js +2 -0
- data/lib/clacky/web/components/sidebar.js +1 -5
- data/lib/clacky/web/core/ext.js +432 -89
- data/lib/clacky/web/features/backup/store.js +1 -0
- data/lib/clacky/web/features/backup/view.js +0 -1
- data/lib/clacky/web/features/brand/view.js +13 -5
- data/lib/clacky/web/features/extensions/store.js +184 -0
- data/lib/clacky/web/features/extensions/view.js +390 -0
- data/lib/clacky/web/features/new-session/store.js +199 -0
- data/lib/clacky/web/features/new-session/view.js +619 -0
- data/lib/clacky/web/features/share/view.js +63 -14
- data/lib/clacky/web/features/skills/store.js +3 -1
- data/lib/clacky/web/features/skills/view.js +1 -1
- data/lib/clacky/web/features/tasks/view.js +12 -0
- data/lib/clacky/web/features/trash/store.js +24 -6
- data/lib/clacky/web/features/trash/view.js +48 -12
- data/lib/clacky/web/features/workspace/store.js +2 -0
- data/lib/clacky/web/features/workspace/view.js +0 -1
- data/lib/clacky/web/i18n.js +152 -106
- data/lib/clacky/web/index.html +172 -190
- data/lib/clacky/web/sessions.js +67 -272
- data/lib/clacky/web/settings.js +1 -1
- data/lib/clacky/web/skills.js +88 -48
- data/lib/clacky/web/theme.js +5 -0
- data/lib/clacky/web/ws-dispatcher.js +12 -2
- data/lib/clacky/web/ws.js +2 -0
- data/lib/clacky.rb +21 -10
- metadata +52 -21
- data/benchmark/runner.rb +0 -441
- data/lib/clacky/api_extension_loader.rb +0 -168
- data/lib/clacky/default_agents/SOUL.md +0 -3
- data/lib/clacky/default_agents/USER.md +0 -1
- data/lib/clacky/default_agents/coding/profile.yml +0 -5
- data/lib/clacky/default_agents/coding/webui/.gitkeep +0 -0
- data/lib/clacky/default_agents/general/profile.yml +0 -2
- data/lib/clacky/default_extensions/meeting/meta.yml +0 -3
- data/lib/clacky/web/features/creator/store.js +0 -81
- data/lib/clacky/web/features/creator/view.js +0 -380
- /data/lib/clacky/{default_agents → default_extensions/coding/agents}/coding/system_prompt.md +0 -0
- /data/lib/clacky/{default_agents → default_extensions/general/agents}/general/system_prompt.md +0 -0
- /data/lib/clacky/{default_agents/base_prompt.md → prompts/base.md} +0 -0
data/lib/clacky/web/i18n.js
CHANGED
|
@@ -20,28 +20,20 @@ const I18n = (() => {
|
|
|
20
20
|
"sidebar.skills": "Skill Management",
|
|
21
21
|
"sidebar.channels": "Channel Management",
|
|
22
22
|
"sidebar.mcp": "MCP Servers",
|
|
23
|
+
"sidebar.extensions": "Extension Market",
|
|
23
24
|
"sidebar.trash": "File Recall",
|
|
24
25
|
"sidebar.profile": "Assistant Memory",
|
|
25
26
|
"sidebar.memories": "Memories",
|
|
26
27
|
"sidebar.dataSection": "My Data",
|
|
27
|
-
"sidebar.creator": "Creator Hub",
|
|
28
|
-
"sidebar.creatorSection": "Creator",
|
|
29
28
|
"sidebar.settings": "Settings",
|
|
30
29
|
"sidebar.billing": "Usage",
|
|
31
30
|
|
|
32
31
|
// ── Welcome screen ──
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"welcome.chip.code.prompt": "Help me write some code. ",
|
|
39
|
-
"welcome.chip.task.title": "Automate a task",
|
|
40
|
-
"welcome.chip.task.desc": "schedule, run, repeat",
|
|
41
|
-
"welcome.chip.task.prompt": "I want to automate a recurring task. ",
|
|
42
|
-
"welcome.chip.research.title": "Research",
|
|
43
|
-
"welcome.chip.research.desc": "search, read, summarize",
|
|
44
|
-
"welcome.chip.research.prompt":"Research this for me: ",
|
|
32
|
+
"sessions.new.title": "Start a new session",
|
|
33
|
+
"sessions.new.subtitle": "Pick who you want to chat with, then type your first message.",
|
|
34
|
+
"sessions.new.placeholder": "Type your first message to {{agent}}…",
|
|
35
|
+
"sessions.new.moreOptions": "More options",
|
|
36
|
+
"sessions.new.send": "Send",
|
|
45
37
|
|
|
46
38
|
// ── Chat panel ──
|
|
47
39
|
"chat.status.idle": "idle",
|
|
@@ -58,6 +50,11 @@ const I18n = (() => {
|
|
|
58
50
|
"chat.history_load_failed": "Could not load history",
|
|
59
51
|
"chat.history_start": "No more history",
|
|
60
52
|
"chat.image_expired": "Expired",
|
|
53
|
+
"chat.file.tooLarge": "File too large: {{name}} (max {{max}})",
|
|
54
|
+
"chat.file.imageTooLarge": "Image too large: {{name}} (max {{max}})",
|
|
55
|
+
"chat.file.unsupportedType": "Unsupported image type: {{type}}\nSupported: PNG, JPEG, GIF, WEBP",
|
|
56
|
+
"chat.file.processFailed": "Image processing failed: {{msg}}",
|
|
57
|
+
"chat.file.uploadFailed": "Upload failed: {{msg}}",
|
|
61
58
|
"chat.done": "Done — {{n}} iteration(s), {{cost}}",
|
|
62
59
|
"chat.done.duration": " · {{duration}}s",
|
|
63
60
|
"chat.done.cache": "Cache hit {{rate}}% ({{hits}}/{{total}}) · {{tokens}} tokens reused",
|
|
@@ -139,6 +136,23 @@ const I18n = (() => {
|
|
|
139
136
|
"workspace.revealInFinder": "Reveal in Finder",
|
|
140
137
|
"workspace.revealFailed": "Failed to reveal file",
|
|
141
138
|
"changes.tab": "Git",
|
|
139
|
+
"changes.loading": "Loading changes…",
|
|
140
|
+
"changes.error": "Failed to load changes",
|
|
141
|
+
"changes.noRepo": "This project has no version control enabled.",
|
|
142
|
+
"changes.cleanTitle": "No changes",
|
|
143
|
+
"changes.changedPre": "AI changed ",
|
|
144
|
+
"changes.filesUnit": "file(s)",
|
|
145
|
+
"changes.sub": "Managed by Git · since last snapshot",
|
|
146
|
+
"changes.branchPre": "Current branch: ",
|
|
147
|
+
"changes.clean": "Working tree is clean — no unsaved changes.",
|
|
148
|
+
"changes.tag.add": "Added",
|
|
149
|
+
"changes.tag.mod": "Modified",
|
|
150
|
+
"changes.tag.del": "Deleted",
|
|
151
|
+
"changes.save.prefix": "Manual snapshot",
|
|
152
|
+
"changes.save.btn": "Save snapshot",
|
|
153
|
+
"changes.save.saving": "Saving…",
|
|
154
|
+
"changes.save.done": "Saved — restore it from History",
|
|
155
|
+
"changes.save.failed": "Save failed",
|
|
142
156
|
"tm.tab": "History",
|
|
143
157
|
"sib.model.tooltip": "Click to switch model",
|
|
144
158
|
"sib.model.tooltip.busy": "Model switching is disabled while the agent is responding",
|
|
@@ -153,6 +167,7 @@ const I18n = (() => {
|
|
|
153
167
|
"sib.reasoning.low": "Low",
|
|
154
168
|
"sib.reasoning.medium": "Medium",
|
|
155
169
|
"sib.reasoning.high": "High",
|
|
170
|
+
"sib.reasoning.xhigh": "XHigh",
|
|
156
171
|
"sessions.thinking": "Thinking…",
|
|
157
172
|
"sessions.default_name": "Session {{n}}",
|
|
158
173
|
"sessions.cronGroup": "Scheduled Tasks",
|
|
@@ -168,7 +183,6 @@ const I18n = (() => {
|
|
|
168
183
|
"sessions.actions.fork": "Fork",
|
|
169
184
|
"sessions.actions.rename": "Rename",
|
|
170
185
|
"sessions.actions.delete": "Delete",
|
|
171
|
-
"sessions.newSessionAdvanced": "More Options",
|
|
172
186
|
"sessions.loadMore": "Load more sessions",
|
|
173
187
|
"sessions.loadingMore": "Loading…",
|
|
174
188
|
"sessions.search.placeholder": "Search sessions…",
|
|
@@ -194,7 +208,6 @@ const I18n = (() => {
|
|
|
194
208
|
"auth.rateLimited": "Too many failed attempts. Please try again in {{seconds}} seconds.",
|
|
195
209
|
|
|
196
210
|
// ── New Session Modal ──
|
|
197
|
-
"sessions.modal.title": "Create New Session",
|
|
198
211
|
"sessions.modal.agent": "Agent",
|
|
199
212
|
"sessions.modal.agent.general": "General",
|
|
200
213
|
"sessions.modal.agent.coding": "Coding",
|
|
@@ -206,7 +219,6 @@ const I18n = (() => {
|
|
|
206
219
|
"sessions.modal.directory.browse": "Browse folders",
|
|
207
220
|
"sessions.modal.dirpicker.title": "Select Working Directory",
|
|
208
221
|
"sessions.modal.initProject": "Initialize full-stack project (/new)",
|
|
209
|
-
"sessions.modal.create": "Create Session",
|
|
210
222
|
|
|
211
223
|
// ── Offline banner ──
|
|
212
224
|
"offline.banner": "Server disconnected — reconnecting…",
|
|
@@ -264,48 +276,17 @@ const I18n = (() => {
|
|
|
264
276
|
"skills.title": "Skills",
|
|
265
277
|
"skills.subtitle": "Extend your assistant's capabilities with custom skills",
|
|
266
278
|
|
|
267
|
-
// ── Creator panel ──
|
|
268
|
-
"creator.title": "Creator Hub",
|
|
269
|
-
"creator.subtitle": "Manage and publish your skills to the platform",
|
|
270
|
-
"creator.loading": "Loading…",
|
|
271
|
-
|
|
272
|
-
"creator.section.cloud": "Cloud Skills",
|
|
273
|
-
"creator.section.cloudHint": "Published to the platform",
|
|
274
|
-
"creator.section.local": "Local Skills",
|
|
275
|
-
"creator.section.localHint": "Ready to publish",
|
|
276
|
-
"creator.section.new": "Create New Skill",
|
|
277
|
-
|
|
278
|
-
"creator.cloud.empty": "No skills published yet.",
|
|
279
|
-
"creator.local.empty": "All local skills are already published.",
|
|
280
|
-
|
|
281
|
-
"creator.badge.published": "Published",
|
|
282
|
-
"creator.badge.unpublished": "Not published",
|
|
283
|
-
|
|
284
|
-
"creator.changed": "Has local changes",
|
|
285
|
-
"creator.hasLocalChanges": "Local SKILL.md is newer than the last upload",
|
|
286
|
-
"creator.downloads": "Downloads",
|
|
287
|
-
|
|
288
|
-
"creator.btn.publish": "Publish",
|
|
289
|
-
"creator.btn.update": "Update",
|
|
290
|
-
"creator.btn.upToDate": "Up to date",
|
|
291
|
-
"creator.btn.iterate": "Iterate",
|
|
292
|
-
"creator.iterate.prompt": "Update skill:",
|
|
293
|
-
|
|
294
|
-
"creator.shadow.label": "Local override",
|
|
295
|
-
"creator.shadow.tooltip": "Local copy shadows a same-named brand skill",
|
|
296
|
-
|
|
297
|
-
"creator.newSkill.label": "Create a new skill with /skill-creator",
|
|
298
|
-
"creator.promo.text": "Publish your skills & build your own brand on OpenClacky.",
|
|
299
|
-
"creator.promo.link": "Learn more →",
|
|
300
|
-
"creator.cloud.locked": "Brand license required to publish cloud skills.",
|
|
301
|
-
|
|
302
279
|
// ── Creator trash ──
|
|
303
280
|
"trash.title": "File Recall",
|
|
304
281
|
"trash.subtitle": "Files the agent moved to trash across all projects. Recall them back to where they were, or clear the ones you don't need.",
|
|
305
282
|
"trash.refresh": "Refresh",
|
|
283
|
+
"trash.refresh.tooltip": "Reload the trash list",
|
|
306
284
|
"trash.emptyOld": "Empty >7 days",
|
|
285
|
+
"trash.emptyOld.tooltip": "Permanently delete files older than 7 days",
|
|
307
286
|
"trash.emptyOrphans":"Clean orphans",
|
|
287
|
+
"trash.emptyOrphans.tooltip": "Permanently delete entries whose original project no longer exists",
|
|
308
288
|
"trash.emptyAll": "Empty all",
|
|
289
|
+
"trash.emptyAll.tooltip": "Permanently delete all trashed files",
|
|
309
290
|
"trash.empty": "Nothing in the trash.",
|
|
310
291
|
"trash.loading": "Loading trash…",
|
|
311
292
|
"trash.summary": "{{count}} file(s), {{size}}",
|
|
@@ -345,6 +326,12 @@ const I18n = (() => {
|
|
|
345
326
|
"trash.deleteFail": "Delete failed: {{msg}}",
|
|
346
327
|
"trash.cleanFail": "Operation failed: {{msg}}",
|
|
347
328
|
|
|
329
|
+
// ── Session type filter ──
|
|
330
|
+
"trash.filterAll": "All",
|
|
331
|
+
"trash.filterCron": "Scheduled",
|
|
332
|
+
"trash.filterManual": "Regular",
|
|
333
|
+
"trash.sessionAutoCleanHint": "The system keeps the most recent 200 sessions; older ones are moved here.",
|
|
334
|
+
|
|
348
335
|
// ── Relative time (used by _humanTime helper) ──
|
|
349
336
|
"time.justNow": "just now",
|
|
350
337
|
"time.minsAgo": "{{n}}m ago",
|
|
@@ -520,6 +507,37 @@ const I18n = (() => {
|
|
|
520
507
|
// ── MCP panel ──
|
|
521
508
|
"mcp.title": "MCP Servers",
|
|
522
509
|
"mcp.subtitle": "Standard Model Context Protocol servers (Claude Desktop / Cursor compatible). Edit ~/.clacky/mcp.json to add or remove servers.",
|
|
510
|
+
"extensions.title": "Extension Market",
|
|
511
|
+
"extensions.subtitle": "Browse and manage your extensions to enhance OpenClacky with agents, skills, and panels.",
|
|
512
|
+
"extensions.searchPlaceholder": "Search extensions…",
|
|
513
|
+
"extensions.sort.newest": "Newest",
|
|
514
|
+
"extensions.sort.updated": "Recently updated",
|
|
515
|
+
"extensions.sort.downloads": "Most downloaded",
|
|
516
|
+
"extensions.empty": "No extensions available yet.",
|
|
517
|
+
"extensions.noResults": "No extensions match your search.",
|
|
518
|
+
"extensions.loadFailed": "Could not reach the extension store.",
|
|
519
|
+
"extensions.homepage": "Homepage",
|
|
520
|
+
"extensions.installed": "Installed",
|
|
521
|
+
"extensions.unit.skill": "skill",
|
|
522
|
+
"extensions.unit.skills": "skills",
|
|
523
|
+
"extensions.unit.agent": "agent",
|
|
524
|
+
"extensions.unit.agents": "agents",
|
|
525
|
+
"extensions.unit.panel": "panel",
|
|
526
|
+
"extensions.unit.panels": "panels",
|
|
527
|
+
"extensions.unit.api": "API",
|
|
528
|
+
"extensions.unit.apis": "APIs",
|
|
529
|
+
"extensions.detail.back": "Back",
|
|
530
|
+
"extensions.detail.contributes": "What's inside",
|
|
531
|
+
"extensions.detail.versions": "Version history",
|
|
532
|
+
"extensions.section.agents": "Agents",
|
|
533
|
+
"extensions.section.skills": "Skills",
|
|
534
|
+
"extensions.section.panels": "Panels",
|
|
535
|
+
"extensions.section.api": "APIs",
|
|
536
|
+
"extensions.disabled": "Disabled",
|
|
537
|
+
"extensions.action.disable": "Disable",
|
|
538
|
+
"extensions.action.enable": "Enable",
|
|
539
|
+
"extensions.action.remove": "Remove",
|
|
540
|
+
"extensions.action.removeConfirm": "Remove this extension? Its files will be deleted. You can reinstall it from your license package later.",
|
|
523
541
|
"mcp.loading": "Loading…",
|
|
524
542
|
"mcp.empty.title": "No MCP servers configured",
|
|
525
543
|
"mcp.empty.body": "Create ~/.clacky/mcp.json to plug in MCP servers. The format matches Claude Desktop and Cursor, so existing configs work as-is.",
|
|
@@ -800,6 +818,7 @@ const I18n = (() => {
|
|
|
800
818
|
"brand.activate.subtitle": "Enter your serial number to get started.",
|
|
801
819
|
"brand.activate.success": "License activated successfully!",
|
|
802
820
|
"brand.skip.warning": "Brand license not activated — brand-exclusive skills are unavailable. You can activate your license anytime in Settings → Brand & License.",
|
|
821
|
+
"brand.warning.renewBtn": "Renew License",
|
|
803
822
|
|
|
804
823
|
// ── Brand activation banner ──
|
|
805
824
|
"brand.banner.prompt": "{{name}} is not activated yet — some features are unavailable.",
|
|
@@ -811,11 +830,14 @@ const I18n = (() => {
|
|
|
811
830
|
"brand.banner.freePromptOnlyPaid": "Welcome to {{name}} — {{paid}} premium skill{{paidPlural}} can be unlocked with a serial number.",
|
|
812
831
|
"brand.banner.freePromptBoth": "Welcome to {{name}} — {{free}} free skill{{freePlural}} ready to use, plus {{paid}} premium skill{{paidPlural}} unlockable with a serial number.",
|
|
813
832
|
|
|
814
|
-
"header.owner.tooltip": "Creator — click to open
|
|
833
|
+
"header.owner.tooltip": "Creator — click to open Extension & Creation",
|
|
815
834
|
"header.cmdbar.placeholder": "Search sessions…",
|
|
816
835
|
"notify.tooltip.on": "Sound on task complete: ON (click to mute)",
|
|
817
836
|
"notify.tooltip.off": "Sound on task complete: OFF (click to enable)",
|
|
818
837
|
|
|
838
|
+
"header.refresh": "Refresh",
|
|
839
|
+
"header.theme.toDark": "Switch to dark mode",
|
|
840
|
+
"header.theme.toLight": "Switch to light mode",
|
|
819
841
|
"share.tooltip": "Share",
|
|
820
842
|
"share.copy.1": "Been running {{brand}} with domestic models (Kimi, DeepSeek, GLM…) — first-class support, no proxy hacks. Solid.",
|
|
821
843
|
"share.copy.2": "{{brand}} is stingy with tokens in the best way — prompt caching keeps my AI bill tiny. Recommend.",
|
|
@@ -958,28 +980,20 @@ const I18n = (() => {
|
|
|
958
980
|
"sidebar.skills": "技能管理",
|
|
959
981
|
"sidebar.channels": "频道管理",
|
|
960
982
|
"sidebar.mcp": "MCP 工具",
|
|
983
|
+
"sidebar.extensions": "扩展市场",
|
|
961
984
|
"sidebar.trash": "文件召回",
|
|
962
985
|
"sidebar.profile": "助理记忆",
|
|
963
986
|
"sidebar.memories": "记忆",
|
|
964
987
|
"sidebar.dataSection": "我的数据",
|
|
965
|
-
"sidebar.creator": "创作者中心",
|
|
966
|
-
"sidebar.creatorSection": "创作者",
|
|
967
988
|
"sidebar.settings": "设置",
|
|
968
989
|
"sidebar.billing": "用量信息",
|
|
969
990
|
|
|
970
991
|
// ── Welcome screen ──
|
|
971
|
-
"
|
|
972
|
-
"
|
|
973
|
-
"
|
|
974
|
-
"
|
|
975
|
-
"
|
|
976
|
-
"welcome.chip.code.prompt": "帮我写一段代码:",
|
|
977
|
-
"welcome.chip.task.title": "自动化任务",
|
|
978
|
-
"welcome.chip.task.desc": "定时、执行、重复",
|
|
979
|
-
"welcome.chip.task.prompt": "我想把一个重复性任务自动化:",
|
|
980
|
-
"welcome.chip.research.title": "做调研",
|
|
981
|
-
"welcome.chip.research.desc": "搜索、阅读、汇总",
|
|
982
|
-
"welcome.chip.research.prompt":"帮我调研一下:",
|
|
992
|
+
"sessions.new.title": "开始新会话",
|
|
993
|
+
"sessions.new.subtitle": "选一个 Agent,然后输入第一条消息。",
|
|
994
|
+
"sessions.new.placeholder": "输入第一条消息发给 {{agent}}…",
|
|
995
|
+
"sessions.new.moreOptions": "更多选项",
|
|
996
|
+
"sessions.new.send": "发送",
|
|
983
997
|
|
|
984
998
|
// ── Chat panel ──
|
|
985
999
|
"chat.status.idle": "空闲",
|
|
@@ -996,6 +1010,11 @@ const I18n = (() => {
|
|
|
996
1010
|
"chat.history_load_failed": "历史记录加载失败",
|
|
997
1011
|
"chat.history_start": "没有更多历史了",
|
|
998
1012
|
"chat.image_expired": "已过期",
|
|
1013
|
+
"chat.file.tooLarge": "文件过大:{{name}}(最大 {{max}})",
|
|
1014
|
+
"chat.file.imageTooLarge": "图片过大:{{name}}(最大 {{max}})",
|
|
1015
|
+
"chat.file.unsupportedType": "不支持的图片格式:{{type}}\n支持:PNG、JPEG、GIF、WEBP",
|
|
1016
|
+
"chat.file.processFailed": "图片处理失败:{{msg}}",
|
|
1017
|
+
"chat.file.uploadFailed": "上传失败:{{msg}}",
|
|
999
1018
|
"chat.done": "完成 — {{n}} 步,{{cost}}",
|
|
1000
1019
|
"chat.done.duration": " · {{duration}}s",
|
|
1001
1020
|
"chat.done.cache": "缓存命中 {{rate}}% ({{hits}}/{{total}}) · 复用 {{tokens}} tokens",
|
|
@@ -1075,6 +1094,23 @@ const I18n = (() => {
|
|
|
1075
1094
|
"workspace.revealInFinder": "打开所在文件夹",
|
|
1076
1095
|
"workspace.revealFailed": "无法打开文件位置",
|
|
1077
1096
|
"changes.tab": "Git 管理",
|
|
1097
|
+
"changes.loading": "正在读取改动…",
|
|
1098
|
+
"changes.error": "读取改动失败",
|
|
1099
|
+
"changes.noRepo": "这个项目还没有启用版本管理。",
|
|
1100
|
+
"changes.cleanTitle": "暂无改动",
|
|
1101
|
+
"changes.changedPre": "AI 改了 ",
|
|
1102
|
+
"changes.filesUnit": "个文件",
|
|
1103
|
+
"changes.sub": "由 Git 管理 · 自上次存档以来",
|
|
1104
|
+
"changes.branchPre": "当前分支:",
|
|
1105
|
+
"changes.clean": "工作区是干净的,没有未存档的改动。",
|
|
1106
|
+
"changes.tag.add": "新增",
|
|
1107
|
+
"changes.tag.mod": "修改",
|
|
1108
|
+
"changes.tag.del": "删除",
|
|
1109
|
+
"changes.save.prefix": "手动存档",
|
|
1110
|
+
"changes.save.btn": "存档当前版本",
|
|
1111
|
+
"changes.save.saving": "正在存档…",
|
|
1112
|
+
"changes.save.done": "已存档,可在「时光机」里回到这个版本",
|
|
1113
|
+
"changes.save.failed": "存档失败",
|
|
1078
1114
|
"tm.tab": "时光机",
|
|
1079
1115
|
"sib.model.tooltip": "点击切换模型",
|
|
1080
1116
|
"sib.model.tooltip.busy": "Agent 回复中,暂时无法切换模型",
|
|
@@ -1089,6 +1125,7 @@ const I18n = (() => {
|
|
|
1089
1125
|
"sib.reasoning.low": "低",
|
|
1090
1126
|
"sib.reasoning.medium": "中",
|
|
1091
1127
|
"sib.reasoning.high": "高",
|
|
1128
|
+
"sib.reasoning.xhigh": "超高",
|
|
1092
1129
|
"sessions.thinking": "思考中…",
|
|
1093
1130
|
"sessions.default_name": "会话 {{n}}",
|
|
1094
1131
|
"sessions.cronGroup": "定时任务",
|
|
@@ -1099,7 +1136,6 @@ const I18n = (() => {
|
|
|
1099
1136
|
"sessions.badge.coding": "Coding",
|
|
1100
1137
|
"sessions.badge.setup": "配置",
|
|
1101
1138
|
"sessions.newSession": "+ 新会话",
|
|
1102
|
-
"sessions.newSessionAdvanced": "更多选项",
|
|
1103
1139
|
"sessions.loadMore": "加载更多会话",
|
|
1104
1140
|
"sessions.actions.pin": "置顶",
|
|
1105
1141
|
"sessions.actions.unpin": "取消置顶",
|
|
@@ -1128,7 +1164,6 @@ const I18n = (() => {
|
|
|
1128
1164
|
"auth.rateLimited": "尝试次数过多,请 {{seconds}} 秒后再试。",
|
|
1129
1165
|
|
|
1130
1166
|
// ── New Session Modal ──
|
|
1131
|
-
"sessions.modal.title": "创建新会话",
|
|
1132
1167
|
"sessions.modal.agent": "助手类型",
|
|
1133
1168
|
"sessions.modal.agent.general": "通用",
|
|
1134
1169
|
"sessions.modal.agent.coding": "编程",
|
|
@@ -1140,7 +1175,6 @@ const I18n = (() => {
|
|
|
1140
1175
|
"sessions.modal.directory.browse": "选择文件夹",
|
|
1141
1176
|
"sessions.modal.dirpicker.title": "选择工作目录",
|
|
1142
1177
|
"sessions.modal.initProject": "初始化全栈项目 (/new)",
|
|
1143
|
-
"sessions.modal.create": "创建会话",
|
|
1144
1178
|
|
|
1145
1179
|
// ── Offline banner ──
|
|
1146
1180
|
"offline.banner": "服务已断开,正在重连…",
|
|
@@ -1198,48 +1232,17 @@ const I18n = (() => {
|
|
|
1198
1232
|
"skills.title": "技能",
|
|
1199
1233
|
"skills.subtitle": "为助手添加自定义能力",
|
|
1200
1234
|
|
|
1201
|
-
// ── Creator panel ──
|
|
1202
|
-
"creator.title": "创作者中心",
|
|
1203
|
-
"creator.subtitle": "管理并发布你的技能到平台",
|
|
1204
|
-
"creator.loading": "加载中…",
|
|
1205
|
-
|
|
1206
|
-
"creator.section.cloud": "云端技能",
|
|
1207
|
-
"creator.section.cloudHint": "已发布到平台",
|
|
1208
|
-
"creator.section.local": "本地技能",
|
|
1209
|
-
"creator.section.localHint": "准备好可以上传",
|
|
1210
|
-
"creator.section.new": "创建新技能",
|
|
1211
|
-
|
|
1212
|
-
"creator.cloud.empty": "还没有发布任何技能。",
|
|
1213
|
-
"creator.local.empty": "所有本地技能均已发布。",
|
|
1214
|
-
|
|
1215
|
-
"creator.badge.published": "已发布",
|
|
1216
|
-
"creator.badge.unpublished": "未发布",
|
|
1217
|
-
|
|
1218
|
-
"creator.changed": "有本地改动",
|
|
1219
|
-
"creator.hasLocalChanges": "本地 SKILL.md 比上次上传更新",
|
|
1220
|
-
"creator.downloads": "下载量",
|
|
1221
|
-
|
|
1222
|
-
"creator.btn.publish": "发布",
|
|
1223
|
-
"creator.btn.update": "更新",
|
|
1224
|
-
"creator.btn.upToDate": "已是最新",
|
|
1225
|
-
"creator.btn.iterate": "迭代",
|
|
1226
|
-
"creator.iterate.prompt": "更新技能:",
|
|
1227
|
-
|
|
1228
|
-
"creator.shadow.label": "本地优先",
|
|
1229
|
-
"creator.shadow.tooltip": "本地版本覆盖了同名的品牌加密技能",
|
|
1230
|
-
|
|
1231
|
-
"creator.newSkill.label": "用 /skill-creator 创建新技能",
|
|
1232
|
-
"creator.promo.text": "发布你的 Skill,在 OpenClacky 上打造自己的品牌。",
|
|
1233
|
-
"creator.promo.link": "了解更多 →",
|
|
1234
|
-
"creator.cloud.locked": "需要品牌授权才能发布云端 Skill。",
|
|
1235
|
-
|
|
1236
1235
|
// ── Creator trash ──
|
|
1237
1236
|
"trash.title": "文件召回",
|
|
1238
1237
|
"trash.subtitle": "AI 代理在各个项目里丢进回收站的文件。可以把它们召回到原位置,或彻底清理不再需要的。",
|
|
1239
1238
|
"trash.refresh": "刷新",
|
|
1239
|
+
"trash.refresh.tooltip": "重新加载回收站列表",
|
|
1240
1240
|
"trash.emptyOld": "清理 >7 天",
|
|
1241
|
+
"trash.emptyOld.tooltip": "永久删除 7 天前的文件",
|
|
1241
1242
|
"trash.emptyOrphans":"清理孤儿",
|
|
1243
|
+
"trash.emptyOrphans.tooltip": "永久删除原始项目目录已不存在的条目",
|
|
1242
1244
|
"trash.emptyAll": "全部清空",
|
|
1245
|
+
"trash.emptyAll.tooltip": "永久删除所有回收站文件",
|
|
1243
1246
|
"trash.empty": "回收站空空如也。",
|
|
1244
1247
|
"trash.loading": "加载回收站…",
|
|
1245
1248
|
"trash.summary": "共 {{count}} 个文件,{{size}}",
|
|
@@ -1281,6 +1284,12 @@ const I18n = (() => {
|
|
|
1281
1284
|
"trash.deleteFail": "删除失败:{{msg}}",
|
|
1282
1285
|
"trash.cleanFail": "操作失败:{{msg}}",
|
|
1283
1286
|
|
|
1287
|
+
// ── Session type filter ──
|
|
1288
|
+
"trash.filterAll": "全部",
|
|
1289
|
+
"trash.filterCron": "定时任务",
|
|
1290
|
+
"trash.filterManual": "普通会话",
|
|
1291
|
+
"trash.sessionAutoCleanHint": "系统自动保留最近 200 个会话,超出后自动移入此处。",
|
|
1292
|
+
|
|
1284
1293
|
// ── Relative time (used by _humanTime helper) ──
|
|
1285
1294
|
"time.justNow": "刚刚",
|
|
1286
1295
|
"time.minsAgo": "{{n}} 分钟前",
|
|
@@ -1455,6 +1464,37 @@ const I18n = (() => {
|
|
|
1455
1464
|
// ── MCP panel ──
|
|
1456
1465
|
"mcp.title": "MCP 工具",
|
|
1457
1466
|
"mcp.subtitle": "标准 Model Context Protocol 服务(与 Claude Desktop / Cursor 兼容)。编辑 ~/.clacky/mcp.json 添加或移除服务。",
|
|
1467
|
+
"extensions.title": "扩展市场",
|
|
1468
|
+
"extensions.subtitle": "浏览并管理你的扩展,用 Agent、技能与面板增强 OpenClacky。",
|
|
1469
|
+
"extensions.searchPlaceholder": "搜索扩展…",
|
|
1470
|
+
"extensions.sort.newest": "最新",
|
|
1471
|
+
"extensions.sort.updated": "最近更新",
|
|
1472
|
+
"extensions.sort.downloads": "下载最多",
|
|
1473
|
+
"extensions.empty": "暂无可用扩展。",
|
|
1474
|
+
"extensions.noResults": "没有匹配的扩展。",
|
|
1475
|
+
"extensions.loadFailed": "无法连接扩展市场。",
|
|
1476
|
+
"extensions.homepage": "主页",
|
|
1477
|
+
"extensions.installed": "已安装",
|
|
1478
|
+
"extensions.unit.skill": "个技能",
|
|
1479
|
+
"extensions.unit.skills": "个技能",
|
|
1480
|
+
"extensions.unit.agent": "个 Agent",
|
|
1481
|
+
"extensions.unit.agents": "个 Agent",
|
|
1482
|
+
"extensions.unit.panel": "个面板",
|
|
1483
|
+
"extensions.unit.panels": "个面板",
|
|
1484
|
+
"extensions.unit.api": "个 API",
|
|
1485
|
+
"extensions.unit.apis": "个 API",
|
|
1486
|
+
"extensions.detail.back": "返回",
|
|
1487
|
+
"extensions.detail.contributes": "包含内容",
|
|
1488
|
+
"extensions.detail.versions": "版本历史",
|
|
1489
|
+
"extensions.section.agents": "Agent",
|
|
1490
|
+
"extensions.section.skills": "技能",
|
|
1491
|
+
"extensions.section.panels": "面板",
|
|
1492
|
+
"extensions.section.api": "API",
|
|
1493
|
+
"extensions.disabled": "已禁用",
|
|
1494
|
+
"extensions.action.disable": "禁用",
|
|
1495
|
+
"extensions.action.enable": "启用",
|
|
1496
|
+
"extensions.action.remove": "移除",
|
|
1497
|
+
"extensions.action.removeConfirm": "确定移除此扩展?相关文件会被删除,之后可从授权包重新安装。",
|
|
1458
1498
|
"mcp.loading": "加载中…",
|
|
1459
1499
|
"mcp.empty.title": "尚未配置 MCP 服务",
|
|
1460
1500
|
"mcp.empty.body": "新建 ~/.clacky/mcp.json 即可接入 MCP 服务。格式与 Claude Desktop、Cursor 一致,现有配置可直接复用。",
|
|
@@ -1742,6 +1782,7 @@ const I18n = (() => {
|
|
|
1742
1782
|
"brand.activate.subtitle": "输入序列号以开始使用。",
|
|
1743
1783
|
"brand.activate.success": "授权激活成功!",
|
|
1744
1784
|
"brand.skip.warning": "品牌授权未激活 — 品牌专属技能暂不可用。可随时在「设置 → 品牌 & 授权」中激活。",
|
|
1785
|
+
"brand.warning.renewBtn": "续期授权",
|
|
1745
1786
|
|
|
1746
1787
|
// ── Brand activation banner ──
|
|
1747
1788
|
"brand.banner.prompt": "{{name}} 尚未激活授权 — 部分功能暂不可用。",
|
|
@@ -1753,11 +1794,14 @@ const I18n = (() => {
|
|
|
1753
1794
|
"brand.banner.freePromptOnlyPaid": "欢迎使用 {{name}} — 还有 {{paid}} 个增值技能,输入序列号后即可解锁。",
|
|
1754
1795
|
"brand.banner.freePromptBoth": "欢迎使用 {{name}} — 已自动安装 {{free}} 个免费技能,还有 {{paid}} 个增值技能可输入序列号解锁。",
|
|
1755
1796
|
|
|
1756
|
-
"header.owner.tooltip": "创作者 —
|
|
1797
|
+
"header.owner.tooltip": "创作者 — 点击进入扩展与创作",
|
|
1757
1798
|
"header.cmdbar.placeholder": "搜索会话…",
|
|
1758
1799
|
"notify.tooltip.on": "任务完成提示音:已开启(点击关闭)",
|
|
1759
1800
|
"notify.tooltip.off": "任务完成提示音:已关闭(点击开启)",
|
|
1760
1801
|
|
|
1802
|
+
"header.refresh": "刷新",
|
|
1803
|
+
"header.theme.toDark": "切换到深色模式",
|
|
1804
|
+
"header.theme.toLight": "切换到浅色模式",
|
|
1761
1805
|
"share.tooltip": "分享",
|
|
1762
1806
|
"share.copy.1": "{{brand}} 对国产模型(Kimi、DeepSeek、智谱…)适配很到位,原生支持不用折腾代理,好用。",
|
|
1763
1807
|
"share.copy.2": "{{brand}} 是真省 Token —— 靠 Prompt 缓存把我的 AI 账单压得很低,推荐。",
|
|
@@ -1980,6 +2024,8 @@ const I18n = (() => {
|
|
|
1980
2024
|
return { lang, setLang, t, tList, applyAll };
|
|
1981
2025
|
})();
|
|
1982
2026
|
|
|
2027
|
+
Clacky.I18n = I18n;
|
|
2028
|
+
|
|
1983
2029
|
// ── Thinking Verbs for Progress Animation ──────────────────────────────────
|
|
1984
2030
|
//
|
|
1985
2031
|
// The primary verb ("Thinking" / "思考中") is chosen 90% of the time inside
|