openclacky 1.3.11 → 1.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eccc2d78824c13072991199a00edd5b848216334422ce37876cd639854abb4ab
4
- data.tar.gz: c29754fc48b5b9638168fa167c5335c32ccf5c64a3db94d3e64ac2638581857e
3
+ metadata.gz: 29e2af05d27f902fc645a1399eb16d16d41681ec03312ee861fdd594292368c2
4
+ data.tar.gz: bbb62ec065f07867a2085b6dc0f81d5702c34cf0ff4e10e0b88513daa5fb4541
5
5
  SHA512:
6
- metadata.gz: 6d2e6ef2dcf07a50779241a3ed5b384c2fbf34e4265208874567b12d1280e29f2fe79124286ab7b73251bfc836de01ebf9d8ad03f91ae12ad55ac4575128bfd3
7
- data.tar.gz: 77088322e7cecc8c0cc0f7138786263c3de14dff2d1b33e99cee763437918e226bd34f0ef318a12d4f7292bcad5a935a8ca2ca16c9a15d8d2bd7262eebee9ccd
6
+ metadata.gz: bf7f4ad60821686404ee3b43607e59c51cb0d38420171b94eaea2c6d2877d71c03052f9147b56f61aeb5fc01155127d4aab15a8f0b6ecc0b73d6b294fb0bbe3c
7
+ data.tar.gz: ba3a05a10e80fd8b48f10f0778388c5417ce8fa79e0f3936cb6ef734117609bc85f56868227e174675e4132d0c619a8b385619c7aaf62e75039fc3f4895d15f8
data/CHANGELOG.md CHANGED
@@ -4,6 +4,36 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
 
7
+ ## [1.4.0] - 2026-07-14
8
+
9
+ ### Added
10
+ - Volcengine Ark Seedance video generation provider (async submit + poll)
11
+ - Entry points config and extension info editing in ext-studio
12
+ - Search box in skills panel tab bar
13
+ - Default letter gradient icon for extensions without a custom icon
14
+ - Skeleton loading for published extensions list in ext-studio
15
+
16
+ ### Improved
17
+ - Extensions market renders `display_name` instead of raw slug
18
+ - ext-studio extension picker and cards show display name; unit tags aggregated by type
19
+ - Session list "Today / Yesterday" labels localized
20
+
21
+ ### Fixed
22
+ - Terminal Pass 1 echo-strip no longer swallows real output (C-5701)
23
+ - OS metadata files (`.DS_Store`, `__MACOSX`) excluded from packed extension zips (C-5728)
24
+ - TUI exit now restores original terminal settings via `stty` (C-5724)
25
+ - Local image cache busted with mtime version param when file is overwritten (C-5703)
26
+ - Generated media usage correctly associated with sessions (C-5739)
27
+ - Mobile header search action alignment (C-5733)
28
+ - Session search shortcut hint adapted for web (C-5734)
29
+ - Memory card expand button height aligned with other action buttons
30
+ - Billing model filter select styling improved
31
+ - Modal overlay click-to-close disabled (prevents accidental dismissal)
32
+ - Version number / date separator added in extension version history
33
+ - All users can now publish extensions (permission gate removed)
34
+ - Invalid extension version format shows inline error in publish modal
35
+ - Brand update button hover color uses correct CSS variable
36
+
7
37
  ## [1.3.11] - 2026-07-12
8
38
 
9
39
  ### Added
@@ -452,6 +452,7 @@ module Clacky
452
452
  # @return [Hash<String, Proc>]
453
453
  def build_template_context
454
454
  {
455
+ "session_id" => -> { @session_id },
455
456
  "memories_meta" => -> { load_memories_meta },
456
457
  "all_skills_meta" => -> { load_all_skills_meta }
457
458
  }
@@ -111,7 +111,7 @@ class ExtStudioExt < Clacky::ApiExtension
111
111
  exts = Array(result[:extensions]).map do |ext|
