PraisonAI 2.3.59__tar.gz → 2.3.60__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 (110) hide show
  1. {praisonai-2.3.59 → praisonai-2.3.60}/PKG-INFO +1 -1
  2. {praisonai-2.3.59 → praisonai-2.3.60}/PraisonAI.egg-info/PKG-INFO +1 -1
  3. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/main.py +69 -2
  4. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/deploy.py +1 -1
  5. praisonai-2.3.60/praisonai/version.py +1 -0
  6. praisonai-2.3.59/praisonai/version.py +0 -1
  7. {praisonai-2.3.59 → praisonai-2.3.60}/PraisonAI.egg-info/SOURCES.txt +0 -0
  8. {praisonai-2.3.59 → praisonai-2.3.60}/PraisonAI.egg-info/dependency_links.txt +0 -0
  9. {praisonai-2.3.59 → praisonai-2.3.60}/PraisonAI.egg-info/entry_points.txt +0 -0
  10. {praisonai-2.3.59 → praisonai-2.3.60}/PraisonAI.egg-info/requires.txt +0 -0
  11. {praisonai-2.3.59 → praisonai-2.3.60}/PraisonAI.egg-info/top_level.txt +0 -0
  12. {praisonai-2.3.59 → praisonai-2.3.60}/README.md +0 -0
  13. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/__init__.py +0 -0
  14. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/__main__.py +0 -0
  15. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/agents_generator.py +0 -0
  16. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/api/call.py +0 -0
  17. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/auto.py +0 -0
  18. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/chainlit_ui.py +0 -0
  19. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/__init__.py +0 -0
  20. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/__init__.py +0 -0
  21. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/at_mentions.py +0 -0
  22. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/auto_memory.py +0 -0
  23. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/autonomy_mode.py +0 -0
  24. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/base.py +0 -0
  25. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/cost_tracker.py +0 -0
  26. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/external_agents.py +0 -0
  27. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/fast_context.py +0 -0
  28. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/flow_display.py +0 -0
  29. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/git_integration.py +0 -0
  30. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/guardrail.py +0 -0
  31. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/handoff.py +0 -0
  32. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/image.py +0 -0
  33. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/interactive_tui.py +0 -0
  34. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/knowledge.py +0 -0
  35. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/mcp.py +0 -0
  36. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/message_queue.py +0 -0
  37. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/metrics.py +0 -0
  38. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/n8n.py +0 -0
  39. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/repo_map.py +0 -0
  40. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/router.py +0 -0
  41. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/sandbox_executor.py +0 -0
  42. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/session.py +0 -0
  43. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/slash_commands.py +0 -0
  44. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/telemetry.py +0 -0
  45. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/todo.py +0 -0
  46. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/tools.py +0 -0
  47. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/cli/features/workflow.py +0 -0
  48. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/__init__.py +0 -0
  49. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/agent_tools.py +0 -0
  50. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/diff/__init__.py +0 -0
  51. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/diff/diff_strategy.py +0 -0
  52. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/tools/__init__.py +0 -0
  53. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/tools/apply_diff.py +0 -0
  54. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/tools/execute_command.py +0 -0
  55. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/tools/list_files.py +0 -0
  56. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/tools/read_file.py +0 -0
  57. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/tools/search_replace.py +0 -0
  58. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/tools/write_file.py +0 -0
  59. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/utils/__init__.py +0 -0
  60. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/utils/file_utils.py +0 -0
  61. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/utils/ignore_utils.py +0 -0
  62. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/code/utils/text_utils.py +0 -0
  63. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/inbuilt_tools/__init__.py +0 -0
  64. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  65. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/inc/__init__.py +0 -0
  66. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/inc/config.py +0 -0
  67. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/inc/models.py +0 -0
  68. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/integrations/__init__.py +0 -0
  69. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/integrations/base.py +0 -0
  70. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/integrations/claude_code.py +0 -0
  71. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/integrations/codex_cli.py +0 -0
  72. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/integrations/cursor_cli.py +0 -0
  73. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/integrations/gemini_cli.py +0 -0
  74. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/profiler.py +0 -0
  75. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/scheduler.py +0 -0
  76. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/setup/__init__.py +0 -0
  77. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/setup/build.py +0 -0
  78. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/setup/post_install.py +0 -0
  79. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/setup/setup_conda_env.py +0 -0
  80. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/setup.py +0 -0
  81. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/test.py +0 -0
  82. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/train.py +0 -0
  83. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/train_vision.py +0 -0
  84. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/agents.py +0 -0
  85. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/callbacks.py +0 -0
  86. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/chat.py +0 -0
  87. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/code.py +0 -0
  88. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/colab.py +0 -0
  89. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/colab_chainlit.py +0 -0
  90. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/components/aicoder.py +0 -0
  91. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/context.py +0 -0
  92. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/database_config.py +0 -0
  93. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/db.py +0 -0
  94. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/realtime.py +0 -0
  95. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/realtimeclient/__init__.py +0 -0
  96. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/realtimeclient/tools.py +0 -0
  97. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/ui/sql_alchemy.py +0 -0
  98. {praisonai-2.3.59 → praisonai-2.3.60}/praisonai/upload_vision.py +0 -0
  99. {praisonai-2.3.59 → praisonai-2.3.60}/pyproject.toml +0 -0
  100. {praisonai-2.3.59 → praisonai-2.3.60}/setup.cfg +0 -0
  101. {praisonai-2.3.59 → praisonai-2.3.60}/tests/test.py +0 -0
  102. {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_agents_playbook.py +0 -0
  103. {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_approval_system.py +0 -0
  104. {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_basic.py +0 -0
  105. {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_cli_features.py +0 -0
  106. {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_custom_tools_fix.py +0 -0
  107. {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_double_api_fix.py +0 -0
  108. {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_n8n_integration.py +0 -0
  109. {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_phase2_refactor.py +0 -0
  110. {praisonai-2.3.59 → praisonai-2.3.60}/tests/test_runner.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 2.3.59
3
+ Version: 2.3.60
4
4
  Summary: PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration.
5
5
  Author: Mervin Praison
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 2.3.59
3
+ Version: 2.3.60
4
4
  Summary: PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration.
5
5
  Author: Mervin Praison
6
6
  License: MIT
@@ -3021,7 +3021,8 @@ Provide ONLY the commit message, no explanations."""
3021
3021
  if tool_level_value <= max_level_value:
3022
3022
  return ApprovalDecision(approved=True, reason=f"Auto-approved (level {risk_level} <= {max_level})")
3023
3023
  else:
3024
- # Fall back to console approval for higher risk levels
3024
+ # Signal to pause Live display before showing approval prompt
3025
+ # This is handled by the approval_pending flag in status_info
3025
3026
  from praisonaiagents.approval import console_approval_callback
3026
3027
  return console_approval_callback(function_name, arguments, risk_level)
3027
3028
 
@@ -3297,7 +3298,9 @@ Now, {final_instruction.lower()}:"""
3297
3298
  'result': None,
3298
3299
  'error': None,
3299
3300
  'start_time': time.time(),
3300
- 'available_tools': tool_names
3301
+ 'available_tools': tool_names,
3302
+ 'approval_pending': False, # Flag to pause Live display during approval
3303
+ 'live_instance': None # Reference to Live instance for stopping
3301
3304
  }
3302
3305
 
3303
3306
  def tool_call_callback(message):
@@ -3360,6 +3363,53 @@ Now, {final_instruction.lower()}:"""
3360
3363
  finally:
3361
3364
  status_info['done'] = True
3362
3365
 
3366
+ # Set up approval callback that stops Live display before prompting
3367
+ # Only if not using --trust (which auto-approves everything)
3368
+ if not getattr(self.args, 'trust', False):
3369
+ from praisonaiagents.approval import set_approval_callback, ApprovalDecision
3370
+ from rich.prompt import Confirm
3371
+ from rich.panel import Panel
3372
+
3373
+ def cli_approval_with_live_pause(function_name, arguments, risk_level):
3374
+ """Approval callback that stops Live display before prompting."""
3375
+ # Signal to stop Live display
3376
+ status_info['approval_pending'] = True
3377
+
3378
+ # Wait a moment for Live to stop
3379
+ time.sleep(0.2)
3380
+
3381
+ # Now show the approval prompt
3382
+ risk_colors = {"critical": "bold red", "high": "red", "medium": "yellow", "low": "blue"}
3383
+ risk_color = risk_colors.get(risk_level, "white")
3384
+
3385
+ tool_info = f"[bold]Function:[/] {function_name}\n"
3386
+ tool_info += f"[bold]Risk Level:[/] [{risk_color}]{risk_level.upper()}[/{risk_color}]\n"
3387
+ tool_info += "[bold]Arguments:[/]\n"
3388
+ for key, value in arguments.items():
3389
+ str_value = str(value)[:100] + "..." if len(str(value)) > 100 else str(value)
3390
+ tool_info += f" {key}: {str_value}\n"
3391
+
3392
+ console.print(Panel(tool_info.strip(), title="🔒 Tool Approval Required", border_style=risk_color))
3393
+
3394
+ try:
3395
+ approved = Confirm.ask(f"[{risk_color}]Execute this {risk_level} risk tool?[/{risk_color}]", default=False)
3396
+ status_info['approval_pending'] = False
3397
+
3398
+ if approved:
3399
+ console.print("[green]✅ Approved[/green]")
3400
+ return ApprovalDecision(approved=True, reason="User approved")
3401
+ else:
3402
+ console.print("[red]❌ Denied[/red]")
3403
+ return ApprovalDecision(approved=False, reason="User denied")
3404
+ except (KeyboardInterrupt, EOFError):
3405
+ status_info['approval_pending'] = False
3406
+ console.print("\n[red]❌ Cancelled[/red]")
3407
+ return ApprovalDecision(approved=False, reason="User cancelled")
3408
+
3409
+ # Only set if not already set by --approve-level
3410
+ if not getattr(self.args, 'approve_level', None):
3411
+ set_approval_callback(cli_approval_with_live_pause)
3412
+
3363
3413
  # Start agent in background thread
3364
3414
  thread = threading.Thread(target=run_agent, daemon=True)
3365
3415
  thread.start()
@@ -3367,9 +3417,26 @@ Now, {final_instruction.lower()}:"""
3367
3417
  # Show live status while processing
3368
3418
  try:
3369
3419
  with Live(build_status_display(), console=console, refresh_per_second=4, transient=True) as live:
3420
+ status_info['live_instance'] = live
3370
3421
  while not status_info['done']:
3422
+ # Check if approval is pending - stop Live to show prompt
3423
+ if status_info['approval_pending']:
3424
+ break
3371
3425
  live.update(build_status_display())
3372
3426
  time.sleep(0.1)
3427
+
3428
+ # If approval was pending, wait for it to complete then restart Live
3429
+ while status_info['approval_pending']:
3430
+ time.sleep(0.1)
3431
+
3432
+ # Continue with Live display if not done
3433
+ if not status_info['done']:
3434
+ with Live(build_status_display(), console=console, refresh_per_second=4, transient=True) as live:
3435
+ while not status_info['done']:
3436
+ if status_info['approval_pending']:
3437
+ break
3438
+ live.update(build_status_display())
3439
+ time.sleep(0.1)
3373
3440
  except KeyboardInterrupt:
3374
3441
  console.print("\n[dim]Interrupted[/dim]")
3375
3442
  # Unregister callback
@@ -57,7 +57,7 @@ class CloudDeployer:
57
57
  file.write("FROM python:3.11-slim\n")
58
58
  file.write("WORKDIR /app\n")
59
59
  file.write("COPY . .\n")
60
- file.write("RUN pip install flask praisonai==2.3.59 gunicorn markdown\n")
60
+ file.write("RUN pip install flask praisonai==2.3.60 gunicorn markdown\n")
61
61
  file.write("EXPOSE 8080\n")
62
62
  file.write('CMD ["gunicorn", "-b", "0.0.0.0:8080", "api:app"]\n')
63
63
 
@@ -0,0 +1 @@
1
+ __version__ = "2.3.60"
@@ -1 +0,0 @@
1
- __version__ = "2.3.59"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes