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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +34 -1
- data/benchmark/fixtures/sample_project/Gemfile +3 -0
- data/benchmark/fixtures/sample_project/lib/api_handler.rb +32 -0
- data/benchmark/fixtures/sample_project/lib/order_calculator.rb +23 -0
- data/benchmark/fixtures/sample_project/lib/user_renderer.rb +20 -0
- data/benchmark/fixtures/sample_project/spec/order_calculator_spec.rb +20 -0
- data/benchmark/results/EVALUATION_REPORT.md +165 -0
- data/benchmark/results/baseline_20260511_174424.json +128 -0
- data/benchmark/results/report_20260511_175256.json +271 -0
- data/benchmark/results/report_20260511_175444.json +271 -0
- data/benchmark/results/treatment_20260511_175103.json +130 -0
- data/benchmark/runner.rb +441 -0
- data/docs/proposals/2026-05-11-system-prompt-alignment.md +325 -0
- data/docs/proposals/2026-05-12-memory-mechanism-optimization.md +89 -0
- data/lib/clacky/agent/cost_tracker.rb +8 -2
- data/lib/clacky/agent/memory_updater.rb +41 -30
- data/lib/clacky/agent/skill_manager.rb +5 -2
- data/lib/clacky/agent/skill_reflector.rb +10 -1
- data/lib/clacky/agent.rb +4 -0
- data/lib/clacky/client.rb +15 -0
- data/lib/clacky/default_agents/base_prompt.md +20 -20
- data/lib/clacky/default_agents/coding/system_prompt.md +51 -1
- data/lib/clacky/default_skills/channel-setup/SKILL.md +190 -14
- data/lib/clacky/default_skills/channel-setup/discord_setup.rb +199 -0
- data/lib/clacky/default_skills/channel-setup/import_lark_skills.rb +97 -0
- data/lib/clacky/default_skills/onboard/SKILL.md +1 -1
- data/lib/clacky/default_skills/persist-memory/SKILL.md +59 -0
- data/lib/clacky/providers.rb +77 -10
- data/lib/clacky/server/channel/adapters/discord/adapter.rb +229 -0
- data/lib/clacky/server/channel/adapters/discord/api_client.rb +107 -0
- data/lib/clacky/server/channel/adapters/discord/gateway_client.rb +272 -0
- data/lib/clacky/server/channel/adapters/telegram/adapter.rb +375 -0
- data/lib/clacky/server/channel/adapters/telegram/api_client.rb +205 -0
- data/lib/clacky/server/channel/channel_config.rb +11 -0
- data/lib/clacky/server/channel.rb +2 -0
- data/lib/clacky/server/http_server.rb +69 -3
- data/lib/clacky/ui2/ui_controller.rb +2 -1
- data/lib/clacky/utils/file_processor.rb +71 -0
- data/lib/clacky/version.rb +1 -1
- data/lib/clacky/web/app.css +44 -0
- data/lib/clacky/web/channels.js +16 -0
- data/lib/clacky/web/i18n.js +24 -2
- data/lib/clacky/web/index.html +6 -1
- data/lib/clacky/web/settings.js +4 -0
- data/lib/clacky/web/version.js +52 -1
- metadata +37 -2
data/lib/clacky/web/version.js
CHANGED
|
@@ -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 (
|
|
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
|
+
{ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[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.
|
|
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-
|
|
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
|