openclacky 1.0.3 → 1.0.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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -1
  3. data/benchmark/fixtures/sample_project/Gemfile +3 -0
  4. data/benchmark/fixtures/sample_project/lib/api_handler.rb +32 -0
  5. data/benchmark/fixtures/sample_project/lib/order_calculator.rb +23 -0
  6. data/benchmark/fixtures/sample_project/lib/user_renderer.rb +20 -0
  7. data/benchmark/fixtures/sample_project/spec/order_calculator_spec.rb +20 -0
  8. data/benchmark/results/EVALUATION_REPORT.md +165 -0
  9. data/benchmark/results/baseline_20260511_174424.json +128 -0
  10. data/benchmark/results/report_20260511_175256.json +271 -0
  11. data/benchmark/results/report_20260511_175444.json +271 -0
  12. data/benchmark/results/treatment_20260511_175103.json +130 -0
  13. data/benchmark/runner.rb +441 -0
  14. data/docs/proposals/2026-05-11-system-prompt-alignment.md +325 -0
  15. data/docs/proposals/2026-05-12-memory-mechanism-optimization.md +89 -0
  16. data/lib/clacky/agent/cost_tracker.rb +8 -2
  17. data/lib/clacky/agent/memory_updater.rb +41 -30
  18. data/lib/clacky/agent/skill_manager.rb +5 -2
  19. data/lib/clacky/agent/skill_reflector.rb +10 -1
  20. data/lib/clacky/agent.rb +4 -0
  21. data/lib/clacky/client.rb +15 -0
  22. data/lib/clacky/default_agents/base_prompt.md +20 -20
  23. data/lib/clacky/default_agents/coding/system_prompt.md +51 -1
  24. data/lib/clacky/default_skills/channel-setup/SKILL.md +190 -14
  25. data/lib/clacky/default_skills/channel-setup/discord_setup.rb +199 -0
  26. data/lib/clacky/default_skills/channel-setup/import_lark_skills.rb +97 -0
  27. data/lib/clacky/default_skills/onboard/SKILL.md +1 -1
  28. data/lib/clacky/default_skills/persist-memory/SKILL.md +59 -0
  29. data/lib/clacky/providers.rb +77 -10
  30. data/lib/clacky/server/channel/adapters/discord/adapter.rb +229 -0
  31. data/lib/clacky/server/channel/adapters/discord/api_client.rb +107 -0
  32. data/lib/clacky/server/channel/adapters/discord/gateway_client.rb +272 -0
  33. data/lib/clacky/server/channel/adapters/telegram/adapter.rb +375 -0
  34. data/lib/clacky/server/channel/adapters/telegram/api_client.rb +205 -0
  35. data/lib/clacky/server/channel/channel_config.rb +11 -0
  36. data/lib/clacky/server/channel.rb +2 -0
  37. data/lib/clacky/server/http_server.rb +69 -3
  38. data/lib/clacky/ui2/ui_controller.rb +2 -1
  39. data/lib/clacky/utils/file_processor.rb +71 -0
  40. data/lib/clacky/version.rb +1 -1
  41. data/lib/clacky/web/app.css +44 -0
  42. data/lib/clacky/web/channels.js +16 -0
  43. data/lib/clacky/web/i18n.js +24 -2
  44. data/lib/clacky/web/index.html +6 -1
  45. data/lib/clacky/web/settings.js +4 -0
  46. data/lib/clacky/web/version.js +52 -1
  47. metadata +37 -2
@@ -26,9 +26,14 @@ const Version = (() => {
26
26
  let _needsRestart = false; // upgrade done, waiting for restart
27
27
  let _reconnecting = false; // restart sent, polling for server to come back
28
28
  let _upgradeDone = false; // restarted and reconnected successfully
29
+ let _restartFailed = false; // 30s passed, server still not responding
29
30
  let _popoverOpen = false;
30
31
  let _reconnectTimer = null;
32
+ let _reconnectDeadline = 0;
31
33
  let _logLines = [];
34
+ let _cliCommand = "openclacky";
35
+
36
+ const RECONNECT_TIMEOUT_MS = 30_000;
32
37
 
33
38
  // ── DOM helpers ────────────────────────────────────────────────────────
34
39
  const $ = id => document.getElementById(id);
@@ -52,6 +57,7 @@ const Version = (() => {
52
57
  _current = data.current;
53
58
  _latest = data.latest;
54
59
  _needsUpdate = !!data.needs_update;
60
+ if (data.cli_command) _cliCommand = data.cli_command;
55
61
  _renderBadge();
56
62
  } catch (e) {
57
63
  console.warn("[Version] check failed:", e);
@@ -133,7 +139,9 @@ const Version = (() => {
133
139
  const pop = _getOrCreatePopover();
134
140
  pop.innerHTML = "";
135
141
 
136
- if (_reconnecting) {
142
+ if (_restartFailed) {
143
+ _renderRestartFailedState(pop);
144
+ } else if (_reconnecting) {
137
145
  _renderReconnectState(pop);
138
146
  } else if (_upgrading) {
139
147
  _renderProgressState(pop);
@@ -233,6 +241,29 @@ const Version = (() => {
233
241
  `;
234
242
  }
235
243
 
244
+ /** State 5: restart timed out — show both recovery paths (tray + CLI) */
245
+ function _renderRestartFailedState(pop) {
246
+ const safeCmd = String(_cliCommand).replace(/[&<>"']/g, c => (
247
+ { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }[c]
248
+ ));
249
+ const cmd = `<code class="vup-cmd">${safeCmd} server</code>`;
250
+ pop.innerHTML = `
251
+ <div class="vup-restart-failed">
252
+ <p class="vup-restart-failed-title">⚠ ${I18n.t("upgrade.restart.timeout.title")}</p>
253
+ <p class="vup-restart-failed-desc">${I18n.t("upgrade.restart.timeout.desc")}</p>
254
+ <ul class="vup-restart-failed-options">
255
+ <li>${I18n.t("upgrade.restart.timeout.tray")}</li>
256
+ <li>${I18n.t("upgrade.restart.timeout.cli", { cmd })}</li>
257
+ </ul>
258
+ <div class="vup-actions">
259
+ <button id="vup-btn-retry" class="vup-btn-primary">${I18n.t("upgrade.restart.timeout.retry")}</button>
260
+ </div>
261
+ </div>
262
+ `;
263
+ const retry = $("vup-btn-retry");
264
+ if (retry) retry.addEventListener("click", _retryReconnect);
265
+ }
266
+
236
267
  // ── Upgrade ────────────────────────────────────────────────────────────
237
268
  async function _startUpgrade(pop) {
238
269
  if (_upgrading || _upgradeDone) return;
@@ -273,8 +304,19 @@ const Version = (() => {
273
304
 
274
305
  function _waitForReconnect() {
275
306
  if (_reconnectTimer) clearInterval(_reconnectTimer);
307
+ _reconnectDeadline = Date.now() + RECONNECT_TIMEOUT_MS;
276
308
  setTimeout(() => {
277
309
  _reconnectTimer = setInterval(async () => {
310
+ if (Date.now() > _reconnectDeadline) {
311
+ clearInterval(_reconnectTimer);
312
+ _reconnectTimer = null;
313
+ _reconnecting = false;
314
+ _restartFailed = true;
315
+ _renderBadge();
316
+ const pop = $("version-upgrade-popover");
317
+ if (pop && _popoverOpen) _renderRestartFailedState(pop);
318
+ return;
319
+ }
278
320
  try {
279
321
  const res = await fetch("/api/version", { cache: "no-store" });
280
322
  if (res.ok) {
@@ -293,6 +335,15 @@ const Version = (() => {
293
335
  }, 2500);
294
336
  }
295
337
 
338
+ function _retryReconnect() {
339
+ _restartFailed = false;
340
+ _reconnecting = true;
341
+ const pop = $("version-upgrade-popover");
342
+ if (pop && _popoverOpen) _renderReconnectState(pop);
343
+ _renderBadge();
344
+ _waitForReconnect();
345
+ }
346
+
296
347
  // ── WebSocket events ───────────────────────────────────────────────────
297
348
  function _handleWsEvent(event) {
298
349
  if (event.type === "upgrade_log") {
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.0.3
4
+ version: 1.0.5
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-09 00:00:00.000000000 Z
11
+ date: 2026-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -156,6 +156,20 @@ dependencies:
156
156
  - - ">="
157
157
  - !ruby/object:Gem::Version
158
158
  version: 0.1.0
159
+ - !ruby/object:Gem::Dependency
160
+ name: logger
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '1.4'
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '1.4'
159
173
  - !ruby/object:Gem::Dependency
160
174
  name: websocket
161
175
  requirement: !ruby/object:Gem::Requirement
@@ -269,6 +283,17 @@ files:
269
283
  - LICENSE.txt
270
284
  - README.md
271
285
  - Rakefile
286
+ - benchmark/fixtures/sample_project/Gemfile
287
+ - benchmark/fixtures/sample_project/lib/api_handler.rb
288
+ - benchmark/fixtures/sample_project/lib/order_calculator.rb
289
+ - benchmark/fixtures/sample_project/lib/user_renderer.rb
290
+ - benchmark/fixtures/sample_project/spec/order_calculator_spec.rb
291
+ - benchmark/results/EVALUATION_REPORT.md
292
+ - benchmark/results/baseline_20260511_174424.json
293
+ - benchmark/results/report_20260511_175256.json
294
+ - benchmark/results/report_20260511_175444.json
295
+ - benchmark/results/treatment_20260511_175103.json
296
+ - benchmark/runner.rb
272
297
  - bin/clacky
273
298
  - bin/clarky
274
299
  - bin/openclacky
@@ -286,6 +311,8 @@ files:
286
311
  - docs/install-script-simplification.md
287
312
  - docs/memory-architecture.md
288
313
  - docs/openclacky_cloud_api_reference.md
314
+ - docs/proposals/2026-05-11-system-prompt-alignment.md
315
+ - docs/proposals/2026-05-12-memory-mechanism-optimization.md
289
316
  - docs/security-design.md
290
317
  - docs/session-management-redesign.md
291
318
  - docs/session-skill-invocation.md
@@ -337,7 +364,9 @@ files:
337
364
  - lib/clacky/default_parsers/xlsx_parser.rb
338
365
  - lib/clacky/default_skills/browser-setup/SKILL.md
339
366
  - lib/clacky/default_skills/channel-setup/SKILL.md
367
+ - lib/clacky/default_skills/channel-setup/discord_setup.rb
340
368
  - lib/clacky/default_skills/channel-setup/feishu_setup.rb
369
+ - lib/clacky/default_skills/channel-setup/import_lark_skills.rb
341
370
  - lib/clacky/default_skills/channel-setup/weixin_setup.rb
342
371
  - lib/clacky/default_skills/code-explorer/SKILL.md
343
372
  - lib/clacky/default_skills/cron-task-creator/SKILL.md
@@ -348,6 +377,7 @@ files:
348
377
  - lib/clacky/default_skills/onboard/SKILL.md
349
378
  - lib/clacky/default_skills/onboard/scripts/import_external_skills.rb
350
379
  - lib/clacky/default_skills/onboard/scripts/install_builtin_skills.rb
380
+ - lib/clacky/default_skills/persist-memory/SKILL.md
351
381
  - lib/clacky/default_skills/personal-website/SKILL.md
352
382
  - lib/clacky/default_skills/personal-website/publish.rb
353
383
  - lib/clacky/default_skills/product-help/SKILL.md
@@ -382,11 +412,16 @@ files:
382
412
  - lib/clacky/server/browser_manager.rb
383
413
  - lib/clacky/server/channel.rb
384
414
  - lib/clacky/server/channel/adapters/base.rb
415
+ - lib/clacky/server/channel/adapters/discord/adapter.rb
416
+ - lib/clacky/server/channel/adapters/discord/api_client.rb
417
+ - lib/clacky/server/channel/adapters/discord/gateway_client.rb
385
418
  - lib/clacky/server/channel/adapters/feishu/adapter.rb
386
419
  - lib/clacky/server/channel/adapters/feishu/bot.rb
387
420
  - lib/clacky/server/channel/adapters/feishu/file_processor.rb
388
421
  - lib/clacky/server/channel/adapters/feishu/message_parser.rb
389
422
  - lib/clacky/server/channel/adapters/feishu/ws_client.rb
423
+ - lib/clacky/server/channel/adapters/telegram/adapter.rb
424
+ - lib/clacky/server/channel/adapters/telegram/api_client.rb
390
425
  - lib/clacky/server/channel/adapters/wecom/adapter.rb
391
426
  - lib/clacky/server/channel/adapters/wecom/media_downloader.rb
392
427
  - lib/clacky/server/channel/adapters/wecom/ws_client.rb