openclacky 1.3.2 → 1.3.4

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 (107) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +54 -0
  3. data/Dockerfile +3 -0
  4. data/README.md +1 -1
  5. data/README_JA.md +237 -0
  6. data/docs/rich_ui_guide.md +277 -0
  7. data/docs/rich_ui_refactor_plan.md +396 -0
  8. data/lib/clacky/agent/llm_caller.rb +10 -4
  9. data/lib/clacky/agent/session_serializer.rb +52 -7
  10. data/lib/clacky/agent/time_machine.rb +247 -26
  11. data/lib/clacky/agent.rb +15 -3
  12. data/lib/clacky/api_extension.rb +262 -0
  13. data/lib/clacky/api_extension_loader.rb +156 -0
  14. data/lib/clacky/cli.rb +93 -3
  15. data/lib/clacky/client.rb +38 -13
  16. data/lib/clacky/default_agents/_panels/git/panel.js +201 -0
  17. data/lib/clacky/default_agents/_panels/time_machine/panel.js +640 -0
  18. data/lib/clacky/default_agents/coding/profile.yml +3 -0
  19. data/lib/clacky/default_agents/coding/webui/.gitkeep +0 -0
  20. data/lib/clacky/default_skills/cron-task-creator/SKILL.md +1 -1
  21. data/lib/clacky/default_skills/extend-openclacky/SKILL.md +6 -4
  22. data/lib/clacky/default_skills/media-gen/SKILL.md +37 -10
  23. data/lib/clacky/idle_compression_timer.rb +3 -1
  24. data/lib/clacky/locales/en.rb +26 -0
  25. data/lib/clacky/locales/i18n.rb +26 -0
  26. data/lib/clacky/locales/zh.rb +26 -0
  27. data/lib/clacky/media/openai_compat.rb +64 -1
  28. data/lib/clacky/message_history.rb +9 -0
  29. data/lib/clacky/rich_ui/components/base_component.rb +50 -0
  30. data/lib/clacky/rich_ui/components/dialogs/approval_dialog.rb +142 -0
  31. data/lib/clacky/rich_ui/components/dialogs/config_menu_dialog.rb +106 -0
  32. data/lib/clacky/rich_ui/components/dialogs/form_dialog.rb +128 -0
  33. data/lib/clacky/rich_ui/components/sidebar.rb +119 -0
  34. data/lib/clacky/rich_ui/components/sidebar_panels.rb +134 -0
  35. data/lib/clacky/rich_ui/components/status_view.rb +58 -0
  36. data/lib/clacky/rich_ui/components/thinking_live_view.rb +79 -0
  37. data/lib/clacky/rich_ui/entry_tracker.rb +56 -0
  38. data/lib/clacky/rich_ui/layout_adapter.rb +16 -0
  39. data/lib/clacky/rich_ui/progress_handle_adapter.rb +24 -0
  40. data/lib/clacky/rich_ui/rich_ui_controller.rb +868 -0
  41. data/lib/clacky/rich_ui/shell/rich_agent_shell.rb +184 -0
  42. data/lib/clacky/rich_ui/view_renderer.rb +291 -0
  43. data/lib/clacky/rich_ui.rb +57 -0
  44. data/lib/clacky/rich_ui_controller.rb +3 -1549
  45. data/lib/clacky/server/api_extension_dispatcher.rb +120 -0
  46. data/lib/clacky/server/channel/channel_manager.rb +26 -0
  47. data/lib/clacky/server/git_panel.rb +115 -0
  48. data/lib/clacky/server/http_server.rb +547 -15
  49. data/lib/clacky/server/server_master.rb +6 -4
  50. data/lib/clacky/server/session_registry.rb +1 -1
  51. data/lib/clacky/shell_hook_loader.rb +1 -1
  52. data/lib/clacky/tools/edit.rb +14 -2
  53. data/lib/clacky/ui2/ui_controller.rb +7 -0
  54. data/lib/clacky/version.rb +1 -1
  55. data/lib/clacky/web/app.css +511 -101
  56. data/lib/clacky/web/app.js +95 -14
  57. data/lib/clacky/web/components/code-editor.js +197 -0
  58. data/lib/clacky/web/{notify.js → components/notify.js} +1 -1
  59. data/lib/clacky/web/{onboard.js → components/onboard.js} +18 -2
  60. data/lib/clacky/web/core/aside.js +117 -0
  61. data/lib/clacky/web/core/ext.js +387 -0
  62. data/lib/clacky/web/features/backup/store.js +92 -0
  63. data/lib/clacky/web/features/backup/view.js +94 -0
  64. data/lib/clacky/web/features/billing/store.js +163 -0
  65. data/lib/clacky/web/{billing.js → features/billing/view.js} +132 -240
  66. data/lib/clacky/web/features/brand/store.js +110 -0
  67. data/lib/clacky/web/{brand.js → features/brand/view.js} +49 -199
  68. data/lib/clacky/web/features/channels/store.js +103 -0
  69. data/lib/clacky/web/{channels.js → features/channels/view.js} +50 -127
  70. data/lib/clacky/web/features/creator/store.js +81 -0
  71. data/lib/clacky/web/{creator.js → features/creator/view.js} +53 -102
  72. data/lib/clacky/web/features/mcp/store.js +158 -0
  73. data/lib/clacky/web/{mcp.js → features/mcp/view.js} +57 -134
  74. data/lib/clacky/web/features/model-tester/store.js +77 -0
  75. data/lib/clacky/web/features/model-tester/view.js +7 -0
  76. data/lib/clacky/web/features/profile/store.js +170 -0
  77. data/lib/clacky/web/{profile.js → features/profile/view.js} +94 -144
  78. data/lib/clacky/web/features/share/store.js +145 -0
  79. data/lib/clacky/web/{share.js → features/share/view.js} +66 -202
  80. data/lib/clacky/web/features/skills/store.js +331 -0
  81. data/lib/clacky/web/features/skills/view.js +581 -0
  82. data/lib/clacky/web/features/tasks/store.js +135 -0
  83. data/lib/clacky/web/features/tasks/view.js +241 -0
  84. data/lib/clacky/web/features/trash/store.js +242 -0
  85. data/lib/clacky/web/{trash.js → features/trash/view.js} +102 -293
  86. data/lib/clacky/web/features/version/store.js +165 -0
  87. data/lib/clacky/web/features/version/view.js +323 -0
  88. data/lib/clacky/web/features/workspace/store.js +99 -0
  89. data/lib/clacky/web/features/workspace/view.js +305 -0
  90. data/lib/clacky/web/i18n.js +68 -6
  91. data/lib/clacky/web/index.html +113 -62
  92. data/lib/clacky/web/sessions.js +493 -39
  93. data/lib/clacky/web/settings.js +143 -49
  94. data/lib/clacky/web/skills.js +3 -863
  95. data/lib/clacky/web/vendor/codemirror/codemirror.min.js +29 -0
  96. data/lib/clacky/web/ws-dispatcher.js +7 -3
  97. data/lib/clacky.rb +17 -1
  98. metadata +81 -20
  99. data/lib/clacky/web/backup.js +0 -119
  100. data/lib/clacky/web/model-tester.js +0 -66
  101. data/lib/clacky/web/tasks.js +0 -373
  102. data/lib/clacky/web/version.js +0 -449
  103. data/lib/clacky/web/workspace.js +0 -316
  104. /data/lib/clacky/web/{notify.mp3 → assets/notify.mp3} +0 -0
  105. /data/lib/clacky/web/{datepicker.js → components/datepicker.js} +0 -0
  106. /data/lib/clacky/web/{sidebar.js → components/sidebar.js} +0 -0
  107. /data/lib/clacky/web/{marked.min.js → vendor/marked/marked.min.js} +0 -0
