openclacky 1.3.6 → 1.3.7

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.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/lib/clacky/agent.rb +8 -1
  4. data/lib/clacky/agent_profile.rb +121 -53
  5. data/lib/clacky/brand_config.rb +309 -6
  6. data/lib/clacky/cli.rb +4 -57
  7. data/lib/clacky/default_extensions/coding/ext.yml +18 -0
  8. data/lib/clacky/default_extensions/ext-studio/agents/ext-developer/system_prompt.md +95 -0
  9. data/lib/clacky/default_extensions/ext-studio/api/handler.rb +254 -0
  10. data/lib/clacky/default_extensions/ext-studio/ext.yml +32 -0
  11. data/lib/clacky/default_extensions/ext-studio/panels/studio/view.js +1269 -0
  12. data/lib/clacky/default_extensions/ext-studio/skills/ext-debug/SKILL.md +71 -0
  13. data/lib/clacky/default_extensions/ext-studio/skills/ext-publish/SKILL.md +74 -0
  14. data/lib/clacky/default_extensions/ext-studio/skills/ext-scaffold/SKILL.md +65 -0
  15. data/lib/clacky/default_extensions/general/ext.yml +18 -0
  16. data/lib/clacky/default_extensions/git/ext.yml +12 -0
  17. data/lib/clacky/{default_agents/_panels/git/panel.js → default_extensions/git/panels/git/view.js} +1 -2
  18. data/lib/clacky/default_extensions/meeting/{handler.rb → api/handler.rb} +78 -26
  19. data/lib/clacky/default_extensions/meeting/ext.yml +15 -0
  20. data/lib/clacky/default_extensions/meeting/{meeting.js → panels/meeting/view.js} +266 -89
  21. data/lib/clacky/default_extensions/meeting/skills/meeting-summarizer/SKILL.md +2 -1
  22. data/lib/clacky/default_extensions/time_machine/ext.yml +12 -0
  23. data/lib/clacky/{default_agents/_panels/time_machine/panel.js → default_extensions/time_machine/panels/time_machine/view.js} +58 -47
  24. data/lib/clacky/default_skills/channel-manager/discord_setup.rb +1 -1
  25. data/lib/clacky/default_skills/extend-openclacky/SKILL.md +83 -18
  26. data/lib/clacky/{api_extension.rb → extension/api_extension.rb} +27 -11
  27. data/lib/clacky/extension/api_loader.rb +136 -0
  28. data/lib/clacky/extension/cli_commands.rb +226 -0
  29. data/lib/clacky/{server/api_extension_dispatcher.rb → extension/dispatcher.rb} +22 -9
  30. data/lib/clacky/extension/hook_loader.rb +77 -0
  31. data/lib/clacky/extension/loader.rb +483 -0
  32. data/lib/clacky/extension/packager.rb +226 -0
  33. data/lib/clacky/{patch_loader.rb → extension/patch_loader.rb} +45 -0
  34. data/lib/clacky/extension/scaffold/template_renderer.rb +64 -0
  35. data/lib/clacky/extension/scaffold/templates/full/README.md.erb +48 -0
  36. data/lib/clacky/extension/scaffold/templates/full/agents/designer.md +5 -0
  37. data/lib/clacky/extension/scaffold/templates/full/api/handler.rb.erb +16 -0
  38. data/lib/clacky/extension/scaffold/templates/full/channels/noop.rb.erb +40 -0
  39. data/lib/clacky/extension/scaffold/templates/full/ext.yml.erb +41 -0
  40. data/lib/clacky/extension/scaffold/templates/full/hooks/audit.rb +9 -0
  41. data/lib/clacky/extension/scaffold/templates/full/panels/dashboard/view.js.erb +194 -0
  42. data/lib/clacky/extension/scaffold/templates/full/patches/audit.rb +15 -0
  43. data/lib/clacky/extension/scaffold/templates/full/skills/__slug__-skill/SKILL.md.erb +8 -0
  44. data/lib/clacky/extension/scaffold/templates/hello/api/handler.rb.erb +9 -0
  45. data/lib/clacky/extension/scaffold/templates/hello/ext.yml.erb +12 -0
  46. data/lib/clacky/extension/scaffold/templates/hello/panels/hello/view.js.erb +31 -0
  47. data/lib/clacky/extension/scaffold.rb +55 -0
  48. data/lib/clacky/extension/verifier.rb +196 -0
  49. data/lib/clacky/identity.rb +70 -0
  50. data/lib/clacky/locales/en.rb +19 -1
  51. data/lib/clacky/locales/zh.rb +19 -1
  52. data/lib/clacky/platform_http_client.rb +18 -15
  53. data/lib/clacky/server/channel/extension_adapter_loader.rb +32 -0
  54. data/lib/clacky/server/channel.rb +6 -0
  55. data/lib/clacky/server/http_server.rb +313 -144
  56. data/lib/clacky/server/session_registry.rb +9 -2
  57. data/lib/clacky/skill_loader.rb +28 -1
  58. data/lib/clacky/ui2/ui_controller.rb +9 -6
  59. data/lib/clacky/version.rb +1 -1
  60. data/lib/clacky/web/app.css +748 -573
  61. data/lib/clacky/web/app.js +63 -15
  62. data/lib/clacky/web/auth.js +2 -0
  63. data/lib/clacky/web/components/notify.js +2 -0
  64. data/lib/clacky/web/components/sidebar.js +1 -5
  65. data/lib/clacky/web/core/ext.js +316 -79
  66. data/lib/clacky/web/features/backup/store.js +1 -0
  67. data/lib/clacky/web/features/backup/view.js +0 -1
  68. data/lib/clacky/web/features/brand/view.js +13 -5
  69. data/lib/clacky/web/features/extensions/store.js +184 -0
  70. data/lib/clacky/web/features/extensions/view.js +389 -0
  71. data/lib/clacky/web/features/new-session/store.js +186 -0
  72. data/lib/clacky/web/features/new-session/view.js +319 -0
  73. data/lib/clacky/web/features/share/view.js +63 -14
  74. data/lib/clacky/web/features/skills/store.js +3 -1
  75. data/lib/clacky/web/features/skills/view.js +1 -1
  76. data/lib/clacky/web/features/tasks/view.js +12 -0
  77. data/lib/clacky/web/features/trash/store.js +24 -6
  78. data/lib/clacky/web/features/trash/view.js +46 -9
  79. data/lib/clacky/web/features/workspace/store.js +2 -0
  80. data/lib/clacky/web/features/workspace/view.js +0 -1
  81. data/lib/clacky/web/i18n.js +118 -106
  82. data/lib/clacky/web/index.html +138 -188
  83. data/lib/clacky/web/sessions.js +64 -269
  84. data/lib/clacky/web/settings.js +1 -1
  85. data/lib/clacky/web/skills.js +2 -0
  86. data/lib/clacky/web/theme.js +2 -0
  87. data/lib/clacky/web/ws-dispatcher.js +1 -0
  88. data/lib/clacky/web/ws.js +2 -0
  89. data/lib/clacky.rb +21 -10
  90. metadata +55 -24
  91. data/benchmark/runner.rb +0 -441
  92. data/lib/clacky/api_extension_loader.rb +0 -168
  93. data/lib/clacky/default_agents/SOUL.md +0 -3
  94. data/lib/clacky/default_agents/USER.md +0 -1
  95. data/lib/clacky/default_agents/coding/profile.yml +0 -5
  96. data/lib/clacky/default_agents/coding/webui/.gitkeep +0 -0
  97. data/lib/clacky/default_agents/general/profile.yml +0 -2
  98. data/lib/clacky/default_extensions/meeting/meta.yml +0 -3
  99. data/lib/clacky/web/features/creator/store.js +0 -81
  100. data/lib/clacky/web/features/creator/view.js +0 -380
  101. /data/lib/clacky/{default_agents → default_extensions/coding/agents}/coding/system_prompt.md +0 -0
  102. /data/lib/clacky/{default_agents → default_extensions/general/agents}/general/system_prompt.md +0 -0
  103. /data/lib/clacky/{default_agents/base_prompt.md → prompts/base.md} +0 -0
