praisonai-code 0.0.28__tar.gz → 0.0.30__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 (301) hide show
  1. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/PKG-INFO +21 -6
  2. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/README.md +20 -5
  3. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/__init__.py +1 -1
  4. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/chat.py +1 -1
  5. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/code.py +1 -1
  6. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/run.py +74 -1
  7. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/setup.py +12 -22
  8. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/tools.py +46 -0
  9. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/setup/handler.py +206 -55
  10. praisonai_code-0.0.30/praisonai_code/cli/utils/stdin.py +165 -0
  11. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code.egg-info/PKG-INFO +21 -6
  12. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/pyproject.toml +1 -1
  13. praisonai_code-0.0.28/praisonai_code/cli/utils/stdin.py +0 -90
  14. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/__main__.py +0 -0
  15. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/_bot_bridge.py +0 -0
  16. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/_framework_availability.py +0 -0
  17. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/_logging.py +0 -0
  18. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/_registry.py +0 -0
  19. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/_safe_loader.py +0 -0
  20. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/_version.py +0 -0
  21. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/_wrapper_bridge.py +0 -0
  22. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/__init__.py +0 -0
  23. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/_forward_shim.py +0 -0
  24. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/_paths.py +0 -0
  25. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/_warnings.py +0 -0
  26. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/_wrapper_reexport.py +0 -0
  27. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/app.py +0 -0
  28. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/approval_backend.py +0 -0
  29. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/branding.py +0 -0
  30. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/__init__.py +0 -0
  31. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/acp.py +0 -0
  32. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/agent.py +0 -0
  33. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/agents.py +0 -0
  34. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/attach.py +0 -0
  35. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/auth.py +0 -0
  36. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/benchmark.py +0 -0
  37. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/browser.py +0 -0
  38. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/call.py +0 -0
  39. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/checkpoint.py +0 -0
  40. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/command.py +0 -0
  41. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/commit.py +0 -0
  42. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/completion.py +0 -0
  43. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/config.py +0 -0
  44. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/daemon.py +0 -0
  45. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/debug.py +0 -0
  46. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/deploy.py +0 -0
  47. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/diag.py +0 -0
  48. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/doctor.py +0 -0
  49. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/endpoints.py +0 -0
  50. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/environment.py +0 -0
  51. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/eval.py +0 -0
  52. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/github.py +0 -0
  53. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/hooks.py +0 -0
  54. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/init.py +0 -0
  55. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/loop.py +0 -0
  56. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/lsp.py +0 -0
  57. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/memory.py +0 -0
  58. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/models.py +0 -0
  59. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/obs.py +0 -0
  60. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/package.py +0 -0
  61. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/paths.py +0 -0
  62. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/permissions.py +0 -0
  63. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/plugins.py +0 -0
  64. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/port.py +0 -0
  65. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/publish.py +0 -0
  66. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/registry.py +0 -0
  67. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/research.py +0 -0
  68. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/retrieval.py +0 -0
  69. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/rules.py +0 -0
  70. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/sandbox.py +0 -0
  71. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/serve.py +0 -0
  72. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/session.py +0 -0
  73. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/skills.py +0 -0
  74. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/templates.py +0 -0
  75. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/test.py +0 -0
  76. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/todo.py +0 -0
  77. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/traces.py +0 -0
  78. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/tracker.py +0 -0
  79. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/ui.py +0 -0
  80. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/up.py +0 -0
  81. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/version.py +0 -0
  82. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/workflow.py +0 -0
  83. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/config_loader.py +0 -0
  84. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/__init__.py +0 -0
  85. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/config.schema.json +0 -0
  86. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/credentials.py +0 -0
  87. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/loader.py +0 -0
  88. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/model_resolver.py +0 -0
  89. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/oauth.py +0 -0
  90. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/paths.py +0 -0
  91. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/resolver.py +0 -0
  92. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/schema.py +0 -0
  93. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/execution/__init__.py +0 -0
  94. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/execution/core.py +0 -0
  95. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/execution/profiler.py +0 -0
  96. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/execution/request.py +0 -0
  97. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/execution/result.py +0 -0
  98. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/fallback_schema.py +0 -0
  99. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/__init__.py +0 -0
  100. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/_approval_bridge.py +0 -0
  101. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/_endpoint_registry.py +0 -0
  102. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/_search_registry.py +0 -0
  103. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/action_orchestrator.py +0 -0
  104. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/agents.py +0 -0
  105. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/at_mentions.py +0 -0
  106. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/audit_cli.py +0 -0
  107. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/auto_memory.py +0 -0
  108. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/auto_mode.py +0 -0
  109. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/autonomy_mode.py +0 -0
  110. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/base.py +0 -0
  111. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/benchmark.py +0 -0
  112. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/capabilities.py +0 -0
  113. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/checkpoints.py +0 -0
  114. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/cli_profiler.py +0 -0
  115. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/code_intelligence.py +0 -0
  116. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/compaction.py +0 -0
  117. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/compare.py +0 -0
  118. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/config_hierarchy.py +0 -0
  119. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/context_manager.py +0 -0
  120. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/cost_tracker.py +0 -0
  121. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/csv_test_runner.py +0 -0
  122. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/custom_definitions.py +0 -0
  123. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/debug.py +0 -0
  124. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/diag.py +0 -0
  125. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/display_jsonl.py +0 -0
  126. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/__init__.py +0 -0
  127. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/__init__.py +0 -0
  128. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/_wrapper_checks.py +0 -0
  129. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/acp_checks.py +0 -0
  130. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/bot_checks.py +0 -0
  131. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/config_checks.py +0 -0
  132. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/db_checks.py +0 -0
  133. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/env_checks.py +0 -0
  134. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/gateway_checks.py +0 -0
  135. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/lsp_checks.py +0 -0
  136. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/mcp_checks.py +0 -0
  137. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/memory_checks.py +0 -0
  138. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/network_checks.py +0 -0
  139. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/obs_checks.py +0 -0
  140. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/packaging_checks.py +0 -0
  141. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/performance_checks.py +0 -0
  142. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/permissions_checks.py +0 -0
  143. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/runtime_checks.py +0 -0
  144. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/runtime_migration_checks.py +0 -0
  145. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/selftest_checks.py +0 -0
  146. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/serve_checks.py +0 -0
  147. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/skills_checks.py +0 -0
  148. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/tools_checks.py +0 -0
  149. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/engine.py +0 -0
  150. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/formatters.py +0 -0
  151. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/handler.py +0 -0
  152. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/models.py +0 -0
  153. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/registry.py +0 -0
  154. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/examples.py +0 -0
  155. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/external_agents.py +0 -0
  156. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/fast_context.py +0 -0
  157. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/file_history.py +0 -0
  158. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/flow_display.py +0 -0
  159. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/git_attribution.py +0 -0
  160. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/git_integration.py +0 -0
  161. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/guardrail.py +0 -0
  162. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/handoff.py +0 -0
  163. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/hooks.py +0 -0
  164. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/hybrid_workflow.py +0 -0
  165. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/image.py +0 -0
  166. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/interactive_core_headless.py +0 -0
  167. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/interactive_runtime.py +0 -0
  168. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/interactive_test_harness.py +0 -0
  169. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/interactive_tools.py +0 -0
  170. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/interactive_tui.py +0 -0
  171. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/job_workflow.py +0 -0
  172. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/jobs.py +0 -0
  173. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/knowledge.py +0 -0
  174. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/knowledge_cli.py +0 -0
  175. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/lite.py +0 -0
  176. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/logs.py +0 -0
  177. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/lsp_cli.py +0 -0
  178. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/lsp_diagnostics.py +0 -0
  179. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/mcp.py +0 -0
  180. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/message_queue.py +0 -0
  181. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/metrics.py +0 -0
  182. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/migrate.py +0 -0
  183. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/migration_flow.py +0 -0
  184. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/migration_spec.py +0 -0
  185. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/n8n.py +0 -0
  186. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/observability.py +0 -0
  187. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/output_modes.py +0 -0
  188. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/output_style.py +0 -0
  189. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/package.py +0 -0
  190. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/performance.py +0 -0
  191. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/profiler/__init__.py +0 -0
  192. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/profiler/core.py +0 -0
  193. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/profiler/optimizations.py +0 -0
  194. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/profiler/suite.py +0 -0
  195. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/queue/__init__.py +0 -0
  196. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/queue/manager.py +0 -0
  197. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/queue/models.py +0 -0
  198. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/queue/persistence.py +0 -0
  199. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/queue/scheduler.py +0 -0
  200. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/queue/worker.py +0 -0
  201. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/recipe_creator.py +0 -0
  202. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/recipe_prompts.py +0 -0
  203. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/repo_map.py +0 -0
  204. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/router.py +0 -0
  205. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/safe_shell.py +0 -0
  206. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/sandbox_executor.py +0 -0
  207. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/sdk_knowledge.py +0 -0
  208. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/session.py +0 -0
  209. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/session_checkpoints.py +0 -0
  210. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/setup/__init__.py +0 -0
  211. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/setup/templates.py +0 -0
  212. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/skills.py +0 -0
  213. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/slash_commands.py +0 -0
  214. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/telemetry.py +0 -0
  215. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/thinking.py +0 -0
  216. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/todo.py +0 -0
  217. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tools.py +0 -0
  218. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/__init__.py +0 -0
  219. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/cli.py +0 -0
  220. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/config.py +0 -0
  221. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/debug.py +0 -0
  222. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/events.py +0 -0
  223. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/mock_provider.py +0 -0
  224. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/orchestrator.py +0 -0
  225. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/screens/__init__.py +0 -0
  226. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/screens/help.py +0 -0
  227. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/screens/main.py +0 -0
  228. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/screens/queue.py +0 -0
  229. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/screens/session.py +0 -0
  230. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/screens/settings.py +0 -0
  231. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/session_store.py +0 -0
  232. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/__init__.py +0 -0
  233. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/chat.py +0 -0
  234. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/command_popup.py +0 -0
  235. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/composer.py +0 -0
  236. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/file_popup.py +0 -0
  237. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/queue_panel.py +0 -0
  238. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/status.py +0 -0
  239. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/tool_panel.py +0 -0
  240. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/wizard.py +0 -0
  241. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/workflow.py +0 -0
  242. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/yaml_utils.py +0 -0
  243. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/__init__.py +0 -0
  244. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/async_tui.py +0 -0
  245. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/config.py +0 -0
  246. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/core.py +0 -0
  247. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/events.py +0 -0
  248. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/frontends/__init__.py +0 -0
  249. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/frontends/rich_frontend.py +0 -0
  250. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/frontends/textual_frontend.py +0 -0
  251. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/praison_io.py +0 -0
  252. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/repl.py +0 -0
  253. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/split_tui.py +0 -0
  254. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/tui_app.py +0 -0
  255. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/legacy/__init__.py +0 -0
  256. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/legacy/env_security.py +0 -0
  257. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/legacy/praison_ai.py +0 -0
  258. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/legacy/prompt_dispatch.py +0 -0
  259. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/main.py +0 -0
  260. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/output/__init__.py +0 -0
  261. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/output/console.py +0 -0
  262. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/output/event_bridge.py +0 -0
  263. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/schedule_cli.py +0 -0
  264. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/schema_provider.py +0 -0
  265. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/session/__init__.py +0 -0
  266. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/session/resume.py +0 -0
  267. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/session/unified.py +0 -0
  268. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/state/__init__.py +0 -0
  269. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/state/identifiers.py +0 -0
  270. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/state/project_sessions.py +0 -0
  271. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/state/sessions.py +0 -0
  272. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/ui/__init__.py +0 -0
  273. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/ui/config.py +0 -0
  274. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/ui/events.py +0 -0
  275. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/ui/mg_backend.py +0 -0
  276. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/ui/plain.py +0 -0
  277. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/ui/rich_backend.py +0 -0
  278. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/unified_schema.py +0 -0
  279. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/utils/env_utils.py +0 -0
  280. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/utils/project.py +0 -0
  281. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli_backends/__init__.py +0 -0
  282. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli_backends/claude.py +0 -0
  283. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli_backends/registry.py +0 -0
  284. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/llm/__init__.py +0 -0
  285. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/llm/catalogue.py +0 -0
  286. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/llm/config.py +0 -0
  287. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/llm/credentials.py +0 -0
  288. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/llm/env.py +0 -0
  289. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/runtime/__init__.py +0 -0
  290. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/runtime/__main__.py +0 -0
  291. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/runtime/client.py +0 -0
  292. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/runtime/descriptor.py +0 -0
  293. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/runtime/server.py +0 -0
  294. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/tool_registry.py +0 -0
  295. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/tool_resolver.py +0 -0
  296. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code.egg-info/SOURCES.txt +0 -0
  297. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code.egg-info/dependency_links.txt +0 -0
  298. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code.egg-info/entry_points.txt +0 -0
  299. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code.egg-info/requires.txt +0 -0
  300. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code.egg-info/top_level.txt +0 -0
  301. {praisonai_code-0.0.28 → praisonai_code-0.0.30}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: praisonai-code
3
- Version: 0.0.28
3
+ Version: 0.0.30
4
4
  Summary: Agentic terminal CLI for PraisonAI — the terminal-native agent (run, chat, code, runtime, cli backends) extracted from the praisonai wrapper.
5
5
  Author: Mervin Praison
6
6
  License: MIT
@@ -71,17 +71,32 @@ click, textual, PyYAML, python-dotenv, litellm, mcp, pydantic — see
71
71
 
72
72
  ### Standalone limits (`pip install praisonai-code` only)
73
73
 
74
+ The terminal-native commands (`run`, `chat`, `code`, `doctor`, `daemon`) live in
75
+ `praisonai_code.cli.commands.*` and resolve via `LazyCommandGroup` without
76
+ importing the wrapper. Only commands in `_WRAPPER_RESIDENT_COMMANDS` (see
77
+ `praisonai_code/cli/app.py`) require `pip install praisonai`.
78
+
74
79
  | Command | Works standalone? | Notes |
75
80
  |---------|-------------------|-------|
81
+ | `praisonai-code --version` | Yes | |
76
82
  | `run --help`, `config`, `doctor` | Yes | |
77
- | `run --output actions "…"` | Yes | In-process `Agent` |
78
- | `run "…"` (default) | No | Requires `pip install praisonai` |
79
- | `chat`, `code` | No | TUI / interactive legacy live in wrapper |
83
+ | `run --output verbose "…"` | Yes | In-process `Agent` (verified). `run` modes: `silent` (default), `actions`, `verbose`, `json`, `stream` |
84
+ | `run "…"` (default) | Yes | Resolves via `praisonai_code.cli.commands.run` |
85
+ | `run --output actions "…"` | Yes (intended) | Currently affected by an `auto_save` shadow-import bug — tracked separately |
86
+ | `chat --output plain "…"` | Yes | One-shot; interactive REPL also in code package. `chat` modes: `actions` (default), `plain`, `verbose`, `json`, `silent` |
87
+ | `code --help` | Yes | Full code assistant command registered |
80
88
  | `daemon start` (foreground) | Yes | |
