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,114 @@
1
+ """
2
+ Configuration paths for PraisonAI CLI.
3
+
4
+ Defines standard locations for configuration files.
5
+ """
6
+
7
+ import os
8
+ from pathlib import Path
9
+ from typing import List, Optional
10
+
11
+
12
+ def get_user_config_dir() -> Path:
13
+ """Get user configuration directory (~/.praison/)."""
14
+ return Path.home() / ".praison"
15
+
16
+
17
+ def get_user_config_path() -> Path:
18
+ """Get user configuration file path (~/.praison/config.toml)."""
19
+ return get_user_config_dir() / "config.toml"
20
+
21
+
22
+ def get_project_config_dir(project_root: Optional[Path] = None) -> Path:
23
+ """Get project configuration directory (.praison/)."""
24
+ root = project_root or Path.cwd()
25
+ return root / ".praison"
26
+
27
+
28
+ def get_project_config_path(project_root: Optional[Path] = None) -> Path:
29
+ """Get project configuration file path (.praison/config.toml)."""
30
+ return get_project_config_dir(project_root) / "config.toml"
31
+
32
+
33
+ def get_sessions_dir() -> Path:
34
+ """Get sessions directory (~/.praison/sessions/)."""
35
+ return get_user_config_dir() / "sessions"
36
+
37
+
38
+ def get_traces_dir() -> Path:
39
+ """Get traces directory (~/.praison/traces/)."""
40
+ return get_user_config_dir() / "traces"
41
+
42
+
43
+ def get_logs_dir() -> Path:
44
+ """Get logs directory (~/.praison/logs/)."""
45
+ return get_user_config_dir() / "logs"
46
+
47
+
48
+ def get_cache_dir() -> Path:
49
+ """Get cache directory (~/.praison/cache/)."""
50
+ return get_user_config_dir() / "cache"
51
+
52
+
53
+ def get_config_paths(project_root: Optional[Path] = None) -> List[Path]:
54
+ """
55
+ Get all configuration file paths in precedence order (highest first).
56
+
57
+ Precedence:
58
+ 1. Project config: .praison/config.toml
59
+ 2. User config: ~/.praison/config.toml
60
+
61
+ Returns:
62
+ List of paths in precedence order
63
+ """
64
+ paths = []
65
+
66
+ # Project config (highest precedence)
67
+ project_config = get_project_config_path(project_root)
68
+ if project_config.exists():
69
+ paths.append(project_config)
70
+
71
+ # User config
72
+ user_config = get_user_config_path()
73
+ if user_config.exists():
74
+ paths.append(user_config)
75
+
76
+ return paths
77
+
78
+
79
+ def ensure_config_dirs() -> None:
80
+ """Ensure all configuration directories exist."""
81
+ dirs = [
82
+ get_user_config_dir(),
83
+ get_sessions_dir(),
84
+ get_traces_dir(),
85
+ get_logs_dir(),
86
+ get_cache_dir(),
87
+ ]
88
+ for d in dirs:
89
+ d.mkdir(parents=True, exist_ok=True)
90
+
91
+
92
+ def get_env_prefix() -> str:
93
+ """Get environment variable prefix."""
94
+ return "PRAISONAI_"
95
+
96
+
97
+ def env_to_config_key(env_var: str) -> Optional[str]:
98
+ """
99
+ Convert environment variable name to config key.
100
+
101
+ Example: PRAISONAI_OUTPUT_FORMAT -> output.format
102
+ """
103
+ prefix = get_env_prefix()
104
+ if not env_var.startswith(prefix):
105
+ return None
106
+
107
+ key = env_var[len(prefix):].lower()
108
+ # Convert underscores to dots for nested keys
109
+ # Single underscore = dot, double underscore = single underscore
110
+ parts = key.split("__")
111
+ result_parts = []
112
+ for part in parts:
113
+ result_parts.append(part.replace("_", "."))
114
+ return "_".join(result_parts)
@@ -0,0 +1,164 @@
1
+ """
2
+ Configuration schema for PraisonAI CLI.
3
+
4
+ Defines the structure and defaults for configuration.
5
+ """
6
+
7
+ from dataclasses import dataclass, field
8
+ from typing import Any, Dict, List, Optional
9
+
10
+
11
+ @dataclass
12
+ class OutputConfig:
13
+ """Output configuration."""
14
+ format: str = "text" # text, json, stream-json
15
+ color: bool = True
16
+ verbose: bool = False
17
+ quiet: bool = False
18
+ screen_reader: bool = False
19
+
20
+
21
+ @dataclass
22
+ class TracesConfig:
23
+ """Traces configuration."""
24
+ enabled: bool = False
25
+ endpoint: Optional[str] = None
26
+ sample_rate: float = 1.0
27
+
28
+
29
+ @dataclass
30
+ class MCPServerConfig:
31
+ """MCP server configuration."""
32
+ command: str = ""
33
+ args: List[str] = field(default_factory=list)
34
+ env: Dict[str, str] = field(default_factory=dict)
35
+ enabled: bool = True
36
+
37
+
38
+ @dataclass
39
+ class MCPConfig:
40
+ """MCP configuration."""
41
+ servers: Dict[str, MCPServerConfig] = field(default_factory=dict)
42
+
43
+
44
+ @dataclass
45
+ class ModelConfig:
46
+ """Model configuration."""
47
+ default: str = "gpt-4o-mini"
48
+ temperature: float = 0.7
49
+ max_tokens: int = 16000
50
+
51
+
52
+ @dataclass
53
+ class SessionConfig:
54
+ """Session configuration."""
55
+ auto_save: bool = False
56
+ history_limit: int = 10
57
+
58
+
59
+ @dataclass
60
+ class ConfigSchema:
61
+ """
62
+ Complete configuration schema.
63
+
64
+ Represents all configurable options for PraisonAI CLI.
65
+ """
66
+ output: OutputConfig = field(default_factory=OutputConfig)
67
+ traces: TracesConfig = field(default_factory=TracesConfig)
68
+ mcp: MCPConfig = field(default_factory=MCPConfig)
69
+ model: ModelConfig = field(default_factory=ModelConfig)
70
+ session: SessionConfig = field(default_factory=SessionConfig)
71
+
72
+ # Additional settings stored as dict for flexibility
73
+ extra: Dict[str, Any] = field(default_factory=dict)
74
+
75
+ def to_dict(self) -> Dict[str, Any]:
76
+ """Convert to dictionary."""
77
+ return {
78
+ "output": {
79
+ "format": self.output.format,
80
+ "color": self.output.color,
81
+ "verbose": self.output.verbose,
82
+ "quiet": self.output.quiet,
83
+ "screen_reader": self.output.screen_reader,
84
+ },
85
+ "traces": {
86
+ "enabled": self.traces.enabled,
87
+ "endpoint": self.traces.endpoint,
88
+ "sample_rate": self.traces.sample_rate,
89
+ },
90
+ "mcp": {
91
+ "servers": {
92
+ name: {
93
+ "command": server.command,
94
+ "args": server.args,
95
+ "env": server.env,
96
+ "enabled": server.enabled,
97
+ }
98
+ for name, server in self.mcp.servers.items()
99
+ }
100
+ },
101
+ "model": {
102
+ "default": self.model.default,
103
+ "temperature": self.model.temperature,
104
+ "max_tokens": self.model.max_tokens,
105
+ },
106
+ "session": {
107
+ "auto_save": self.session.auto_save,
108
+ "history_limit": self.session.history_limit,
109
+ },
110
+ **self.extra,
111
+ }
112
+
113
+ @classmethod
114
+ def from_dict(cls, data: Dict[str, Any]) -> "ConfigSchema":
115
+ """Create from dictionary."""
116
+ output_data = data.get("output", {})
117
+ traces_data = data.get("traces", {})
118
+ mcp_data = data.get("mcp", {})
119
+ model_data = data.get("model", {})
120
+ session_data = data.get("session", {})
121
+
122
+ # Extract known keys
123
+ known_keys = {"output", "traces", "mcp", "model", "session"}
124
+ extra = {k: v for k, v in data.items() if k not in known_keys}
125
+
126
+ # Parse MCP servers
127
+ mcp_servers = {}
128
+ for name, server_data in mcp_data.get("servers", {}).items():
129
+ mcp_servers[name] = MCPServerConfig(
130
+ command=server_data.get("command", ""),
131
+ args=server_data.get("args", []),
132
+ env=server_data.get("env", {}),
133
+ enabled=server_data.get("enabled", True),
134
+ )
135
+
136
+ return cls(
137
+ output=OutputConfig(
138
+ format=output_data.get("format", "text"),
139
+ color=output_data.get("color", True),
140
+ verbose=output_data.get("verbose", False),
141
+ quiet=output_data.get("quiet", False),
142
+ screen_reader=output_data.get("screen_reader", False),
143
+ ),
144
+ traces=TracesConfig(
145
+ enabled=traces_data.get("enabled", False),
146
+ endpoint=traces_data.get("endpoint"),
147
+ sample_rate=traces_data.get("sample_rate", 1.0),
148
+ ),
149
+ mcp=MCPConfig(servers=mcp_servers),
150
+ model=ModelConfig(
151
+ default=model_data.get("default", "gpt-4o-mini"),
152
+ temperature=model_data.get("temperature", 0.7),
153
+ max_tokens=model_data.get("max_tokens", 16000),
154
+ ),
155
+ session=SessionConfig(
156
+ auto_save=session_data.get("auto_save", False),
157
+ history_limit=session_data.get("history_limit", 10),
158
+ ),
159
+ extra=extra,
160
+ )
161
+
162
+
163
+ # Default configuration
164
+ DEFAULT_CONFIG = ConfigSchema()
@@ -0,0 +1,268 @@
1
+ """
2
+ CLI Features Module for PraisonAI
3
+
4
+ This module contains modular CLI feature handlers that extend the base CLI functionality.
5
+ Each feature is implemented as a separate module for maintainability and testability.
6
+
7
+ Features:
8
+ - guardrail: Output validation using LLM guardrails
9
+ - metrics: Token usage and cost tracking
10
+ - image: Image processing with ImageAgent
11
+ - telemetry: Usage monitoring and analytics
12
+ - mcp: Model Context Protocol server integration
13
+ - fast_context: Codebase search capability
14
+ - knowledge: RAG/vector store management
15
+ - session: Session management for multi-turn conversations
16
+ - tools: Tool registry management
17
+ - handoff: Agent-to-agent delegation
18
+ - auto_memory: Automatic memory extraction
19
+ - todo: Todo list management
20
+ - router: Smart model selection
21
+ - flow_display: Visual workflow tracking
22
+ - workflow: YAML workflow management
23
+ - n8n: Export workflows to n8n visual editor
24
+ - external_agents: External AI CLI tool integrations (Claude, Gemini, Codex, Cursor)
25
+ - slash_commands: Interactive slash commands (/help, /cost, /plan, etc.)
26
+ - autonomy_mode: Autonomy levels (suggest, auto-edit, full-auto)
27
+ - cost_tracker: Real-time cost and token tracking
28
+ - message_queue: Message queuing while agent is processing
29
+ - at_mentions: @ mention autocomplete for files and directories
30
+ - compare: CLI command comparison feature
31
+ - eval: Agent evaluation framework (accuracy, performance, reliability, criteria)
32
+ - hooks: Hook system for intercepting and modifying agent behavior
33
+ - checkpoints: Shadow git checkpointing for file-level undo/restore
34
+ - background: Background agent task execution and management
35
+ - thinking: Thinking budget management
36
+ - compaction: Context compaction settings
37
+ - output_style: Output style configuration
38
+ - ollama: Ollama provider and Weak-Model-Proof execution
39
+ """
40
+
41
+ # Type hints available for IDE support
42
+
43
+ # Lazy imports to avoid performance impact
44
+ __all__ = [
45
+ 'GuardrailHandler',
46
+ 'MetricsHandler',
47
+ 'ImageHandler',
48
+ 'TelemetryHandler',
49
+ 'MCPHandler',
50
+ 'FastContextHandler',
51
+ 'KnowledgeHandler',
52
+ 'SessionHandler',
53
+ 'ToolsHandler',
54
+ 'HandoffHandler',
55
+ 'AutoMemoryHandler',
56
+ 'TodoHandler',
57
+ 'RouterHandler',
58
+ 'FlowDisplayHandler',
59
+ 'WorkflowHandler',
60
+ 'N8nHandler',
61
+ 'ExternalAgentsHandler',
62
+ # New CLI enhancement features
63
+ 'SlashCommandHandler',
64
+ 'AutonomyModeHandler',
65
+ 'CostTrackerHandler',
66
+ 'RepoMapHandler',
67
+ 'InteractiveTUIHandler',
68
+ 'GitIntegrationHandler',
69
+ 'SandboxExecutorHandler',
70
+ 'MessageQueueHandler',
71
+ # @ mention autocomplete
72
+ 'AtMentionCompleter',
73
+ 'CombinedCompleter',
74
+ 'FileSearchService',
75
+ # Evaluation
76
+ 'EvalHandler',
77
+ # Compare feature
78
+ 'CompareHandler',
79
+ # Agent Skills
80
+ 'SkillsHandler',
81
+ # Hooks
82
+ 'HooksHandler',
83
+ # Checkpoints
84
+ 'CheckpointsHandler',
85
+ # Background
86
+ 'BackgroundHandler',
87
+ # Thinking, Compaction, Output Style
88
+ 'ThinkingHandler',
89
+ 'CompactionHandler',
90
+ 'OutputStyleHandler',
91
+ # Ollama + WMP
92
+ 'OllamaHandler',
93
+ # Capabilities (LiteLLM endpoint parity)
94
+ 'CapabilitiesHandler',
95
+ # Performance benchmarking
96
+ 'PerformanceHandler',
97
+ # Lite agent (BYO-LLM)
98
+ 'LiteHandler',
99
+ # Agent-centric tools (LSP/ACP powered)
100
+ 'create_agent_centric_tools',
101
+ 'InteractiveRuntime',
102
+ 'RuntimeConfig',
103
+ 'CodeIntelligenceRouter',
104
+ 'ActionOrchestrator',
105
+ # Interactive tools provider (canonical source)
106
+ 'get_interactive_tools',
107
+ 'resolve_tool_groups',
108
+ 'ToolConfig',
109
+ 'TOOL_GROUPS',
110
+ ]
111
+
112
+ def __getattr__(name):
113
+ """Lazy load handlers to minimize import overhead."""
114
+ if name == 'GuardrailHandler':
115
+ from .guardrail import GuardrailHandler
116
+ return GuardrailHandler
117
+ elif name == 'MetricsHandler':
118
+ from .metrics import MetricsHandler
119
+ return MetricsHandler
120
+ elif name == 'ImageHandler':
121
+ from .image import ImageHandler
122
+ return ImageHandler
123
+ elif name == 'TelemetryHandler':
124
+ from .telemetry import TelemetryHandler
125
+ return TelemetryHandler
126
+ elif name == 'MCPHandler':
127
+ from .mcp import MCPHandler
128
+ return MCPHandler
129
+ elif name == 'FastContextHandler':
130
+ from .fast_context import FastContextHandler
131
+ return FastContextHandler
132
+ elif name == 'KnowledgeHandler':
133
+ from .knowledge import KnowledgeHandler
134
+ return KnowledgeHandler
135
+ elif name == 'SessionHandler':
136
+ from .session import SessionHandler
137
+ return SessionHandler
138
+ elif name == 'ToolsHandler':
139
+ from .tools import ToolsHandler
140
+ return ToolsHandler
141
+ elif name == 'HandoffHandler':
142
+ from .handoff import HandoffHandler
143
+ return HandoffHandler
144
+ elif name == 'AutoMemoryHandler':
145
+ from .auto_memory import AutoMemoryHandler
146
+ return AutoMemoryHandler
147
+ elif name == 'TodoHandler':
148
+ from .todo import TodoHandler
149
+ return TodoHandler
150
+ elif name == 'RouterHandler':
151
+ from .router import RouterHandler
152
+ return RouterHandler
153
+ elif name == 'FlowDisplayHandler':
154
+ from .flow_display import FlowDisplayHandler
155
+ return FlowDisplayHandler
156
+ elif name == 'WorkflowHandler':
157
+ from .workflow import WorkflowHandler
158
+ return WorkflowHandler
159
+ elif name == 'N8nHandler':
160
+ from .n8n import N8nHandler
161
+ return N8nHandler
162
+ elif name == 'ExternalAgentsHandler':
163
+ from .external_agents import ExternalAgentsHandler
164
+ return ExternalAgentsHandler
165
+ # New CLI enhancement features
166
+ elif name == 'SlashCommandHandler':
167
+ from .slash_commands import SlashCommandHandler
168
+ return SlashCommandHandler
169
+ elif name == 'AutonomyModeHandler':
170
+ from .autonomy_mode import AutonomyModeHandler
171
+ return AutonomyModeHandler
172
+ elif name == 'CostTrackerHandler':
173
+ from .cost_tracker import CostTrackerHandler
174
+ return CostTrackerHandler
175
+ elif name == 'RepoMapHandler':
176
+ from .repo_map import RepoMapHandler
177
+ return RepoMapHandler
178
+ elif name == 'InteractiveTUIHandler':
179
+ from .interactive_tui import InteractiveTUIHandler
180
+ return InteractiveTUIHandler
181
+ elif name == 'GitIntegrationHandler':
182
+ from .git_integration import GitIntegrationHandler
183
+ return GitIntegrationHandler
184
+ elif name == 'SandboxExecutorHandler':
185
+ from .sandbox_executor import SandboxExecutorHandler
186
+ return SandboxExecutorHandler
187
+ elif name == 'MessageQueueHandler':
188
+ from .message_queue import MessageQueueHandler
189
+ return MessageQueueHandler
190
+ # @ mention autocomplete
191
+ elif name == 'AtMentionCompleter':
192
+ from .at_mentions import AtMentionCompleter
193
+ return AtMentionCompleter
194
+ elif name == 'CombinedCompleter':
195
+ from .at_mentions import CombinedCompleter
196
+ return CombinedCompleter
197
+ elif name == 'FileSearchService':
198
+ from .at_mentions import FileSearchService
199
+ return FileSearchService
200
+ elif name == 'CompareHandler':
201
+ from .compare import CompareHandler
202
+ return CompareHandler
203
+ elif name == 'EvalHandler':
204
+ from .eval import EvalHandler
205
+ return EvalHandler
206
+ elif name == 'SkillsHandler':
207
+ from .skills import SkillsHandler
208
+ return SkillsHandler
209
+ elif name == 'HooksHandler':
210
+ from .hooks import HooksHandler
211
+ return HooksHandler
212
+ elif name == 'CheckpointsHandler':
213
+ from .checkpoints import CheckpointsHandler
214
+ return CheckpointsHandler
215
+ elif name == 'BackgroundHandler':
216
+ from .background import BackgroundHandler
217
+ return BackgroundHandler
218
+ elif name == 'ThinkingHandler':
219
+ from .thinking import ThinkingHandler
220
+ return ThinkingHandler
221
+ elif name == 'CompactionHandler':
222
+ from .compaction import CompactionHandler
223
+ return CompactionHandler
224
+ elif name == 'OutputStyleHandler':
225
+ from .output_style import OutputStyleHandler
226
+ return OutputStyleHandler
227
+ elif name == 'OllamaHandler':
228
+ from .ollama import OllamaHandler
229
+ return OllamaHandler
230
+ elif name == 'CapabilitiesHandler':
231
+ from .capabilities import CapabilitiesHandler
232
+ return CapabilitiesHandler
233
+ elif name == 'PerformanceHandler':
234
+ from .performance import PerformanceHandler
235
+ return PerformanceHandler
236
+ elif name == 'LiteHandler':
237
+ from .lite import LiteHandler
238
+ return LiteHandler
239
+ # Agent-centric tools (LSP/ACP powered)
240
+ elif name == 'create_agent_centric_tools':
241
+ from .agent_tools import create_agent_centric_tools
242
+ return create_agent_centric_tools
243
+ elif name == 'InteractiveRuntime':
244
+ from .interactive_runtime import InteractiveRuntime
245
+ return InteractiveRuntime
246
+ elif name == 'RuntimeConfig':
247
+ from .interactive_runtime import RuntimeConfig
248
+ return RuntimeConfig
249
+ elif name == 'CodeIntelligenceRouter':
250
+ from .code_intelligence import CodeIntelligenceRouter
251
+ return CodeIntelligenceRouter
252
+ elif name == 'ActionOrchestrator':
253
+ from .action_orchestrator import ActionOrchestrator
254
+ return ActionOrchestrator
255
+ # Interactive tools provider (canonical source)
256
+ elif name == 'get_interactive_tools':
257
+ from .interactive_tools import get_interactive_tools
258
+ return get_interactive_tools
259
+ elif name == 'resolve_tool_groups':
260
+ from .interactive_tools import resolve_tool_groups
261
+ return resolve_tool_groups
262
+ elif name == 'ToolConfig':
263
+ from .interactive_tools import ToolConfig
264
+ return ToolConfig
265
+ elif name == 'TOOL_GROUPS':
266
+ from .interactive_tools import TOOL_GROUPS
267
+ return TOOL_GROUPS
268
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")