kward 0.81.0 → 0.83.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/CHANGELOG.md +57 -0
- data/Gemfile.lock +2 -2
- data/README.md +1 -1
- data/Rakefile +44 -4
- data/doc/agent-tools.md +1 -0
- data/doc/composer.md +2 -2
- data/doc/configuration.md +18 -3
- data/doc/editor.md +20 -10
- data/doc/files.md +12 -5
- data/doc/permissions.md +1 -0
- data/doc/releasing.md +79 -38
- data/doc/rpc.md +2 -2
- data/doc/sandboxing.md +5 -1
- data/doc/security.md +2 -2
- data/doc/shell.md +42 -18
- data/doc/tabs.md +3 -0
- data/doc/usage.md +3 -2
- data/kward.gemspec +1 -1
- data/lib/kward/adaptive_pty_output_sink.rb +183 -0
- data/lib/kward/agent.rb +1 -0
- data/lib/kward/auth/anthropic_oauth.rb +7 -7
- data/lib/kward/cli/git.rb +5 -1
- data/lib/kward/cli/interactive_turn.rb +101 -19
- data/lib/kward/cli/rendering.rb +14 -2
- data/lib/kward/cli/runtime_helpers.rb +252 -46
- data/lib/kward/cli/settings.rb +5 -13
- data/lib/kward/cli/slash_commands.rb +12 -1
- data/lib/kward/cli/tabs.rb +71 -9
- data/lib/kward/cli.rb +12 -0
- data/lib/kward/compaction/token_estimator.rb +12 -6
- data/lib/kward/config_files.rb +17 -0
- data/lib/kward/editor_prompt.rb +46 -0
- data/lib/kward/editor_prompt_session.rb +28 -0
- data/lib/kward/ekwsh.rb +70 -10
- data/lib/kward/image_attachments.rb +98 -15
- data/lib/kward/interactive_pty_runner.rb +25 -19
- data/lib/kward/model/client.rb +1 -17
- data/lib/kward/model/model_info.rb +3 -2
- data/lib/kward/model/payloads.rb +0 -2
- data/lib/kward/persistent_shell_session.rb +750 -0
- data/lib/kward/project_files.rb +18 -5
- data/lib/kward/prompt_interface/composer_controller.rb +3 -3
- data/lib/kward/prompt_interface/composer_renderer.rb +28 -1
- data/lib/kward/prompt_interface/editor/auto_indent.rb +3 -0
- data/lib/kward/prompt_interface/editor/controller.rb +75 -6
- data/lib/kward/prompt_interface/editor/modes/emacs.rb +2 -2
- data/lib/kward/prompt_interface/editor/modes/modern.rb +4 -0
- data/lib/kward/prompt_interface/editor/modes/vibe.rb +12 -6
- data/lib/kward/prompt_interface/editor/renderer.rb +1 -0
- data/lib/kward/prompt_interface/editor/state.rb +11 -0
- data/lib/kward/prompt_interface/editor/word_completion.rb +124 -0
- data/lib/kward/prompt_interface/file_overlay.rb +21 -7
- data/lib/kward/prompt_interface/git_prompt.rb +1 -1
- data/lib/kward/prompt_interface/key_handler.rb +30 -0
- data/lib/kward/prompt_interface/overlay_renderer.rb +1 -0
- data/lib/kward/prompt_interface/project_browser.rb +192 -8
- data/lib/kward/prompt_interface/prompt_renderer.rb +15 -6
- data/lib/kward/prompt_interface/question_prompt.rb +1 -1
- data/lib/kward/prompt_interface/runtime_state.rb +5 -1
- data/lib/kward/prompt_interface/screen.rb +40 -20
- data/lib/kward/prompt_interface/selection_prompt.rb +5 -5
- data/lib/kward/prompt_interface/transcript_renderer.rb +4 -4
- data/lib/kward/prompt_interface.rb +159 -32
- data/lib/kward/prompts/commands.rb +1 -0
- data/lib/kward/pty_output_sink.rb +45 -0
- data/lib/kward/pty_transcript_normalizer.rb +93 -0
- data/lib/kward/rpc/auth_manager.rb +1 -1
- data/lib/kward/rpc/server.rb +2 -1
- data/lib/kward/session_catalog.rb +87 -0
- data/lib/kward/session_store.rb +94 -5
- data/lib/kward/shell_prompt.rb +50 -0
- data/lib/kward/shell_prompt_session.rb +58 -0
- data/lib/kward/terminal_image_support.rb +116 -0
- data/lib/kward/terminal_keys.rb +1 -0
- data/lib/kward/terminal_sequences.rb +43 -0
- data/lib/kward/tools/prepare_shell_command.rb +28 -0
- data/lib/kward/tools/registry.rb +63 -5
- data/lib/kward/tools/replace_editor_buffer.rb +30 -0
- data/lib/kward/tools/run_shell_command.rb +24 -6
- data/lib/kward/version.rb +1 -1
- data/templates/default/layout/html/layout.erb +1 -1
- metadata +15 -4
- data/.github/workflows/ci.yml +0 -48
- data/.github/workflows/pages.yml +0 -48
|
@@ -5,17 +5,27 @@ require_relative "../workspace"
|
|
|
5
5
|
module Kward
|
|
6
6
|
# Model-callable tool wrappers and their argument schemas.
|
|
7
7
|
module Tools
|
|
8
|
-
# Tool wrapper for bounded shell commands in the workspace.
|
|
8
|
+
# Tool wrapper for bounded shell commands in the workspace or active shell.
|
|
9
9
|
class RunShellCommand < Base
|
|
10
10
|
# Builds the tool schema and stores the execution dependency.
|
|
11
|
-
def initialize(workspace:)
|
|
11
|
+
def initialize(workspace: nil, shell_prompt_session: nil)
|
|
12
|
+
raise ArgumentError, "RunShellCommand requires a workspace or shell session" unless workspace || shell_prompt_session
|
|
13
|
+
raise ArgumentError, "RunShellCommand accepts only one execution target" if workspace && shell_prompt_session
|
|
14
|
+
|
|
12
15
|
@workspace = workspace
|
|
16
|
+
@shell_prompt_session = shell_prompt_session
|
|
17
|
+
description = shell_prompt_session ?
|
|
18
|
+
"Run a bounded noninteractive command in the active embedded shell session." :
|
|
19
|
+
"Run a shell command from the workspace root."
|
|
20
|
+
timeout_description = shell_prompt_session ?
|
|
21
|
+
"Timeout seconds; defaults to the embedded shell setting." :
|
|
22
|
+
"Timeout seconds; default 30."
|
|
13
23
|
super(
|
|
14
24
|
"run_shell_command",
|
|
15
|
-
|
|
25
|
+
description,
|
|
16
26
|
properties: {
|
|
17
27
|
command: { type: "string", description: "Command to run." },
|
|
18
|
-
timeout_seconds: { type: "integer", description:
|
|
28
|
+
timeout_seconds: { type: "integer", description: timeout_description }
|
|
19
29
|
},
|
|
20
30
|
required: ["command"]
|
|
21
31
|
)
|
|
@@ -24,9 +34,17 @@ module Kward
|
|
|
24
34
|
# Executes the tool and returns model-facing output text.
|
|
25
35
|
def call(args, _conversation, cancellation: nil)
|
|
26
36
|
command = argument(args, :command, "")
|
|
27
|
-
timeout_seconds = argument(
|
|
37
|
+
timeout_seconds = argument(
|
|
38
|
+
args,
|
|
39
|
+
:timeout_seconds,
|
|
40
|
+
@shell_prompt_session ? @shell_prompt_session.timeout_seconds : Workspace::DEFAULT_COMMAND_TIMEOUT_SECONDS
|
|
41
|
+
)
|
|
28
42
|
|
|
29
|
-
@
|
|
43
|
+
if @shell_prompt_session
|
|
44
|
+
@shell_prompt_session.run(command, timeout_seconds: timeout_seconds, cancellation: cancellation)
|
|
45
|
+
else
|
|
46
|
+
@workspace.run_shell_command(command, timeout_seconds: timeout_seconds, cancellation: cancellation)
|
|
47
|
+
end
|
|
30
48
|
end
|
|
31
49
|
end
|
|
32
50
|
end
|
data/lib/kward/version.rb
CHANGED
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
<article><strong>⌘</strong><h2>Project-aware agent loop</h2><p>Inspect, reason, patch, verify.</p></article>
|
|
111
111
|
<article><strong>▤</strong><h2>Unix filter mode</h2><p>Pipe diffs, logs, and code through Kward.</p></article>
|
|
112
112
|
<article><strong>▰</strong><h2>Branchable sessions</h2><p>Resume, rewind, fork, compact, export.</p></article>
|
|
113
|
-
<article><strong
|
|
113
|
+
<article><strong>⌗</strong><h2>Builtin shell and editor</h2><p>Run commands and edit files safely in the workspace.</p></article>
|
|
114
114
|
<article><strong>◎</strong><h2>Live source intelligence</h2><p>Search the web and read public repos.</p></article>
|
|
115
115
|
<article><strong>✣</strong><h2>Ruby-native extensions</h2><p>Shape Kward with plugins, skills, and prompts.</p></article>
|
|
116
116
|
</section>
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kward
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.83.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kai Wood
|
|
@@ -116,8 +116,6 @@ executables:
|
|
|
116
116
|
extensions: []
|
|
117
117
|
extra_rdoc_files: []
|
|
118
118
|
files:
|
|
119
|
-
- ".github/workflows/ci.yml"
|
|
120
|
-
- ".github/workflows/pages.yml"
|
|
121
119
|
- ".yardopts"
|
|
122
120
|
- CHANGELOG.md
|
|
123
121
|
- Gemfile
|
|
@@ -170,6 +168,7 @@ files:
|
|
|
170
168
|
- exe/kward
|
|
171
169
|
- kward.gemspec
|
|
172
170
|
- lib/kward.rb
|
|
171
|
+
- lib/kward/adaptive_pty_output_sink.rb
|
|
173
172
|
- lib/kward/agent.rb
|
|
174
173
|
- lib/kward/ansi.rb
|
|
175
174
|
- lib/kward/auth/anthropic_oauth.rb
|
|
@@ -216,6 +215,8 @@ files:
|
|
|
216
215
|
- lib/kward/deep_copy.rb
|
|
217
216
|
- lib/kward/diff_view_mode.rb
|
|
218
217
|
- lib/kward/editor_mode.rb
|
|
218
|
+
- lib/kward/editor_prompt.rb
|
|
219
|
+
- lib/kward/editor_prompt_session.rb
|
|
219
220
|
- lib/kward/ekwsh.rb
|
|
220
221
|
- lib/kward/events.rb
|
|
221
222
|
- lib/kward/export_path.rb
|
|
@@ -263,6 +264,7 @@ files:
|
|
|
263
264
|
- lib/kward/pan/server.rb
|
|
264
265
|
- lib/kward/path_guard.rb
|
|
265
266
|
- lib/kward/permissions/policy.rb
|
|
267
|
+
- lib/kward/persistent_shell_session.rb
|
|
266
268
|
- lib/kward/plugin_chat_runtime.rb
|
|
267
269
|
- lib/kward/plugin_registry.rb
|
|
268
270
|
- lib/kward/private_file.rb
|
|
@@ -294,6 +296,7 @@ files:
|
|
|
294
296
|
- lib/kward/prompt_interface/editor/syntax_highlighter.rb
|
|
295
297
|
- lib/kward/prompt_interface/editor/undo_history.rb
|
|
296
298
|
- lib/kward/prompt_interface/editor/vibe_state.rb
|
|
299
|
+
- lib/kward/prompt_interface/editor/word_completion.rb
|
|
297
300
|
- lib/kward/prompt_interface/file_overlay.rb
|
|
298
301
|
- lib/kward/prompt_interface/git_prompt.rb
|
|
299
302
|
- lib/kward/prompt_interface/interactive/controller.rb
|
|
@@ -315,6 +318,8 @@ files:
|
|
|
315
318
|
- lib/kward/prompts.rb
|
|
316
319
|
- lib/kward/prompts/commands.rb
|
|
317
320
|
- lib/kward/prompts/templates.rb
|
|
321
|
+
- lib/kward/pty_output_sink.rb
|
|
322
|
+
- lib/kward/pty_transcript_normalizer.rb
|
|
318
323
|
- lib/kward/question_contract.rb
|
|
319
324
|
- lib/kward/rpc/attachment_normalizer.rb
|
|
320
325
|
- lib/kward/rpc/auth_manager.rb
|
|
@@ -346,6 +351,7 @@ files:
|
|
|
346
351
|
- lib/kward/sandbox/runner_factory.rb
|
|
347
352
|
- lib/kward/sandbox/unavailable_runner.rb
|
|
348
353
|
- lib/kward/scratchpad_runner.rb
|
|
354
|
+
- lib/kward/session_catalog.rb
|
|
349
355
|
- lib/kward/session_diff.rb
|
|
350
356
|
- lib/kward/session_naming.rb
|
|
351
357
|
- lib/kward/session_store.rb
|
|
@@ -353,6 +359,8 @@ files:
|
|
|
353
359
|
- lib/kward/session_tree_nodes.rb
|
|
354
360
|
- lib/kward/session_tree_renderer.rb
|
|
355
361
|
- lib/kward/session_tree_tool_display.rb
|
|
362
|
+
- lib/kward/shell_prompt.rb
|
|
363
|
+
- lib/kward/shell_prompt_session.rb
|
|
356
364
|
- lib/kward/skills/capture.rb
|
|
357
365
|
- lib/kward/skills/registry.rb
|
|
358
366
|
- lib/kward/skills/trust_coordinator.rb
|
|
@@ -363,6 +371,7 @@ files:
|
|
|
363
371
|
- lib/kward/tab_store.rb
|
|
364
372
|
- lib/kward/telemetry/logger.rb
|
|
365
373
|
- lib/kward/telemetry/stats.rb
|
|
374
|
+
- lib/kward/terminal_image_support.rb
|
|
366
375
|
- lib/kward/terminal_keys.rb
|
|
367
376
|
- lib/kward/terminal_sequences.rb
|
|
368
377
|
- lib/kward/text_boundary.rb
|
|
@@ -378,9 +387,11 @@ files:
|
|
|
378
387
|
- lib/kward/tools/git_commit.rb
|
|
379
388
|
- lib/kward/tools/list_directory.rb
|
|
380
389
|
- lib/kward/tools/mcp_tool.rb
|
|
390
|
+
- lib/kward/tools/prepare_shell_command.rb
|
|
381
391
|
- lib/kward/tools/read_file.rb
|
|
382
392
|
- lib/kward/tools/read_skill.rb
|
|
383
393
|
- lib/kward/tools/registry.rb
|
|
394
|
+
- lib/kward/tools/replace_editor_buffer.rb
|
|
384
395
|
- lib/kward/tools/retrieve_tool_output.rb
|
|
385
396
|
- lib/kward/tools/run_shell_command.rb
|
|
386
397
|
- lib/kward/tools/search/code.rb
|
|
@@ -436,7 +447,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
436
447
|
- !ruby/object:Gem::Version
|
|
437
448
|
version: '0'
|
|
438
449
|
requirements: []
|
|
439
|
-
rubygems_version:
|
|
450
|
+
rubygems_version: 3.6.9
|
|
440
451
|
specification_version: 4
|
|
441
452
|
summary: An extendable Ruby CLI coding agent.
|
|
442
453
|
test_files: []
|
data/.github/workflows/ci.yml
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches:
|
|
6
|
-
- main
|
|
7
|
-
pull_request:
|
|
8
|
-
workflow_dispatch:
|
|
9
|
-
|
|
10
|
-
permissions:
|
|
11
|
-
contents: read
|
|
12
|
-
|
|
13
|
-
jobs:
|
|
14
|
-
test:
|
|
15
|
-
runs-on: ubuntu-latest
|
|
16
|
-
strategy:
|
|
17
|
-
fail-fast: false
|
|
18
|
-
matrix:
|
|
19
|
-
ruby-version: ['3.4', 'ruby']
|
|
20
|
-
steps:
|
|
21
|
-
- name: Checkout
|
|
22
|
-
uses: actions/checkout@v4
|
|
23
|
-
|
|
24
|
-
- name: Set up Ruby
|
|
25
|
-
uses: ruby/setup-ruby@v1
|
|
26
|
-
with:
|
|
27
|
-
ruby-version: ${{ matrix.ruby-version }}
|
|
28
|
-
bundler-cache: true
|
|
29
|
-
|
|
30
|
-
- name: Install sandbox test dependency
|
|
31
|
-
run: sudo apt-get update && sudo apt-get install --yes bubblewrap
|
|
32
|
-
|
|
33
|
-
- name: Enable Bubblewrap namespaces
|
|
34
|
-
run: |
|
|
35
|
-
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
|
|
36
|
-
sudo sysctl -w kernel.unprivileged_userns_clone=1
|
|
37
|
-
bwrap --ro-bind / / --unshare-net true
|
|
38
|
-
|
|
39
|
-
- name: Check syntax
|
|
40
|
-
run: find lib test -name '*.rb' -print0 | xargs -0 ruby -c
|
|
41
|
-
|
|
42
|
-
- name: Check runtime warnings
|
|
43
|
-
run: bundle exec ruby -w -Ilib -e 'require "kward"'
|
|
44
|
-
|
|
45
|
-
- name: Run tests
|
|
46
|
-
env:
|
|
47
|
-
KWARD_RUN_BUBBLEWRAP_TESTS: "1"
|
|
48
|
-
run: bundle exec rake test
|
data/.github/workflows/pages.yml
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
name: Deploy documentation
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches:
|
|
6
|
-
- main
|
|
7
|
-
workflow_dispatch:
|
|
8
|
-
|
|
9
|
-
permissions:
|
|
10
|
-
contents: read
|
|
11
|
-
pages: write
|
|
12
|
-
id-token: write
|
|
13
|
-
|
|
14
|
-
concurrency:
|
|
15
|
-
group: pages
|
|
16
|
-
cancel-in-progress: false
|
|
17
|
-
|
|
18
|
-
jobs:
|
|
19
|
-
build:
|
|
20
|
-
runs-on: ubuntu-latest
|
|
21
|
-
steps:
|
|
22
|
-
- name: Checkout
|
|
23
|
-
uses: actions/checkout@v4
|
|
24
|
-
|
|
25
|
-
- name: Set up Ruby
|
|
26
|
-
uses: ruby/setup-ruby@v1
|
|
27
|
-
with:
|
|
28
|
-
ruby-version: '3.4'
|
|
29
|
-
bundler-cache: true
|
|
30
|
-
|
|
31
|
-
- name: Build documentation
|
|
32
|
-
run: bundle exec rake docs:build
|
|
33
|
-
|
|
34
|
-
- name: Upload Pages artifact
|
|
35
|
-
uses: actions/upload-pages-artifact@v3
|
|
36
|
-
with:
|
|
37
|
-
path: _yardoc
|
|
38
|
-
|
|
39
|
-
deploy:
|
|
40
|
-
environment:
|
|
41
|
-
name: github-pages
|
|
42
|
-
url: ${{ steps.deployment.outputs.page_url }}
|
|
43
|
-
runs-on: ubuntu-latest
|
|
44
|
-
needs: build
|
|
45
|
-
steps:
|
|
46
|
-
- name: Deploy to GitHub Pages
|
|
47
|
-
id: deployment
|
|
48
|
-
uses: actions/deploy-pages@v4
|