81
89
  | `daemon start --background` | Yes | Spawns `python -m praisonai_code.runtime` |
90
+ | `batch`, `docs`, `langfuse`, `flow`, `n8n`, `train`, … | No | `_WRAPPER_RESIDENT_COMMANDS` — needs `pip install praisonai` |
91
+ | `bot`, `gateway`, `pairing`, … | No | Needs `praisonai` bot package |
92
+
93
+ **Known limitations:**
94
+ - `praisonai-code --help` may crash on Windows (cp1252) due to emoji in command
95
+ descriptions — tracked separately.
96
+ - Piped stdin (`file | run`) is not yet supported on Windows.
82
97
 
83
- For full terminal UX (`chat`, `code`, default `run`), install the wrapper:
84
- `pip install praisonai`.
98
+ For bots, gateway, batch, observability sinks, and the wrapper-resident commands
99
+ above, install the full wrapper: `pip install praisonai`.
85
100
 
86
101
  Completed C7 steps:
87
102
  - `praisonai_code._registry` — vendored plugin registry (no wrapper import)
@@ -49,17 +49,32 @@ click, textual, PyYAML, python-dotenv, litellm, mcp, pydantic — see
49
49
 
50
50
  ### Standalone limits (`pip install praisonai-code` only)
51
51
 
