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,380 @@
1
+ """
2
+ Interactive Default Tools Provider for PraisonAI.
3
+
4
+ This module provides the canonical source of truth for default tools
5
+ in interactive modes (TUI and `praison "prompt"`).
6
+
7
+ Tool Groups:
8
+ - `acp`: ACP-powered file operations (create, edit, delete, execute)
9
+ - `lsp`: LSP-powered code intelligence (symbols, definitions, references)
10
+ - `basic`: Basic file tools (read, list, search)
11
+ - `interactive`: Union of all groups (default)
12
+
13
+ Usage:
14
+ from praisonai.cli.features.interactive_tools import (
15
+ get_interactive_tools,
16
+ resolve_tool_groups,
17
+ TOOL_GROUPS,
18
+ )
19
+
20
+ # Get all interactive tools (default)
21
+ tools = get_interactive_tools()
22
+
23
+ # Get specific groups
24
+ tools = get_interactive_tools(groups=["acp", "basic"])
25
+
26
+ # Disable specific groups
27
+ tools = get_interactive_tools(disable=["lsp"])
28
+ """
29
+
30
+ import logging
31
+ import os
32
+ from dataclasses import dataclass, field
33
+ from typing import Callable, Dict, List, Optional, Set
34
+
35
+ logger = logging.getLogger(__name__)
36
+
37
+ # Tool group definitions
38
+ TOOL_GROUPS = {
39
+ "acp": [
40
+ "acp_create_file",
41
+ "acp_edit_file",
42
+ "acp_delete_file",
43
+ "acp_execute_command",
44
+ ],
45
+ "lsp": [
46
+ "lsp_list_symbols",
47
+ "lsp_find_definition",
48
+ "lsp_find_references",
49
+ "lsp_get_diagnostics",
50
+ ],
51
+ "basic": [
52
+ "read_file",
53
+ "write_file",
54
+ "list_files",
55
+ "execute_command",
56
+ "internet_search",
57
+ ],
58
+ }
59
+
60
+ # Default interactive group includes all
61
+ TOOL_GROUPS["interactive"] = (
62
+ TOOL_GROUPS["acp"] +
63
+ TOOL_GROUPS["lsp"] +
64
+ TOOL_GROUPS["basic"]
65
+ )
66
+
67
+
68
+ @dataclass
69
+ class ToolConfig:
70
+ """Configuration for tool loading."""
71
+ workspace: str = field(default_factory=os.getcwd)
72
+ enable_acp: bool = True
73
+ enable_lsp: bool = True
74
+ enable_basic: bool = True
75
+ approval_mode: str = "auto" # auto, manual, scoped
76
+ lsp_enabled: bool = True
77
+ acp_enabled: bool = True
78
+
79
+ @classmethod
80
+ def from_env(cls) -> "ToolConfig":
81
+ """Create config from environment variables."""
82
+ config = cls()
83
+
84
+ # Check env vars for disabling groups
85
+ disable_str = os.environ.get("PRAISON_TOOLS_DISABLE", "")
86
+ if disable_str:
87
+ disabled = [g.strip().lower() for g in disable_str.split(",")]
88
+ if "acp" in disabled:
89
+ config.enable_acp = False
90
+ if "lsp" in disabled:
91
+ config.enable_lsp = False
92
+ if "basic" in disabled:
93
+ config.enable_basic = False
94
+
95
+ # Check for workspace
96
+ workspace = os.environ.get("PRAISON_WORKSPACE", "")
97
+ if workspace:
98
+ config.workspace = workspace
99
+
100
+ # Check approval mode
101
+ approval = os.environ.get("PRAISON_APPROVAL_MODE", "")
102
+ if approval in ("auto", "manual", "scoped"):
103
+ config.approval_mode = approval
104
+
105
+ return config
106
+
107
+
108
+ def resolve_tool_groups(
109
+ groups: Optional[List[str]] = None,
110
+ disable: Optional[List[str]] = None,
111
+ config: Optional[ToolConfig] = None,
112
+ ) -> Set[str]:
113
+ """
114
+ Resolve which tool names should be included based on groups and config.
115
+
116
+ Args:
117
+ groups: Specific groups to include (None = all enabled)
118
+ disable: Groups to explicitly disable
119
+ config: Tool configuration
120
+
121
+ Returns:
122
+ Set of tool names to include
123
+ """
124
+ if config is None:
125
+ config = ToolConfig.from_env()
126
+
127
+ disable = disable or []
128
+
129
+ # Start with requested groups or all enabled
130
+ if groups:
131
+ tool_names = set()
132
+ for group in groups:
133
+ if group in TOOL_GROUPS:
134
+ tool_names.update(TOOL_GROUPS[group])
135
+ else:
136
+ tool_names = set()
137
+ if config.enable_acp:
138
+ tool_names.update(TOOL_GROUPS["acp"])
139
+ if config.enable_lsp:
140
+ tool_names.update(TOOL_GROUPS["lsp"])
141
+ if config.enable_basic:
142
+ tool_names.update(TOOL_GROUPS["basic"])
143
+
144
+ # Remove disabled groups
145
+ for group in disable:
146
+ if group in TOOL_GROUPS:
147
+ tool_names -= set(TOOL_GROUPS[group])
148
+
149
+ return tool_names
150
+
151
+
152
+ def _load_basic_tools() -> Dict[str, Callable]:
153
+ """Lazy load basic tools from praisonaiagents."""
154
+ tools = {}
155
+
156
+ try:
157
+ from praisonaiagents.tools import read_file
158
+ tools["read_file"] = read_file
159
+ except ImportError:
160
+ logger.debug("read_file not available")
161
+
162
+ try:
163
+ from praisonaiagents.tools import write_file
164
+ tools["write_file"] = write_file
165
+ except ImportError:
166
+ logger.debug("write_file not available")
167
+
168
+ try:
169
+ from praisonaiagents.tools import list_files
170
+ tools["list_files"] = list_files
171
+ except ImportError:
172
+ logger.debug("list_files not available")
173
+
174
+ try:
175
+ from praisonaiagents.tools import execute_command
176
+ tools["execute_command"] = execute_command
177
+ except ImportError:
178
+ logger.debug("execute_command not available")
179
+
180
+ try:
181
+ from praisonaiagents.tools import internet_search
182
+ tools["internet_search"] = internet_search
183
+ except ImportError:
184
+ logger.debug("internet_search not available")
185
+
186
+ return tools
187
+
188
+
189
+ def _load_acp_tools(config: ToolConfig) -> Dict[str, Callable]:
190
+ """Lazy load ACP tools with runtime initialization."""
191
+ tools = {}
192
+
193
+ try:
194
+ from .interactive_runtime import InteractiveRuntime, RuntimeConfig
195
+ from .agent_tools import create_agent_centric_tools
196
+
197
+ # Create runtime config
198
+ runtime_config = RuntimeConfig(
199
+ workspace=config.workspace,
200
+ lsp_enabled=config.lsp_enabled,
201
+ acp_enabled=config.acp_enabled,
202
+ approval_mode=config.approval_mode,
203
+ )
204
+
205
+ # Create runtime (lazy - doesn't start until needed)
206
+ runtime = InteractiveRuntime(runtime_config)
207
+
208
+ # Get all agent-centric tools
209
+ all_tools = create_agent_centric_tools(runtime)
210
+
211
+ # Map by name
212
+ for tool in all_tools:
213
+ name = tool.__name__
214
+ if name.startswith("acp_"):
215
+ tools[name] = tool
216
+
217
+ logger.debug(f"Loaded {len(tools)} ACP tools")
218
+
219
+ except ImportError as e:
220
+ logger.debug(f"ACP tools not available: {e}")
221
+ except Exception as e:
222
+ logger.warning(f"Error loading ACP tools: {e}")
223
+
224
+ return tools
225
+
226
+
227
+ def _load_lsp_tools(config: ToolConfig) -> Dict[str, Callable]:
228
+ """Lazy load LSP tools with runtime initialization."""
229
+ tools = {}
230
+
231
+ try:
232
+ from .interactive_runtime import InteractiveRuntime, RuntimeConfig
233
+ from .agent_tools import create_agent_centric_tools
234
+
235
+ # Create runtime config
236
+ runtime_config = RuntimeConfig(
237
+ workspace=config.workspace,
238
+ lsp_enabled=config.lsp_enabled,
239
+ acp_enabled=config.acp_enabled,
240
+ approval_mode=config.approval_mode,
241
+ )
242
+
243
+ # Create runtime
244
+ runtime = InteractiveRuntime(runtime_config)
245
+
246
+ # Get all agent-centric tools
247
+ all_tools = create_agent_centric_tools(runtime)
248
+
249
+ # Map by name
250
+ for tool in all_tools:
251
+ name = tool.__name__
252
+ if name.startswith("lsp_"):
253
+ tools[name] = tool
254
+
255
+ logger.debug(f"Loaded {len(tools)} LSP tools")
256
+
257
+ except ImportError as e:
258
+ logger.debug(f"LSP tools not available: {e}")
259
+ except Exception as e:
260
+ logger.warning(f"Error loading LSP tools: {e}")
261
+
262
+ return tools
263
+
264
+
265
+ def get_interactive_tools(
266
+ groups: Optional[List[str]] = None,
267
+ disable: Optional[List[str]] = None,
268
+ config: Optional[ToolConfig] = None,
269
+ workspace: Optional[str] = None,
270
+ ) -> List[Callable]:
271
+ """
272
+ Get the default interactive tools for TUI and prompt modes.
273
+
274
+ This is the canonical source of truth for interactive tool defaults.
275
+ Both `praisonai tui launch` and `praison "prompt"` should use this.
276
+
277
+ Args:
278
+ groups: Specific tool groups to include (default: all enabled)
279
+ disable: Tool groups to disable (e.g., ["acp", "lsp"])
280
+ config: Tool configuration (created from env if not provided)
281
+ workspace: Override workspace path
282
+
283
+ Returns:
284
+ List of tool callables
285
+
286
+ Example:
287
+ # Default (all tools)
288
+ tools = get_interactive_tools()
289
+
290
+ # Disable ACP tools
291
+ tools = get_interactive_tools(disable=["acp"])
292
+
293
+ # Only basic tools
294
+ tools = get_interactive_tools(groups=["basic"])
295
+ """
296
+ if config is None:
297
+ config = ToolConfig.from_env()
298
+
299
+ if workspace:
300
+ config.workspace = workspace
301
+
302
+ # Resolve which tools to include
303
+ tool_names = resolve_tool_groups(groups, disable, config)
304
+
305
+ # Load tools by group
306
+ all_tools: Dict[str, Callable] = {}
307
+
308
+ # Load basic tools (always available, no runtime needed)
309
+ if config.enable_basic and not (disable and "basic" in disable):
310
+ basic_tools = _load_basic_tools()
311
+ all_tools.update(basic_tools)
312
+
313
+ # Load ACP tools (requires runtime)
314
+ if config.enable_acp and not (disable and "acp" in disable):
315
+ acp_tools = _load_acp_tools(config)
316
+ all_tools.update(acp_tools)
317
+
318
+ # Load LSP tools (requires runtime)
319
+ if config.enable_lsp and not (disable and "lsp" in disable):
320
+ lsp_tools = _load_lsp_tools(config)
321
+ all_tools.update(lsp_tools)
322
+
323
+ # Filter to requested tools
324
+ result = []
325
+ for name in sorted(tool_names): # Deterministic ordering
326
+ if name in all_tools:
327
+ result.append(all_tools[name])
328
+
329
+ logger.debug(f"Loaded {len(result)} interactive tools: {[t.__name__ for t in result]}")
330
+
331
+ return result
332
+
333
+
334
+ def merge_tool_overrides(
335
+ default_tools: List[Callable],
336
+ add_tools: Optional[List[Callable]] = None,
337
+ remove_names: Optional[List[str]] = None,
338
+ ) -> List[Callable]:
339
+ """
340
+ Merge tool overrides with default tools.
341
+
342
+ Args:
343
+ default_tools: Base list of tools
344
+ add_tools: Tools to add
345
+ remove_names: Tool names to remove
346
+
347
+ Returns:
348
+ Merged tool list
349
+ """
350
+ # Build name -> tool map
351
+ tool_map = {t.__name__: t for t in default_tools}
352
+
353
+ # Remove specified tools
354
+ if remove_names:
355
+ for name in remove_names:
356
+ tool_map.pop(name, None)
357
+
358
+ # Add new tools
359
+ if add_tools:
360
+ for tool in add_tools:
361
+ tool_map[tool.__name__] = tool
362
+
363
+ return list(tool_map.values())
364
+
365
+
366
+ def get_tool_group_names() -> Dict[str, List[str]]:
367
+ """Get available tool groups and their tool names."""
368
+ return TOOL_GROUPS.copy()
369
+
370
+
371
+ def print_tool_summary(tools: List[Callable]) -> None:
372
+ """Print a summary of loaded tools (for debugging)."""
373
+ acp_count = sum(1 for t in tools if t.__name__.startswith("acp_"))
374
+ lsp_count = sum(1 for t in tools if t.__name__.startswith("lsp_"))
375
+ basic_count = len(tools) - acp_count - lsp_count
376
+
377
+ print(f"Interactive tools loaded: {len(tools)} total")
378
+ print(f" - ACP tools: {acp_count}")
379
+ print(f" - LSP tools: {lsp_count}")
380
+ print(f" - Basic tools: {basic_count}")