@@ -36,6 +36,7 @@ module Clacky
36
36
  @worker_pid = nil
37
37
  @restart_requested = false
38
38
  @shutdown_requested = false
39
+ @shutdown_signal = nil
39
40
  end
40
41
 
41
42
  def run
@@ -68,9 +69,9 @@ module Clacky
68
69
 
69
70
  # 3. Signal handlers
70
71
  Signal.trap("USR1") { @restart_requested = true }
71
- Signal.trap("TERM") { @shutdown_requested = true }
72
- Signal.trap("INT") { @shutdown_requested = true }
73
- Signal.trap("HUP") { @shutdown_requested = true }
72
+ Signal.trap("TERM") { @shutdown_signal = "TERM"; @shutdown_requested = true }
73
+ Signal.trap("INT") { @shutdown_signal = "INT"; @shutdown_requested = true }
74
+ Signal.trap("HUP") { @shutdown_signal = "HUP"; @shutdown_requested = true }
74
75
 
75
76
  # 4. Spawn first worker
76
77
  @worker_pid = spawn_worker
@@ -184,7 +185,8 @@ module Clacky
184
185
  end
185
186
 
186
187
  def shutdown
187
- Clacky::Logger.info("[Master] Shutting down (worker PID=#{@worker_pid})...")
188
+ reason = @shutdown_signal ? "signal=SIG#{@shutdown_signal}" : "signal=none"
189
+ Clacky::Logger.info("[Master] Shutting down (worker PID=#{@worker_pid}) #{reason}...")
188
190
  if @worker_pid