52
+ The terminal-native commands (`run`, `chat`, `code`, `doctor`, `daemon`) live in
53
+ `praisonai_code.cli.commands.*` and resolve via `LazyCommandGroup` without
54
+ importing the wrapper. Only commands in `_WRAPPER_RESIDENT_COMMANDS` (see
55
+ `praisonai_code/cli/app.py`) require `pip install praisonai`.
56
+
52
57
  | Command | Works standalone? | Notes |
53
58
  |---------|-------------------|-------|
59
+ | `praisonai-code --version` | Yes | |
54
60
  | `run --help`, `config`, `doctor` | Yes | |
55
- | `run --output actions "…"` | Yes | In-process `Agent` |
56
- | `run "…"` (default) | No | Requires `pip install praisonai` |
57
- | `chat`, `code` | No | TUI / interactive legacy live in wrapper |
61
+ | `run --output verbose "…"` | Yes | In-process `Agent` (verified). `run` modes: `silent` (default), `actions`, `verbose`, `json`, `stream` |
62
+ | `run "…"` (default) | Yes | Resolves via `praisonai_code.cli.commands.run` |
63
+ | `run --output actions "…"` | Yes (intended) | Currently affected by an `auto_save` shadow-import bug — tracked separately |
64
+ | `chat --output plain "…"` | Yes | One-shot; interactive REPL also in code package. `chat` modes: `actions` (default), `plain`, `verbose`, `json`, `silent` |
65
+ | `code --help` | Yes | Full code assistant command registered |
58
66
  | `daemon start` (foreground) | Yes | |