112
112
  {
113
113
  id: ext["name"] || ext["slug"] || ext["id"],
114
- name: ext["name"],
114
+ name: ext["display_name"] || ext["name"],
115
115
  version: (ext["latest_version"] || {})["version"] || ext["version"],
116
116
  status: ext["status"],
117
117
  units: ext["units"] || {}
@@ -149,6 +149,47 @@ class ExtStudioExt < Clacky::ApiExtension
149
149
  json(ok: true, ext_id: ext_id)
150
150
  end
151
151
 
152
+ # POST /api/ext/ext-studio/set_meta
153
+ # body: { ext_id, name?, description?, entry_points? }
154
+ # entry_points: [{ unit_id, slot }] — stored under contributes.panels[id].entry_points
155
+ # Writes display metadata back to the local ext.yml without touching other fields.
156
+ post "/set_meta" do
157
+ ext_id = require_ext_id!
158
+
159
+ result = Clacky::ExtensionLoader.load_all(force: false)
160
+ container = Array(result.containers).find { |id, _| id == ext_id }&.last
161
+ error!("extension not found: #{ext_id}", status: 404) unless container
162
+
163
+ yml_path = File.join(container[:dir], "ext.yml")
164
+ error!("ext.yml not found", status: 404) unless File.exist?(yml_path)
165
+
166
+ manifest = Psych.safe_load(File.read(yml_path), permitted_classes: [], aliases: true) || {}
167
+
168
+ manifest["name"] = presence(json_body["name"]) if json_body.key?("name")
169
+ manifest["description"] = presence(json_body["description"]) if json_body.key?("description")
170
+
171
+ if json_body.key?("entry_points")
172
+ eps = json_body["entry_points"]
173
+ by_panel = Hash.new { |h, k| h[k] = [] }
174
+ Array(eps).each { |ep| by_panel[ep["unit_id"].to_s] << { "slot" => ep["slot"] } if ep["slot"] }
175
+ panels = Array((manifest["contributes"] || {})["panels"])
176
+ panels.each do |panel|
177
+ pid = panel["id"].to_s
178
+ slots = by_panel[pid]
179
+ if slots.any?
180
+ panel["entry_points"] = slots
181
+ else
182
+ panel.delete("entry_points")
183
+ end
184
+ end
185
+ end
186
+
187
+ File.write(yml_path, Psych.dump(manifest))
188
+ Clacky::ExtensionLoader.load_all(force: true)
189
+
190
+ json(ok: true, ext_id: ext_id)
191
+ end
192
+
152
193
  # POST /api/ext/ext-studio/set_version
153
194
  # body: { ext_id, version }
154
195
  # Writes the new version string back to the local ext.yml.
@@ -250,6 +291,11 @@ class ExtStudioExt < Clacky::ApiExtension
250
291
  raw = container[:raw] || {}
251
292
  ext_issues = issues.select { |i| i.ext == ext_id }
252
293
  dir = container[:dir]
294
+ ext_units = result.units.select { |u| u.ext_id == ext_id }
295
+ panels = Array((raw["contributes"] || {})["panels"])
296
+ entry_points = panels.flat_map do |p|
297
+ Array(p["entry_points"]).map { |ep| { panel_id: p["id"], slot: ep["slot"] } }
298
+ end
253
299
  {
254
300
  id: ext_id,
255
301
  name: raw["name"] || ext_id,
@@ -259,7 +305,10 @@ class ExtStudioExt < Clacky::ApiExtension
259
305
  layer: container[:layer].to_s,
260
306
  dir: dir,
261
307
  mtime: File.mtime(File.join(dir, "ext.yml")).to_i,
262
- units: result.units.select { |u| u.ext_id == ext_id }.map { |u| serialize_unit(u) },
308
+ units: ext_units.map { |u| serialize_unit(u) },
309
+ unit_counts: unit_counts(ext_units),
310
+ contributes: raw["contributes"] || {},
311
+ entry_points: entry_points,
263
312
  error_count: ext_issues.count { |i| i.level == :error },
264
313
  warning_count: ext_issues.count { |i| i.level == :warning }
265
314
  }
@@ -269,6 +318,13 @@ class ExtStudioExt < Clacky::ApiExtension
269
318
  { kind: unit.kind.to_s, id: unit.id, layer: unit.layer.to_s }
270
319
  end
271
320
 
321
+ private def unit_counts(units)
322
+ units.each_with_object({}) do |unit, counts|
323
+ kind = unit.kind.to_s
324
+ counts[kind] = (counts[kind] || 0) + 1
325
+ end
326
+ end
327
+
272
328
  private def serialize_issue(issue)
273
329
  {
274
330
  ext: issue.ext,