@@ -37,10 +37,10 @@
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).
40
- Clicking navigates to Creator Hub. stopPropagation prevents the parent
41
- #header-brand onclick (which would navigate to chat). -->
40
+ Clicking opens the Extension & Creation workspace. stopPropagation
41
+ prevents the parent #header-brand onclick (which navigates to chat). -->
42
42
  <button id="header-owner-badge" class="header-owner-badge" style="display:none"
43
- onclick="event.stopPropagation(); Router.navigate('creator')"
43
+ onclick="event.stopPropagation(); Clacky.ext.ui.openWorkspace('ext-studio')"
44
44
  title="Creator / Owner" data-i18n-title="header.owner.tooltip">OWNER</button>
45
45
  </div>
46
46
  </div>
@@ -53,6 +53,14 @@
53
53
  </div>
54
54
  <div id="header-right">
55
55
  <span id="ext-slot-header-right" data-slot="header.right"></span>
56
+ <button id="refresh-page-btn" class="theme-toggle-btn" data-i18n-title="header.refresh" title="Refresh" onclick="location.reload()">
57
+ <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="icon-sm">
58
+ <path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"/>
59
+ <path d="M21 3v5h-5"/>
60
+ <path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"/>
61
+ <path d="M8 16H3v5"/>
62
+ </svg>
63
+ </button>
56
64
  <button id="share-toggle-header" class="theme-toggle-btn" data-i18n-title="share.tooltip" title="Share">
