kader 0.1.3__tar.gz → 0.1.4__tar.gz

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 (78) hide show
  1. {kader-0.1.3 → kader-0.1.4}/PKG-INFO +1 -1
  2. {kader-0.1.3 → kader-0.1.4}/cli/app.py +4 -0
  3. {kader-0.1.3 → kader-0.1.4}/kader/agent/base.py +10 -5
  4. {kader-0.1.3 → kader-0.1.4}/pyproject.toml +1 -1
  5. {kader-0.1.3 → kader-0.1.4}/uv.lock +1 -1
  6. {kader-0.1.3 → kader-0.1.4}/.github/workflows/ci.yml +0 -0
  7. {kader-0.1.3 → kader-0.1.4}/.github/workflows/release.yml +0 -0
  8. {kader-0.1.3 → kader-0.1.4}/.gitignore +0 -0
  9. {kader-0.1.3 → kader-0.1.4}/.python-version +0 -0
  10. {kader-0.1.3 → kader-0.1.4}/.qwen/QWEN.md +0 -0
  11. {kader-0.1.3 → kader-0.1.4}/.qwen/agents/technical-writer.md +0 -0
  12. {kader-0.1.3 → kader-0.1.4}/.qwen/agents/test-automation-specialist.md +0 -0
  13. {kader-0.1.3 → kader-0.1.4}/README.md +0 -0
  14. {kader-0.1.3 → kader-0.1.4}/cli/README.md +0 -0
  15. {kader-0.1.3 → kader-0.1.4}/cli/__init__.py +0 -0
  16. {kader-0.1.3 → kader-0.1.4}/cli/__main__.py +0 -0
  17. {kader-0.1.3 → kader-0.1.4}/cli/app.tcss +0 -0
  18. {kader-0.1.3 → kader-0.1.4}/cli/utils.py +0 -0
  19. {kader-0.1.3 → kader-0.1.4}/cli/widgets/__init__.py +0 -0
  20. {kader-0.1.3 → kader-0.1.4}/cli/widgets/confirmation.py +0 -0
  21. {kader-0.1.3 → kader-0.1.4}/cli/widgets/conversation.py +0 -0
  22. {kader-0.1.3 → kader-0.1.4}/cli/widgets/loading.py +0 -0
  23. {kader-0.1.3 → kader-0.1.4}/examples/.gitignore +0 -0
  24. {kader-0.1.3 → kader-0.1.4}/examples/README.md +0 -0
  25. {kader-0.1.3 → kader-0.1.4}/examples/memory_example.py +0 -0
  26. {kader-0.1.3 → kader-0.1.4}/examples/ollama_example.py +0 -0
  27. {kader-0.1.3 → kader-0.1.4}/examples/planning_agent_example.py +0 -0
  28. {kader-0.1.3 → kader-0.1.4}/examples/python_developer/main.py +0 -0
  29. {kader-0.1.3 → kader-0.1.4}/examples/python_developer/template.yaml +0 -0
  30. {kader-0.1.3 → kader-0.1.4}/examples/react_agent_example.py +0 -0
  31. {kader-0.1.3 → kader-0.1.4}/examples/simple_agent.py +0 -0
  32. {kader-0.1.3 → kader-0.1.4}/examples/todo_agent/main.py +0 -0
  33. {kader-0.1.3 → kader-0.1.4}/examples/tools_example.py +0 -0
  34. {kader-0.1.3 → kader-0.1.4}/kader/__init__.py +0 -0
  35. {kader-0.1.3 → kader-0.1.4}/kader/agent/__init__.py +0 -0
  36. {kader-0.1.3 → kader-0.1.4}/kader/agent/agents.py +0 -0
  37. {kader-0.1.3 → kader-0.1.4}/kader/agent/logger.py +0 -0
  38. {kader-0.1.3 → kader-0.1.4}/kader/config.py +0 -0
  39. {kader-0.1.3 → kader-0.1.4}/kader/memory/__init__.py +0 -0
  40. {kader-0.1.3 → kader-0.1.4}/kader/memory/conversation.py +0 -0
  41. {kader-0.1.3 → kader-0.1.4}/kader/memory/session.py +0 -0
  42. {kader-0.1.3 → kader-0.1.4}/kader/memory/state.py +0 -0
  43. {kader-0.1.3 → kader-0.1.4}/kader/memory/types.py +0 -0
  44. {kader-0.1.3 → kader-0.1.4}/kader/prompts/__init__.py +0 -0
  45. {kader-0.1.3 → kader-0.1.4}/kader/prompts/agent_prompts.py +0 -0
  46. {kader-0.1.3 → kader-0.1.4}/kader/prompts/base.py +0 -0
  47. {kader-0.1.3 → kader-0.1.4}/kader/prompts/templates/planning_agent.j2 +0 -0
  48. {kader-0.1.3 → kader-0.1.4}/kader/prompts/templates/react_agent.j2 +0 -0
  49. {kader-0.1.3 → kader-0.1.4}/kader/providers/__init__.py +0 -0
  50. {kader-0.1.3 → kader-0.1.4}/kader/providers/base.py +0 -0
  51. {kader-0.1.3 → kader-0.1.4}/kader/providers/mock.py +0 -0
  52. {kader-0.1.3 → kader-0.1.4}/kader/providers/ollama.py +0 -0
  53. {kader-0.1.3 → kader-0.1.4}/kader/tools/README.md +0 -0
  54. {kader-0.1.3 → kader-0.1.4}/kader/tools/__init__.py +0 -0
  55. {kader-0.1.3 → kader-0.1.4}/kader/tools/base.py +0 -0
  56. {kader-0.1.3 → kader-0.1.4}/kader/tools/exec_commands.py +0 -0
  57. {kader-0.1.3 → kader-0.1.4}/kader/tools/filesys.py +0 -0
  58. {kader-0.1.3 → kader-0.1.4}/kader/tools/filesystem.py +0 -0
  59. {kader-0.1.3 → kader-0.1.4}/kader/tools/protocol.py +0 -0
  60. {kader-0.1.3 → kader-0.1.4}/kader/tools/rag.py +0 -0
  61. {kader-0.1.3 → kader-0.1.4}/kader/tools/todo.py +0 -0
  62. {kader-0.1.3 → kader-0.1.4}/kader/tools/utils.py +0 -0
  63. {kader-0.1.3 → kader-0.1.4}/kader/tools/web.py +0 -0
  64. {kader-0.1.3 → kader-0.1.4}/tests/conftest.py +0 -0
  65. {kader-0.1.3 → kader-0.1.4}/tests/providers/test_mock.py +0 -0
  66. {kader-0.1.3 → kader-0.1.4}/tests/providers/test_ollama.py +0 -0
  67. {kader-0.1.3 → kader-0.1.4}/tests/providers/test_providers_base.py +0 -0
  68. {kader-0.1.3 → kader-0.1.4}/tests/test_agent_logger.py +0 -0
  69. {kader-0.1.3 → kader-0.1.4}/tests/test_agent_logger_integration.py +0 -0
  70. {kader-0.1.3 → kader-0.1.4}/tests/test_base_agent.py +0 -0
  71. {kader-0.1.3 → kader-0.1.4}/tests/test_file_memory.py +0 -0
  72. {kader-0.1.3 → kader-0.1.4}/tests/test_todo_tool.py +0 -0
  73. {kader-0.1.3 → kader-0.1.4}/tests/tools/test_exec_commands.py +0 -0
  74. {kader-0.1.3 → kader-0.1.4}/tests/tools/test_filesys_tools.py +0 -0
  75. {kader-0.1.3 → kader-0.1.4}/tests/tools/test_filesystem_tools.py +0 -0
  76. {kader-0.1.3 → kader-0.1.4}/tests/tools/test_rag.py +0 -0
  77. {kader-0.1.3 → kader-0.1.4}/tests/tools/test_tools_base.py +0 -0
  78. {kader-0.1.3 → kader-0.1.4}/tests/tools/test_web.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kader
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: kader coding agent
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: faiss-cpu>=1.9.0
@@ -171,11 +171,15 @@ class KaderApp(App):
171
171
  self._confirmation_result = (event.confirmed, None)