189
191
  begin
190
192
  # TERM the entire worker process group so grandchildren (node MCP, etc.)
@@ -440,7 +440,7 @@ module Clacky
440
440
 
441
441
  private def persist_and_release(id, session)
442
442
  agent = session[:agent]
443
- @session_manager&.save(agent.to_session_data(status: :success)) if agent
443
+ @session_manager&.save(agent.to_session_data(status: :success, preserve_updated_at: true)) if agent
444
444
 
445
445
  @mutex.synchronize do
446
446
  s = @sessions[id]
@@ -178,4 +178,4 @@ module Clacky
178
178
  base
179
179
  end
180
180
  end
181
- end
181
+ end
@@ -67,8 +67,20 @@ module Clacky
67
67
  }
68
68
  end
69
69
 
70
- # Perform replacement
71
- content = replace_all ? content.gsub(actual_old_string, new_string) : content.sub(actual_old_string, new_string)
70
+ # Perform literal replacement.
71
+ #
72
+ # NOTE: Use the block form (`sub(old) { new }`) instead of the
73
+ # two-arg form (`sub(old, new)`). The two-arg form interprets
74
+ # backslash escapes (\&, \1, \`, \', \\) in the replacement
75
+ # as sed-style backreferences, silently mangling literal
76
+ # backslashes and these escape sequences. The block form
77
+ # performs no such interpretation, matching the edit tool's
78
+ # literal-replacement contract.
79
+ content = if replace_all
80
+ content.gsub(actual_old_string) { new_string }
81
+ else
82
+ content.sub(actual_old_string) { new_string }
83
+ end
72
84
 
73
85
  File.write(path, content)
74
86
 
@@ -47,6 +47,7 @@ module Clacky
47
47
  @input_callback = nil
48
48
  @interrupt_callback = nil
49
49
  @time_machine_callback = nil
50
+ @model_switch_callback = nil
50
51
  @tasks_count = 0
51
52
  @total_cost = 0.0
52
53
  @session_id = nil
@@ -192,6 +193,12 @@ module Clacky
192
193
  @time_machine_callback = block
193
194
  end
194
195
 
196
+ # Set callback for model switch (from /model slash command)
197
+ # @param block [Proc] Callback to execute on model switch
198
+ def on_model_switch(&block)
199
+ @model_switch_callback = block
200
+ end
201
+
195
202
  # Set agent for command suggestions
196
203
  # @param agent [Clacky::Agent] The agent instance with skill management
197
204
  # @param agent_profile [Clacky::AgentProfile, nil] Current agent profile for skill filtering
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Clacky
4
- VERSION = "1.3.2"
4
+ VERSION = "1.3.4"
5
5
  end