57
65
  <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="icon-sm">
58
66
  <circle cx="18" cy="5" r="3"/>
@@ -117,25 +125,17 @@
117
125
  <aside id="sidebar">
118
126
  <!-- Sidebar navigation groups -->
119
127
  <div id="sidebar-list">
128
+ <!-- TOP nav slot: extensions add first-class workspace entries here.
129
+ Above Sessions — reserved for major extension surfaces. -->
130
+ <div id="ext-slot-sidebar-nav-top" data-slot="sidebar.nav.top"></div>
131
+
120
132
  <!-- Chat Group -->
121
133
  <div id="chat-section">
122
- <!-- Header: "Sessions" label + [+ ] split button -->
134
+ <!-- Header: "Sessions" label + [+ New] button -->
123
135
  <div class="sidebar-divider">
124
136
  <span data-i18n="sidebar.chat">Sessions</span>
125
137
  <div class="sidebar-divider-actions">
126
- <div class="btn-split-wrap">
127
- <button id="btn-new-session-inline" class="btn-split-main" title="New Session" data-i18n="sessions.newSession">+ New Session</button>
128
- <button id="btn-new-session-arrow" class="btn-split-arrow" title="Options">▾</button>
129
- <!-- Dropdown -->
130
- <div id="new-session-dropdown" class="new-session-dropdown" hidden>
131
- <div class="dropdown-item" id="btn-new-session-modal" data-i18n="sessions.newSessionAdvanced">
132
- <svg width="10" height="10" viewBox="0 0 16 16" fill="currentColor" style="vertical-align: -1px; margin-right: 5px; opacity: 0.6;">
133
- <path d="M8 0a.5.5 0 01.5.5v2a.5.5 0 01-1 0v-2A.5.5 0 018 0zm0 13a.5.5 0 01.5.5v2a.5.5 0 01-1 0v-2A.5.5 0 018 13zm8-5a.5.5 0 01-.5.5h-2a.5.5 0 010-1h2a.5.5 0 01.5.5zM3 8a.5.5 0 01-.5.5h-2a.5.5 0 010-1h2A.5.5 0 013 8zm10.657-5.657a.5.5 0 010 .707l-1.414 1.415a.5.5 0 11-.707-.708l1.414-1.414a.5.5 0 01.707 0zm-9.193 9.193a.5.5 0 010 .707L3.05 13.657a.5.5 0 01-.707-.707l1.414-1.414a.5.5 0 01.707 0zm9.193 2.121a.5.5 0 01-.707 0l-1.414-1.414a.5.5 0 01.707-.707l1.414 1.414a.5.5 0 010 .707zM4.464 4.465a.5.5 0 01-.707 0L2.343 3.05a.5.5 0 11.707-.707l1.414 1.414a.5.5 0 010 .708z"/>
134
- </svg>
135
- <span data-i18n="sessions.newSessionAdvanced">More Options</span>
136
- </div>
137
- </div>
138
- </div>
138
+ <button id="btn-new-session-inline" class="btn-split-main" title="New Session" data-i18n="sessions.newSession">+ New Session</button>
139
139
  </div>
140
140
  </div>
141
141
 
@@ -154,7 +154,11 @@
154
154
  <div id="session-list"></div>
