kward 0.67.1 → 0.69.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/pages.yml +48 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +54 -0
- data/Gemfile.lock +8 -2
- data/README.md +37 -30
- data/Rakefile +14 -1
- data/doc/authentication.md +84 -43
- data/doc/code-search.md +55 -28
- data/doc/configuration.md +27 -2
- data/doc/extensibility.md +90 -129
- data/doc/getting-started.md +53 -57
- data/doc/memory.md +51 -118
- data/doc/personas.md +417 -0
- data/doc/plugins.md +55 -99
- data/doc/releasing.md +10 -9
- data/doc/rpc.md +7 -7
- data/doc/usage.md +125 -141
- data/doc/web-search.md +80 -14
- data/exe/kward +2 -0
- data/kward.gemspec +4 -0
- data/lib/kward/agent.rb +30 -3
- data/lib/kward/ansi.rb +3 -0
- data/lib/kward/auth/anthropic_oauth.rb +291 -0
- data/lib/kward/auth/file.rb +2 -0
- data/lib/kward/auth/github_oauth.rb +3 -0
- data/lib/kward/auth/openai_oauth.rb +4 -0
- data/lib/kward/auth/openrouter_api_key.rb +2 -0
- data/lib/kward/cancellation.rb +3 -0
- data/lib/kward/cli/auth_commands.rb +82 -0
- data/lib/kward/cli/commands.rb +229 -0
- data/lib/kward/cli/compaction.rb +25 -0
- data/lib/kward/cli/doctor.rb +121 -0
- data/lib/kward/cli/interactive_turn.rb +227 -0
- data/lib/kward/cli/memory_commands.rb +133 -0
- data/lib/kward/cli/plugins.rb +112 -0
- data/lib/kward/cli/prompt_interface.rb +134 -0
- data/lib/kward/cli/rendering.rb +378 -0
- data/lib/kward/cli/runtime_helpers.rb +170 -0
- data/lib/kward/cli/sessions.rb +376 -0
- data/lib/kward/cli/settings.rb +669 -0
- data/lib/kward/cli/slash_commands.rb +114 -0
- data/lib/kward/cli/stats.rb +64 -0
- data/lib/kward/cli/sysprompt.rb +57 -0
- data/lib/kward/cli/tool_summaries.rb +157 -0
- data/lib/kward/cli.rb +52 -2792
- data/lib/kward/cli_transcript_formatter.rb +40 -12
- data/lib/kward/clipboard.rb +1 -0
- data/lib/kward/compaction/file_operation_tracker.rb +3 -0
- data/lib/kward/compactor.rb +31 -9
- data/lib/kward/config_files.rb +78 -34
- data/lib/kward/conversation.rb +110 -13
- data/lib/kward/events.rb +2 -0
- data/lib/kward/export_path.rb +2 -0
- data/lib/kward/image_attachments.rb +2 -0
- data/lib/kward/markdown_transcript.rb +2 -0
- data/lib/kward/memory/manager.rb +144 -14
- data/lib/kward/message_access.rb +29 -2
- data/lib/kward/message_text.rb +45 -0
- data/lib/kward/model/chat_invocation.rb +2 -0
- data/lib/kward/model/client.rb +295 -77
- data/lib/kward/model/context_overflow.rb +2 -0
- data/lib/kward/model/context_usage.rb +14 -10
- data/lib/kward/model/model_info.rb +160 -4
- data/lib/kward/model/payloads.rb +254 -22
- data/lib/kward/model/retry_message.rb +2 -0
- data/lib/kward/model/stream_parser.rb +387 -25
- data/lib/kward/pan/server.rb +3 -1
- data/lib/kward/plugin_registry.rb +12 -0
- data/lib/kward/private_file.rb +2 -0
- data/lib/kward/prompt_interface/banner.rb +3 -0
- data/lib/kward/prompt_interface/composer_controller.rb +262 -0
- data/lib/kward/prompt_interface/composer_renderer.rb +172 -0
- data/lib/kward/prompt_interface/composer_state.rb +221 -0
- data/lib/kward/prompt_interface/key_handler.rb +365 -0
- data/lib/kward/prompt_interface/layout.rb +31 -0
- data/lib/kward/prompt_interface/overlay_renderer.rb +111 -0
- data/lib/kward/prompt_interface/prompt_renderer.rb +91 -0
- data/lib/kward/prompt_interface/question_prompt.rb +328 -0
- data/lib/kward/prompt_interface/runtime_state.rb +59 -0
- data/lib/kward/prompt_interface/screen.rb +186 -0
- data/lib/kward/prompt_interface/selection_prompt.rb +242 -0
- data/lib/kward/prompt_interface/slash_overlay.rb +102 -0
- data/lib/kward/prompt_interface/stream_state.rb +65 -0
- data/lib/kward/prompt_interface/transcript_buffer.rb +85 -0
- data/lib/kward/prompt_interface/transcript_renderer.rb +151 -0
- data/lib/kward/prompt_interface.rb +69 -1832
- data/lib/kward/prompts/commands.rb +2 -0
- data/lib/kward/prompts/templates.rb +3 -0
- data/lib/kward/prompts.rb +63 -7
- data/lib/kward/question_contract.rb +66 -0
- data/lib/kward/resources/avatar_kward_logo.rb +2 -0
- data/lib/kward/resources/pixel_logo.rb +2 -0
- data/lib/kward/rpc/attachment_normalizer.rb +60 -0
- data/lib/kward/rpc/auth_manager.rb +65 -11
- data/lib/kward/rpc/config_manager.rb +11 -0
- data/lib/kward/rpc/prompt_bridge.rb +5 -26
- data/lib/kward/rpc/redactor.rb +3 -0
- data/lib/kward/rpc/runtime_payloads.rb +4 -1
- data/lib/kward/rpc/server.rb +43 -11
- data/lib/kward/rpc/session_manager.rb +139 -347
- data/lib/kward/rpc/session_metrics.rb +68 -0
- data/lib/kward/rpc/session_tree.rb +48 -0
- data/lib/kward/rpc/session_tree_rows.rb +208 -0
- data/lib/kward/rpc/tool_event_normalizer.rb +3 -0
- data/lib/kward/rpc/tool_metadata.rb +3 -0
- data/lib/kward/rpc/transcript_normalizer.rb +50 -0
- data/lib/kward/rpc/transport.rb +3 -0
- data/lib/kward/session_diff.rb +2 -0
- data/lib/kward/session_store.rb +154 -25
- data/lib/kward/session_trash.rb +1 -0
- data/lib/kward/session_tree_renderer.rb +8 -41
- data/lib/kward/session_tree_tool_display.rb +56 -0
- data/lib/kward/skills/registry.rb +3 -0
- data/lib/kward/starter_pack_installer.rb +3 -2
- data/lib/kward/steering.rb +2 -0
- data/lib/kward/telemetry/logger.rb +3 -0
- data/lib/kward/telemetry/stats.rb +3 -0
- data/lib/kward/tools/ask_user_question.rb +20 -32
- data/lib/kward/tools/base.rb +8 -0
- data/lib/kward/tools/code_search.rb +5 -0
- data/lib/kward/tools/edit_file.rb +5 -0
- data/lib/kward/tools/fetch_content.rb +41 -0
- data/lib/kward/tools/fetch_raw.rb +40 -0
- data/lib/kward/tools/list_directory.rb +5 -0
- data/lib/kward/tools/read_file.rb +5 -0
- data/lib/kward/tools/read_skill.rb +5 -0
- data/lib/kward/tools/registry.rb +42 -4
- data/lib/kward/tools/run_shell_command.rb +5 -0
- data/lib/kward/tools/search/code.rb +7 -0
- data/lib/kward/tools/search/web.rb +20 -17
- data/lib/kward/tools/search/web_fetch.rb +202 -0
- data/lib/kward/tools/tool_call.rb +27 -5
- data/lib/kward/tools/web_search.rb +7 -1
- data/lib/kward/tools/write_file.rb +5 -0
- data/lib/kward/transcript_export.rb +2 -0
- data/lib/kward/version.rb +2 -1
- data/lib/kward/workspace.rb +45 -5
- data/templates/default/fulldoc/html/css/kward.css +1501 -0
- data/templates/default/fulldoc/html/images/kward_logo.png +0 -0
- data/templates/default/fulldoc/html/js/kward.js +296 -0
- data/templates/default/fulldoc/html/setup.rb +8 -0
- data/templates/default/layout/html/breadcrumb.erb +11 -0
- data/templates/default/layout/html/layout.erb +141 -0
- data/templates/default/layout/html/setup.rb +139 -0
- metadata +56 -1
data/lib/kward/rpc/server.rb
CHANGED
|
@@ -14,7 +14,9 @@ require_relative "redactor"
|
|
|
14
14
|
require_relative "session_manager"
|
|
15
15
|
require_relative "transport"
|
|
16
16
|
|
|
17
|
+
# Namespace for the Kward CLI agent runtime.
|
|
17
18
|
module Kward
|
|
19
|
+
# JSON-RPC backend namespace used by UI clients.
|
|
18
20
|
module RPC
|
|
19
21
|
# Experimental JSON-RPC backend for UI clients.
|
|
20
22
|
#
|
|
@@ -22,6 +24,13 @@ module Kward
|
|
|
22
24
|
# exposes capabilities during `initialize`, redacts secrets in errors and
|
|
23
25
|
# notifications, and coordinates auth, config, sessions, turns, tools,
|
|
24
26
|
# memory, commands, and startup resources.
|
|
27
|
+
#
|
|
28
|
+
# `Server` should stay focused on protocol concerns: framing, JSON-RPC error
|
|
29
|
+
# codes, method dispatch, capability reporting, and redaction at the wire
|
|
30
|
+
# boundary. Delegate stateful product behavior to manager objects such as
|
|
31
|
+
# `SessionManager`, `AuthManager`, and `ConfigManager`. When adding an RPC
|
|
32
|
+
# feature, update dispatch, capabilities, docs, and tests together so clients
|
|
33
|
+
# can trust `initialize` as the source of supported behavior.
|
|
25
34
|
class Server
|
|
26
35
|
PROTOCOL_VERSION = 1
|
|
27
36
|
JSONRPC_VERSION = "2.0"
|
|
@@ -34,12 +43,30 @@ module Kward
|
|
|
34
43
|
invalid_params: -32_602,
|
|
35
44
|
internal_error: -32_603
|
|
36
45
|
}.freeze
|
|
37
|
-
|
|
46
|
+
SESSION_METHODS = [
|
|
47
|
+
"sessions/create", "sessions/resume", "sessions/list", "sessions/rename",
|
|
48
|
+
"sessions/clone", "sessions/compact", "sessions/forkMessages", "sessions/fork",
|
|
49
|
+
"sessions/tree", "sessions/tree/setLabel", "sessions/tree/navigate",
|
|
50
|
+
"sessions/export", "sessions/delete", "sessions/close", "sessions/transcript"
|
|
51
|
+
].freeze
|
|
52
|
+
MODEL_METHODS = ["models/list", "models/current", "models/set", "reasoning/set", "openrouter/catalog"].freeze
|
|
53
|
+
AUTH_METHODS = [
|
|
54
|
+
"auth/status", "auth/providers", "auth/loginWithApiKey", "auth/logoutProvider",
|
|
55
|
+
"auth/loginWithOAuth", "auth/startOpenAILogin", "auth/submitOpenAICode", "auth/loginStatus"
|
|
56
|
+
].freeze
|
|
57
|
+
MEMORY_METHODS = [
|
|
58
|
+
"memory/status", "memory/enable", "memory/disable", "memory/autoSummary/enable",
|
|
59
|
+
"memory/autoSummary/disable", "memory/list", "memory/add", "memory/addCore",
|
|
60
|
+
"memory/forget", "memory/promote", "memory/relax", "memory/inspect",
|
|
61
|
+
"memory/why", "memory/summarize"
|
|
62
|
+
].freeze
|
|
63
|
+
|
|
64
|
+
# Creates the RPC server and its stateful managers.
|
|
38
65
|
def initialize(input: $stdin, output: $stdout, error_output: $stderr, client: Client.new)
|
|
39
66
|
@transport = Transport.new(input: input, output: output)
|
|
40
67
|
@error_output = error_output
|
|
41
|
-
@session_manager = SessionManager.new(server: self, client: client)
|
|
42
68
|
@config_manager = ConfigManager.new
|
|
69
|
+
@session_manager = SessionManager.new(server: self, client: client, config_manager: @config_manager)
|
|
43
70
|
@auth_manager = AuthManager.new(server: self, config_manager: @config_manager)
|
|
44
71
|
@shutdown = false
|
|
45
72
|
end
|
|
@@ -287,7 +314,7 @@ module Kward
|
|
|
287
314
|
sessions: {
|
|
288
315
|
mode: "explicit",
|
|
289
316
|
persistence: "jsonl",
|
|
290
|
-
methods:
|
|
317
|
+
methods: SESSION_METHODS,
|
|
291
318
|
startupResume: { supported: true, method: "sessions/create", parameter: "resumeLast", default: session_auto_resume_enabled?, immediateTranscript: true, sessionActivePersonaLabel: true },
|
|
292
319
|
list: { supported: true, source: "rpc", ancestry: true, treeFields: true },
|
|
293
320
|
fork: { supported: true, methods: ["sessions/forkMessages", "sessions/fork"], entryIdFormat: "entry-id", selectedMessage: "excludedFromForkComposerTextReturned" },
|
|
@@ -333,7 +360,7 @@ module Kward
|
|
|
333
360
|
},
|
|
334
361
|
models: {
|
|
335
362
|
supported: true,
|
|
336
|
-
methods:
|
|
363
|
+
methods: MODEL_METHODS,
|
|
337
364
|
fields: ["provider", "id", "name", "reasoning", "reasoningEffort", "contextWindow"],
|
|
338
365
|
scopedModels: false
|
|
339
366
|
},
|
|
@@ -351,13 +378,13 @@ module Kward
|
|
|
351
378
|
auth: {
|
|
352
379
|
supported: true,
|
|
353
380
|
providerFormat: "tauren-auth-v1",
|
|
354
|
-
methods:
|
|
355
|
-
oauthProviders: ["openai", "github"],
|
|
381
|
+
methods: AUTH_METHODS,
|
|
382
|
+
oauthProviders: ["openai", "anthropic", "github"],
|
|
356
383
|
unsupportedOAuthProviders: { github: "CLI-only GitHub login for Copilot scaffolding; RPC login is not implemented yet." },
|
|
357
384
|
apiKeyProviders: ["openrouter"],
|
|
358
385
|
logout: true
|
|
359
386
|
},
|
|
360
|
-
memory: { supported: true, optIn: true, defaultEnabled: false, autoSummaryDefaultEnabled: false, promptInjection: "interactive", storage: { core: "json", soft: "jsonl", events: "jsonl" }, methods:
|
|
387
|
+
memory: { supported: true, optIn: true, defaultEnabled: false, autoSummaryDefaultEnabled: false, promptInjection: "interactive", storage: { core: "json", soft: "jsonl", events: "jsonl" }, methods: MEMORY_METHODS },
|
|
361
388
|
commands: { supported: true, methods: ["commands/list", "commands/run"], method: "commands/list", runMethod: "commands/run", sources: ["builtin", "prompt", "skill", "plugin"], executableSources: ["builtin", "plugin"] },
|
|
362
389
|
startupResources: { supported: true, method: "resources/startup" },
|
|
363
390
|
starterPack: { supported: false, reason: "cliOnlyInstallCommand" },
|
|
@@ -533,8 +560,13 @@ module Kward
|
|
|
533
560
|
def startup_resources(params)
|
|
534
561
|
@session_manager.runtime_state(session_id: params.fetch("sessionId"))
|
|
535
562
|
sections = []
|
|
536
|
-
|
|
537
|
-
|
|
563
|
+
context_items = []
|
|
564
|
+
if File.exist?(ConfigFiles.config_principles_path)
|
|
565
|
+
context_items << "PRINCIPLES.md"
|
|
566
|
+
elsif File.exist?(ConfigFiles.config_agents_path)
|
|
567
|
+
context_items << "AGENTS.md"
|
|
568
|
+
end
|
|
569
|
+
sections << { name: "Context", items: context_items } unless context_items.empty?
|
|
538
570
|
skills = ConfigFiles.skills.map(&:name)
|
|
539
571
|
prompts = ConfigFiles.prompt_templates(reserved_commands: BUILTIN_SLASH_COMMAND_NAMES).map { |template| "/#{template.command}" }
|
|
540
572
|
plugins = @session_manager.plugin_commands.map { |command| "/#{command.name}" }
|
|
@@ -600,11 +632,11 @@ module Kward
|
|
|
600
632
|
end
|
|
601
633
|
|
|
602
634
|
def workspace_guardrails_enabled?
|
|
603
|
-
|
|
635
|
+
@config_manager.workspace_guardrails_enabled?
|
|
604
636
|
end
|
|
605
637
|
|
|
606
638
|
def session_auto_resume_enabled?
|
|
607
|
-
|
|
639
|
+
@config_manager.session_auto_resume_enabled?
|
|
608
640
|
end
|
|
609
641
|
|
|
610
642
|
def write_result(id, result)
|