59
67
  | `daemon start --background` | Yes | Spawns `python -m praisonai_code.runtime` |
68
+ | `batch`, `docs`, `langfuse`, `flow`, `n8n`, `train`, … | No | `_WRAPPER_RESIDENT_COMMANDS` — needs `pip install praisonai` |
69
+ | `bot`, `gateway`, `pairing`, … | No | Needs `praisonai` bot package |
70
+
71
+ **Known limitations:**
72
+ - `praisonai-code --help` may crash on Windows (cp1252) due to emoji in command
73
+ descriptions — tracked separately.
74
+ - Piped stdin (`file | run`) is not yet supported on Windows.
60
75
 
61
- For full terminal UX (`chat`, `code`, default `run`), install the wrapper:
62
- `pip install praisonai`.
76
+ For bots, gateway, batch, observability sinks, and the wrapper-resident commands
77
+ above, install the full wrapper: `pip install praisonai`.
63
78
 
64
79
  Completed C7 steps:
65
80
  - `praisonai_code._registry` — vendored plugin registry (no wrapper import)
@@ -12,6 +12,6 @@ the remaining terminal-agent modules, with PEP 562 shims left behind at the
12
12
  old ``praisonai.*`` paths for backward compatibility.
13
13
  """
14
14
 
15
- __version__ = "0.0.28"
15
+ __version__ = "0.0.30"
16
16
 
17
17
  __all__ = ["__version__"]
@@ -60,7 +60,7 @@ def chat_main(
60
60
  flag_value="true",
61
61
  ),
62
62
  no_memory: bool = typer.Option(False, "--no-memory", help="Disable memory"),
63
- tools: Optional[str] = typer.Option(None, "--tools", "-t", help="Tools file path"),
63
+ tools: Optional[str] = typer.Option(None, "--tools", "-t", help="Comma-separated tool names (e.g. web_search,github) or a tools.py file path"),
64
64
  toolset: Optional[str] = typer.Option(None, "--toolset", help="Named toolset groups (comma-separated, e.g., web,files)"),
65
65
  user_id: Optional[str] = typer.Option(None, "--user-id", help="User ID for memory isolation"),
66
66
  session_id: Optional[str] = typer.Option(None, "--session", "-s", help="Session ID to resume"),
@@ -18,7 +18,7 @@ def code_main(
18
18
  prompt: Optional[str] = typer.Argument(None, help="Code task or question"),
19
19
  model: Optional[str] = typer.Option(None, "--model", "-m", help="LLM model to use"),
20
20
  verbose: bool = typer.Option(False, "--verbose", "-v", help="Verbose output"),
21
- tools: Optional[str] = typer.Option(None, "--tools", "-t", help="Tools file path"),
21
+ tools: Optional[str] = typer.Option(None, "--tools", "-t", help="Comma-separated tool names (e.g. web_search,github) or a tools.py file path"),
22
22
  workspace: Optional[str] = typer.Option(None, "--workspace", "-w", help="Workspace directory"),
23
23
  file: Optional[List[str]] = typer.Option(None, "--file", "-f", help="Attach file(s) to context"),
24
24
  no_acp: bool = typer.Option(False, "--no-acp", help="Disable ACP tools (file operations)"),
@@ -252,6 +252,68 @@ def _build_mcp_tools(
252
252
  return tools
253
253
 
254
254
 
255
+ def _resolve_tools_arg(value: Optional[str], verbose: bool = False) -> list:
256
+ """Resolve a ``--tools`` value into a list of tool callables.
257
+
258
+ ``value`` may be a comma-separated list of tool *names* (resolved by name
259
+ through :class:`ToolResolver`, so CLI == YAML == Python), a path to a
260
+ ``tools.py`` file, or a mix of both. Items ending in ``.py`` or that exist
261
+ on disk are loaded as files; everything else is resolved by name.
262
+
263
+ Returns an empty list when ``value`` is falsy so callers can unconditionally
264
+ extend an agent's tool list.
265
+ """
266
+ import os as _os
267
+
268
+ if not value:
269
+ return []
270
+
271
+ from praisonai_code.tool_resolver import ToolResolver
272
+ resolver = ToolResolver()
273
+ resolved: list = []
274
+ for item in (v.strip() for v in value.split(",")):
275
+ if not item:
276
+ continue
277
+ if item.endswith(".py") or _os.path.exists(item):
278
+ module_fns = resolver.load_functions_from_module(item)
279
+ if module_fns:
280
+ resolved.extend(module_fns.values())
281
+ elif not _os.path.exists(item):
282
+ # A .py name that isn't on disk: fall through to name resolution.
283
+ # Strip the .py suffix so "internet_search.py" resolves as the
284
+ # named tool "internet_search" instead of missing outright.
285
+ name_only = item[:-3] if item.endswith(".py") else item
286
+ tool = resolver.resolve(name_only, instantiate=True)
287
+ if tool is not None:
288
+ resolved.append(tool)
289
+ else:
290
+ from ..output import get_output_controller
291
+ get_output_controller().print_info(
292
+ f"Unknown tool '{item}'. Run 'praisonai tools list' to see available tools."
293
+ )
294
+ else:
295
+ # tools.py present on disk but produced no callables.
296
+ from ..output import get_output_controller
297
+ if not _os.environ.get("PRAISONAI_ALLOW_LOCAL_TOOLS"):
298
+ get_output_controller().print_info(
299
+ f"Skipped '{item}': set PRAISONAI_ALLOW_LOCAL_TOOLS=true to load local tools."
300
+ )
301
+ else:
302
+ get_output_controller().print_info(
303
+ f"No callable tools found in '{item}'."
304
+ )
305
+ else:
306
+ tool = resolver.resolve(item, instantiate=True)
307
+ if tool is not None:
308
+ resolved.append(tool)
309
+ else:
310
+ from ..output import get_output_controller
311
+ get_output_controller().print_info(
312
+ f"Unknown tool '{item}'. Run 'praisonai tools list' to see available tools."
313
+ )
314
+ return resolved
315
+
316
+
255
317
  def _permissions_from_config(config) -> Optional[dict]:
256
318
  """Convert a resolved ``permissions`` config section to a pattern->action dict.