155
155
  <!-- Load more button rendered dynamically by Sessions.renderList() -->
156
156
  </div>
157
-
157
+
158
+ <!-- MAIN nav slot: default landing spot for extension menus. Between
159
+ Sessions and Config so ext entries feel like standard nav items. -->
160
+ <div id="ext-slot-sidebar-nav" data-slot="sidebar.nav"></div>
161
+
158
162
  <!-- Config Group -->
159
163
  <div id="config-section">
160
164
  <div class="sidebar-divider"><span data-i18n="sidebar.config">Config</span></div>
@@ -203,6 +207,17 @@
203
207
  </div>
204
208
  </div>
205
209
  </div>
210
+ <div id="extensions-sidebar-item" class="task-item task-item-summary">
211
+ <div class="task-row">
212
+ <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">
213
+ <path d="M20 7h-9"/><path d="M14 17H5"/>
214
+ <circle cx="17" cy="17" r="3"/><circle cx="7" cy="7" r="3"/>
215
+ </svg>
216
+ <div class="task-info">
217
+ <span class="task-name" id="extensions-sidebar-label" data-i18n="sidebar.extensions">Extension Market</span>
218
+ </div>
219
+ </div>
220
+ </div>
206
221
  </div>
207
222
  </div>
208
223
 
@@ -253,27 +268,8 @@
253
268
  </div>
254
269
  </div>
255
270
 
256
- <!-- Creator Group only shown when user_licensed -->
257
- <div id="creator-section" style="display:none">
258
- <div class="sidebar-divider"><span data-i18n="sidebar.creatorSection">Creator</span></div>
259
- <div id="creator-nav-items">
260
- <div id="creator-sidebar-item" class="task-item task-item-summary">
261
- <div class="task-row">
262
- <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">
263
- <path d="M12 2L2 7l10 5 10-5-10-5z"/>
264
- <path d="M2 17l10 5 10-5"/>
265
- <path d="M2 12l10 5 10-5"/>
266
- </svg>
267
- <div class="task-info">
268
- <span class="task-name" id="creator-sidebar-label" data-i18n="sidebar.creator">Creator Hub</span>
269
- </div>
270
- </div>
271
- </div>
272
- </div>
273
- </div>
274
-
275
- <!-- Extension nav slot: extensions add custom menu items / entry points to whole new workspaces here. -->
276
- <div id="ext-slot-sidebar-nav" data-slot="sidebar.nav"></div>
271
+ <!-- BOTTOM nav slot: end-of-sidebar spot for secondary ext entries. -->
272
+ <div id="ext-slot-sidebar-nav-bottom" data-slot="sidebar.nav.bottom"></div>
277
273
  </div>
278
274
 
279
275
  <!-- Bottom Settings -->
@@ -303,39 +299,77 @@
303
299
  <!-- ── MAIN ─────────────────────────────────────────────────────────── -->
304
300
  <main id="main">
305
301
 
306
- <!-- Extension workspace slot: extensions mount entirely new custom panels here. -->
307
- <div id="ext-slot-main-workspace" data-slot="main.workspace"></div>
302
+ <!-- Extension workspace slot: extensions mount entirely new custom panels here.
303
+ Hidden by default; the Router shows it (display:block) when handling
304
+ the `ext-workspace` view and re-renders it on every navigate(). -->
305
+ <div id="ext-slot-main-workspace" data-slot="main.workspace" style="display:none"></div>
308
306
 
309
307
 
310
308
  <!-- Onboard panel: kept as empty shell (soul_setup auto-launches /onboard session) -->
311
309
  <div id="onboard-panel" style="display:none"></div>
312
310
 
313
- <!-- Welcome screen -->
314
- <div id="welcome" class="centered">
315
- <div class="ce-mark">
316
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round">
317
- <path d="M12 2l2.4 6.6L21 11l-6.6 2.4L12 20l-2.4-6.6L3 11l6.6-2.4z"/>
318
- </svg>
319
- </div>
320
- <div class="ce-head">
321
- <h2 id="welcome-title" class="ce-title" data-i18n="welcome.title" data-i18n-vars="brand={{BRAND_NAME}}">What should we build?</h2>
322
- <p class="ce-sub" data-i18n="welcome.body">Your agent is standing by. Pick a starting point or just type.</p>
323
- </div>
324
- <div class="chips">
325
- <button class="chip" data-welcome-prompt="welcome.chip.code.prompt">
326
- <span class="ci"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M16 18l6-6-6-6M8 6l-6 6 6 6"/></svg></span>
327
- <span class="ct-wrap"><span class="ct" data-i18n="welcome.chip.code.title">Write code</span><span class="cd" data-i18n="welcome.chip.code.desc">build, refactor, debug</span></span>
328
- </button>
329
- <button class="chip" data-welcome-prompt="welcome.chip.task.prompt">
330
- <span class="ci"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg></span>
331
- <span class="ct-wrap"><span class="ct" data-i18n="welcome.chip.task.title">Automate a task</span><span class="cd" data-i18n="welcome.chip.task.desc">schedule, run, repeat</span></span>
332
- </button>
333
- <button class="chip" data-welcome-prompt="welcome.chip.research.prompt">
334
- <span class="ci"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5V6a2 2 0 0 1 2-2h12v16H6a2 2 0 0 1-2-2z"/><path d="M8 7h7"/></svg></span>
335
- <span class="ct-wrap"><span class="ct" data-i18n="welcome.chip.research.title">Research</span><span class="cd" data-i18n="welcome.chip.research.desc">search, read, summarize</span></span>
336
- </button>
311
+ <!-- New Session page (default landing view; hash: #new or empty) -->
312
+ <div id="welcome" class="centered new-session-page">
313
+ <div class="new-session-inner">
314
+ <h2 class="new-session-title" data-i18n="sessions.new.title">Start a new session</h2>
315
+ <p class="new-session-subtitle" data-i18n="sessions.new.subtitle">Pick who you want to chat with, then type your first message.</p>
316
+
317
+ <div id="new-session-agents" class="new-session-agents"></div>
318
+
319
+ <div class="new-session-advanced-wrap">
320
+ <button id="new-session-toggle-advanced" class="new-session-advanced-toggle" type="button" aria-expanded="false">
321
+ <span data-i18n="sessions.new.moreOptions">More options</span>
322
+ <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>
323
+ </button>
324
+
325
+ <div id="new-session-advanced" class="new-session-advanced" hidden>
326
+ <div class="new-session-field">
327
+ <label class="new-session-label" data-i18n="sessions.modal.name">Session Name</label>
328
+ <input id="new-session-name" type="text" class="new-session-input"
329
+ data-i18n-placeholder="sessions.modal.name.placeholder"
330
+ placeholder="Leave empty to auto-generate">
331
+ </div>
332
+
333
+ <div class="new-session-field">
334
+ <label class="new-session-label" data-i18n="sessions.modal.model">Model</label>
335
+ <select id="new-session-model" class="new-session-select"></select>
336
+ </div>
337
+
338
+ <div class="new-session-field">
339
+ <label class="new-session-label" data-i18n="sessions.modal.directory">Working Directory</label>
340
+ <div class="new-session-input-row">
341
+ <input id="new-session-directory" type="text" class="new-session-input"
342
+ data-i18n-placeholder="sessions.modal.directory.placeholder"
343
+ placeholder="~/workspace/my-project">
344
+ <button id="new-session-browse-btn" type="button" class="new-session-browse-btn"
345
+ data-i18n-title="sessions.modal.directory.browse" title="Browse…" aria-label="Browse">
346
+ <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>
347
+ </button>
348
+ </div>
349
+ </div>
350
+
351
+ <div id="new-session-init-project-field" class="new-session-checkbox-field" style="display:none">
352
+ <label class="new-session-checkbox-label">
353
+ <input id="new-session-init-project" type="checkbox" class="new-session-checkbox">
354
+ <span data-i18n="sessions.modal.initProject">Initialize full-stack project (/new)</span>
355
+ </label>
356
+ </div>
357
+ </div>
358
+ </div>
359
+
360
+ <div class="new-session-composer">
361
+ <textarea id="new-session-input"
362
+ class="new-session-textarea"
363
+ rows="3"
364
+ data-i18n-placeholder="sessions.new.placeholder"
365
+ placeholder="Type your first message and press Enter…"></textarea>
366
+ <div class="new-session-composer-actions">
367
+ <button id="new-session-send" class="new-session-send" type="button" disabled>
368
+ <span data-i18n="sessions.new.send">Send</span>
369
+ </button>
370
+ </div>
371
+ </div>
337
372
  </div>
338
- <button id="btn-welcome-new" class="ce-blank" data-i18n="welcome.btn">Start a blank session</button>
339
373
  </div>
340
374
 
341
375
  <!-- Scheduled Tasks list panel (shown when user clicks "Scheduled Tasks") -->
@@ -474,67 +508,6 @@
474
508
  </button>
475
509
  </div>
476
510
 
477
- <!-- ── CREATOR PANEL ─────────────────────────────────────────────── -->
478
- <div id="creator-panel" style="display:none">
479
- <div id="creator-body">
480
- <div class="skills-page-header">
481
- <h2 class="skills-page-title" data-i18n="creator.title">Creator Hub</h2>
482
- <p class="skills-page-subtitle" data-i18n="creator.subtitle">Manage and publish your skills to the platform</p>
483
- </div>
484
-
485
- <!-- Promo banner: shown only to non-licensed users -->
486
- <div id="creator-promo-banner" style="display:none">
487
- <svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
488
- <polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/>
489
- </svg>
490
- <span data-i18n="creator.promo.text">Publish your skills &amp; build your own brand on OpenClacky.</span>
491
- <a href="https://www.openclacky.com/creators" target="_blank" data-i18n="creator.promo.link">Learn more →</a>
492
- </div>
493
-
494
- <!-- Section 1: Cloud skills (published) -->
495
- <div class="creator-section-block" id="creator-cloud-block">
496
- <div class="creator-section-header">
497
- <span class="creator-section-label" data-i18n="creator.section.cloud">Cloud Skills</span>
498
- <span class="creator-section-hint" data-i18n="creator.section.cloudHint">Published to the platform</span>
499
- </div>
500
- <div id="creator-cloud-list" class="creator-list"></div>
501
- <!-- Lock overlay: shown only to non-licensed users -->
502
- <div id="creator-cloud-lock" style="display:none">
503
- <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">
504
- <rect x="3" y="11" width="18" height="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/>
505
- </svg>
506
- <span data-i18n="creator.cloud.locked">Brand license required to publish cloud skills.</span>
507
- </div>
508
- </div>
509
-
510
- <!-- Section 2: Local skills (ready to publish) -->
511
- <div class="creator-section-block" id="creator-local-block">
512
- <div class="creator-section-header">
513
- <span class="creator-section-label" data-i18n="creator.section.local">Local Skills</span>
514
- <span class="creator-section-hint" data-i18n="creator.section.localHint">Ready to publish</span>
515
- </div>
516
- <div id="creator-local-list" class="creator-list"></div>
517
- </div>
518
-
519
- <!-- Section 3: Create new skill -->
520
- <div class="creator-section-block" id="creator-new-block">
521
- <div class="creator-section-header">
522
- <span class="creator-section-label" data-i18n="creator.section.new">Create New Skill</span>
523
- </div>
524
- <div id="creator-new-entry" class="creator-new-card">
525
- <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">
526
- <path d="M12 2a10 10 0 1 0 10 10A10 10 0 0 0 12 2z"/><path d="M12 8v8"/><path d="M8 12h8"/>
527
- </svg>
528
- <span data-i18n="creator.newSkill.label">Create a new skill with /skill-creator</span>
529
- <svg class="creator-new-arrow" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
530
- <path d="M5 12h14"/><path d="M12 5l7 7-7 7"/>
531
- </svg>
532
- </div>
533
- </div>
534
-
535
- </div>
536
- </div>
537
-
538
511
  <!-- ── SKILLS PANEL ───────────────────────────────────────────────── -->
539
512
  <div id="skills-panel" style="display:none">
540
513
  <div id="skills-body">
@@ -648,6 +621,29 @@
648
621
  </div>
649
622
  </div>
650
623
 
624
+ <!-- ── EXTENSIONS PANEL — public extension marketplace (browse only) ─── -->
625
+ <div id="extensions-panel" style="display:none">
626
+ <div id="extensions-body">
627
+ <div class="channels-page-header">
628
+ <h2 class="channels-page-title" data-i18n="extensions.title">Extension Market</h2>
629
+ <p class="channels-page-subtitle" data-i18n="extensions.subtitle">Browse extensions that creators can bundle into brand packages. Extensions are delivered with your license — there is no direct download here.</p>
630
+ </div>
631
+
632
+ <div class="extensions-toolbar">
633
+ <input type="text" id="extensions-search-input" class="extensions-search" placeholder="Search extensions…" />
634
+ <select id="extensions-sort" class="extensions-sort">
635
+ <option value="newest" data-i18n="extensions.sort.newest">Newest</option>
636
+ <option value="updated" data-i18n="extensions.sort.updated">Recently updated</option>
637
+ <option value="downloads" data-i18n="extensions.sort.downloads">Most downloaded</option>
638
+ </select>
639
+ </div>
640
+
641
+ <div id="extensions-warning" class="brand-skills-warning" style="display:none"></div>
642
+ <div id="extensions-list"></div>
643
+ </div>
644
+ <div id="extensions-detail" class="extension-detail" style="display:none"></div>
645
+ </div>
646
+
651
647
  <!-- ── TRASH PANEL — Recently deleted files across all projects ─── -->
652
648
  <div id="trash-panel" style="display:none">
653
649
  <div id="trash-body">
@@ -663,30 +659,37 @@
663
659
  </div>
664
660
  </div>
665
661
 
662
+ <p class="trash-session-hint" id="trash-session-hint" style="display:none" data-i18n="trash.sessionAutoCleanHint">The system keeps the most recent 200 sessions; older ones are moved here.</p>
663
+
666
664
  <div class="trash-toolbar">
665
+ <div class="trash-filter-bar" id="trash-filter-bar" style="display:none">
666
+ <button class="trash-filter-chip active" data-filter="all" data-i18n="trash.filterAll">All</button>
667
+ <button class="trash-filter-chip" data-filter="manual" data-i18n="trash.filterManual">Regular</button>
668
+ <button class="trash-filter-chip" data-filter="cron" data-i18n="trash.filterCron">Scheduled</button>
669
+ </div>
667
670
  <span class="trash-summary" id="trash-summary"></span>
668
671
  <div class="trash-actions">
669
- <button id="btn-trash-refresh" class="btn-trash-action" title="Refresh">
672
+ <button id="btn-trash-refresh" class="btn-trash-action" data-i18n-title="trash.refresh.tooltip" title="Refresh">
670
673
  <svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
671
674
  <path d="M21 2v6h-6"/><path d="M3 12a9 9 0 0 1 15-6.7L21 8"/>
672
675
  <path d="M3 22v-6h6"/><path d="M21 12a9 9 0 0 1-15 6.7L3 16"/>
673
676
  </svg>
674
677
  <span data-i18n="trash.refresh">Refresh</span>
675
678
  </button>
676
- <button id="btn-trash-empty-old" class="btn-trash-action" title="Permanently delete files older than 7 days">
679
+ <button id="btn-trash-empty-old" class="btn-trash-action" data-i18n-title="trash.emptyOld.tooltip" title="Permanently delete files older than 7 days">
677
680
  <svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
678
681
  <circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/>
679
682
  </svg>
680
683
  <span data-i18n="trash.emptyOld">Empty &gt;7 days</span>
681
684
  </button>
682
- <button id="btn-trash-empty-orphans" class="btn-trash-action" title="Permanently delete entries whose original project directory no longer exists (e.g. test temp dirs)">
685
+ <button id="btn-trash-empty-orphans" class="btn-trash-action" data-i18n-title="trash.emptyOrphans.tooltip" title="Permanently delete entries whose original project directory no longer exists (e.g. test temp dirs)">
683
686
  <svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
684
687
  <path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/>
685
688
  <line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/>
686
689
  </svg>
687
690
  <span data-i18n="trash.emptyOrphans">Clean orphans</span>
688
691
  </button>
689
- <button id="btn-trash-empty-all" class="btn-trash-action btn-trash-danger" title="Permanently delete all trashed files">
692
+ <button id="btn-trash-empty-all" class="btn-trash-action btn-trash-danger" data-i18n-title="trash.emptyAll.tooltip" title="Permanently delete all trashed files">
690
693
  <svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
691
694
  <polyline points="3 6 5 6 21 6"/>
692
695
  <path d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"/>
@@ -1394,61 +1397,6 @@
1394
1397
  </div>
1395
1398
  </div>
1396
1399
 
1397
- <!-- ── NEW SESSION MODAL ─────────────────────────────────────────────────── -->
1398
- <div id="new-session-modal" class="modal-overlay" style="display:none">
1399
- <div class="modal-box new-session-modal">
1400
- <div class="modal-header">
1401
- <h3 class="modal-title" data-i18n="sessions.modal.title">Create New Session</h3>
1402
- </div>
1403
- <div class="modal-body">
1404
- <div class="modal-field">
1405
- <label class="modal-label" data-i18n="sessions.modal.agent">Agent</label>
1406
- <select id="new-session-agent" class="modal-select">
1407
- <option value="general" data-i18n="sessions.modal.agent.general">General</option>
1408
- <option value="coding" data-i18n="sessions.modal.agent.coding">Coding</option>
1409
- </select>
1410
- </div>
1411
-
1412
- <div class="modal-field">
1413
- <label class="modal-label" data-i18n="sessions.modal.name">Session Name</label>
1414
- <input id="new-session-name" type="text" class="modal-input"
1415
- data-i18n-placeholder="sessions.modal.name.placeholder"
1416
- placeholder="Leave empty to auto-generate">
1417
- </div>
1418
-
1419
- <div class="modal-field">
1420
- <label class="modal-label" data-i18n="sessions.modal.model">Model</label>
1421
- <select id="new-session-model" class="modal-select">
1422
- <!-- Populated dynamically from configured models -->
1423
- </select>
1424
- </div>
1425
-
1426
- <div class="modal-field">
1427
- <label class="modal-label" data-i18n="sessions.modal.directory">Working Directory</label>
1428
- <div class="modal-input-row">
1429
- <input id="new-session-directory" type="text" class="modal-input"
1430
- data-i18n-placeholder="sessions.modal.directory.placeholder"
1431
- placeholder="~/workspace/my-project">
1432
- <button id="new-session-browse-btn" type="button" class="modal-browse-btn" data-i18n-title="sessions.modal.directory.browse" title="Browse…" aria-label="Browse">
1433
- <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>
1434
- </button>
1435
- </div>
1436
- </div>
1437
-
1438
- <div id="new-session-init-project-field" class="modal-field-checkbox" style="display:none">
1439
- <label class="modal-checkbox-label">
1440
- <input id="new-session-init-project" type="checkbox" class="modal-checkbox">
1441
- <span data-i18n="sessions.modal.initProject">Initialize full-stack project (/new)</span>
1442
- </label>
1443
- </div>
1444
- </div>
1445
- <div class="modal-footer">
1446
- <button id="new-session-cancel" class="btn-secondary" data-i18n="modal.cancel">Cancel</button>
1447
- <button id="new-session-create" class="btn-primary" data-i18n="sessions.modal.create">Create Session</button>
1448
- </div>
1449
- </div>
1450
- </div>
1451
-
1452
1400
  <!-- ── CONFIRMATION MODAL ────────────────────────────────────────────────── -->
1453
1401
  <div id="modal-overlay" class="modal-overlay" style="display:none">
1454
1402
  <div class="modal-box sm">
@@ -1531,8 +1479,12 @@
1531
1479
  <script src="/skills.js"></script>
1532
1480
  <script src="/features/mcp/store.js"></script>
1533
1481
  <script src="/features/mcp/view.js"></script>
1482
+ <script src="/features/extensions/store.js"></script>
1483
+ <script src="/features/extensions/view.js"></script>
1534
1484
  <script src="/features/backup/store.js"></script>
1535
1485
  <script src="/features/backup/view.js"></script>
1486
+ <script src="/features/new-session/store.js"></script>
1487
+ <script src="/features/new-session/view.js"></script>
1536
1488
  <script src="/features/model-tester/store.js"></script>
1537
1489
  <script src="/features/model-tester/view.js"></script>
1538
1490
  <script src="/settings.js"></script>
@@ -1541,8 +1493,6 @@
1541
1493
  <script src="/components/onboard.js"></script>
1542
1494
  <script src="/features/brand/store.js"></script>
1543
1495
  <script src="/features/brand/view.js"></script>
1544
- <script src="/features/creator/store.js"></script>
1545
- <script src="/features/creator/view.js"></script>
1546
1496
  <script src="/features/trash/store.js"></script>
1547
1497
  <script src="/features/trash/view.js"></script>
1548
1498
  <script src="/features/profile/store.js"></script>