kward 0.76.0 → 0.77.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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +8 -1
  3. data/CHANGELOG.md +36 -0
  4. data/Gemfile.lock +2 -2
  5. data/README.md +12 -4
  6. data/doc/agent-tools.md +0 -3
  7. data/doc/api.md +4 -0
  8. data/doc/composer.md +219 -0
  9. data/doc/configuration.md +75 -27
  10. data/doc/editor.md +18 -2
  11. data/doc/files.md +1 -1
  12. data/doc/getting-started.md +4 -0
  13. data/doc/git.md +2 -2
  14. data/doc/lifecycle-hooks.md +2 -14
  15. data/doc/pan.md +167 -0
  16. data/doc/rpc.md +0 -22
  17. data/doc/security.md +180 -0
  18. data/doc/usage.md +15 -32
  19. data/lib/kward/ansi.rb +2 -2
  20. data/lib/kward/cancellation.rb +2 -2
  21. data/lib/kward/cli/commands.rb +1 -3
  22. data/lib/kward/cli/interactive_turn.rb +0 -17
  23. data/lib/kward/cli/plugins.rb +2 -7
  24. data/lib/kward/cli/prompt_interface.rb +1 -0
  25. data/lib/kward/cli/runtime_helpers.rb +0 -38
  26. data/lib/kward/cli/sessions.rb +14 -5
  27. data/lib/kward/cli/settings.rb +22 -0
  28. data/lib/kward/cli/slash_commands.rb +1 -561
  29. data/lib/kward/cli/tabs.rb +14 -2
  30. data/lib/kward/cli.rb +1 -17
  31. data/lib/kward/compactor.rb +3 -3
  32. data/lib/kward/config_files.rb +18 -0
  33. data/lib/kward/ekwsh.rb +0 -4
  34. data/lib/kward/hooks/catalog.rb +0 -5
  35. data/lib/kward/image_attachments.rb +1 -1
  36. data/lib/kward/pan/index.html.erb +459 -64
  37. data/lib/kward/pan/kward_logo.png +0 -0
  38. data/lib/kward/pan/server.rb +248 -23
  39. data/lib/kward/plugin_registry.rb +18 -0
  40. data/lib/kward/prompt_interface/editor/auto_indent.rb +31 -23
  41. data/lib/kward/prompt_interface/editor/modes/vibe.rb +72 -3
  42. data/lib/kward/prompt_interface/layout.rb +0 -4
  43. data/lib/kward/prompt_interface/project_browser.rb +40 -1
  44. data/lib/kward/prompt_interface/runtime_state.rb +4 -0
  45. data/lib/kward/prompt_interface/selection_prompt.rb +0 -1
  46. data/lib/kward/prompt_interface/transcript_renderer.rb +0 -12
  47. data/lib/kward/prompt_interface.rb +18 -1
  48. data/lib/kward/prompts/commands.rb +1 -3
  49. data/lib/kward/prompts.rb +20 -0
  50. data/lib/kward/rpc/server.rb +13 -41
  51. data/lib/kward/rpc/session_manager.rb +75 -25
  52. data/lib/kward/rpc/tool_event_normalizer.rb +2 -0
  53. data/lib/kward/rpc/tool_metadata.rb +23 -0
  54. data/lib/kward/rpc/transcript_normalizer.rb +4 -0
  55. data/lib/kward/session_store.rb +55 -16
  56. data/lib/kward/skills/registry.rb +21 -1
  57. data/lib/kward/tools/base.rb +14 -0
  58. data/lib/kward/tools/registry.rb +11 -16
  59. data/lib/kward/tools/search/code.rb +1 -1
  60. data/lib/kward/tools/search/web.rb +1 -1
  61. data/lib/kward/tools/tool_call.rb +0 -4
  62. data/lib/kward/transcript_export.rb +1 -1
  63. data/lib/kward/version.rb +1 -1
  64. data/templates/default/kward_navigation.rb +5 -1
  65. data/templates/default/layout/html/layout.erb +0 -2
  66. metadata +5 -12
  67. data/lib/kward/workers/git_guard.rb +0 -93
  68. data/lib/kward/workers/job.rb +0 -99
  69. data/lib/kward/workers/live_view.rb +0 -49
  70. data/lib/kward/workers/manager.rb +0 -328
  71. data/lib/kward/workers/queue_runner.rb +0 -166
  72. data/lib/kward/workers/queue_store.rb +0 -112
  73. data/lib/kward/workers/store.rb +0 -72
  74. data/lib/kward/workers/tool_policy.rb +0 -23
  75. data/lib/kward/workers/worker.rb +0 -82
  76. data/lib/kward/workers/write_lock.rb +0 -38
  77. data/lib/kward/workers.rb +0 -10