257
319
 
@@ -510,7 +572,7 @@ def run_main(
510
572
  stream: bool = typer.Option(False, "--stream/--no-stream", help="Stream output (default: off for production use)"),
511
573
  trace: bool = typer.Option(False, "--trace", help="Enable tracing"),
512
574
  memory: bool = typer.Option(False, "--memory", help="Enable memory"),
513
- tools: Optional[str] = typer.Option(None, "--tools", "-t", help="Tools file path"),
575
+ tools: Optional[str] = typer.Option(None, "--tools", "-t", help="Comma-separated tool names (e.g. web_search,github) or a tools.py file path"),
514
576
  toolset: Optional[str] = typer.Option(None, "--toolset", help="Named toolset groups (comma-separated, e.g., web,files)"),
515
577
  max_tokens: int = typer.Option(16000, "--max-tokens", help="Maximum output tokens"),
516
578
  profile: bool = typer.Option(False, "--profile", help="Enable CLI profiling (timing breakdown)"),
@@ -1143,6 +1205,17 @@ def _run_prompt(
1143
1205
  if mcp_tools:
1144
1206
  agent_config["tools"] = list(agent_config.get("tools", [])) + mcp_tools
1145
1207
 
1208
+ # Wire --tools (names or file) and --toolset so actions mode reaches
1209
+ # parity with the default/YAML/Python surfaces (previously dropped).
1210
+ selected_tools = _resolve_tools_arg(tools, verbose=verbose)
1211
+ if toolset:
1212
+ from praisonai_code.tool_resolver import resolve_toolsets as _resolve_toolsets
1213
+ toolset_names = [t.strip() for t in toolset.split(",") if t.strip()]
1214
+ if toolset_names:
1215
+ selected_tools.extend(_resolve_toolsets(toolset_names))
1216
+ if selected_tools:
1217
+ agent_config["tools"] = list(agent_config.get("tools", [])) + selected_tools
1218
+
1146
1219
  agent = Agent(**agent_config)
1147
1220
  # Reasoning effort applied via the property setter (not a
1148
1221
  # constructor kwarg) so defaults are unchanged when omitted.
@@ -14,9 +14,6 @@ from ..output.console import get_output_controller
14
14
 
15
15
  app = typer.Typer(help="Interactive onboarding / configuration wizard")
16
16
 
17
- # Source the OpenAI default from the single source of truth so setup never
18
- # re-declares the terminal fallback literal.
19
- from praisonai_code.llm.env import DEFAULT_FALLBACK_MODEL as _OPENAI_DEFAULT_MODEL
20
17
 
21
18
  # Default PRAISON_HOME directory
22
19
  def get_praison_home() -> Path:
@@ -29,22 +26,9 @@ def get_praison_home() -> Path:
29
26
  PRAISON_HOME = get_praison_home()
30
27
  ENV_FILE = PRAISON_HOME / ".env"
31
28
 
32
- # Provider configurations
33
- PROVIDERS = {
34
- "1": ("openai", "OPENAI_API_KEY", _OPENAI_DEFAULT_MODEL),
35
- "2": ("anthropic", "ANTHROPIC_API_KEY", "claude-3-5-sonnet-latest"),
36
- "3": ("google", "GEMINI_API_KEY", "gemini-2.0-flash"),
37
- "4": ("ollama", None, "llama3.2"),
38
- "5": ("custom", None, None),
39
- }
40
-
41
- PROVIDER_NAMES = {
42
- "openai": ("OpenAI", "OPENAI_API_KEY", _OPENAI_DEFAULT_MODEL),
43
- "anthropic": ("Anthropic", "ANTHROPIC_API_KEY", "claude-3-5-sonnet-latest"),
44
- "google": ("Google", "GEMINI_API_KEY", "gemini-2.0-flash"),
45
- "ollama": ("Ollama", None, "llama3.2"),
46
- "custom": ("Custom", None, None),
47
- }
29
+ # Provider configurations (names, env-vars, and refreshed default models) live
30
+ # in a single source of truth: SetupHandler._provider_defaults(). Do not
31
+ # re-declare them here.
48
32
 
49
33
 
50
34
  def _run_setup(
@@ -52,6 +36,7 @@ def _run_setup(
52
36
  provider: Optional[str] = None,
53
37
  api_key: Optional[str] = None,
54
38
  model: Optional[str] = None,
39
+ verify: bool = True,
55
40
  ) -> int:
56
41
  """Run the setup wizard."""
57
42
  try:
@@ -61,7 +46,8 @@ def _run_setup(
61
46
  non_interactive=non_interactive,
62
47
  provider=provider,
63
48
  api_key=api_key,
64
- model=model
49
+ model=model,
50
+ verify=verify,
65
51
  )
66
52
  except ImportError as e:
67
53
  output = get_output_controller()
@@ -80,6 +66,7 @@ def setup_callback(
80
66
  provider: Optional[str] = typer.Option(None, "--provider", help="LLM provider (openai, anthropic, google, ollama, custom)"),
81
67
  api_key: Optional[str] = typer.Option(None, "--api-key", help="API key for the provider"),
82
68
  model: Optional[str] = typer.Option(None, "--model", help="Default model to use"),
69
+ no_verify: bool = typer.Option(False, "--no-verify", help="Skip the post-setup smoke test (offline/CI)"),
83
70
  ):
84
71
  """Run the onboarding wizard (idempotent — safe to re-run)."""
85
72
  if ctx.invoked_subcommand:
@@ -89,7 +76,8 @@ def setup_callback(
89
76
  non_interactive=non_interactive,
90
77
  provider=provider,
91
78
  api_key=api_key,
92
- model=model
79
+ model=model,
80
+ verify=not no_verify,
93
81
  )
94
82
  raise typer.Exit(exit_code)
95
83
 
@@ -99,13 +87,15 @@ def setup_wizard(
99
87
  provider: Optional[str] = typer.Option(None, "--provider", help="LLM provider"),
100
88
  api_key: Optional[str] = typer.Option(None, "--api-key", help="API key"),
101
89
  model: Optional[str] = typer.Option(None, "--model", help="Default model"),
90
+ no_verify: bool = typer.Option(False, "--no-verify", help="Skip the post-setup smoke test (offline/CI)"),
102
91
  ):
103
92
  """Run the interactive setup wizard."""
104
93
  exit_code = _run_setup(
105
94
  non_interactive=False,
106
95
  provider=provider,
107
96
  api_key=api_key,
108
- model=model
97
+ model=model,
98
+ verify=not no_verify,
109
99
  )
110
100
  raise typer.Exit(exit_code)
111
101
 
@@ -11,6 +11,7 @@ from typing import Optional
11
11
 
12
12
  import typer
13
13
  from rich.console import Console
14
+ from rich.markup import escape
14
15
  from rich.table import Table
15
16
 
16
17
  app = typer.Typer(help="Tool management and discovery")
@@ -92,6 +93,51 @@ def tools_list(
92
93
  console.print(f"[dim] Built-in: {len(builtin_tools)} | Local: {len(local_tools)} | External: {len(external_tools)} | Registered: {len(registered_tools)}[/dim]")
93
94
 
94
95
 
96
+ @app.command("search")
97
+ def tools_search(
98
+ query: str = typer.Argument(..., help="Substring to search tool names for"),
99
+ verbose: bool = typer.Option(False, "--verbose", "-v", help="Show detailed info"),
100
+ ):
101
+ """Search available tools by name substring (case-insensitive).
102
+
103
+ Enumerates the same catalogue as 'tools list' (built-in, local, external,
104
+ registered/entry-point) and filters to names containing the query.
105
+ """
106
+ from praisonai_code.tool_resolver import ToolResolver
107
+
108
+ resolver = ToolResolver()
109
+ available = resolver.list_available()
110
+ sources = resolver.list_available_sources()
111
+
112
+ needle = query.strip().lower()
113
+ matches = {
114
+ name: desc for name, desc in available.items() if needle in name.lower()
115
+ }
116
+
117
+ safe_query = escape(query)
118
+ if not matches:
119
+ console.print(f"[yellow]No tools matching '{safe_query}'.[/yellow]")
120
+ console.print("[dim]Run 'praisonai tools list' to see all available tools.[/dim]")
121
+ return
122
+
123
+ table = Table(title=f"Tools matching '{safe_query}'", show_header=True, header_style="bold cyan")
124
+ table.add_column("Tool Name", style="green")
125
+ table.add_column("Source", style="blue")
126
+ if verbose:
127
+ table.add_column("Description", style="dim")
128
+
129
+ for name in sorted(matches.keys()):
130
+ desc = matches[name]
131
+ src = sources.get(name, "builtin")
132
+ if verbose:
133
+ table.add_row(name, src, desc[:60] + "..." if len(desc) > 60 else desc)
134
+ else:
135
+ table.add_row(name, src)
136
+
137
+ console.print(table)
138
+ console.print(f"\n[dim]Total: {len(matches)} match(es)[/dim]")
139
+
140
+
95
141
  @app.command("validate")
96
142
  def tools_validate(
97
143
  yaml_file: str = typer.Argument("agents.yaml", help="YAML file to validate"),