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.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/pages.yml +48 -0
  3. data/.yardopts +1 -0
  4. data/CHANGELOG.md +54 -0
  5. data/Gemfile.lock +8 -2
  6. data/README.md +37 -30
  7. data/Rakefile +14 -1
  8. data/doc/authentication.md +84 -43
  9. data/doc/code-search.md +55 -28
  10. data/doc/configuration.md +27 -2
  11. data/doc/extensibility.md +90 -129
  12. data/doc/getting-started.md +53 -57
  13. data/doc/memory.md +51 -118
  14. data/doc/personas.md +417 -0
  15. data/doc/plugins.md +55 -99
  16. data/doc/releasing.md +10 -9
  17. data/doc/rpc.md +7 -7
  18. data/doc/usage.md +125 -141
  19. data/doc/web-search.md +80 -14
  20. data/exe/kward +2 -0
  21. data/kward.gemspec +4 -0
  22. data/lib/kward/agent.rb +30 -3
  23. data/lib/kward/ansi.rb +3 -0
  24. data/lib/kward/auth/anthropic_oauth.rb +291 -0
  25. data/lib/kward/auth/file.rb +2 -0
  26. data/lib/kward/auth/github_oauth.rb +3 -0
  27. data/lib/kward/auth/openai_oauth.rb +4 -0
  28. data/lib/kward/auth/openrouter_api_key.rb +2 -0
  29. data/lib/kward/cancellation.rb +3 -0
  30. data/lib/kward/cli/auth_commands.rb +82 -0
  31. data/lib/kward/cli/commands.rb +229 -0
  32. data/lib/kward/cli/compaction.rb +25 -0
  33. data/lib/kward/cli/doctor.rb +121 -0
  34. data/lib/kward/cli/interactive_turn.rb +227 -0
  35. data/lib/kward/cli/memory_commands.rb +133 -0
  36. data/lib/kward/cli/plugins.rb +112 -0
  37. data/lib/kward/cli/prompt_interface.rb +134 -0
  38. data/lib/kward/cli/rendering.rb +378 -0
  39. data/lib/kward/cli/runtime_helpers.rb +170 -0
  40. data/lib/kward/cli/sessions.rb +376 -0
  41. data/lib/kward/cli/settings.rb +669 -0
  42. data/lib/kward/cli/slash_commands.rb +114 -0
  43. data/lib/kward/cli/stats.rb +64 -0
  44. data/lib/kward/cli/sysprompt.rb +57 -0
  45. data/lib/kward/cli/tool_summaries.rb +157 -0
  46. data/lib/kward/cli.rb +52 -2792
  47. data/lib/kward/cli_transcript_formatter.rb +40 -12
  48. data/lib/kward/clipboard.rb +1 -0
  49. data/lib/kward/compaction/file_operation_tracker.rb +3 -0
  50. data/lib/kward/compactor.rb +31 -9
  51. data/lib/kward/config_files.rb +78 -34
  52. data/lib/kward/conversation.rb +110 -13
  53. data/lib/kward/events.rb +2 -0
  54. data/lib/kward/export_path.rb +2 -0
  55. data/lib/kward/image_attachments.rb +2 -0
  56. data/lib/kward/markdown_transcript.rb +2 -0
  57. data/lib/kward/memory/manager.rb +144 -14
  58. data/lib/kward/message_access.rb +29 -2
  59. data/lib/kward/message_text.rb +45 -0
  60. data/lib/kward/model/chat_invocation.rb +2 -0
  61. data/lib/kward/model/client.rb +295 -77
  62. data/lib/kward/model/context_overflow.rb +2 -0
  63. data/lib/kward/model/context_usage.rb +14 -10
  64. data/lib/kward/model/model_info.rb +160 -4
  65. data/lib/kward/model/payloads.rb +254 -22
  66. data/lib/kward/model/retry_message.rb +2 -0
  67. data/lib/kward/model/stream_parser.rb +387 -25
  68. data/lib/kward/pan/server.rb +3 -1
  69. data/lib/kward/plugin_registry.rb +12 -0
  70. data/lib/kward/private_file.rb +2 -0
  71. data/lib/kward/prompt_interface/banner.rb +3 -0
  72. data/lib/kward/prompt_interface/composer_controller.rb +262 -0
  73. data/lib/kward/prompt_interface/composer_renderer.rb +172 -0
  74. data/lib/kward/prompt_interface/composer_state.rb +221 -0
  75. data/lib/kward/prompt_interface/key_handler.rb +365 -0
  76. data/lib/kward/prompt_interface/layout.rb +31 -0
  77. data/lib/kward/prompt_interface/overlay_renderer.rb +111 -0
  78. data/lib/kward/prompt_interface/prompt_renderer.rb +91 -0
  79. data/lib/kward/prompt_interface/question_prompt.rb +328 -0
  80. data/lib/kward/prompt_interface/runtime_state.rb +59 -0
  81. data/lib/kward/prompt_interface/screen.rb +186 -0
  82. data/lib/kward/prompt_interface/selection_prompt.rb +242 -0
  83. data/lib/kward/prompt_interface/slash_overlay.rb +102 -0
  84. data/lib/kward/prompt_interface/stream_state.rb +65 -0
  85. data/lib/kward/prompt_interface/transcript_buffer.rb +85 -0
  86. data/lib/kward/prompt_interface/transcript_renderer.rb +151 -0
  87. data/lib/kward/prompt_interface.rb +69 -1832
  88. data/lib/kward/prompts/commands.rb +2 -0
  89. data/lib/kward/prompts/templates.rb +3 -0
  90. data/lib/kward/prompts.rb +63 -7
  91. data/lib/kward/question_contract.rb +66 -0
  92. data/lib/kward/resources/avatar_kward_logo.rb +2 -0
  93. data/lib/kward/resources/pixel_logo.rb +2 -0
  94. data/lib/kward/rpc/attachment_normalizer.rb +60 -0
  95. data/lib/kward/rpc/auth_manager.rb +65 -11
  96. data/lib/kward/rpc/config_manager.rb +11 -0
  97. data/lib/kward/rpc/prompt_bridge.rb +5 -26
  98. data/lib/kward/rpc/redactor.rb +3 -0
  99. data/lib/kward/rpc/runtime_payloads.rb +4 -1
  100. data/lib/kward/rpc/server.rb +43 -11
  101. data/lib/kward/rpc/session_manager.rb +139 -347
  102. data/lib/kward/rpc/session_metrics.rb +68 -0
  103. data/lib/kward/rpc/session_tree.rb +48 -0
  104. data/lib/kward/rpc/session_tree_rows.rb +208 -0
  105. data/lib/kward/rpc/tool_event_normalizer.rb +3 -0
  106. data/lib/kward/rpc/tool_metadata.rb +3 -0
  107. data/lib/kward/rpc/transcript_normalizer.rb +50 -0
  108. data/lib/kward/rpc/transport.rb +3 -0
  109. data/lib/kward/session_diff.rb +2 -0
  110. data/lib/kward/session_store.rb +154 -25
  111. data/lib/kward/session_trash.rb +1 -0
  112. data/lib/kward/session_tree_renderer.rb +8 -41
  113. data/lib/kward/session_tree_tool_display.rb +56 -0
  114. data/lib/kward/skills/registry.rb +3 -0
  115. data/lib/kward/starter_pack_installer.rb +3 -2
  116. data/lib/kward/steering.rb +2 -0
  117. data/lib/kward/telemetry/logger.rb +3 -0
  118. data/lib/kward/telemetry/stats.rb +3 -0
  119. data/lib/kward/tools/ask_user_question.rb +20 -32
  120. data/lib/kward/tools/base.rb +8 -0
  121. data/lib/kward/tools/code_search.rb +5 -0
  122. data/lib/kward/tools/edit_file.rb +5 -0
  123. data/lib/kward/tools/fetch_content.rb +41 -0
  124. data/lib/kward/tools/fetch_raw.rb +40 -0
  125. data/lib/kward/tools/list_directory.rb +5 -0
  126. data/lib/kward/tools/read_file.rb +5 -0
  127. data/lib/kward/tools/read_skill.rb +5 -0
  128. data/lib/kward/tools/registry.rb +42 -4
  129. data/lib/kward/tools/run_shell_command.rb +5 -0
  130. data/lib/kward/tools/search/code.rb +7 -0
  131. data/lib/kward/tools/search/web.rb +20 -17
  132. data/lib/kward/tools/search/web_fetch.rb +202 -0
  133. data/lib/kward/tools/tool_call.rb +27 -5
  134. data/lib/kward/tools/web_search.rb +7 -1
  135. data/lib/kward/tools/write_file.rb +5 -0
  136. data/lib/kward/transcript_export.rb +2 -0
  137. data/lib/kward/version.rb +2 -1
  138. data/lib/kward/workspace.rb +45 -5
  139. data/templates/default/fulldoc/html/css/kward.css +1501 -0
  140. data/templates/default/fulldoc/html/images/kward_logo.png +0 -0
  141. data/templates/default/fulldoc/html/js/kward.js +296 -0
  142. data/templates/default/fulldoc/html/setup.rb +8 -0
  143. data/templates/default/layout/html/breadcrumb.erb +11 -0
  144. data/templates/default/layout/html/layout.erb +141 -0
  145. data/templates/default/layout/html/setup.rb +139 -0
  146. metadata +56 -1
@@ -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: ["sessions/create", "sessions/resume", "sessions/list", "sessions/rename", "sessions/clone", "sessions/compact", "sessions/forkMessages", "sessions/fork", "sessions/tree", "sessions/tree/setLabel", "sessions/tree/navigate", "sessions/export", "sessions/delete", "sessions/close", "sessions/transcript"],
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: ["models/list", "models/current", "models/set", "reasoning/set", "openrouter/catalog"],
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: ["auth/status", "auth/providers", "auth/loginWithApiKey", "auth/logoutProvider", "auth/loginWithOAuth", "auth/startOpenAILogin", "auth/submitOpenAICode", "auth/loginStatus"],
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: ["memory/status", "memory/enable", "memory/disable", "memory/autoSummary/enable", "memory/autoSummary/disable", "memory/list", "memory/add", "memory/addCore", "memory/forget", "memory/promote", "memory/relax", "memory/inspect", "memory/why", "memory/summarize"] },
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
- agents_path = File.join(ConfigFiles.config_dir, "AGENTS.md")
537
- sections << { name: "Context", items: ["AGENTS.md"] } if File.exist?(agents_path)
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
- ConfigFiles.workspace_guardrails_enabled?(@config_manager.read(redacted: false))
635
+ @config_manager.workspace_guardrails_enabled?
604
636
  end
605
637
 
606
638
  def session_auto_resume_enabled?
607
- ConfigFiles.session_auto_resume_enabled?(@config_manager.read(redacted: false))
639
+ @config_manager.session_auto_resume_enabled?
608
640
  end
609
641
 
610
642
  def write_result(id, result)