172
172
 
173
173
  # Remove selector and show result message
174
+ tool_message = None
174
175
  if self._inline_selector:
176
+ tool_message = self._inline_selector.message
175
177
  self._inline_selector.remove()
176
178
  self._inline_selector = None
177
179
 
178
180
  if event.confirmed:
181
+ if tool_message:
182
+ conversation.add_message(tool_message, "assistant")
179
183
  conversation.add_message("✅ Executing tool...", "assistant")
180
184
  # Restart spinner
181
185
  try:
@@ -322,7 +322,7 @@ class BaseAgent:
322
322
  return f"execute {tool_name}"
323
323
 
324
324
  def _confirm_tool_execution(
325
- self, tool_call_dict: dict
325
+ self, tool_call_dict: dict, llm_content: Optional[str] = None
326
326
  ) -> tuple[bool, Optional[str]]:
327
327
  """
328
328
  Ask user for confirmation before executing a tool.
@@ -336,6 +336,9 @@ class BaseAgent:
336
336
  """
337
337
  display_str = self._format_tool_call_for_display(tool_call_dict)
338
338
 
339
+ if llm_content and len(llm_content) > 0:
340
+ display_str = f"{llm_content}\n\n{display_str}"
341
+
339
342
  # Use callback if provided (e.g., for GUI/TUI)
