praisonai-code 0.0.5__tar.gz → 0.0.7__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 (331) hide show
  1. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/PKG-INFO +1 -1
  2. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/__init__.py +1 -1
  3. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/_wrapper_bridge.py +7 -2
  4. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/app.py +5 -1
  5. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/chat.py +33 -7
  6. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/doctor.py +64 -0
  7. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/capabilities.py +41 -101
  8. praisonai_code-0.0.7/praisonai_code/cli/features/doctor/checks/_wrapper_checks.py +38 -0
  9. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/acp_checks.py +6 -1
  10. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/bot_checks.py +17 -9
  11. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/config_checks.py +4 -1
  12. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/env_checks.py +126 -23
  13. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/gateway_checks.py +21 -8
  14. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/runtime_checks.py +6 -3
  15. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/serve_checks.py +47 -14
  16. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/formatters.py +30 -2
  17. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/recipe_creator.py +19 -8
  18. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/interactive/async_tui.py +132 -1
  19. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/main.py +36 -11
  20. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli_backends/__init__.py +20 -4
  21. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/tool_resolver.py +2 -1
  22. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code.egg-info/PKG-INFO +1 -1
  23. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code.egg-info/SOURCES.txt +1 -0
  24. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/pyproject.toml +1 -1
  25. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/README.md +0 -0
  26. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/__main__.py +0 -0
  27. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/_framework_availability.py +0 -0
  28. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/_logging.py +0 -0
  29. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/_registry.py +0 -0
  30. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/_safe_loader.py +0 -0
  31. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/_version.py +0 -0
  32. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/__init__.py +0 -0
  33. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/_forward_shim.py +0 -0
  34. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/_paths.py +0 -0
  35. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/_warnings.py +0 -0
  36. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/approval_backend.py +0 -0
  37. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/branding.py +0 -0
  38. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/__init__.py +0 -0
  39. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/acp.py +0 -0
  40. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/agent.py +0 -0
  41. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/agents.py +0 -0
  42. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/app.py +0 -0
  43. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/attach.py +0 -0
  44. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/audit.py +0 -0
  45. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/auth.py +0 -0
  46. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/batch.py +0 -0
  47. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/benchmark.py +0 -0
  48. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/browser.py +0 -0
  49. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/call.py +0 -0
  50. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/checkpoint.py +0 -0
  51. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/code.py +0 -0
  52. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/command.py +0 -0
  53. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/commit.py +0 -0
  54. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/completion.py +0 -0
  55. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/config.py +0 -0
  56. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/context.py +0 -0
  57. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/daemon.py +0 -0
  58. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/debug.py +0 -0
  59. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/deploy.py +0 -0
  60. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/diag.py +0 -0
  61. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/docs.py +0 -0
  62. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/endpoints.py +0 -0
  63. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/environment.py +0 -0
  64. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/eval.py +0 -0
  65. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/examples.py +0 -0
  66. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/flow.py +0 -0
  67. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/github.py +0 -0
  68. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/hooks.py +0 -0
  69. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/init.py +0 -0
  70. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/knowledge.py +0 -0
  71. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/langextract.py +0 -0
  72. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/langfuse.py +0 -0
  73. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/loop.py +0 -0
  74. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/lsp.py +0 -0
  75. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/managed.py +0 -0
  76. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/mcp.py +0 -0
  77. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/memory.py +0 -0
  78. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/models.py +0 -0
  79. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/n8n.py +0 -0
  80. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/obs.py +0 -0
  81. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/package.py +0 -0
  82. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/paths.py +0 -0
  83. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/permissions.py +0 -0
  84. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/plugins.py +0 -0
  85. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/port.py +0 -0
  86. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/profile.py +0 -0
  87. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/publish.py +0 -0
  88. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/rag.py +0 -0
  89. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/realtime.py +0 -0
  90. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/recipe.py +0 -0
  91. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/registry.py +0 -0
  92. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/replay.py +0 -0
  93. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/research.py +0 -0
  94. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/retrieval.py +0 -0
  95. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/rules.py +0 -0
  96. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/run.py +0 -0
  97. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/sandbox.py +0 -0
  98. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/schedule.py +0 -0
  99. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/serve.py +0 -0
  100. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/session.py +0 -0
  101. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/setup.py +0 -0
  102. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/skills.py +0 -0
  103. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/standardise.py +0 -0
  104. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/templates.py +0 -0
  105. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/test.py +0 -0
  106. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/todo.py +0 -0
  107. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/tools.py +0 -0
  108. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/traces.py +0 -0
  109. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/tracker.py +0 -0
  110. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/train.py +0 -0
  111. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/ui.py +0 -0
  112. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/up.py +0 -0
  113. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/validate.py +0 -0
  114. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/version.py +0 -0
  115. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/commands/workflow.py +0 -0
  116. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/config_loader.py +0 -0
  117. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/configuration/__init__.py +0 -0
  118. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/configuration/config.schema.json +0 -0
  119. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/configuration/credentials.py +0 -0
  120. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/configuration/loader.py +0 -0
  121. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/configuration/model_resolver.py +0 -0
  122. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/configuration/oauth.py +0 -0
  123. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/configuration/paths.py +0 -0
  124. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/configuration/resolver.py +0 -0
  125. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/configuration/schema.py +0 -0
  126. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/execution/__init__.py +0 -0
  127. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/execution/core.py +0 -0
  128. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/execution/profiler.py +0 -0
  129. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/execution/request.py +0 -0
  130. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/execution/result.py +0 -0
  131. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/fallback_schema.py +0 -0
  132. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/__init__.py +0 -0
  133. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/_approval_bridge.py +0 -0
  134. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/_endpoint_registry.py +0 -0
  135. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/_search_registry.py +0 -0
  136. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/acp.py +0 -0
  137. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/action_orchestrator.py +0 -0
  138. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/agent_scheduler.py +0 -0
  139. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/agent_tools.py +0 -0
  140. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/agents.py +0 -0
  141. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/at_mentions.py +0 -0
  142. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/audit_cli.py +0 -0
  143. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/auto_memory.py +0 -0
  144. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/auto_mode.py +0 -0
  145. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/autonomy_mode.py +0 -0
  146. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/background.py +0 -0
  147. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/base.py +0 -0
  148. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/benchmark.py +0 -0
  149. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/checkpoints.py +0 -0
  150. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/cli_profiler.py +0 -0
  151. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/code_intelligence.py +0 -0
  152. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/compaction.py +0 -0
  153. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/compare.py +0 -0
  154. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/config_hierarchy.py +0 -0
  155. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/context_manager.py +0 -0
  156. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/cost_tracker.py +0 -0
  157. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/csv_test_runner.py +0 -0
  158. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/custom_definitions.py +0 -0
  159. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/debug.py +0 -0
  160. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/deploy.py +0 -0
  161. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/diag.py +0 -0
  162. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/display_jsonl.py +0 -0
  163. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/__init__.py +0 -0
  164. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/__init__.py +0 -0
  165. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/db_checks.py +0 -0
  166. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/lsp_checks.py +0 -0
  167. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/mcp_checks.py +0 -0
  168. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/memory_checks.py +0 -0
  169. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/network_checks.py +0 -0
  170. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/obs_checks.py +0 -0
  171. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/packaging_checks.py +0 -0
  172. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/performance_checks.py +0 -0
  173. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/permissions_checks.py +0 -0
  174. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/runtime_migration_checks.py +0 -0
  175. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/selftest_checks.py +0 -0
  176. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/skills_checks.py +0 -0
  177. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/checks/tools_checks.py +0 -0
  178. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/engine.py +0 -0
  179. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/handler.py +0 -0
  180. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/models.py +0 -0
  181. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/doctor/registry.py +0 -0
  182. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/endpoints.py +0 -0
  183. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/eval.py +0 -0
  184. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/examples.py +0 -0
  185. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/external_agents.py +0 -0
  186. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/fast_context.py +0 -0
  187. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/file_history.py +0 -0
  188. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/flow_display.py +0 -0
  189. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/git_attribution.py +0 -0
  190. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/git_integration.py +0 -0
  191. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/guardrail.py +0 -0
  192. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/handoff.py +0 -0
  193. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/hooks.py +0 -0
  194. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/hybrid_workflow.py +0 -0
  195. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/image.py +0 -0
  196. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/interactive_core_headless.py +0 -0
  197. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/interactive_runtime.py +0 -0
  198. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/interactive_test_harness.py +0 -0
  199. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/interactive_tools.py +0 -0
  200. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/interactive_tui.py +0 -0
  201. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/job_workflow.py +0 -0
  202. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/jobs.py +0 -0
  203. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/knowledge.py +0 -0
  204. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/knowledge_cli.py +0 -0
  205. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/lite.py +0 -0
  206. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/logs.py +0 -0
  207. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/lsp_cli.py +0 -0
  208. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/lsp_diagnostics.py +0 -0
  209. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/mcp.py +0 -0
  210. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/message_queue.py +0 -0
  211. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/metrics.py +0 -0
  212. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/migrate.py +0 -0
  213. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/migration_flow.py +0 -0
  214. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/migration_spec.py +0 -0
  215. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/n8n.py +0 -0
  216. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/observability.py +0 -0
  217. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/ollama.py +0 -0
  218. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/output_modes.py +0 -0
  219. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/output_style.py +0 -0
  220. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/package.py +0 -0
  221. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/performance.py +0 -0
  222. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/persistence.py +0 -0
  223. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/profiler/__init__.py +0 -0
  224. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/profiler/core.py +0 -0
  225. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/profiler/optimizations.py +0 -0
  226. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/profiler/suite.py +0 -0
  227. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/queue/__init__.py +0 -0
  228. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/queue/manager.py +0 -0
  229. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/queue/models.py +0 -0
  230. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/queue/persistence.py +0 -0
  231. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/queue/scheduler.py +0 -0
  232. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/queue/worker.py +0 -0
  233. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/recipe.py +0 -0
  234. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/recipe_optimizer.py +0 -0
  235. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/recipe_prompts.py +0 -0
  236. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/registry.py +0 -0
  237. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/repo_map.py +0 -0
  238. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/router.py +0 -0
  239. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/safe_shell.py +0 -0
  240. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/sandbox_cli.py +0 -0
  241. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/sandbox_executor.py +0 -0
  242. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/sdk_knowledge.py +0 -0
  243. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/session.py +0 -0
  244. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/session_checkpoints.py +0 -0
  245. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/setup/__init__.py +0 -0
  246. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/setup/handler.py +0 -0
  247. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/setup/templates.py +0 -0
  248. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/skills.py +0 -0
  249. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/slash_commands.py +0 -0
  250. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/telemetry.py +0 -0
  251. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/templates.py +0 -0
  252. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/thinking.py +0 -0
  253. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/todo.py +0 -0
  254. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tools.py +0 -0
  255. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/__init__.py +0 -0
  256. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/app.py +0 -0
  257. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/cli.py +0 -0
  258. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/config.py +0 -0
  259. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/debug.py +0 -0
  260. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/events.py +0 -0
  261. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/mock_provider.py +0 -0
  262. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/orchestrator.py +0 -0
  263. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/screens/__init__.py +0 -0
  264. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/screens/help.py +0 -0
  265. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/screens/main.py +0 -0
  266. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/screens/queue.py +0 -0
  267. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/screens/session.py +0 -0
  268. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/screens/settings.py +0 -0
  269. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/session_store.py +0 -0
  270. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/widgets/__init__.py +0 -0
  271. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/widgets/chat.py +0 -0
  272. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/widgets/command_popup.py +0 -0
  273. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/widgets/composer.py +0 -0
  274. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/widgets/file_popup.py +0 -0
  275. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/widgets/queue_panel.py +0 -0
  276. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/widgets/status.py +0 -0
  277. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/tui/widgets/tool_panel.py +0 -0
  278. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/wizard.py +0 -0
  279. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/workflow.py +0 -0
  280. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/features/yaml_utils.py +0 -0
  281. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/interactive/__init__.py +0 -0
  282. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/interactive/config.py +0 -0
  283. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/interactive/core.py +0 -0
  284. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/interactive/events.py +0 -0
  285. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/interactive/frontends/__init__.py +0 -0
  286. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/interactive/frontends/rich_frontend.py +0 -0
  287. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/interactive/frontends/textual_frontend.py +0 -0
  288. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/interactive/praison_io.py +0 -0
  289. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/interactive/repl.py +0 -0
  290. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/interactive/split_tui.py +0 -0
  291. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/interactive/tui_app.py +0 -0
  292. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/langfuse_client.py +0 -0
  293. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/output/__init__.py +0 -0
  294. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/output/console.py +0 -0
  295. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/output/event_bridge.py +0 -0
  296. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/schedule_cli.py +0 -0
  297. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/schema_provider.py +0 -0
  298. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/session/__init__.py +0 -0
  299. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/session/resume.py +0 -0
  300. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/session/unified.py +0 -0
  301. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/state/__init__.py +0 -0
  302. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/state/identifiers.py +0 -0
  303. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/state/project_sessions.py +0 -0
  304. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/state/sessions.py +0 -0
  305. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/ui/__init__.py +0 -0
  306. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/ui/config.py +0 -0
  307. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/ui/events.py +0 -0
  308. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/ui/mg_backend.py +0 -0
  309. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/ui/plain.py +0 -0
  310. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/ui/rich_backend.py +0 -0
  311. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/unified_schema.py +0 -0
  312. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/utils/env_utils.py +0 -0
  313. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli/utils/project.py +0 -0
  314. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli_backends/claude.py +0 -0
  315. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/cli_backends/registry.py +0 -0
  316. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/llm/__init__.py +0 -0
  317. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/llm/catalogue.py +0 -0
  318. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/llm/config.py +0 -0
  319. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/llm/credentials.py +0 -0
  320. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/llm/env.py +0 -0
  321. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/runtime/__init__.py +0 -0
  322. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/runtime/__main__.py +0 -0
  323. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/runtime/client.py +0 -0
  324. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/runtime/descriptor.py +0 -0
  325. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/runtime/server.py +0 -0
  326. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code/tool_registry.py +0 -0
  327. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code.egg-info/dependency_links.txt +0 -0
  328. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code.egg-info/entry_points.txt +0 -0
  329. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code.egg-info/requires.txt +0 -0
  330. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/praisonai_code.egg-info/top_level.txt +0 -0
  331. {praisonai_code-0.0.5 → praisonai_code-0.0.7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: praisonai-code
3
- Version: 0.0.5
3
+ Version: 0.0.7
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
@@ -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.4"
15
+ __version__ = "0.0.6"
16
16
 
17
17
  __all__ = ["__version__"]
@@ -39,10 +39,15 @@ def get_wrapper_attr(module_name: str, attr: str) -> Any:
39
39
 
40
40
 
41
41
  def optional_wrapper_attr(module_name: str, attr: str, default: T | None = None) -> Any | T | None:
42
- """Return a wrapper attribute when installed, else ``default``."""
42
+ """Return a wrapper attribute when installed, else ``default``.
43
+
44
+ Falls back to ``default`` when the wrapper package is missing (ImportError)
45
+ or when an installed wrapper module lacks the requested attribute
46
+ (AttributeError), so callers degrade gracefully in both cases.
47
+ """
43
48
  if not wrapper_available():
44
49
  return default
45
50
  try:
46
51
  return get_wrapper_attr(module_name, attr)
47
- except ImportError:
52
+ except (ImportError, AttributeError):
48
53
  return default
@@ -223,6 +223,9 @@ _LAZY_COMMANDS: Dict[str, Tuple[str, str, str]] = {
223
223
  # relative ``.commands.*`` path would resolve to ``praisonai_code`` where the
224
224
  # modules do not live. The import happens lazily at invocation time only, so
225
225
  # ``praisonai_code`` keeps no static dependency on ``praisonai``.
226
+ # C7.1 audit: wrapper-resident Typer modules only (no praisonai_code.cli.commands.*
227
+ # copy). Do NOT add train/serve here — their impl lives in praisonai_code; bridge
228
+ # internal wrapper imports instead. mint_link is wrapper-only but not in Typer registry.
226
229
  _WRAPPER_COMMANDS = frozenset({
227
230
  "bot",
228
231
  "gateway",
@@ -455,7 +458,8 @@ class LazyCommandGroup(TyperGroup):
455
458
  console = Console()
456
459
 
457
460
  try:
458
- from praisonai import AgentOS
461
+ from praisonai_code._wrapper_bridge import get_wrapper_attr
462
+ AgentOS = get_wrapper_attr("praisonai", "AgentOS")
459
463
  from praisonaiagents import AgentOSConfig
460
464
  except ImportError as e:
461
465
  console.print(f"[red]Error importing AgentOS: {e}[/red]")
@@ -5,6 +5,7 @@ Provides terminal-native interactive chat mode.
5
5
  This command NEVER opens a browser - it runs entirely in the terminal.
6
6
  """
7
7
 
8
+ import logging
8
9
  from typing import List, Optional, Union
9
10
 
10
11
  import typer
@@ -231,6 +232,10 @@ def chat_main(
231
232
  response = tui.run_single(prompt)
232
233
  if response:
233
234
  print(response)
235
+ # Propagate a non-zero exit code on failure (e.g. invalid API key)
236
+ # so shell scripts and CI can detect authentication failures (#2562).
237
+ if tui.execution_failed:
238
+ raise typer.Exit(1)
234
239
  else:
235
240
  # Interactive split-pane TUI mode
236
241
  tui.run()
@@ -278,20 +283,41 @@ def _run_profiled_chat(
278
283
  agent = Agent(**agent_config)
279
284
  profiler.mark_init_end()
280
285
 
281
- # Execution phase
286
+ # Execution phase. Capture auth failures (raised or logged-then-swallowed)
287
+ # so profiling still runs and CI can detect the failure (#2562).
288
+ from praisonai_code.cli.interactive.async_tui import _LogCapture
289
+
290
+ log_capture = _LogCapture()
291
+ root_logger = logging.getLogger()
292
+ root_logger.addHandler(log_capture)
293
+
294
+ response = None
295
+ failed = False
282
296
  profiler.mark_exec_start()
283
- response = agent.start(prompt)
284
- profiler.mark_exec_end()
285
-
297
+ try:
298
+ response = agent.start(prompt)
299
+ except Exception as exc: # noqa: BLE001 - surface any failure via exit code
300
+ typer.echo(f"Error: {exc}", err=True)
301
+ failed = True
302
+ finally:
303
+ profiler.mark_exec_end()
304
+ root_logger.removeHandler(log_capture)
305
+
286
306
  profiler.stop()
287
-
307
+
288
308
  # Print response
289
309
  if response:
290
310
  print(response)
291
-
292
- # Print profiling report
311
+
312
+ # Print profiling report (always, even on failure)
293
313
  profiler.print_report()
294
314
 
315
+ # Propagate failure (e.g. invalid API key) so CI can detect it (#2562).
316
+ # An empty-but-successful response is NOT treated as a failure on its own;
317
+ # only a raised exception or a logged auth error (with no response) exits 1.
318
+ if failed or (not response and log_capture.find_auth_error()):
319
+ raise typer.Exit(1)
320
+
295
321
 
296
322
  def _run_legacy_terminal_chat(
297
323
  prompt: Optional[str] = None,
@@ -14,6 +14,38 @@ from ..output.console import get_output_controller
14
14
  app = typer.Typer(help="Health checks and diagnostics")
15
15
 
16
16
 
17
+ @app.callback(invoke_without_command=True)
18
+ def doctor_main(
19
+ ctx: typer.Context,
20
+ quick: bool = typer.Option(False, "--quick", help="Fast env-only checks (alias for 'doctor env')"),
21
+ live: bool = typer.Option(False, "--live", help="Include live provider pings (validate keys, not just presence)"),
22
+ deep: bool = typer.Option(False, "--deep", help="Enable deeper probes"),
23
+ strict: bool = typer.Option(False, "--strict", help="Treat warnings as failures"),
24
+ json_output: bool = typer.Option(False, "--json", help="Output machine-readable JSON"),
25
+ ):
26
+ """Run a full setup report when no subcommand is given.
27
+
28
+ ``praisonai doctor`` (no subcommand) now runs a comprehensive first-run /
29
+ operator troubleshooting report instead of failing with "Missing command".
30
+ Use ``praisonai doctor env`` (or ``--quick``) for the fast, CI-friendly path.
31
+ """
32
+ if ctx.invoked_subcommand is not None:
33
+ return
34
+
35
+ args: list = []
36
+ if quick:
37
+ args.append("env")
38
+ if live:
39
+ args.append("--live")
40
+ if deep:
41
+ args.append("--deep")
42
+ if strict:
43
+ args.append("--strict")
44
+ if json_output:
45
+ args.append("--json")
46
+ raise typer.Exit(_run_doctor(args))
47
+
48
+
17
49
  def _run_doctor(args: list) -> int:
18
50
  """Run doctor command with args."""
19
51
  try:
@@ -292,6 +324,38 @@ def doctor_runtime(
292
324
  raise typer.Exit(_run_doctor(args))
293
325
 
294
326
 
327
+ @app.command("fix")
328
+ def doctor_fix(
329
+ dry_run: bool = typer.Option(True, "--dry-run/--execute", help="Show proposed changes without applying them (default: dry-run)"),
330
+ no_backup: bool = typer.Option(False, "--no-backup", help="Skip creating backup files before applying fixes"),
331
+ file: Optional[str] = typer.Option(None, "--file", "-f", help="Config file to fix (default: search for YAML files in the current directory)"),
332
+ quiet: bool = typer.Option(False, "--quiet", "-q", help="Minimal output"),
333
+ ):
334
+ """
335
+ Run safe auto-remediation for common setup issues.
336
+
337
+ Dry-run by default: lists proposed changes without modifying anything.
338
+ Use --execute to apply fixes (a .bak backup is created unless --no-backup).
339
+
340
+ Scope (phase 1):
341
+ • Migrate deprecated cli_backend YAML configuration
342
+
343
+ Examples:
344
+ praisonai doctor fix # Dry-run: list proposed changes
345
+ praisonai doctor fix --execute # Apply safe fixes with backup
346
+ """
347
+ args = ["fix"]
348
+ if not dry_run:
349
+ args.append("--execute")
350
+ if no_backup:
351
+ args.append("--no-backup")
352
+ if file:
353
+ args.extend(["--file", file])
354
+ if quiet:
355
+ args.append("--quiet")
356
+ raise typer.Exit(_run_doctor(args))
357
+
358
+
295
359
  @app.command("troubleshoot")
296
360
  def doctor_troubleshoot():
297
361
  """
@@ -9,6 +9,12 @@ import sys
9
9
  from typing import Optional, List
10
10
 
11
11
 
12
+ def _cap(submodule: str, attr: str):
13
+ """Load a wrapper capabilities symbol (requires pip install praisonai)."""
14
+ from praisonai_code._wrapper_bridge import get_wrapper_attr
15
+ return get_wrapper_attr(f"praisonai.capabilities.{submodule}", attr)
16
+
17
+
12
18
  class CapabilitiesHandler:
13
19
  """Handler for capabilities CLI commands."""
14
20
 
@@ -50,9 +56,7 @@ class CapabilitiesHandler:
50
56
  parsed = parser.parse_args(remaining_args)
51
57
  except SystemExit:
52
58
  return 1
53
-
54
- from praisonai.capabilities.audio import transcribe
55
-
59
+ transcribe = _cap("audio", "transcribe")
56
60
  try:
57
61
  result = transcribe(
58
62
  audio=parsed.file,
@@ -93,9 +97,7 @@ class CapabilitiesHandler:
93
97
  parsed = parser.parse_args(remaining_args)
94
98
  except SystemExit:
95
99
  return 1
96
-
97
- from praisonai.capabilities.audio import speech
98
-
100
+ speech = _cap("audio", "speech")
99
101
  try:
100
102
  result = speech(
101
103
  text=parsed.text,
@@ -149,9 +151,7 @@ class CapabilitiesHandler:
149
151
  parsed = parser.parse_args(remaining_args)
150
152
  except SystemExit:
151
153
  return 1
152
-
153
- from praisonai.capabilities.images import image_generate
154
-
154
+ image_generate = _cap("images", "image_generate")
155
155
  try:
156
156
  results = image_generate(
157
157
  prompt=parsed.prompt,
@@ -184,9 +184,7 @@ class CapabilitiesHandler:
184
184
  parsed = parser.parse_args(remaining_args)
185
185
  except SystemExit:
186
186
  return 1
187
-
188
- from praisonai.capabilities.images import image_edit
189
-
187
+ image_edit = _cap("images", "image_edit")
190
188
  try:
191
189
  results = image_edit(
192
190
  image=parsed.image,
@@ -244,9 +242,7 @@ class CapabilitiesHandler:
244
242
  parsed = parser.parse_args(remaining_args)
245
243
  except SystemExit:
246
244
  return 1
247
-
248
- from praisonai.capabilities.files import file_create
249
-
245
+ file_create = _cap("files", "file_create")
250
246
  try:
251
247
  result = file_create(
252
248
  file=parsed.file,
@@ -273,9 +269,7 @@ class CapabilitiesHandler:
273
269
  parsed = parser.parse_args(remaining_args)
274
270
  except SystemExit:
275
271
  return 1
276
-
277
- from praisonai.capabilities.files import file_list
278
-
272
+ file_list = _cap("files", "file_list")
279
273
  try:
280
274
  results = file_list(purpose=parsed.purpose)
281
275
 
@@ -300,9 +294,7 @@ class CapabilitiesHandler:
300
294
  parsed = parser.parse_args(remaining_args)
301
295
  except SystemExit:
302
296
  return 1
303
-
304
- from praisonai.capabilities.files import file_retrieve
305
-
297
+ file_retrieve = _cap("files", "file_retrieve")
306
298
  try:
307
299
  result = file_retrieve(file_id=parsed.file_id)
308
300
 
@@ -327,9 +319,7 @@ class CapabilitiesHandler:
327
319
  parsed = parser.parse_args(remaining_args)
328
320
  except SystemExit:
329
321
  return 1
330
-
331
- from praisonai.capabilities.files import file_delete
332
-
322
+ file_delete = _cap("files", "file_delete")
333
323
  try:
334
324
  result = file_delete(file_id=parsed.file_id)
335
325
 
@@ -389,9 +379,7 @@ class CapabilitiesHandler:
389
379
  parsed = parser.parse_args(unknown_args)
390
380
  except SystemExit:
391
381
  return 1
392
-
393
- from praisonai.capabilities.rerank import rerank
394
-
382
+ rerank = _cap("rerank", "rerank")
395
383
  try:
396
384
  result = rerank(
397
385
  query=parsed.query,
@@ -420,9 +408,7 @@ class CapabilitiesHandler:
420
408
  parsed = parser.parse_args(unknown_args)
421
409
  except SystemExit:
422
410
  return 1
423
-
424
- from praisonai.capabilities.moderations import moderate
425
-
411
+ moderate = _cap("moderations", "moderate")
426
412
  try:
427
413
  text_input = " ".join(parsed.text)
428
414
  results = moderate(
@@ -454,9 +440,7 @@ class CapabilitiesHandler:
454
440
  parsed = parser.parse_args(unknown_args)
455
441
  except SystemExit:
456
442
  return 1
457
-
458
- from praisonai.capabilities.ocr import ocr
459
-
443
+ ocr = _cap("ocr", "ocr")
460
444
  try:
461
445
  result = ocr(
462
446
  document=parsed.document,
@@ -514,9 +498,7 @@ class CapabilitiesHandler:
514
498
  parsed = parser.parse_args(remaining_args)
515
499
  except SystemExit:
516
500
  return 1
517
-
518
- from praisonai.capabilities.batches import batch_create
519
-
501
+ batch_create = _cap("batches", "batch_create")
520
502
  try:
521
503
  result = batch_create(
522
504
  input_file_id=parsed.file_id,
@@ -534,8 +516,7 @@ class CapabilitiesHandler:
534
516
  @staticmethod
535
517
  def _handle_batches_list(args, remaining_args):
536
518
  """Handle: praisonai batches list"""
537
- from praisonai.capabilities.batches import batch_list
538
-
519
+ batch_list = _cap("batches", "batch_list")
539
520
  try:
540
521
  results = batch_list()
541
522
 
@@ -560,9 +541,7 @@ class CapabilitiesHandler:
560
541
  parsed = parser.parse_args(remaining_args)
561
542
  except SystemExit:
562
543
  return 1
563
-
564
- from praisonai.capabilities.batches import batch_retrieve
565
-
544
+ batch_retrieve = _cap("batches", "batch_retrieve")
566
545
  try:
567
546
  result = batch_retrieve(batch_id=parsed.batch_id)
568
547
 
@@ -587,9 +566,7 @@ class CapabilitiesHandler:
587
566
  parsed = parser.parse_args(remaining_args)
588
567
  except SystemExit:
589
568
  return 1
590
-
591
- from praisonai.capabilities.batches import batch_cancel
592
-
569
+ batch_cancel = _cap("batches", "batch_cancel")
593
570
  try:
594
571
  result = batch_cancel(batch_id=parsed.batch_id)
595
572
 
@@ -633,9 +610,7 @@ class CapabilitiesHandler:
633
610
  parsed = parser.parse_args(remaining_args)
634
611
  except SystemExit:
635
612
  return 1
636
-
637
- from praisonai.capabilities.vector_stores import vector_store_create
638
-
613
+ vector_store_create = _cap("vector_stores", "vector_store_create")
639
614
  try:
640
615
  result = vector_store_create(
641
616
  name=parsed.name,
@@ -663,9 +638,7 @@ class CapabilitiesHandler:
663
638
  parsed = parser.parse_args(remaining_args)
664
639
  except SystemExit:
665
640
  return 1
666
-
667
- from praisonai.capabilities.vector_stores import vector_store_search
668
-
641
+ vector_store_search = _cap("vector_stores", "vector_store_search")
669
642
  try:
670
643
  result = vector_store_search(
671
644
  vector_store_id=parsed.store_id,
@@ -719,9 +692,7 @@ class CapabilitiesHandler:
719
692
  parsed = parser.parse_args(remaining_args)
720
693
  except SystemExit:
721
694
  return 1
722
-
723
- from praisonai.capabilities.assistants import assistant_create
724
-
695
+ assistant_create = _cap("assistants", "assistant_create")
725
696
  try:
726
697
  result = assistant_create(
727
698
  name=parsed.name,
@@ -741,8 +712,7 @@ class CapabilitiesHandler:
741
712
  @staticmethod
742
713
  def _handle_assistants_list(args, remaining_args):
743
714
  """Handle: praisonai assistants list"""
744
- from praisonai.capabilities.assistants import assistant_list
745
-
715
+ assistant_list = _cap("assistants", "assistant_list")
746
716
  try:
747
717
  results = assistant_list()
748
718
 
@@ -790,9 +760,7 @@ class CapabilitiesHandler:
790
760
  parsed = parser.parse_args(remaining_args)
791
761
  except SystemExit:
792
762
  return 1
793
-
794
- from praisonai.capabilities.fine_tuning import fine_tuning_create
795
-
763
+ fine_tuning_create = _cap("fine_tuning", "fine_tuning_create")
796
764
  try:
797
765
  result = fine_tuning_create(
798
766
  training_file=parsed.file_id,
@@ -812,8 +780,7 @@ class CapabilitiesHandler:
812
780
  @staticmethod
813
781
  def _handle_fine_tuning_list(args, remaining_args):
814
782
  """Handle: praisonai fine-tuning list"""
815
- from praisonai.capabilities.fine_tuning import fine_tuning_list
816
-
783
+ fine_tuning_list = _cap("fine_tuning", "fine_tuning_list")
817
784
  try:
818
785
  results = fine_tuning_list()
819
786
 
@@ -846,9 +813,7 @@ class CapabilitiesHandler:
846
813
  if not parsed.prompt:
847
814
  print("Usage: praisonai completions <prompt> [options]")
848
815
  return 1
849
-
850
- from praisonai.capabilities.completions import chat_completion
851
-
816
+ chat_completion = _cap("completions", "chat_completion")
852
817
  try:
853
818
  messages = []
854
819
  if parsed.system:
@@ -899,9 +864,7 @@ class CapabilitiesHandler:
899
864
  parsed = parser.parse_args(remaining_args)
900
865
  except SystemExit:
901
866
  return 1
902
-
903
- from praisonai.capabilities.messages import messages_create
904
-
867
+ messages_create = _cap("messages", "messages_create")
905
868
  try:
906
869
  result = messages_create(
907
870
  messages=[{"role": "user", "content": parsed.prompt}],
@@ -931,9 +894,7 @@ class CapabilitiesHandler:
931
894
  parsed = parser.parse_args(remaining_args)
932
895
  except SystemExit:
933
896
  return 1
934
-
935
- from praisonai.capabilities.messages import count_tokens
936
-
897
+ count_tokens = _cap("messages", "count_tokens")
937
898
  try:
938
899
  result = count_tokens(
939
900
  messages=[{"role": "user", "content": parsed.text}],
@@ -958,9 +919,7 @@ class CapabilitiesHandler:
958
919
  parsed = parser.parse_args(unknown_args)
959
920
  except SystemExit:
960
921
  return 1
961
-
962
- from praisonai.capabilities.guardrails import apply_guardrail
963
-
922
+ apply_guardrail = _cap("guardrails", "apply_guardrail")
964
923
  try:
965
924
  result = apply_guardrail(
966
925
  content=parsed.content,
@@ -994,9 +953,7 @@ class CapabilitiesHandler:
994
953
  parsed = parser.parse_args(unknown_args)
995
954
  except SystemExit:
996
955
  return 1
997
-
998
- from praisonai.capabilities.rag import rag_query
999
-
956
+ rag_query = _cap("rag", "rag_query")
1000
957
  try:
1001
958
  result = rag_query(
1002
959
  query=parsed.query,
@@ -1028,9 +985,7 @@ class CapabilitiesHandler:
1028
985
  parsed = parser.parse_args(unknown_args)
1029
986
  except SystemExit:
1030
987
  return 1
1031
-
1032
- from praisonai.capabilities.realtime import realtime_connect
1033
-
988
+ realtime_connect = _cap("realtime", "realtime_connect")
1034
989
  try:
1035
990
  if parsed.action == "connect":
1036
991
  session = realtime_connect(model=parsed.model)
@@ -1059,9 +1014,7 @@ class CapabilitiesHandler:
1059
1014
  parsed = parser.parse_args(unknown_args)
1060
1015
  except SystemExit:
1061
1016
  return 1
1062
-
1063
- from praisonai.capabilities.videos import video_generate
1064
-
1017
+ video_generate = _cap("videos", "video_generate")
1065
1018
  try:
1066
1019
  result = video_generate(
1067
1020
  prompt=parsed.prompt,
@@ -1089,9 +1042,7 @@ class CapabilitiesHandler:
1089
1042
  parsed = parser.parse_args(unknown_args)
1090
1043
  except SystemExit:
1091
1044
  return 1
1092
-
1093
- from praisonai.capabilities.a2a import a2a_send
1094
-
1045
+ a2a_send = _cap("a2a", "a2a_send")
1095
1046
  try:
1096
1047
  result = a2a_send(
1097
1048
  message=parsed.message,
@@ -1137,9 +1088,7 @@ class CapabilitiesHandler:
1137
1088
  parsed = parser.parse_args(remaining_args)
1138
1089
  except SystemExit:
1139
1090
  return 1
1140
-
1141
- from praisonai.capabilities.containers import container_create
1142
-
1091
+ container_create = _cap("containers", "container_create")
1143
1092
  try:
1144
1093
  result = container_create(
1145
1094
  image=parsed.image,
@@ -1173,9 +1122,7 @@ class CapabilitiesHandler:
1173
1122
  parsed = parser.parse_args(action_args)
1174
1123
  except SystemExit:
1175
1124
  return 1
1176
-
1177
- from praisonai.capabilities.container_files import container_file_read
1178
-
1125
+ container_file_read = _cap("container_files", "container_file_read")
1179
1126
  try:
1180
1127
  result = container_file_read(
1181
1128
  container_id=parsed.container_id,
@@ -1201,9 +1148,7 @@ class CapabilitiesHandler:
1201
1148
  parsed = parser.parse_args(action_args)
1202
1149
  except SystemExit:
1203
1150
  return 1
1204
-
1205
- from praisonai.capabilities.container_files import container_file_list
1206
-
1151
+ container_file_list = _cap("container_files", "container_file_list")
1207
1152
  try:
1208
1153
  results = container_file_list(
1209
1154
  container_id=parsed.container_id,
@@ -1238,8 +1183,7 @@ class CapabilitiesHandler:
1238
1183
  parsed = parser.parse_args(unknown_args)
1239
1184
  except SystemExit:
1240
1185
  return 1
1241
-
1242
- from praisonai.capabilities.passthrough import passthrough
1186
+ passthrough = _cap("passthrough", "passthrough")
1243
1187
  import json
1244
1188
 
1245
1189
  try:
@@ -1273,9 +1217,7 @@ class CapabilitiesHandler:
1273
1217
  parsed = parser.parse_args(unknown_args)
1274
1218
  except SystemExit:
1275
1219
  return 1
1276
-
1277
- from praisonai.capabilities.responses import responses_create
1278
-
1220
+ responses_create = _cap("responses", "responses_create")
1279
1221
  try:
1280
1222
  result = responses_create(
1281
1223
  input=parsed.input,
@@ -1301,9 +1243,7 @@ class CapabilitiesHandler:
1301
1243
  parsed = parser.parse_args(unknown_args)
1302
1244
  except SystemExit:
1303
1245
  return 1
1304
-
1305
- from praisonai.capabilities.search import search
1306
-
1246
+ search = _cap("search", "search")
1307
1247
  try:
1308
1248
  result = search(
1309
1249
  query=parsed.query,
@@ -0,0 +1,38 @@
1
+ """Shared helpers for doctor checks that require the praisonai wrapper."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import time
6
+ from typing import Optional
7
+
8
+ from ..models import CheckResult, CheckStatus, CheckCategory
9
+
10
+
11
+ def skip_if_no_wrapper(
12
+ check_id: str,
13
+ title: str,
14
+ *,
15
+ start: Optional[float] = None,
16
+ category: CheckCategory = CheckCategory.BOTS,
17
+ ) -> Optional[CheckResult]:
18
+ """Return a SKIP result when the full wrapper is not installed."""
19
+ from praisonai_code._wrapper_bridge import wrapper_available
20
+
21
+ if wrapper_available():
22
+ return None
23
+ duration_ms = (time.time() - start) * 1000 if start is not None else None
24
+ return CheckResult(
25
+ id=check_id,
26
+ title=title,
27
+ category=category,
28
+ status=CheckStatus.SKIP,
29
+ message="Install full wrapper: pip install praisonai",
30
+ duration_ms=duration_ms,
31
+ )
32
+
33
+
34
+ def bots_config_schema():
35
+ """Load ``praisonai.bots._config_schema`` via the wrapper bridge."""
36
+ from praisonai_code._wrapper_bridge import import_wrapper_module
37
+
38
+ return import_wrapper_module("praisonai.bots._config_schema")
@@ -8,6 +8,7 @@ import os
8
8
 
9
9
  from ..models import CheckCategory, CheckResult, CheckStatus
10
10
  from ..registry import register_check
11
+ from ._wrapper_checks import skip_if_no_wrapper
11
12
 
12
13
  logger = logging.getLogger(__name__)
13
14
 
@@ -102,8 +103,12 @@ def check_acp_sdk(config=None) -> CheckResult:
102
103
  )
103
104
  def check_acp_server(config=None) -> CheckResult:
104
105
  """Check if ACP server can be imported."""
106
+ skipped = skip_if_no_wrapper("acp_server", "ACP Server Import", category=CheckCategory.TOOLS)
107
+ if skipped:
108
+ return skipped
105
109
  try:
106
- from praisonai.acp import ACPServer # noqa: F401
110
+ from praisonai_code._wrapper_bridge import get_wrapper_attr
111
+ get_wrapper_attr("praisonai.acp", "ACPServer")
107
112
 
108
113
  return CheckResult(
109
114
  id="acp_server",