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,568 @@
1
+ """
2
+ CLI Tools Adapter
3
+
4
+ Maps PraisonAI CLI features to MCP tools:
5
+ - Workflow management
6
+ - Rules management
7
+ - Hooks management
8
+ - Session management
9
+ - Todo management
10
+ - Docs management
11
+ - Schedule management
12
+ - Profile management
13
+ - Deploy management
14
+ """
15
+
16
+ import logging
17
+ from typing import Optional
18
+
19
+ from ..registry import register_tool
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+
24
+ def register_cli_tools() -> None:
25
+ """Register CLI-based MCP tools."""
26
+
27
+ # Workflow tools
28
+ @register_tool("praisonai.workflow.list")
29
+ def workflow_list() -> str:
30
+ """List available workflows."""
31
+ try:
32
+ import glob
33
+ workflows = []
34
+ for pattern in ["*.yaml", "*.yml", "agents*.yaml", "workflow*.yaml"]:
35
+ workflows.extend(glob.glob(pattern))
36
+ if not workflows:
37
+ return "No workflows found in current directory"
38
+ return f"Available workflows: {workflows}"
39
+ except Exception as e:
40
+ return f"Error: {e}"
41
+
42
+ @register_tool("praisonai.workflow.validate")
43
+ def workflow_validate(file_path: str) -> str:
44
+ """Validate a workflow YAML file."""
45
+ try:
46
+ import yaml
47
+ with open(file_path, 'r') as f:
48
+ config = yaml.safe_load(f)
49
+
50
+ required = ["framework", "topic"]
51
+ missing = [k for k in required if k not in config]
52
+ if missing:
53
+ return f"Invalid workflow: missing {missing}"
54
+
55
+ return f"Workflow valid: {file_path}"
56
+ except yaml.YAMLError as e:
57
+ return f"YAML error: {e}"
58
+ except FileNotFoundError:
59
+ return f"File not found: {file_path}"
60
+ except Exception as e:
61
+ return f"Error: {e}"
62
+
63
+ @register_tool("praisonai.workflow.show")
64
+ def workflow_show(file_path: str) -> str:
65
+ """Show workflow configuration."""
66
+ try:
67
+ with open(file_path, 'r') as f:
68
+ content = f.read()
69
+ return content
70
+ except FileNotFoundError:
71
+ return f"File not found: {file_path}"
72
+ except Exception as e:
73
+ return f"Error: {e}"
74
+
75
+ @register_tool("praisonai.workflow.auto")
76
+ def workflow_auto(topic: str, pattern: str = "sequential") -> str:
77
+ """Auto-generate a workflow for a topic."""
78
+ try:
79
+ from praisonai.auto import AutoGenerator
80
+ generator = AutoGenerator(topic=topic)
81
+ result = generator.generate(pattern=pattern)
82
+ return str(result)
83
+ except ImportError:
84
+ return "Error: AutoGenerator not available"
85
+ except Exception as e:
86
+ return f"Error: {e}"
87
+
88
+ # Rules tools
89
+ @register_tool("praisonai.rules.list")
90
+ def rules_list() -> str:
91
+ """List active rules."""
92
+ try:
93
+ import os
94
+ rules_dir = os.path.expanduser("~/.praison/rules")
95
+ if not os.path.exists(rules_dir):
96
+ return "No rules directory found"
97
+ rules = os.listdir(rules_dir)
98
+ return f"Active rules: {rules}"
99
+ except Exception as e:
100
+ return f"Error: {e}"
101
+
102
+ @register_tool("praisonai.rules.show")
103
+ def rules_show(rule_name: str) -> str:
104
+ """Show a specific rule."""
105
+ try:
106
+ import os
107
+ rule_path = os.path.expanduser(f"~/.praison/rules/{rule_name}")
108
+ if not os.path.exists(rule_path):
109
+ return f"Rule not found: {rule_name}"
110
+ with open(rule_path, 'r') as f:
111
+ content = f.read()
112
+ return content
113
+ except Exception as e:
114
+ return f"Error: {e}"
115
+
116
+ @register_tool("praisonai.rules.create")
117
+ def rules_create(rule_name: str, content: str) -> str:
118
+ """Create a new rule."""
119
+ try:
120
+ import os
121
+ rules_dir = os.path.expanduser("~/.praison/rules")
122
+ os.makedirs(rules_dir, exist_ok=True)
123
+ rule_path = os.path.join(rules_dir, rule_name)
124
+ with open(rule_path, 'w') as f:
125
+ f.write(content)
126
+ return f"Rule created: {rule_name}"
127
+ except Exception as e:
128
+ return f"Error: {e}"
129
+
130
+ @register_tool("praisonai.rules.delete")
131
+ def rules_delete(rule_name: str) -> str:
132
+ """Delete a rule."""
133
+ try:
134
+ import os
135
+ rule_path = os.path.expanduser(f"~/.praison/rules/{rule_name}")
136
+ if not os.path.exists(rule_path):
137
+ return f"Rule not found: {rule_name}"
138
+ os.remove(rule_path)
139
+ return f"Rule deleted: {rule_name}"
140
+ except Exception as e:
141
+ return f"Error: {e}"
142
+
143
+ # Hooks tools
144
+ @register_tool("praisonai.hooks.list")
145
+ def hooks_list() -> str:
146
+ """List registered hooks."""
147
+ try:
148
+ from praisonaiagents.hooks import get_hook_manager
149
+ manager = get_hook_manager()
150
+ hooks = manager.list_hooks()
151
+ return str(hooks)
152
+ except ImportError:
153
+ return "Error: Hooks not available"
154
+ except Exception as e:
155
+ return f"Error: {e}"
156
+
157
+ @register_tool("praisonai.hooks.stats")
158
+ def hooks_stats() -> str:
159
+ """Get hook execution statistics."""
160
+ try:
161
+ from praisonaiagents.hooks import get_hook_manager
162
+ manager = get_hook_manager()
163
+ stats = manager.get_stats()
164
+ return str(stats)
165
+ except ImportError:
166
+ return "Error: Hooks not available"
167
+ except Exception as e:
168
+ return f"Error: {e}"
169
+
170
+ # Session tools
171
+ @register_tool("praisonai.session.list")
172
+ def session_list() -> str:
173
+ """List active sessions."""
174
+ try:
175
+ from praisonaiagents.session import SessionManager
176
+ manager = SessionManager()
177
+ sessions = manager.list_sessions()
178
+ return str(sessions)
179
+ except ImportError:
180
+ return "Error: Session management not available"
181
+ except Exception as e:
182
+ return f"Error: {e}"
183
+
184
+ @register_tool("praisonai.session.info")
185
+ def session_info(session_id: str) -> str:
186
+ """Get session information."""
187
+ try:
188
+ from praisonaiagents.session import SessionManager
189
+ manager = SessionManager()
190
+ info = manager.get_session(session_id)
191
+ return str(info)
192
+ except ImportError:
193
+ return "Error: Session management not available"
194
+ except Exception as e:
195
+ return f"Error: {e}"
196
+
197
+ @register_tool("praisonai.session.delete")
198
+ def session_delete(session_id: str) -> str:
199
+ """Delete a session."""
200
+ try:
201
+ from praisonaiagents.session import SessionManager
202
+ manager = SessionManager()
203
+ manager.delete_session(session_id)
204
+ return f"Session deleted: {session_id}"
205
+ except ImportError:
206
+ return "Error: Session management not available"
207
+ except Exception as e:
208
+ return f"Error: {e}"
209
+
210
+ # Todo tools
211
+ @register_tool("praisonai.todo.list")
212
+ def todo_list() -> str:
213
+ """List todo items."""
214
+ try:
215
+ import os
216
+ import json
217
+ todo_path = os.path.expanduser("~/.praison/todo.json")
218
+ if not os.path.exists(todo_path):
219
+ return "No todos found"
220
+ with open(todo_path, 'r') as f:
221
+ todos = json.load(f)
222
+ return str(todos)
223
+ except Exception as e:
224
+ return f"Error: {e}"
225
+
226
+ @register_tool("praisonai.todo.add")
227
+ def todo_add(content: str, priority: str = "medium") -> str:
228
+ """Add a todo item."""
229
+ try:
230
+ import os
231
+ import json
232
+ import uuid
233
+ todo_path = os.path.expanduser("~/.praison/todo.json")
234
+ os.makedirs(os.path.dirname(todo_path), exist_ok=True)
235
+
236
+ todos = []
237
+ if os.path.exists(todo_path):
238
+ with open(todo_path, 'r') as f:
239
+ todos = json.load(f)
240
+
241
+ todo = {
242
+ "id": str(uuid.uuid4())[:8],
243
+ "content": content,
244
+ "priority": priority,
245
+ "status": "pending",
246
+ }
247
+ todos.append(todo)
248
+
249
+ with open(todo_path, 'w') as f:
250
+ json.dump(todos, f, indent=2)
251
+
252
+ return f"Todo added: {todo['id']}"
253
+ except Exception as e:
254
+ return f"Error: {e}"
255
+
256
+ @register_tool("praisonai.todo.complete")
257
+ def todo_complete(todo_id: str) -> str:
258
+ """Mark a todo as complete."""
259
+ try:
260
+ import os
261
+ import json
262
+ todo_path = os.path.expanduser("~/.praison/todo.json")
263
+ if not os.path.exists(todo_path):
264
+ return "No todos found"
265
+
266
+ with open(todo_path, 'r') as f:
267
+ todos = json.load(f)
268
+
269
+ for todo in todos:
270
+ if todo.get("id") == todo_id:
271
+ todo["status"] = "completed"
272
+ break
273
+ else:
274
+ return f"Todo not found: {todo_id}"
275
+
276
+ with open(todo_path, 'w') as f:
277
+ json.dump(todos, f, indent=2)
278
+
279
+ return f"Todo completed: {todo_id}"
280
+ except Exception as e:
281
+ return f"Error: {e}"
282
+
283
+ @register_tool("praisonai.todo.delete")
284
+ def todo_delete(todo_id: str) -> str:
285
+ """Delete a todo item."""
286
+ try:
287
+ import os
288
+ import json
289
+ todo_path = os.path.expanduser("~/.praison/todo.json")
290
+ if not os.path.exists(todo_path):
291
+ return "No todos found"
292
+
293
+ with open(todo_path, 'r') as f:
294
+ todos = json.load(f)
295
+
296
+ todos = [t for t in todos if t.get("id") != todo_id]
297
+
298
+ with open(todo_path, 'w') as f:
299
+ json.dump(todos, f, indent=2)
300
+
301
+ return f"Todo deleted: {todo_id}"
302
+ except Exception as e:
303
+ return f"Error: {e}"
304
+
305
+ # Tools discovery
306
+ @register_tool("praisonai.tools.list")
307
+ def tools_list() -> str:
308
+ """List available tools."""
309
+ try:
310
+ from praisonaiagents.tools import get_available_tools
311
+ tools = get_available_tools()
312
+ return str(tools)
313
+ except ImportError:
314
+ return "Error: Tools module not available"
315
+ except Exception as e:
316
+ return f"Error: {e}"
317
+
318
+ @register_tool("praisonai.tools.info")
319
+ def tools_info(tool_name: str) -> str:
320
+ """Get information about a tool."""
321
+ try:
322
+ from praisonaiagents.tools import get_tool_info
323
+ info = get_tool_info(tool_name)
324
+ return str(info)
325
+ except ImportError:
326
+ return "Error: Tools module not available"
327
+ except Exception as e:
328
+ return f"Error: {e}"
329
+
330
+ @register_tool("praisonai.tools.search")
331
+ def tools_search(query: str) -> str:
332
+ """Search for tools by name or description."""
333
+ try:
334
+ from praisonaiagents.tools import search_tools
335
+ results = search_tools(query)
336
+ return str(results)
337
+ except ImportError:
338
+ return "Error: Tools module not available"
339
+ except Exception as e:
340
+ return f"Error: {e}"
341
+
342
+ # Schedule tools
343
+ @register_tool("praisonai.schedule.list")
344
+ def schedule_list() -> str:
345
+ """List scheduled tasks."""
346
+ try:
347
+ from praisonai.agent_scheduler import AgentScheduler
348
+ scheduler = AgentScheduler()
349
+ tasks = scheduler.list_tasks()
350
+ return str(tasks)
351
+ except ImportError:
352
+ return "Error: Scheduler not available"
353
+ except Exception as e:
354
+ return f"Error: {e}"
355
+
356
+ @register_tool("praisonai.schedule.add")
357
+ def schedule_add(
358
+ task_name: str,
359
+ cron: str,
360
+ workflow_path: str,
361
+ ) -> str:
362
+ """Add a scheduled task."""
363
+ try:
364
+ from praisonai.agent_scheduler import AgentScheduler
365
+ scheduler = AgentScheduler()
366
+ scheduler.add_task(task_name, cron, workflow_path)
367
+ return f"Task scheduled: {task_name}"
368
+ except ImportError:
369
+ return "Error: Scheduler not available"
370
+ except Exception as e:
371
+ return f"Error: {e}"
372
+
373
+ @register_tool("praisonai.schedule.remove")
374
+ def schedule_remove(task_name: str) -> str:
375
+ """Remove a scheduled task."""
376
+ try:
377
+ from praisonai.agent_scheduler import AgentScheduler
378
+ scheduler = AgentScheduler()
379
+ scheduler.remove_task(task_name)
380
+ return f"Task removed: {task_name}"
381
+ except ImportError:
382
+ return "Error: Scheduler not available"
383
+ except Exception as e:
384
+ return f"Error: {e}"
385
+
386
+ # Deploy tools
387
+ @register_tool("praisonai.deploy.validate")
388
+ def deploy_validate(config_path: str = "deploy.yaml") -> str:
389
+ """Validate deployment configuration."""
390
+ try:
391
+ import yaml
392
+ with open(config_path, 'r') as f:
393
+ config = yaml.safe_load(f)
394
+
395
+ required = ["name", "type"]
396
+ missing = [k for k in required if k not in config]
397
+ if missing:
398
+ return f"Invalid config: missing {missing}"
399
+
400
+ return f"Deployment config valid: {config_path}"
401
+ except FileNotFoundError:
402
+ return f"Config not found: {config_path}"
403
+ except Exception as e:
404
+ return f"Error: {e}"
405
+
406
+ @register_tool("praisonai.deploy.status")
407
+ def deploy_status(deployment_name: Optional[str] = None) -> str:
408
+ """Get deployment status."""
409
+ try:
410
+ from praisonai.deploy import get_deployment_status
411
+ status = get_deployment_status(deployment_name)
412
+ return str(status)
413
+ except ImportError:
414
+ return "Error: Deploy module not available"
415
+ except Exception as e:
416
+ return f"Error: {e}"
417
+
418
+ # Doctor/diagnostics tools
419
+ @register_tool("praisonai.doctor.env")
420
+ def doctor_env() -> str:
421
+ """Check environment configuration."""
422
+ try:
423
+ import os
424
+ checks = {
425
+ "OPENAI_API_KEY": bool(os.environ.get("OPENAI_API_KEY")),
426
+ "ANTHROPIC_API_KEY": bool(os.environ.get("ANTHROPIC_API_KEY")),
427
+ "GOOGLE_API_KEY": bool(os.environ.get("GOOGLE_API_KEY")),
428
+ }
429
+ return str(checks)
430
+ except Exception as e:
431
+ return f"Error: {e}"
432
+
433
+ @register_tool("praisonai.doctor.config")
434
+ def doctor_config() -> str:
435
+ """Check configuration files."""
436
+ try:
437
+ import os
438
+ config_files = [
439
+ "agents.yaml",
440
+ "config.yaml",
441
+ ".env",
442
+ "pyproject.toml",
443
+ ]
444
+ results = {}
445
+ for f in config_files:
446
+ results[f] = os.path.exists(f)
447
+ return str(results)
448
+ except Exception as e:
449
+ return f"Error: {e}"
450
+
451
+ @register_tool("praisonai.doctor.mcp")
452
+ def doctor_mcp() -> str:
453
+ """Check MCP server configuration."""
454
+ try:
455
+ from ..registry import get_tool_registry, get_resource_registry, get_prompt_registry
456
+
457
+ tools = get_tool_registry().list_all()
458
+ resources = get_resource_registry().list_all()
459
+ prompts = get_prompt_registry().list_all()
460
+
461
+ return f"MCP Status: {len(tools)} tools, {len(resources)} resources, {len(prompts)} prompts"
462
+ except Exception as e:
463
+ return f"Error: {e}"
464
+
465
+ # Eval tools
466
+ @register_tool("praisonai.eval.accuracy")
467
+ def eval_accuracy(
468
+ agent_config: str,
469
+ input_text: str,
470
+ expected_output: str,
471
+ iterations: int = 3,
472
+ ) -> str:
473
+ """Run accuracy evaluation on an agent."""
474
+ try:
475
+ from praisonaiagents.eval import AccuracyEval
476
+ from praisonaiagents import Agent
477
+
478
+ agent = Agent.from_yaml(agent_config)
479
+ eval_runner = AccuracyEval(
480
+ agent=agent,
481
+ input=input_text,
482
+ expected_output=expected_output,
483
+ num_iterations=iterations,
484
+ )
485
+ result = eval_runner.run()
486
+ return str(result)
487
+ except ImportError:
488
+ return "Error: Eval module not available"
489
+ except Exception as e:
490
+ return f"Error: {e}"
491
+
492
+ @register_tool("praisonai.eval.performance")
493
+ def eval_performance(
494
+ agent_config: str,
495
+ input_text: str,
496
+ iterations: int = 10,
497
+ ) -> str:
498
+ """Run performance evaluation on an agent."""
499
+ try:
500
+ from praisonaiagents.eval import PerformanceEval
501
+ from praisonaiagents import Agent
502
+
503
+ agent = Agent.from_yaml(agent_config)
504
+ eval_runner = PerformanceEval(
505
+ func=lambda: agent.chat(input_text),
506
+ num_iterations=iterations,
507
+ )
508
+ result = eval_runner.run()
509
+ return str(result)
510
+ except ImportError:
511
+ return "Error: Eval module not available"
512
+ except Exception as e:
513
+ return f"Error: {e}"
514
+
515
+ # MCP config management
516
+ @register_tool("praisonai.mcp_config.list")
517
+ def mcp_config_list() -> str:
518
+ """List MCP server configurations."""
519
+ try:
520
+ from praisonaiagents.memory.mcp_config import MCPConfigManager
521
+ manager = MCPConfigManager()
522
+ configs = manager.list_configs()
523
+ return str(configs)
524
+ except ImportError:
525
+ return "Error: MCP config manager not available"
526
+ except Exception as e:
527
+ return f"Error: {e}"
528
+
529
+ @register_tool("praisonai.mcp_config.show")
530
+ def mcp_config_show(config_name: str) -> str:
531
+ """Show MCP server configuration."""
532
+ try:
533
+ from praisonaiagents.memory.mcp_config import MCPConfigManager
534
+ manager = MCPConfigManager()
535
+ config = manager.get_config(config_name)
536
+ return str(config)
537
+ except ImportError:
538
+ return "Error: MCP config manager not available"
539
+ except Exception as e:
540
+ return f"Error: {e}"
541
+
542
+ @register_tool("praisonai.mcp_config.enable")
543
+ def mcp_config_enable(config_name: str) -> str:
544
+ """Enable an MCP server configuration."""
545
+ try:
546
+ from praisonaiagents.memory.mcp_config import MCPConfigManager
547
+ manager = MCPConfigManager()
548
+ manager.enable_config(config_name)
549
+ return f"MCP config enabled: {config_name}"
550
+ except ImportError:
551
+ return "Error: MCP config manager not available"
552
+ except Exception as e:
553
+ return f"Error: {e}"
554
+
555
+ @register_tool("praisonai.mcp_config.disable")
556
+ def mcp_config_disable(config_name: str) -> str:
557
+ """Disable an MCP server configuration."""
558
+ try:
559
+ from praisonaiagents.memory.mcp_config import MCPConfigManager
560
+ manager = MCPConfigManager()
561
+ manager.disable_config(config_name)
562
+ return f"MCP config disabled: {config_name}"
563
+ except ImportError:
564
+ return "Error: MCP config manager not available"
565
+ except Exception as e:
566
+ return f"Error: {e}"
567
+
568
+ logger.info("Registered CLI MCP tools")