340
343
  if self.tool_confirmation_callback:
341
344
  return self.tool_confirmation_callback(display_str)
@@ -357,7 +360,7 @@ class BaseAgent:
357
360
  print("Please enter 'yes' or 'no'.")
358
361
 
359
362
  async def _aconfirm_tool_execution(
360
- self, tool_call_dict: dict
363
+ self, tool_call_dict: dict, llm_content: Optional[str] = None
361
364
  ) -> tuple[bool, Optional[str]]:
362
365
  """
363
366
  Async version - Ask user for confirmation before executing a tool.
@@ -375,7 +378,9 @@ class BaseAgent:
375
378
  # In production, use asyncio.to_thread or aioconsole
376
379
  import asyncio
377
380
 
378
- return await asyncio.to_thread(self._confirm_tool_execution, tool_call_dict)
381
+ return await asyncio.to_thread(
382
+ self._confirm_tool_execution, tool_call_dict, llm_content
383
+ )
379
384
 
380
385
  def _process_tool_calls(
381
386
  self, response: LLMResponse
@@ -396,7 +401,7 @@ class BaseAgent:
396
401
  # Check for interrupt before tool execution
397
402
  if self.interrupt_before_tool:
398
403
  should_execute, user_input = self._confirm_tool_execution(
399
- tool_call_dict
404
+ tool_call_dict, response.content
400
405
  )
401
406
  if not should_execute:
402
407
  # Return the user's elaboration to be processed
@@ -455,7 +460,7 @@ class BaseAgent:
455
460
  # Check for interrupt before tool execution
456
461
  if self.interrupt_before_tool:
457
462
  should_execute, user_input = await self._aconfirm_tool_execution(
458
- tool_call_dict
463
+ tool_call_dict, response.content
459
464
  )
460
465
  if not should_execute:
461
466
  return (False, user_input)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kader"
3
- version = "0.1.3"
3
+ version = "0.1.4"
4
4
  description = "kader coding agent"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -487,7 +487,7 @@ wheels = [
487
487
 
488
488
  [[package]]
489
489
  name = "kader"
490
- version = "0.1.3"
490
+ version = "0.1.4"
491
491
  source = { editable = "." }
492
492
  dependencies = [
493
493
  { name = "faiss-cpu" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes