openclacky 1.2.6 → 1.2.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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -0
  3. data/README.md +34 -0
  4. data/README_CN.md +34 -0
  5. data/lib/clacky/agent/cost_tracker.rb +7 -1
  6. data/lib/clacky/agent/message_compressor.rb +2 -1
  7. data/lib/clacky/agent/message_compressor_helper.rb +6 -2
  8. data/lib/clacky/agent/session_serializer.rb +23 -4
  9. data/lib/clacky/agent.rb +46 -2
  10. data/lib/clacky/agent_config.rb +54 -6
  11. data/lib/clacky/billing/billing_store.rb +107 -3
  12. data/lib/clacky/brand_config.rb +0 -6
  13. data/lib/clacky/cli.rb +107 -1
  14. data/lib/clacky/client.rb +56 -6
  15. data/lib/clacky/default_skills/deploy/SKILL.md +2 -1
  16. data/lib/clacky/default_skills/extend-openclacky/SKILL.md +39 -0
  17. data/lib/clacky/default_skills/mcp-manager/SKILL.md +0 -7
  18. data/lib/clacky/default_skills/onboard/SKILL.md +2 -2
  19. data/lib/clacky/json_ui_controller.rb +5 -2
  20. data/lib/clacky/patch_loader.rb +282 -0
  21. data/lib/clacky/plain_ui_controller.rb +1 -1
  22. data/lib/clacky/providers.rb +11 -2
  23. data/lib/clacky/server/channel/adapters/base.rb +4 -0
  24. data/lib/clacky/server/channel/channel_manager.rb +149 -13
  25. data/lib/clacky/server/channel/channel_ui_controller.rb +4 -2
  26. data/lib/clacky/server/channel/user_adapter_loader.rb +177 -0
  27. data/lib/clacky/server/channel.rb +5 -0
  28. data/lib/clacky/server/http_server.rb +135 -14
  29. data/lib/clacky/server/scheduler.rb +1 -4
  30. data/lib/clacky/server/session_registry.rb +30 -4
  31. data/lib/clacky/server/web_ui_controller.rb +6 -3
  32. data/lib/clacky/shell_hook_loader.rb +181 -0
  33. data/lib/clacky/tools/terminal.rb +22 -26
  34. data/lib/clacky/ui2/ui_controller.rb +1 -1
  35. data/lib/clacky/ui_interface.rb +1 -1
  36. data/lib/clacky/version.rb +1 -1
  37. data/lib/clacky/web/app.css +392 -14
  38. data/lib/clacky/web/app.js +0 -1
  39. data/lib/clacky/web/billing.js +117 -22
  40. data/lib/clacky/web/i18n.js +50 -6
  41. data/lib/clacky/web/index.html +33 -0
  42. data/lib/clacky/web/sessions.js +203 -14
  43. data/lib/clacky/web/settings.js +59 -17
  44. data/lib/clacky/web/workspace.js +204 -0
  45. data/lib/clacky/web/ws-dispatcher.js +19 -3
  46. data/lib/clacky.rb +15 -0
  47. metadata +7 -2
@@ -18,7 +18,6 @@
18
18
 
19
19
 
20
20
  WS.onEvent(ev => {
21
- console.log("[DEBUG] WS event received:", ev.type, ev);
22
21
  switch (ev.type) {
23
22
 
24
23
  // ── Internal WS lifecycle ──────────────────────────────────────────
@@ -273,11 +272,28 @@ WS.onEvent(ev => {
273
272
  break;
274
273
 
275
274
  case "error":
276
- if (!ev.session_id || ev.session_id === Sessions.activeId)
277
- Sessions.appendMsg("error", escapeHtml(ev.message));
275
+ if (!ev.session_id || ev.session_id === Sessions.activeId) {
276
+ renderErrorEvent(ev);
277
+ }
278
278
  break;
279
279
  }
280
280
  });
281
281
 
282
+ // ── Error rendering ────────────────────────────────────────────────────────
283
+
284
+ function renderErrorEvent(ev) {
285
+ if (ev.code === "insufficient_credit") {
286
+ const body = escapeHtml(I18n.t("error.insufficient_credit"));
287
+ const action = ev.top_up_url
288
+ ? ` <a href="${escapeHtml(ev.top_up_url)}" target="_blank" rel="noopener noreferrer">${escapeHtml(I18n.t("error.insufficient_credit.action"))} →</a>`
289
+ : "";
290
+ Sessions.appendMsg("error", `<span>${body}${action}</span>`);
291
+ return;
292
+ }
293
+ Sessions.appendMsg("error", escapeHtml(ev.message));
294
+ }
295
+
296
+ window.renderErrorEvent = renderErrorEvent;
297
+
282
298
 
283
299
  })();
data/lib/clacky.rb CHANGED
@@ -83,6 +83,7 @@ require_relative "clacky/idle_compression_timer"
83
83
  # Agent modules
84
84
  require_relative "clacky/agent/message_compressor"
85
85
  require_relative "clacky/agent/hook_manager"
86
+ require_relative "clacky/shell_hook_loader"
86
87
  require_relative "clacky/agent/tool_registry"
87
88
 
88
89
  # UI modules
@@ -132,10 +133,24 @@ require_relative "clacky/server/web_ui_controller"
132
133
  require_relative "clacky/server/browser_manager"
133
134
  require_relative "clacky/cli"
134
135
 
136
+ # Runtime patch layer: load user/AI patches from ~/.clacky/patches/ after all
137
+ # gem code is defined, so fingerprints reflect the actual installed source.
138
+ require_relative "clacky/patch_loader"
139
+ Clacky::PatchLoader.load_all
140
+
135
141
  module Clacky
136
142
  class AgentInterrupted < Exception; end # Inherit from Exception to bypass rescue StandardError
137
143
  class AgentError < StandardError; end
138
144
  class BadRequestError < AgentError; end # 400 errors — our request was malformed, history should be rolled back
145
+ class InsufficientCreditError < AgentError
146
+ attr_reader :error_code, :provider_id
147
+
148
+ def initialize(message, error_code: nil, provider_id: nil)
149
+ super(message)
150
+ @error_code = error_code
151
+ @provider_id = provider_id
152
+ end
153
+ end
139
154
  class RetryableError < StandardError; end # Transient errors that should be retried (5xx, HTML response, rate limit)
140
155
  # Upstream (model/router like OpenRouter/Bedrock) returned finish_reason="stop" together with
141
156
  # one or more tool_calls whose `arguments` JSON was truncated (empty, "{}" placeholder, or
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openclacky
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.6
4
+ version: 1.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - windy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-05-28 00:00:00.000000000 Z
11
+ date: 2026-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -374,6 +374,7 @@ files:
374
374
  - lib/clacky/default_skills/cron-task-creator/SKILL.md
375
375
  - lib/clacky/default_skills/cron-task-creator/evals/evals.json
376
376
  - lib/clacky/default_skills/deploy/SKILL.md
377
+ - lib/clacky/default_skills/extend-openclacky/SKILL.md
377
378
  - lib/clacky/default_skills/mcp-manager/SKILL.md
378
379
  - lib/clacky/default_skills/new/SKILL.md
379
380
  - lib/clacky/default_skills/new/scripts/create_rails_project.sh
@@ -417,6 +418,7 @@ files:
417
418
  - lib/clacky/message_format/open_ai.rb
418
419
  - lib/clacky/message_history.rb
419
420
  - lib/clacky/openai_stream_aggregator.rb
421
+ - lib/clacky/patch_loader.rb
420
422
  - lib/clacky/plain_ui_controller.rb
421
423
  - lib/clacky/platform_http_client.rb
422
424
  - lib/clacky/providers.rb
@@ -444,6 +446,7 @@ files:
444
446
  - lib/clacky/server/channel/channel_config.rb
445
447
  - lib/clacky/server/channel/channel_manager.rb
446
448
  - lib/clacky/server/channel/channel_ui_controller.rb
449
+ - lib/clacky/server/channel/user_adapter_loader.rb
447
450
  - lib/clacky/server/discover.rb
448
451
  - lib/clacky/server/epipe_safe_io.rb
449
452
  - lib/clacky/server/http_server.rb
@@ -452,6 +455,7 @@ files:
452
455
  - lib/clacky/server/session_registry.rb
453
456
  - lib/clacky/server/web_ui_controller.rb
454
457
  - lib/clacky/session_manager.rb
458
+ - lib/clacky/shell_hook_loader.rb
455
459
  - lib/clacky/skill.rb
456
460
  - lib/clacky/skill_loader.rb
457
461
  - lib/clacky/telemetry.rb
@@ -570,6 +574,7 @@ files:
570
574
  - lib/clacky/web/vendor/katex/katex.min.js
571
575
  - lib/clacky/web/version.js
572
576
  - lib/clacky/web/weixin-qr.html
577
+ - lib/clacky/web/workspace.js
573
578
  - lib/clacky/web/ws-dispatcher.js
574
579
  - lib/clacky/web/ws.js
575
580
  - scripts/build/build.sh