PraisonAI 3.0.0__py3-none-any.whl

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 (393) hide show
  1. praisonai/__init__.py +54 -0
  2. praisonai/__main__.py +15 -0
  3. praisonai/acp/__init__.py +54 -0
  4. praisonai/acp/config.py +159 -0
  5. praisonai/acp/server.py +587 -0
  6. praisonai/acp/session.py +219 -0
  7. praisonai/adapters/__init__.py +50 -0
  8. praisonai/adapters/readers.py +395 -0
  9. praisonai/adapters/rerankers.py +315 -0
  10. praisonai/adapters/retrievers.py +394 -0
  11. praisonai/adapters/vector_stores.py +409 -0
  12. praisonai/agent_scheduler.py +337 -0
  13. praisonai/agents_generator.py +903 -0
  14. praisonai/api/call.py +292 -0
  15. praisonai/auto.py +1197 -0
  16. praisonai/capabilities/__init__.py +275 -0
  17. praisonai/capabilities/a2a.py +140 -0
  18. praisonai/capabilities/assistants.py +283 -0
  19. praisonai/capabilities/audio.py +320 -0
  20. praisonai/capabilities/batches.py +469 -0
  21. praisonai/capabilities/completions.py +336 -0
  22. praisonai/capabilities/container_files.py +155 -0
  23. praisonai/capabilities/containers.py +93 -0
  24. praisonai/capabilities/embeddings.py +158 -0
  25. praisonai/capabilities/files.py +467 -0
  26. praisonai/capabilities/fine_tuning.py +293 -0
  27. praisonai/capabilities/guardrails.py +182 -0
  28. praisonai/capabilities/images.py +330 -0
  29. praisonai/capabilities/mcp.py +190 -0
  30. praisonai/capabilities/messages.py +270 -0
  31. praisonai/capabilities/moderations.py +154 -0
  32. praisonai/capabilities/ocr.py +217 -0
  33. praisonai/capabilities/passthrough.py +204 -0
  34. praisonai/capabilities/rag.py +207 -0
  35. praisonai/capabilities/realtime.py +160 -0
  36. praisonai/capabilities/rerank.py +165 -0
  37. praisonai/capabilities/responses.py +266 -0
  38. praisonai/capabilities/search.py +109 -0
  39. praisonai/capabilities/skills.py +133 -0
  40. praisonai/capabilities/vector_store_files.py +334 -0
  41. praisonai/capabilities/vector_stores.py +304 -0
  42. praisonai/capabilities/videos.py +141 -0
  43. praisonai/chainlit_ui.py +304 -0
  44. praisonai/chat/__init__.py +106 -0
  45. praisonai/chat/app.py +125 -0
  46. praisonai/cli/__init__.py +26 -0
  47. praisonai/cli/app.py +213 -0
  48. praisonai/cli/commands/__init__.py +75 -0
  49. praisonai/cli/commands/acp.py +70 -0
  50. praisonai/cli/commands/completion.py +333 -0
  51. praisonai/cli/commands/config.py +166 -0
  52. praisonai/cli/commands/debug.py +142 -0
  53. praisonai/cli/commands/diag.py +55 -0
  54. praisonai/cli/commands/doctor.py +166 -0
  55. praisonai/cli/commands/environment.py +179 -0
  56. praisonai/cli/commands/lsp.py +112 -0
  57. praisonai/cli/commands/mcp.py +210 -0
  58. praisonai/cli/commands/profile.py +457 -0
  59. praisonai/cli/commands/run.py +228 -0
  60. praisonai/cli/commands/schedule.py +150 -0
  61. praisonai/cli/commands/serve.py +97 -0
  62. praisonai/cli/commands/session.py +212 -0
  63. praisonai/cli/commands/traces.py +145 -0
  64. praisonai/cli/commands/version.py +101 -0
  65. praisonai/cli/configuration/__init__.py +18 -0
  66. praisonai/cli/configuration/loader.py +353 -0
  67. praisonai/cli/configuration/paths.py +114 -0
  68. praisonai/cli/configuration/schema.py +164 -0
  69. praisonai/cli/features/__init__.py +268 -0
  70. praisonai/cli/features/acp.py +236 -0
  71. praisonai/cli/features/action_orchestrator.py +546 -0
  72. praisonai/cli/features/agent_scheduler.py +773 -0
  73. praisonai/cli/features/agent_tools.py +474 -0
  74. praisonai/cli/features/agents.py +375 -0
  75. praisonai/cli/features/at_mentions.py +471 -0
  76. praisonai/cli/features/auto_memory.py +182 -0
  77. praisonai/cli/features/autonomy_mode.py +490 -0
  78. praisonai/cli/features/background.py +356 -0
  79. praisonai/cli/features/base.py +168 -0
  80. praisonai/cli/features/capabilities.py +1326 -0
  81. praisonai/cli/features/checkpoints.py +338 -0
  82. praisonai/cli/features/code_intelligence.py +652 -0
  83. praisonai/cli/features/compaction.py +294 -0
  84. praisonai/cli/features/compare.py +534 -0
  85. praisonai/cli/features/cost_tracker.py +514 -0
  86. praisonai/cli/features/debug.py +810 -0
  87. praisonai/cli/features/deploy.py +517 -0
  88. praisonai/cli/features/diag.py +289 -0
  89. praisonai/cli/features/doctor/__init__.py +63 -0
  90. praisonai/cli/features/doctor/checks/__init__.py +24 -0
  91. praisonai/cli/features/doctor/checks/acp_checks.py +240 -0
  92. praisonai/cli/features/doctor/checks/config_checks.py +366 -0
  93. praisonai/cli/features/doctor/checks/db_checks.py +366 -0
  94. praisonai/cli/features/doctor/checks/env_checks.py +543 -0
  95. praisonai/cli/features/doctor/checks/lsp_checks.py +199 -0
  96. praisonai/cli/features/doctor/checks/mcp_checks.py +349 -0
  97. praisonai/cli/features/doctor/checks/memory_checks.py +268 -0
  98. praisonai/cli/features/doctor/checks/network_checks.py +251 -0
  99. praisonai/cli/features/doctor/checks/obs_checks.py +328 -0
  100. praisonai/cli/features/doctor/checks/performance_checks.py +235 -0
  101. praisonai/cli/features/doctor/checks/permissions_checks.py +259 -0
  102. praisonai/cli/features/doctor/checks/selftest_checks.py +322 -0
  103. praisonai/cli/features/doctor/checks/serve_checks.py +426 -0
  104. praisonai/cli/features/doctor/checks/skills_checks.py +231 -0
  105. praisonai/cli/features/doctor/checks/tools_checks.py +371 -0
  106. praisonai/cli/features/doctor/engine.py +266 -0
  107. praisonai/cli/features/doctor/formatters.py +310 -0
  108. praisonai/cli/features/doctor/handler.py +397 -0
  109. praisonai/cli/features/doctor/models.py +264 -0
  110. praisonai/cli/features/doctor/registry.py +239 -0
  111. praisonai/cli/features/endpoints.py +1019 -0
  112. praisonai/cli/features/eval.py +560 -0
  113. praisonai/cli/features/external_agents.py +231 -0
  114. praisonai/cli/features/fast_context.py +410 -0
  115. praisonai/cli/features/flow_display.py +566 -0
  116. praisonai/cli/features/git_integration.py +651 -0
  117. praisonai/cli/features/guardrail.py +171 -0
  118. praisonai/cli/features/handoff.py +185 -0
  119. praisonai/cli/features/hooks.py +583 -0
  120. praisonai/cli/features/image.py +384 -0
  121. praisonai/cli/features/interactive_runtime.py +585 -0
  122. praisonai/cli/features/interactive_tools.py +380 -0
  123. praisonai/cli/features/interactive_tui.py +603 -0
  124. praisonai/cli/features/jobs.py +632 -0
  125. praisonai/cli/features/knowledge.py +531 -0
  126. praisonai/cli/features/lite.py +244 -0
  127. praisonai/cli/features/lsp_cli.py +225 -0
  128. praisonai/cli/features/mcp.py +169 -0
  129. praisonai/cli/features/message_queue.py +587 -0
  130. praisonai/cli/features/metrics.py +211 -0
  131. praisonai/cli/features/n8n.py +673 -0
  132. praisonai/cli/features/observability.py +293 -0
  133. praisonai/cli/features/ollama.py +361 -0
  134. praisonai/cli/features/output_style.py +273 -0
  135. praisonai/cli/features/package.py +631 -0
  136. praisonai/cli/features/performance.py +308 -0
  137. praisonai/cli/features/persistence.py +636 -0
  138. praisonai/cli/features/profile.py +226 -0
  139. praisonai/cli/features/profiler/__init__.py +81 -0
  140. praisonai/cli/features/profiler/core.py +558 -0
  141. praisonai/cli/features/profiler/optimizations.py +652 -0
  142. praisonai/cli/features/profiler/suite.py +386 -0
  143. praisonai/cli/features/profiling.py +350 -0
  144. praisonai/cli/features/queue/__init__.py +73 -0
  145. praisonai/cli/features/queue/manager.py +395 -0
  146. praisonai/cli/features/queue/models.py +286 -0
  147. praisonai/cli/features/queue/persistence.py +564 -0
  148. praisonai/cli/features/queue/scheduler.py +484 -0
  149. praisonai/cli/features/queue/worker.py +372 -0
  150. praisonai/cli/features/recipe.py +1723 -0
  151. praisonai/cli/features/recipes.py +449 -0
  152. praisonai/cli/features/registry.py +229 -0
  153. praisonai/cli/features/repo_map.py +860 -0
  154. praisonai/cli/features/router.py +466 -0
  155. praisonai/cli/features/sandbox_executor.py +515 -0
  156. praisonai/cli/features/serve.py +829 -0
  157. praisonai/cli/features/session.py +222 -0
  158. praisonai/cli/features/skills.py +856 -0
  159. praisonai/cli/features/slash_commands.py +650 -0
  160. praisonai/cli/features/telemetry.py +179 -0
  161. praisonai/cli/features/templates.py +1384 -0
  162. praisonai/cli/features/thinking.py +305 -0
  163. praisonai/cli/features/todo.py +334 -0
  164. praisonai/cli/features/tools.py +680 -0
  165. praisonai/cli/features/tui/__init__.py +83 -0
  166. praisonai/cli/features/tui/app.py +580 -0
  167. praisonai/cli/features/tui/cli.py +566 -0
  168. praisonai/cli/features/tui/debug.py +511 -0
  169. praisonai/cli/features/tui/events.py +99 -0
  170. praisonai/cli/features/tui/mock_provider.py +328 -0
  171. praisonai/cli/features/tui/orchestrator.py +652 -0
  172. praisonai/cli/features/tui/screens/__init__.py +50 -0
  173. praisonai/cli/features/tui/screens/main.py +245 -0
  174. praisonai/cli/features/tui/screens/queue.py +174 -0
  175. praisonai/cli/features/tui/screens/session.py +124 -0
  176. praisonai/cli/features/tui/screens/settings.py +148 -0
  177. praisonai/cli/features/tui/widgets/__init__.py +56 -0
  178. praisonai/cli/features/tui/widgets/chat.py +261 -0
  179. praisonai/cli/features/tui/widgets/composer.py +224 -0
  180. praisonai/cli/features/tui/widgets/queue_panel.py +200 -0
  181. praisonai/cli/features/tui/widgets/status.py +167 -0
  182. praisonai/cli/features/tui/widgets/tool_panel.py +248 -0
  183. praisonai/cli/features/workflow.py +720 -0
  184. praisonai/cli/legacy.py +236 -0
  185. praisonai/cli/main.py +5559 -0
  186. praisonai/cli/schedule_cli.py +54 -0
  187. praisonai/cli/state/__init__.py +31 -0
  188. praisonai/cli/state/identifiers.py +161 -0
  189. praisonai/cli/state/sessions.py +313 -0
  190. praisonai/code/__init__.py +93 -0
  191. praisonai/code/agent_tools.py +344 -0
  192. praisonai/code/diff/__init__.py +21 -0
  193. praisonai/code/diff/diff_strategy.py +432 -0
  194. praisonai/code/tools/__init__.py +27 -0
  195. praisonai/code/tools/apply_diff.py +221 -0
  196. praisonai/code/tools/execute_command.py +275 -0
  197. praisonai/code/tools/list_files.py +274 -0
  198. praisonai/code/tools/read_file.py +206 -0
  199. praisonai/code/tools/search_replace.py +248 -0
  200. praisonai/code/tools/write_file.py +217 -0
  201. praisonai/code/utils/__init__.py +46 -0
  202. praisonai/code/utils/file_utils.py +307 -0
  203. praisonai/code/utils/ignore_utils.py +308 -0
  204. praisonai/code/utils/text_utils.py +276 -0
  205. praisonai/db/__init__.py +64 -0
  206. praisonai/db/adapter.py +531 -0
  207. praisonai/deploy/__init__.py +62 -0
  208. praisonai/deploy/api.py +231 -0
  209. praisonai/deploy/docker.py +454 -0
  210. praisonai/deploy/doctor.py +367 -0
  211. praisonai/deploy/main.py +327 -0
  212. praisonai/deploy/models.py +179 -0
  213. praisonai/deploy/providers/__init__.py +33 -0
  214. praisonai/deploy/providers/aws.py +331 -0
  215. praisonai/deploy/providers/azure.py +358 -0
  216. praisonai/deploy/providers/base.py +101 -0
  217. praisonai/deploy/providers/gcp.py +314 -0
  218. praisonai/deploy/schema.py +208 -0
  219. praisonai/deploy.py +185 -0
  220. praisonai/endpoints/__init__.py +53 -0
  221. praisonai/endpoints/a2u_server.py +410 -0
  222. praisonai/endpoints/discovery.py +165 -0
  223. praisonai/endpoints/providers/__init__.py +28 -0
  224. praisonai/endpoints/providers/a2a.py +253 -0
  225. praisonai/endpoints/providers/a2u.py +208 -0
  226. praisonai/endpoints/providers/agents_api.py +171 -0
  227. praisonai/endpoints/providers/base.py +231 -0
  228. praisonai/endpoints/providers/mcp.py +263 -0
  229. praisonai/endpoints/providers/recipe.py +206 -0
  230. praisonai/endpoints/providers/tools_mcp.py +150 -0
  231. praisonai/endpoints/registry.py +131 -0
  232. praisonai/endpoints/server.py +161 -0
  233. praisonai/inbuilt_tools/__init__.py +24 -0
  234. praisonai/inbuilt_tools/autogen_tools.py +117 -0
  235. praisonai/inc/__init__.py +2 -0
  236. praisonai/inc/config.py +96 -0
  237. praisonai/inc/models.py +155 -0
  238. praisonai/integrations/__init__.py +56 -0
  239. praisonai/integrations/base.py +303 -0
  240. praisonai/integrations/claude_code.py +270 -0
  241. praisonai/integrations/codex_cli.py +255 -0
  242. praisonai/integrations/cursor_cli.py +195 -0
  243. praisonai/integrations/gemini_cli.py +222 -0
  244. praisonai/jobs/__init__.py +67 -0
  245. praisonai/jobs/executor.py +425 -0
  246. praisonai/jobs/models.py +230 -0
  247. praisonai/jobs/router.py +314 -0
  248. praisonai/jobs/server.py +186 -0
  249. praisonai/jobs/store.py +203 -0
  250. praisonai/llm/__init__.py +66 -0
  251. praisonai/llm/registry.py +382 -0
  252. praisonai/mcp_server/__init__.py +152 -0
  253. praisonai/mcp_server/adapters/__init__.py +74 -0
  254. praisonai/mcp_server/adapters/agents.py +128 -0
  255. praisonai/mcp_server/adapters/capabilities.py +168 -0
  256. praisonai/mcp_server/adapters/cli_tools.py +568 -0
  257. praisonai/mcp_server/adapters/extended_capabilities.py +462 -0
  258. praisonai/mcp_server/adapters/knowledge.py +93 -0
  259. praisonai/mcp_server/adapters/memory.py +104 -0
  260. praisonai/mcp_server/adapters/prompts.py +306 -0
  261. praisonai/mcp_server/adapters/resources.py +124 -0
  262. praisonai/mcp_server/adapters/tools_bridge.py +280 -0
  263. praisonai/mcp_server/auth/__init__.py +48 -0
  264. praisonai/mcp_server/auth/api_key.py +291 -0
  265. praisonai/mcp_server/auth/oauth.py +460 -0
  266. praisonai/mcp_server/auth/oidc.py +289 -0
  267. praisonai/mcp_server/auth/scopes.py +260 -0
  268. praisonai/mcp_server/cli.py +852 -0
  269. praisonai/mcp_server/elicitation.py +445 -0
  270. praisonai/mcp_server/icons.py +302 -0
  271. praisonai/mcp_server/recipe_adapter.py +573 -0
  272. praisonai/mcp_server/recipe_cli.py +824 -0
  273. praisonai/mcp_server/registry.py +703 -0
  274. praisonai/mcp_server/sampling.py +422 -0
  275. praisonai/mcp_server/server.py +490 -0
  276. praisonai/mcp_server/tasks.py +443 -0
  277. praisonai/mcp_server/transports/__init__.py +18 -0
  278. praisonai/mcp_server/transports/http_stream.py +376 -0
  279. praisonai/mcp_server/transports/stdio.py +132 -0
  280. praisonai/persistence/__init__.py +84 -0
  281. praisonai/persistence/config.py +238 -0
  282. praisonai/persistence/conversation/__init__.py +25 -0
  283. praisonai/persistence/conversation/async_mysql.py +427 -0
  284. praisonai/persistence/conversation/async_postgres.py +410 -0
  285. praisonai/persistence/conversation/async_sqlite.py +371 -0
  286. praisonai/persistence/conversation/base.py +151 -0
  287. praisonai/persistence/conversation/json_store.py +250 -0
  288. praisonai/persistence/conversation/mysql.py +387 -0
  289. praisonai/persistence/conversation/postgres.py +401 -0
  290. praisonai/persistence/conversation/singlestore.py +240 -0
  291. praisonai/persistence/conversation/sqlite.py +341 -0
  292. praisonai/persistence/conversation/supabase.py +203 -0
  293. praisonai/persistence/conversation/surrealdb.py +287 -0
  294. praisonai/persistence/factory.py +301 -0
  295. praisonai/persistence/hooks/__init__.py +18 -0
  296. praisonai/persistence/hooks/agent_hooks.py +297 -0
  297. praisonai/persistence/knowledge/__init__.py +26 -0
  298. praisonai/persistence/knowledge/base.py +144 -0
  299. praisonai/persistence/knowledge/cassandra.py +232 -0
  300. praisonai/persistence/knowledge/chroma.py +295 -0
  301. praisonai/persistence/knowledge/clickhouse.py +242 -0
  302. praisonai/persistence/knowledge/cosmosdb_vector.py +438 -0
  303. praisonai/persistence/knowledge/couchbase.py +286 -0
  304. praisonai/persistence/knowledge/lancedb.py +216 -0
  305. praisonai/persistence/knowledge/langchain_adapter.py +291 -0
  306. praisonai/persistence/knowledge/lightrag_adapter.py +212 -0
  307. praisonai/persistence/knowledge/llamaindex_adapter.py +256 -0
  308. praisonai/persistence/knowledge/milvus.py +277 -0
  309. praisonai/persistence/knowledge/mongodb_vector.py +306 -0
  310. praisonai/persistence/knowledge/pgvector.py +335 -0
  311. praisonai/persistence/knowledge/pinecone.py +253 -0
  312. praisonai/persistence/knowledge/qdrant.py +301 -0
  313. praisonai/persistence/knowledge/redis_vector.py +291 -0
  314. praisonai/persistence/knowledge/singlestore_vector.py +299 -0
  315. praisonai/persistence/knowledge/surrealdb_vector.py +309 -0
  316. praisonai/persistence/knowledge/upstash_vector.py +266 -0
  317. praisonai/persistence/knowledge/weaviate.py +223 -0
  318. praisonai/persistence/migrations/__init__.py +10 -0
  319. praisonai/persistence/migrations/manager.py +251 -0
  320. praisonai/persistence/orchestrator.py +406 -0
  321. praisonai/persistence/state/__init__.py +21 -0
  322. praisonai/persistence/state/async_mongodb.py +200 -0
  323. praisonai/persistence/state/base.py +107 -0
  324. praisonai/persistence/state/dynamodb.py +226 -0
  325. praisonai/persistence/state/firestore.py +175 -0
  326. praisonai/persistence/state/gcs.py +155 -0
  327. praisonai/persistence/state/memory.py +245 -0
  328. praisonai/persistence/state/mongodb.py +158 -0
  329. praisonai/persistence/state/redis.py +190 -0
  330. praisonai/persistence/state/upstash.py +144 -0
  331. praisonai/persistence/tests/__init__.py +3 -0
  332. praisonai/persistence/tests/test_all_backends.py +633 -0
  333. praisonai/profiler.py +1214 -0
  334. praisonai/recipe/__init__.py +134 -0
  335. praisonai/recipe/bridge.py +278 -0
  336. praisonai/recipe/core.py +893 -0
  337. praisonai/recipe/exceptions.py +54 -0
  338. praisonai/recipe/history.py +402 -0
  339. praisonai/recipe/models.py +266 -0
  340. praisonai/recipe/operations.py +440 -0
  341. praisonai/recipe/policy.py +422 -0
  342. praisonai/recipe/registry.py +849 -0
  343. praisonai/recipe/runtime.py +214 -0
  344. praisonai/recipe/security.py +711 -0
  345. praisonai/recipe/serve.py +859 -0
  346. praisonai/recipe/server.py +613 -0
  347. praisonai/scheduler/__init__.py +45 -0
  348. praisonai/scheduler/agent_scheduler.py +552 -0
  349. praisonai/scheduler/base.py +124 -0
  350. praisonai/scheduler/daemon_manager.py +225 -0
  351. praisonai/scheduler/state_manager.py +155 -0
  352. praisonai/scheduler/yaml_loader.py +193 -0
  353. praisonai/scheduler.py +194 -0
  354. praisonai/setup/__init__.py +1 -0
  355. praisonai/setup/build.py +21 -0
  356. praisonai/setup/post_install.py +23 -0
  357. praisonai/setup/setup_conda_env.py +25 -0
  358. praisonai/setup.py +16 -0
  359. praisonai/templates/__init__.py +116 -0
  360. praisonai/templates/cache.py +364 -0
  361. praisonai/templates/dependency_checker.py +358 -0
  362. praisonai/templates/discovery.py +391 -0
  363. praisonai/templates/loader.py +564 -0
  364. praisonai/templates/registry.py +511 -0
  365. praisonai/templates/resolver.py +206 -0
  366. praisonai/templates/security.py +327 -0
  367. praisonai/templates/tool_override.py +498 -0
  368. praisonai/templates/tools_doctor.py +256 -0
  369. praisonai/test.py +105 -0
  370. praisonai/train.py +562 -0
  371. praisonai/train_vision.py +306 -0
  372. praisonai/ui/agents.py +824 -0
  373. praisonai/ui/callbacks.py +57 -0
  374. praisonai/ui/chainlit_compat.py +246 -0
  375. praisonai/ui/chat.py +532 -0
  376. praisonai/ui/code.py +717 -0
  377. praisonai/ui/colab.py +474 -0
  378. praisonai/ui/colab_chainlit.py +81 -0
  379. praisonai/ui/components/aicoder.py +284 -0
  380. praisonai/ui/context.py +283 -0
  381. praisonai/ui/database_config.py +56 -0
  382. praisonai/ui/db.py +294 -0
  383. praisonai/ui/realtime.py +488 -0
  384. praisonai/ui/realtimeclient/__init__.py +756 -0
  385. praisonai/ui/realtimeclient/tools.py +242 -0
  386. praisonai/ui/sql_alchemy.py +710 -0
  387. praisonai/upload_vision.py +140 -0
  388. praisonai/version.py +1 -0
  389. praisonai-3.0.0.dist-info/METADATA +3493 -0
  390. praisonai-3.0.0.dist-info/RECORD +393 -0
  391. praisonai-3.0.0.dist-info/WHEEL +5 -0
  392. praisonai-3.0.0.dist-info/entry_points.txt +4 -0
  393. praisonai-3.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,55 @@
