kward 0.71.0 → 0.73.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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +30 -0
- data/CHANGELOG.md +93 -0
- data/Gemfile.lock +2 -2
- data/README.md +4 -0
- data/doc/agent-tools.md +15 -6
- data/doc/authentication.md +22 -1
- data/doc/code-search.md +42 -2
- data/doc/configuration.md +106 -3
- data/doc/context-budgeting.md +136 -0
- data/doc/context-tools.md +16 -3
- data/doc/editor.md +415 -0
- data/doc/extensibility.md +16 -7
- data/doc/files.md +100 -0
- data/doc/getting-started.md +25 -18
- data/doc/git.md +123 -0
- data/doc/memory.md +24 -4
- data/doc/personas.md +34 -5
- data/doc/plugins.md +72 -1
- data/doc/releasing.md +37 -9
- data/doc/rpc.md +75 -5
- data/doc/session-management.md +35 -1
- data/doc/shell.md +332 -0
- data/doc/tabs.md +122 -0
- data/doc/troubleshooting.md +77 -1
- data/doc/usage.md +79 -7
- data/doc/web-search.md +12 -4
- data/doc/workspace-tools.md +51 -12
- data/examples/plugins/space_invaders.rb +377 -0
- data/lib/kward/agent.rb +1 -1
- data/lib/kward/ansi.rb +62 -23
- data/lib/kward/cli/commands.rb +33 -2
- data/lib/kward/cli/git.rb +150 -0
- data/lib/kward/cli/interactive_turn.rb +73 -9
- data/lib/kward/cli/plugins.rb +54 -4
- data/lib/kward/cli/prompt_interface.rb +32 -1
- data/lib/kward/cli/rendering.rb +4 -1
- data/lib/kward/cli/runtime_helpers.rb +268 -4
- data/lib/kward/cli/sessions.rb +2 -2
- data/lib/kward/cli/settings.rb +217 -9
- data/lib/kward/cli/slash_commands.rb +628 -2
- data/lib/kward/cli/tabs.rb +725 -0
- data/lib/kward/cli/tool_summaries.rb +6 -0
- data/lib/kward/cli.rb +150 -26
- data/lib/kward/clipboard.rb +2 -3
- data/lib/kward/compactor.rb +7 -19
- data/lib/kward/config_files.rb +145 -1
- data/lib/kward/context_budget_meter.rb +44 -0
- data/lib/kward/conversation.rb +12 -4
- data/lib/kward/editor_mode.rb +25 -0
- data/lib/kward/ekwsh.rb +559 -0
- data/lib/kward/image_attachments.rb +3 -1
- data/lib/kward/interactive_pty_runner.rb +151 -0
- data/lib/kward/local_command_runner.rb +155 -0
- data/lib/kward/local_pty_command_runner.rb +171 -0
- data/lib/kward/model/context_usage.rb +2 -2
- data/lib/kward/model/payloads.rb +2 -5
- data/lib/kward/plugin_registry.rb +61 -0
- data/lib/kward/project_files.rb +52 -0
- data/lib/kward/prompt_history.rb +84 -0
- data/lib/kward/prompt_interface/composer_controller.rb +69 -1
- data/lib/kward/prompt_interface/composer_renderer.rb +109 -13
- data/lib/kward/prompt_interface/composer_state.rb +96 -27
- data/lib/kward/prompt_interface/editor/auto_close_pairs.rb +123 -0
- data/lib/kward/prompt_interface/editor/auto_indent.rb +510 -0
- data/lib/kward/prompt_interface/editor/buffer.rb +109 -0
- data/lib/kward/prompt_interface/editor/controller.rb +1218 -0
- data/lib/kward/prompt_interface/editor/endwise.rb +321 -0
- data/lib/kward/prompt_interface/editor/file_marker.rb +40 -0
- data/lib/kward/prompt_interface/editor/indent_navigation.rb +61 -0
- data/lib/kward/prompt_interface/editor/kill_ring.rb +78 -0
- data/lib/kward/prompt_interface/editor/modes/emacs.rb +259 -0
- data/lib/kward/prompt_interface/editor/modes/modern.rb +354 -0
- data/lib/kward/prompt_interface/editor/modes/vibe.rb +1812 -0
- data/lib/kward/prompt_interface/editor/modes/vibe_insert_readline.rb +166 -0
- data/lib/kward/prompt_interface/editor/renderer.rb +244 -0
- data/lib/kward/prompt_interface/editor/search.rb +76 -0
- data/lib/kward/prompt_interface/editor/selections.rb +120 -0
- data/lib/kward/prompt_interface/editor/state.rb +1271 -0
- data/lib/kward/prompt_interface/editor/status_text.rb +23 -0
- data/lib/kward/prompt_interface/editor/syntax_highlighter.rb +422 -0
- data/lib/kward/prompt_interface/editor/undo_history.rb +46 -0
- data/lib/kward/prompt_interface/editor/vibe_state.rb +44 -0
- data/lib/kward/prompt_interface/file_overlay.rb +211 -0
- data/lib/kward/prompt_interface/git_prompt.rb +288 -0
- data/lib/kward/prompt_interface/interactive/controller.rb +186 -0
- data/lib/kward/prompt_interface/interactive/renderer.rb +71 -0
- data/lib/kward/prompt_interface/interactive/state.rb +62 -0
- data/lib/kward/prompt_interface/key_handler.rb +451 -57
- data/lib/kward/prompt_interface/overlay_renderer.rb +21 -2
- data/lib/kward/prompt_interface/project_browser.rb +524 -0
- data/lib/kward/prompt_interface/question_prompt.rb +99 -56
- data/lib/kward/prompt_interface/runtime_state.rb +43 -0
- data/lib/kward/prompt_interface/screen.rb +19 -3
- data/lib/kward/prompt_interface/selection_prompt.rb +10 -19
- data/lib/kward/prompt_interface/slash_overlay.rb +2 -0
- data/lib/kward/prompt_interface/stream_state.rb +7 -0
- data/lib/kward/prompt_interface/transcript_buffer.rb +6 -0
- data/lib/kward/prompt_interface.rb +366 -222
- data/lib/kward/prompts/commands.rb +9 -0
- data/lib/kward/prompts.rb +2 -0
- data/lib/kward/rpc/memory_methods.rb +83 -0
- data/lib/kward/rpc/server.rb +169 -83
- data/lib/kward/rpc/session_manager.rb +45 -121
- data/lib/kward/rpc/session_tree_rows.rb +9 -115
- data/lib/kward/rpc/tool_event_normalizer.rb +1 -1
- data/lib/kward/rpc/tool_metadata.rb +11 -0
- data/lib/kward/rpc/transcript_normalizer.rb +4 -39
- data/lib/kward/scratchpad_runner.rb +56 -0
- data/lib/kward/session_diff.rb +20 -3
- data/lib/kward/session_naming.rb +11 -0
- data/lib/kward/session_store.rb +44 -0
- data/lib/kward/session_tree_nodes.rb +136 -0
- data/lib/kward/session_tree_renderer.rb +9 -131
- data/lib/kward/tab_store.rb +47 -0
- data/lib/kward/terminal_keys.rb +84 -0
- data/lib/kward/terminal_sequences.rb +42 -0
- data/lib/kward/text_boundary.rb +25 -0
- data/lib/kward/tools/context_budget_stats.rb +54 -0
- data/lib/kward/tools/context_for_task.rb +204 -0
- data/lib/kward/tools/read_file.rb +8 -4
- data/lib/kward/tools/registry.rb +62 -16
- data/lib/kward/tools/tool_call.rb +10 -0
- data/lib/kward/version.rb +1 -1
- data/lib/kward/workers/git_guard.rb +93 -0
- data/lib/kward/workers/job.rb +99 -0
- data/lib/kward/workers/live_view.rb +49 -0
- data/lib/kward/workers/manager.rb +288 -0
- data/lib/kward/workers/queue_runner.rb +166 -0
- data/lib/kward/workers/queue_store.rb +112 -0
- data/lib/kward/workers/store.rb +72 -0
- data/lib/kward/workers/tool_policy.rb +23 -0
- data/lib/kward/workers/worker.rb +82 -0
- data/lib/kward/workers/write_lock.rb +38 -0
- data/lib/kward/workers.rb +10 -0
- data/lib/kward/workspace.rb +125 -87
- data/templates/default/fulldoc/html/css/kward.css +140 -36
- data/templates/default/fulldoc/html/images/kward_screen_1.png +0 -0
- data/templates/default/fulldoc/html/setup.rb +1 -0
- data/templates/default/kward_navigation.rb +12 -1
- data/templates/default/layout/html/layout.erb +23 -34
- data/templates/default/layout/html/setup.rb +6 -0
- metadata +67 -1
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Namespace for the Kward CLI agent runtime.
|
|
2
|
+
module Kward
|
|
3
|
+
# Interactive terminal UI used by the CLI frontend.
|
|
4
|
+
class PromptInterface
|
|
5
|
+
# Text storage and line/offset mechanics for editor buffers.
|
|
6
|
+
class EditorBuffer
|
|
7
|
+
attr_reader :text
|
|
8
|
+
|
|
9
|
+
def initialize(text = "")
|
|
10
|
+
@text = text.to_s
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def text=(value)
|
|
14
|
+
@text = value.to_s
|
|
15
|
+
invalidate_lines_cache
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def length
|
|
19
|
+
@text.length
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def empty?
|
|
23
|
+
@text.empty?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def [](range)
|
|
27
|
+
@text[range]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def slice(start_index, length = nil)
|
|
31
|
+
length.nil? ? @text[start_index] : @text[start_index, length]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def before(offset)
|
|
35
|
+
@text[0...offset].to_s
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def after(offset)
|
|
39
|
+
@text[offset..].to_s
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def lines
|
|
43
|
+
@lines_cache ||= begin
|
|
44
|
+
values = @text.split("\n", -1)
|
|
45
|
+
values.empty? ? [""] : values
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def line_and_column_for(offset)
|
|
50
|
+
before_cursor = before(offset)
|
|
51
|
+
[before_cursor.count("\n"), (before_cursor.split("\n", -1).last || "").length]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def offset_for_line_and_column(line_index, column)
|
|
55
|
+
values = lines
|
|
56
|
+
line_index = [[line_index.to_i, 0].max, values.length - 1].min
|
|
57
|
+
column = [[column.to_i, 0].max, values[line_index].length].min
|
|
58
|
+
values.first(line_index).sum { |line| line.length + 1 } + column
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def line_start_offset(line_index)
|
|
62
|
+
line_index = [[line_index.to_i, 0].max, lines.length - 1].min
|
|
63
|
+
lines.first(line_index).sum { |line| line.length + 1 }
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def line_range(line_index)
|
|
67
|
+
start_index = line_start_offset(line_index)
|
|
68
|
+
end_index = start_index + lines[line_index].to_s.length
|
|
69
|
+
end_index += 1 if end_index < @text.length
|
|
70
|
+
[start_index, end_index]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def replace_range(start_index, end_index, text)
|
|
74
|
+
start_index, end_index = [start_index, end_index].minmax
|
|
75
|
+
start_index = [[start_index, 0].max, @text.length].min
|
|
76
|
+
end_index = [[end_index, 0].max, @text.length].min
|
|
77
|
+
@text = @text[0...start_index].to_s + text.to_s + @text[end_index..].to_s
|
|
78
|
+
invalidate_lines_cache
|
|
79
|
+
[start_index, start_index + text.to_s.length]
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def insert(offset, text)
|
|
83
|
+
replace_range(offset, offset, text)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def delete_range(start_index, end_index)
|
|
87
|
+
replace_range(start_index, end_index, "")
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def index(*arguments)
|
|
91
|
+
@text.index(*arguments)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def rindex(*arguments)
|
|
95
|
+
@text.rindex(*arguments)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def count(*arguments)
|
|
99
|
+
@text.count(*arguments)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
private
|
|
103
|
+
|
|
104
|
+
def invalidate_lines_cache
|
|
105
|
+
@lines_cache = nil
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|