@@ -1,82 +0,0 @@
1
- require "securerandom"
2
- require "time"
3
- require_relative "../config_files"
4
- require_relative "../cancellation"
5
-
6
- module Kward
7
- module Workers
8
- # Runtime record for one independent unit of agent work.
9
- class Worker
10
- STATUSES = %w[idle queued running ready failed cancelled archived].freeze
11
-
12
- def initialize(id: SecureRandom.hex(4), title:, role:, workspace_root: Dir.pwd, status: "idle", prompt: nil, conversation: nil, session: nil, cancellation: Cancellation.new, created_at: Time.now.utc)
13
- @id = id
14
- @title = title.to_s
15
- @role = role.to_s
16
- @workspace_root = ConfigFiles.canonical_workspace_root(workspace_root)
17
- @status = status.to_s
18
- @prompt = prompt.to_s
19
- @conversation = conversation
20
- @session = session
21
- @cancellation = cancellation
22
- @created_at = created_at
23
- @updated_at = created_at
24
- @started_at = nil
25
- @finished_at = nil
26
- @report = nil
27
- @error = nil
28
- @thread = nil
29
- @event_history = []
30
- @event_queue = Queue.new
31
- end
32
-
33
- attr_reader :id, :title, :role, :workspace_root, :prompt, :conversation, :session, :cancellation, :created_at, :updated_at, :started_at, :finished_at, :report, :error, :thread, :event_history, :event_queue
34
- attr_writer :conversation, :session, :thread
35
-
36
- def status
37
- @status
38
- end
39
-
40
- def update_status(status, error: nil, report: nil)
41
- @status = status.to_s
42
- @error = error unless error.nil?
43
- @report = report unless report.nil?
44
- now = Time.now.utc
45
- @updated_at = now
46
- @started_at ||= now if @status == "running"
47
- @finished_at = now if %w[ready failed cancelled archived].include?(@status)
48
- self
49
- end
50
-
51
- def record_event(event)
52
- @event_history << event
53
- @event_queue << event
54
- end
55
-
56
- def to_h
57
- {
58
- "id" => id,
59
- "title" => title,
60
- "role" => role,
61
- "status" => status,
62
- "prompt" => prompt,
63
- "workspace_root" => workspace_root,
64
- "session_id" => session&.id,
65
- "session_path" => session&.path,
66
- "created_at" => timestamp(created_at),
67
- "updated_at" => timestamp(updated_at),
68
- "started_at" => timestamp(started_at),
69
- "finished_at" => timestamp(finished_at),
70
- "report" => report,
71
- "error" => error
72
- }
73
- end
74
-
75
- private
76
-
77
- def timestamp(value)
78
- value&.utc&.iso8601(3)
79
- end
80
- end
81
- end
82
- end
@@ -1,38 +0,0 @@
1
- require "thread"
2
-
3
- module Kward
4
- module Workers
5
- # Cooperative ownership guard for workspace-mutating worker tools.
6
- class WriteLock
7
- def initialize
8
- @owner_id = nil
9
- @mutex = Mutex.new
10
- end
11
-
12
- attr_reader :owner_id
13
-
14
- def acquire(owner_id)
15
- owner = owner_id.to_s
16
- return false if owner.empty?
17
-
18
- @mutex.synchronize do
19
- return true if @owner_id == owner
20
- return false if @owner_id
21
-
22
- @owner_id = owner
23
- true
24
- end
25
- end
26
-
27
- def owned_by?(owner_id)
28
- @mutex.synchronize { @owner_id == owner_id.to_s }
29
- end
30
-
31
- def release(owner_id)
32
- @mutex.synchronize do
33
- @owner_id = nil if @owner_id == owner_id.to_s
34
- end
35
- end
36
- end
37
- end
38
- end
data/lib/kward/workers.rb DELETED
@@ -1,10 +0,0 @@
1
- require_relative "workers/git_guard"
2
- require_relative "workers/job"
3
- require_relative "workers/live_view"
4
- require_relative "workers/manager"
5
- require_relative "workers/queue_runner"
6
- require_relative "workers/queue_store"
7
- require_relative "workers/store"
8
- require_relative "workers/tool_policy"
9
- require_relative "workers/write_lock"
10
- require_relative "workers/worker"