1
+ """
2
+ Diag command group for PraisonAI CLI.
3
+
4
+ Wraps existing diagnostics functionality from features/diag.py.
5
+ Provides diagnostic export for bug reports.
6
+ """
7
+
8
+ from typing import Optional
9
+
10
+ import typer
11
+
12
+ from ..output.console import get_output_controller
13
+
14
+ app = typer.Typer(help="Diagnostics export")
15
+
16
+
17
+ @app.command("export")
18
+ def diag_export(
19
+ output_path: Optional[str] = typer.Option(None, "--output", "-o", help="Output path"),
20
+ workspace: str = typer.Option(".", "--workspace", "-w", help="Workspace root directory"),
21
+ include_logs: bool = typer.Option(True, "--include-logs/--no-logs", help="Include log files"),
22
+ include_config: bool = typer.Option(True, "--include-config/--no-config", help="Include configuration"),
23
+ include_trace: bool = typer.Option(True, "--include-trace/--no-trace", help="Include recent traces"),
24
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
25
+ ):
26
+ """Export diagnostic bundle for bug reports."""
27
+ args = ["export", "--workspace", workspace]
28
+
29
+ if output_path:
30
+ args.extend(["--output", output_path])
31
+ if not include_logs:
32
+ args.append("--no-logs")
33
+ if not include_config:
34
+ args.append("--no-config")
35
+ if not include_trace:
36
+ args.append("--no-trace")
37
+ if json_output:
38
+ args.append("--json")
39
+
40
+ try:
41
+ from ..features.diag import run_diag_command
42
+ exit_code = run_diag_command(args)
43
+ raise typer.Exit(exit_code)
44
+ except ImportError as e:
45
+ output = get_output_controller()
46
+ output.print_error(f"Diag module not available: {e}")
47
+ raise typer.Exit(4)
48
+
49
+
50
+ @app.callback(invoke_without_command=True)
51
+ def diag_callback(ctx: typer.Context):
52
+ """Show diag help or run export."""
53
+ if ctx.invoked_subcommand is None:
54
+ # Default to export
55
+ diag_export()
@@ -0,0 +1,166 @@
1
+ """
2
+ Doctor command group for PraisonAI CLI.
3
+
4
+ Wraps existing doctor functionality from features/doctor/.
5
+ Provides health checks and diagnostics.
6
+ """
7
+
8
+ from typing import Optional
9
+
10
+ import typer
11
+
12
+ from ..output.console import get_output_controller
13
+
14
+ app = typer.Typer(help="Health checks and diagnostics")
15
+
16
+
17
+ def _run_doctor(args: list) -> int:
18
+ """Run doctor command with args."""
19
+ try:
20
+ from ..features.doctor.handler import DoctorHandler
21
+ handler = DoctorHandler()
22
+ # DoctorHandler uses execute(action, action_args) pattern
23
+ action = args[0] if args else None
24
+ action_args = args[1:] if len(args) > 1 else []
25
+ return handler.execute(action, action_args)
26
+ except ImportError as e:
27
+ output = get_output_controller()
28
+ output.print_error(f"Doctor module not available: {e}")
29
+ return 4
30
+ except Exception as e:
31
+ output = get_output_controller()
32
+ output.print_error(f"Doctor error: {e}")
33
+ return 1
34
+
35
+
36
+ @app.command("env")
37
+ def doctor_env(
38
+ deep: bool = typer.Option(False, "--deep", help="Enable deeper probes"),
39
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
40
+ timeout: float = typer.Option(10.0, "--timeout", help="Per-check timeout"),
41
+ ):
42
+ """Check environment variables and API keys."""
43
+ args = ["env"]
44
+ if deep:
45
+ args.append("--deep")
46
+ if json_output:
47
+ args.append("--json")
48
+ args.extend(["--timeout", str(timeout)])
49
+ raise typer.Exit(_run_doctor(args))
50
+
51
+
52
+ @app.command("config")
53
+ def doctor_config(
54
+ deep: bool = typer.Option(False, "--deep", help="Enable deeper probes"),
55
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
56
+ ):
57
+ """Check configuration files."""
58
+ args = ["config"]
59
+ if deep:
60
+ args.append("--deep")
61
+ if json_output:
62
+ args.append("--json")
63
+ raise typer.Exit(_run_doctor(args))
64
+
65
+
66
+ @app.command("tools")
67
+ def doctor_tools(
68
+ deep: bool = typer.Option(False, "--deep", help="Enable deeper probes"),
69
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
70
+ ):
71
+ """Check tools availability."""
72
+ args = ["tools"]
73
+ if deep:
74
+ args.append("--deep")
75
+ if json_output:
76
+ args.append("--json")
77
+ raise typer.Exit(_run_doctor(args))
78
+
79
+
80
+ @app.command("db")
81
+ def doctor_db(
82
+ deep: bool = typer.Option(False, "--deep", help="Enable deeper probes"),
83
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
84
+ ):
85
+ """Check database connections."""
86
+ args = ["db"]
87
+ if deep:
88
+ args.append("--deep")
89
+ if json_output:
90
+ args.append("--json")
91
+ raise typer.Exit(_run_doctor(args))
92
+
93
+
94
+ @app.command("mcp")
95
+ def doctor_mcp(
96
+ deep: bool = typer.Option(False, "--deep", help="Enable deeper probes"),
97
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
98
+ ):
99
+ """Check MCP servers."""
100
+ args = ["mcp"]
101
+ if deep:
102
+ args.append("--deep")
103
+ if json_output:
104
+ args.append("--json")
105
+ raise typer.Exit(_run_doctor(args))
106
+
107
+
108
+ @app.command("network")
109
+ def doctor_network(
110
+ deep: bool = typer.Option(False, "--deep", help="Enable deeper probes"),
111
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
112
+ ):
113
+ """Check network connectivity."""
114
+ args = ["network"]
115
+ if deep:
116
+ args.append("--deep")
117
+ if json_output:
118
+ args.append("--json")
119
+ raise typer.Exit(_run_doctor(args))
120
+
121
+
122
+ @app.command("performance")
123
+ def doctor_performance(
124
+ deep: bool = typer.Option(False, "--deep", help="Enable deeper probes"),
125
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
126
+ ):
127
+ """Check performance metrics."""
128
+ args = ["performance"]
129
+ if deep:
130
+ args.append("--deep")
131
+ if json_output:
132
+ args.append("--json")
133
+ raise typer.Exit(_run_doctor(args))
134
+
135
+
136
+ @app.command("selftest")
137
+ def doctor_selftest(
138
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
139
+ ):
140
+ """Run self-test."""
141
+ args = ["selftest"]
142
+ if json_output:
143
+ args.append("--json")
144
+ raise typer.Exit(_run_doctor(args))
145
+
146
+
147
+ @app.callback(invoke_without_command=True)
148
+ def doctor_callback(
149
+ ctx: typer.Context,
150
+ deep: bool = typer.Option(False, "--deep", help="Enable deeper probes"),
151
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
152
+ strict: bool = typer.Option(False, "--strict", help="Treat warnings as failures"),
153
+ quiet: bool = typer.Option(False, "--quiet", "-q", help="Minimal output"),
154
+ ):
155
+ """Run all fast health checks."""
156
+ if ctx.invoked_subcommand is None:
157
+ args = []
158
+ if deep:
159
+ args.append("--deep")
160
+ if json_output:
161
+ args.append("--json")
162
+ if strict:
163
+ args.append("--strict")
164
+ if quiet:
165
+ args.append("--quiet")
166
+ raise typer.Exit(_run_doctor(args))
@@ -0,0 +1,179 @@
1
+ """
2
+ Environment command group for PraisonAI CLI.
3
+
4
+ Provides environment management and diagnostics:
5
+ - env view: Show environment variables
6
+ - env check: Validate API keys
7
+ - env doctor: Run diagnostics (alias for doctor command)
8
+ """
9
+
10
+ import os
11
+ from typing import Optional
12
+
13
+ import typer
14
+
15
+ from ..output.console import get_output_controller
16
+
17
+ app = typer.Typer(help="Environment and diagnostics")
18
+
19
+
20
+ # Known API key patterns
21
+ API_KEY_PATTERNS = {
22
+ "OPENAI_API_KEY": {"prefix": "sk-", "min_length": 20},
23
+ "ANTHROPIC_API_KEY": {"prefix": "sk-ant-", "min_length": 20},
24
+ "GOOGLE_API_KEY": {"prefix": "AI", "min_length": 20},
25
+ "GEMINI_API_KEY": {"prefix": "AI", "min_length": 20},
26
+ "TAVILY_API_KEY": {"prefix": "tvly-", "min_length": 20},
27
+ "GROQ_API_KEY": {"prefix": "gsk_", "min_length": 20},
28
+ }
29
+
30
+
31
+ def _redact_key(value: str, show_chars: int = 4) -> str:
32
+ """Redact an API key for display."""
33
+ if len(value) <= show_chars * 2:
34
+ return "*" * len(value)
35
+ return value[:show_chars] + "*" * (len(value) - show_chars * 2) + value[-show_chars:]
36
+
37
+
38
+ def _validate_key(name: str, value: str) -> tuple[bool, str]:
39
+ """Validate an API key format."""
40
+ if name not in API_KEY_PATTERNS:
41
+ return True, "Unknown key type"
42
+
43
+ pattern = API_KEY_PATTERNS[name]
44
+
45
+ if len(value) < pattern["min_length"]:
46
+ return False, f"Too short (expected >= {pattern['min_length']} chars)"
47
+
48
+ if pattern.get("prefix") and not value.startswith(pattern["prefix"]):
49
+ return False, f"Invalid prefix (expected {pattern['prefix']}...)"
50
+
51
+ return True, "Valid format"
52
+
53
+
54
+ @app.command("view")
55
+ def env_view(
56
+ show_values: bool = typer.Option(
57
+ False,
58
+ "--show-values",
59
+ help="Show actual values (redacted by default)",
60
+ ),
61
+ filter_prefix: Optional[str] = typer.Option(
62
+ None,
63
+ "--filter",
64
+ "-f",
65
+ help="Filter by prefix (e.g., OPENAI, PRAISONAI)",
66
+ ),
67
+ ):
68
+ """Show relevant environment variables."""
69
+ output = get_output_controller()
70
+
71
+ # Relevant prefixes
72
+ prefixes = ["OPENAI", "ANTHROPIC", "GOOGLE", "GEMINI", "TAVILY", "GROQ",
73
+ "PRAISONAI", "MODEL", "LLM", "OLLAMA", "AZURE"]
74
+
75
+ if filter_prefix:
76
+ prefixes = [filter_prefix.upper()]
77
+
78
+ env_vars = {}
79
+ for key, value in os.environ.items():
80
+ for prefix in prefixes:
81
+ if key.upper().startswith(prefix):
82
+ if show_values:
83
+ if "KEY" in key.upper() or "SECRET" in key.upper() or "TOKEN" in key.upper():
84
+ env_vars[key] = _redact_key(value)
85
+ else:
86
+ env_vars[key] = value
87
+ else:
88
+ env_vars[key] = "***" if value else "(empty)"
89
+ break
90
+
91
+ if output.is_json_mode:
92
+ output.print_json({"environment": env_vars})
93
+ return
94
+
95
+ if not env_vars:
96
+ output.print_info("No relevant environment variables found")
97
+ return
98
+
99
+ headers = ["Variable", "Value"]
100
+ rows = [[k, v] for k, v in sorted(env_vars.items())]
101
+ output.print_table(headers, rows, title="Environment Variables")
102
+
103
+
104
+ @app.command("check")
105
+ def env_check():
106
+ """Validate API keys and configuration."""
107
+ output = get_output_controller()
108
+
109
+ results = []
110
+ all_valid = True
111
+
112
+ for key_name, pattern in API_KEY_PATTERNS.items():
113
+ value = os.environ.get(key_name)
114
+
115
+ if value:
116
+ valid, message = _validate_key(key_name, value)
117
+ results.append({
118
+ "key": key_name,
119
+ "present": True,
120
+ "valid": valid,
121
+ "message": message,
122
+ })
123
+ if not valid:
124
+ all_valid = False
125
+ else:
126
+ results.append({
127
+ "key": key_name,
128
+ "present": False,
129
+ "valid": False,
130
+ "message": "Not set",
131
+ })
132
+
133
+ if output.is_json_mode:
134
+ output.print_json({"checks": results, "all_valid": all_valid})
135
+ return
136
+
137
+ headers = ["Key", "Status", "Message"]
138
+ rows = []
139
+ for r in results:
140
+ if r["present"]:
141
+ status = "✅" if r["valid"] else "⚠️"
142
+ else:
143
+ status = "❌"
144
+ rows.append([r["key"], status, r["message"]])
145
+
146
+ output.print_table(headers, rows, title="API Key Validation")
147
+
148
+ if not all_valid:
149
+ output.print_warning("Some API keys are missing or invalid")
150
+ raise typer.Exit(3) # Exit code 3 = missing config/env
151
+
152
+
153
+ @app.command("doctor")
154
+ def env_doctor(
155
+ deep: bool = typer.Option(
156
+ False,
157
+ "--deep",
158
+ help="Run deep checks (network, DB connections)",
159
+ ),
160
+ ):
161
+ """Run environment diagnostics (alias for 'praisonai doctor env')."""
162
+ output = get_output_controller()
163
+
164
+ # Delegate to doctor command
165
+ try:
166
+ from ..features.doctor.handler import DoctorHandler
167
+ handler = DoctorHandler()
168
+
169
+ # Run env checks
170
+ if output.is_json_mode:
171
+ # Run and get JSON output
172
+ result = handler.handle(["env", "--json"] if not deep else ["env", "--json", "--deep"])
173
+ else:
174
+ result = handler.handle(["env"] if not deep else ["env", "--deep"])
175
+
176
+ raise typer.Exit(result)
177
+ except ImportError:
178
+ # Fallback to basic env check
179
+ env_check()
@@ -0,0 +1,112 @@
1
+ """
2
+ LSP command group for PraisonAI CLI.
3
+
4
+ Wraps existing LSP functionality from features/lsp_cli.py.
5
+ Provides LSP service lifecycle management.
6
+ """
7
+
8
+ from typing import Optional
9
+
10
+ import typer
11
+
12
+ from ..output.console import get_output_controller
13
+
14
+ app = typer.Typer(help="LSP service lifecycle management")
15
+
16
+
17
+ @app.command("start")
18
+ def lsp_start(
19
+ workspace: str = typer.Option(".", "--workspace", "-w", help="Workspace root directory"),
20
+ language: Optional[str] = typer.Option(None, "--language", "-l", help="Language to start"),
21
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
22
+ ):
23
+ """Start LSP server(s)."""
24
+ args = ["start", "--workspace", workspace]
25
+ if language:
26
+ args.extend(["--language", language])
27
+ if json_output:
28
+ args.append("--json")
29
+
30
+ try:
31
+ from ..features.lsp_cli import run_lsp_command
32
+ exit_code = run_lsp_command(args)
33
+ raise typer.Exit(exit_code)
34
+ except ImportError as e:
35
+ output = get_output_controller()
36
+ output.print_error(f"LSP module not available: {e}")
37
+ raise typer.Exit(4)
38
+
39
+
40
+ @app.command("stop")
41
+ def lsp_stop(
42
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
43
+ ):
44
+ """Stop LSP server(s)."""
45
+ args = ["stop"]
46
+ if json_output:
47
+ args.append("--json")
48
+
49
+ try:
50
+ from ..features.lsp_cli import run_lsp_command
51
+ exit_code = run_lsp_command(args)
52
+ raise typer.Exit(exit_code)
53
+ except ImportError as e:
54
+ output = get_output_controller()
55
+ output.print_error(f"LSP module not available: {e}")
56
+ raise typer.Exit(4)
57
+
58
+
59
+ @app.command("status")
60
+ def lsp_status(
61
+ workspace: str = typer.Option(".", "--workspace", "-w", help="Workspace root directory"),
62
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
63
+ ):
64
+ """Show LSP status."""
65
+ args = ["status", "--workspace", workspace]
66
+ if json_output:
67
+ args.append("--json")
68
+
69
+ try:
70
+ from ..features.lsp_cli import run_lsp_command
71
+ exit_code = run_lsp_command(args)
72
+ raise typer.Exit(exit_code)
73
+ except ImportError as e:
74
+ output = get_output_controller()
75
+ output.print_error(f"LSP module not available: {e}")
76
+ raise typer.Exit(4)
77
+
78
+
79
+ @app.command("logs")
80
+ def lsp_logs(
81
+ tail: int = typer.Option(50, "--tail", "-n", help="Number of lines to show"),
82
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
83
+ ):
84
+ """Show recent LSP logs."""
85
+ args = ["logs", "--tail", str(tail)]
86
+ if json_output:
87
+ args.append("--json")
88
+
89
+ try:
90
+ from ..features.lsp_cli import run_lsp_command
91
+ exit_code = run_lsp_command(args)
92
+ raise typer.Exit(exit_code)
93
+ except ImportError as e:
94
+ output = get_output_controller()
95
+ output.print_error(f"LSP module not available: {e}")
96
+ raise typer.Exit(4)
97
+
98
+
99
+ @app.callback(invoke_without_command=True)
100
+ def lsp_callback(ctx: typer.Context):
101
+ """Show LSP help."""
102
+ if ctx.invoked_subcommand is None:
103
+ output = get_output_controller()
104
+ output.print_panel(
105
+ "LSP service lifecycle management.\n\n"
106
+ "Commands:\n"
107
+ " start Start LSP server(s)\n"
108
+ " stop Stop LSP server(s)\n"
109
+ " status Show LSP status\n"
110
+ " logs Show recent logs",
111
+ title="LSP Commands"
112
+ )