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.
- praisonai/__init__.py +54 -0
- praisonai/__main__.py +15 -0
- praisonai/acp/__init__.py +54 -0
- praisonai/acp/config.py +159 -0
- praisonai/acp/server.py +587 -0
- praisonai/acp/session.py +219 -0
- praisonai/adapters/__init__.py +50 -0
- praisonai/adapters/readers.py +395 -0
- praisonai/adapters/rerankers.py +315 -0
- praisonai/adapters/retrievers.py +394 -0
- praisonai/adapters/vector_stores.py +409 -0
- praisonai/agent_scheduler.py +337 -0
- praisonai/agents_generator.py +903 -0
- praisonai/api/call.py +292 -0
- praisonai/auto.py +1197 -0
- praisonai/capabilities/__init__.py +275 -0
- praisonai/capabilities/a2a.py +140 -0
- praisonai/capabilities/assistants.py +283 -0
- praisonai/capabilities/audio.py +320 -0
- praisonai/capabilities/batches.py +469 -0
- praisonai/capabilities/completions.py +336 -0
- praisonai/capabilities/container_files.py +155 -0
- praisonai/capabilities/containers.py +93 -0
- praisonai/capabilities/embeddings.py +158 -0
- praisonai/capabilities/files.py +467 -0
- praisonai/capabilities/fine_tuning.py +293 -0
- praisonai/capabilities/guardrails.py +182 -0
- praisonai/capabilities/images.py +330 -0
- praisonai/capabilities/mcp.py +190 -0
- praisonai/capabilities/messages.py +270 -0
- praisonai/capabilities/moderations.py +154 -0
- praisonai/capabilities/ocr.py +217 -0
- praisonai/capabilities/passthrough.py +204 -0
- praisonai/capabilities/rag.py +207 -0
- praisonai/capabilities/realtime.py +160 -0
- praisonai/capabilities/rerank.py +165 -0
- praisonai/capabilities/responses.py +266 -0
- praisonai/capabilities/search.py +109 -0
- praisonai/capabilities/skills.py +133 -0
- praisonai/capabilities/vector_store_files.py +334 -0
- praisonai/capabilities/vector_stores.py +304 -0
- praisonai/capabilities/videos.py +141 -0
- praisonai/chainlit_ui.py +304 -0
- praisonai/chat/__init__.py +106 -0
- praisonai/chat/app.py +125 -0
- praisonai/cli/__init__.py +26 -0
- praisonai/cli/app.py +213 -0
- praisonai/cli/commands/__init__.py +75 -0
- praisonai/cli/commands/acp.py +70 -0
- praisonai/cli/commands/completion.py +333 -0
- praisonai/cli/commands/config.py +166 -0
- praisonai/cli/commands/debug.py +142 -0
- praisonai/cli/commands/diag.py +55 -0
- praisonai/cli/commands/doctor.py +166 -0
- praisonai/cli/commands/environment.py +179 -0
- praisonai/cli/commands/lsp.py +112 -0
- praisonai/cli/commands/mcp.py +210 -0
- praisonai/cli/commands/profile.py +457 -0
- praisonai/cli/commands/run.py +228 -0
- praisonai/cli/commands/schedule.py +150 -0
- praisonai/cli/commands/serve.py +97 -0
- praisonai/cli/commands/session.py +212 -0
- praisonai/cli/commands/traces.py +145 -0
- praisonai/cli/commands/version.py +101 -0
- praisonai/cli/configuration/__init__.py +18 -0
- praisonai/cli/configuration/loader.py +353 -0
- praisonai/cli/configuration/paths.py +114 -0
- praisonai/cli/configuration/schema.py +164 -0
- praisonai/cli/features/__init__.py +268 -0
- praisonai/cli/features/acp.py +236 -0
- praisonai/cli/features/action_orchestrator.py +546 -0
- praisonai/cli/features/agent_scheduler.py +773 -0
- praisonai/cli/features/agent_tools.py +474 -0
- praisonai/cli/features/agents.py +375 -0
- praisonai/cli/features/at_mentions.py +471 -0
- praisonai/cli/features/auto_memory.py +182 -0
- praisonai/cli/features/autonomy_mode.py +490 -0
- praisonai/cli/features/background.py +356 -0
- praisonai/cli/features/base.py +168 -0
- praisonai/cli/features/capabilities.py +1326 -0
- praisonai/cli/features/checkpoints.py +338 -0
- praisonai/cli/features/code_intelligence.py +652 -0
- praisonai/cli/features/compaction.py +294 -0
- praisonai/cli/features/compare.py +534 -0
- praisonai/cli/features/cost_tracker.py +514 -0
- praisonai/cli/features/debug.py +810 -0
- praisonai/cli/features/deploy.py +517 -0
- praisonai/cli/features/diag.py +289 -0
- praisonai/cli/features/doctor/__init__.py +63 -0
- praisonai/cli/features/doctor/checks/__init__.py +24 -0
- praisonai/cli/features/doctor/checks/acp_checks.py +240 -0
- praisonai/cli/features/doctor/checks/config_checks.py +366 -0
- praisonai/cli/features/doctor/checks/db_checks.py +366 -0
- praisonai/cli/features/doctor/checks/env_checks.py +543 -0
- praisonai/cli/features/doctor/checks/lsp_checks.py +199 -0
- praisonai/cli/features/doctor/checks/mcp_checks.py +349 -0
- praisonai/cli/features/doctor/checks/memory_checks.py +268 -0
- praisonai/cli/features/doctor/checks/network_checks.py +251 -0
- praisonai/cli/features/doctor/checks/obs_checks.py +328 -0
- praisonai/cli/features/doctor/checks/performance_checks.py +235 -0
- praisonai/cli/features/doctor/checks/permissions_checks.py +259 -0
- praisonai/cli/features/doctor/checks/selftest_checks.py +322 -0
- praisonai/cli/features/doctor/checks/serve_checks.py +426 -0
- praisonai/cli/features/doctor/checks/skills_checks.py +231 -0
- praisonai/cli/features/doctor/checks/tools_checks.py +371 -0
- praisonai/cli/features/doctor/engine.py +266 -0
- praisonai/cli/features/doctor/formatters.py +310 -0
- praisonai/cli/features/doctor/handler.py +397 -0
- praisonai/cli/features/doctor/models.py +264 -0
- praisonai/cli/features/doctor/registry.py +239 -0
- praisonai/cli/features/endpoints.py +1019 -0
- praisonai/cli/features/eval.py +560 -0
- praisonai/cli/features/external_agents.py +231 -0
- praisonai/cli/features/fast_context.py +410 -0
- praisonai/cli/features/flow_display.py +566 -0
- praisonai/cli/features/git_integration.py +651 -0
- praisonai/cli/features/guardrail.py +171 -0
- praisonai/cli/features/handoff.py +185 -0
- praisonai/cli/features/hooks.py +583 -0
- praisonai/cli/features/image.py +384 -0
- praisonai/cli/features/interactive_runtime.py +585 -0
- praisonai/cli/features/interactive_tools.py +380 -0
- praisonai/cli/features/interactive_tui.py +603 -0
- praisonai/cli/features/jobs.py +632 -0
- praisonai/cli/features/knowledge.py +531 -0
- praisonai/cli/features/lite.py +244 -0
- praisonai/cli/features/lsp_cli.py +225 -0
- praisonai/cli/features/mcp.py +169 -0
- praisonai/cli/features/message_queue.py +587 -0
- praisonai/cli/features/metrics.py +211 -0
- praisonai/cli/features/n8n.py +673 -0
- praisonai/cli/features/observability.py +293 -0
- praisonai/cli/features/ollama.py +361 -0
- praisonai/cli/features/output_style.py +273 -0
- praisonai/cli/features/package.py +631 -0
- praisonai/cli/features/performance.py +308 -0
- praisonai/cli/features/persistence.py +636 -0
- praisonai/cli/features/profile.py +226 -0
- praisonai/cli/features/profiler/__init__.py +81 -0
- praisonai/cli/features/profiler/core.py +558 -0
- praisonai/cli/features/profiler/optimizations.py +652 -0
- praisonai/cli/features/profiler/suite.py +386 -0
- praisonai/cli/features/profiling.py +350 -0
- praisonai/cli/features/queue/__init__.py +73 -0
- praisonai/cli/features/queue/manager.py +395 -0
- praisonai/cli/features/queue/models.py +286 -0
- praisonai/cli/features/queue/persistence.py +564 -0
- praisonai/cli/features/queue/scheduler.py +484 -0
- praisonai/cli/features/queue/worker.py +372 -0
- praisonai/cli/features/recipe.py +1723 -0
- praisonai/cli/features/recipes.py +449 -0
- praisonai/cli/features/registry.py +229 -0
- praisonai/cli/features/repo_map.py +860 -0
- praisonai/cli/features/router.py +466 -0
- praisonai/cli/features/sandbox_executor.py +515 -0
- praisonai/cli/features/serve.py +829 -0
- praisonai/cli/features/session.py +222 -0
- praisonai/cli/features/skills.py +856 -0
- praisonai/cli/features/slash_commands.py +650 -0
- praisonai/cli/features/telemetry.py +179 -0
- praisonai/cli/features/templates.py +1384 -0
- praisonai/cli/features/thinking.py +305 -0
- praisonai/cli/features/todo.py +334 -0
- praisonai/cli/features/tools.py +680 -0
- praisonai/cli/features/tui/__init__.py +83 -0
- praisonai/cli/features/tui/app.py +580 -0
- praisonai/cli/features/tui/cli.py +566 -0
- praisonai/cli/features/tui/debug.py +511 -0
- praisonai/cli/features/tui/events.py +99 -0
- praisonai/cli/features/tui/mock_provider.py +328 -0
- praisonai/cli/features/tui/orchestrator.py +652 -0
- praisonai/cli/features/tui/screens/__init__.py +50 -0
- praisonai/cli/features/tui/screens/main.py +245 -0
- praisonai/cli/features/tui/screens/queue.py +174 -0
- praisonai/cli/features/tui/screens/session.py +124 -0
- praisonai/cli/features/tui/screens/settings.py +148 -0
- praisonai/cli/features/tui/widgets/__init__.py +56 -0
- praisonai/cli/features/tui/widgets/chat.py +261 -0
- praisonai/cli/features/tui/widgets/composer.py +224 -0
- praisonai/cli/features/tui/widgets/queue_panel.py +200 -0
- praisonai/cli/features/tui/widgets/status.py +167 -0
- praisonai/cli/features/tui/widgets/tool_panel.py +248 -0
- praisonai/cli/features/workflow.py +720 -0
- praisonai/cli/legacy.py +236 -0
- praisonai/cli/main.py +5559 -0
- praisonai/cli/schedule_cli.py +54 -0
- praisonai/cli/state/__init__.py +31 -0
- praisonai/cli/state/identifiers.py +161 -0
- praisonai/cli/state/sessions.py +313 -0
- praisonai/code/__init__.py +93 -0
- praisonai/code/agent_tools.py +344 -0
- praisonai/code/diff/__init__.py +21 -0
- praisonai/code/diff/diff_strategy.py +432 -0
- praisonai/code/tools/__init__.py +27 -0
- praisonai/code/tools/apply_diff.py +221 -0
- praisonai/code/tools/execute_command.py +275 -0
- praisonai/code/tools/list_files.py +274 -0
- praisonai/code/tools/read_file.py +206 -0
- praisonai/code/tools/search_replace.py +248 -0
- praisonai/code/tools/write_file.py +217 -0
- praisonai/code/utils/__init__.py +46 -0
- praisonai/code/utils/file_utils.py +307 -0
- praisonai/code/utils/ignore_utils.py +308 -0
- praisonai/code/utils/text_utils.py +276 -0
- praisonai/db/__init__.py +64 -0
- praisonai/db/adapter.py +531 -0
- praisonai/deploy/__init__.py +62 -0
- praisonai/deploy/api.py +231 -0
- praisonai/deploy/docker.py +454 -0
- praisonai/deploy/doctor.py +367 -0
- praisonai/deploy/main.py +327 -0
- praisonai/deploy/models.py +179 -0
- praisonai/deploy/providers/__init__.py +33 -0
- praisonai/deploy/providers/aws.py +331 -0
- praisonai/deploy/providers/azure.py +358 -0
- praisonai/deploy/providers/base.py +101 -0
- praisonai/deploy/providers/gcp.py +314 -0
- praisonai/deploy/schema.py +208 -0
- praisonai/deploy.py +185 -0
- praisonai/endpoints/__init__.py +53 -0
- praisonai/endpoints/a2u_server.py +410 -0
- praisonai/endpoints/discovery.py +165 -0
- praisonai/endpoints/providers/__init__.py +28 -0
- praisonai/endpoints/providers/a2a.py +253 -0
- praisonai/endpoints/providers/a2u.py +208 -0
- praisonai/endpoints/providers/agents_api.py +171 -0
- praisonai/endpoints/providers/base.py +231 -0
- praisonai/endpoints/providers/mcp.py +263 -0
- praisonai/endpoints/providers/recipe.py +206 -0
- praisonai/endpoints/providers/tools_mcp.py +150 -0
- praisonai/endpoints/registry.py +131 -0
- praisonai/endpoints/server.py +161 -0
- praisonai/inbuilt_tools/__init__.py +24 -0
- praisonai/inbuilt_tools/autogen_tools.py +117 -0
- praisonai/inc/__init__.py +2 -0
- praisonai/inc/config.py +96 -0
- praisonai/inc/models.py +155 -0
- praisonai/integrations/__init__.py +56 -0
- praisonai/integrations/base.py +303 -0
- praisonai/integrations/claude_code.py +270 -0
- praisonai/integrations/codex_cli.py +255 -0
- praisonai/integrations/cursor_cli.py +195 -0
- praisonai/integrations/gemini_cli.py +222 -0
- praisonai/jobs/__init__.py +67 -0
- praisonai/jobs/executor.py +425 -0
- praisonai/jobs/models.py +230 -0
- praisonai/jobs/router.py +314 -0
- praisonai/jobs/server.py +186 -0
- praisonai/jobs/store.py +203 -0
- praisonai/llm/__init__.py +66 -0
- praisonai/llm/registry.py +382 -0
- praisonai/mcp_server/__init__.py +152 -0
- praisonai/mcp_server/adapters/__init__.py +74 -0
- praisonai/mcp_server/adapters/agents.py +128 -0
- praisonai/mcp_server/adapters/capabilities.py +168 -0
- praisonai/mcp_server/adapters/cli_tools.py +568 -0
- praisonai/mcp_server/adapters/extended_capabilities.py +462 -0
- praisonai/mcp_server/adapters/knowledge.py +93 -0
- praisonai/mcp_server/adapters/memory.py +104 -0
- praisonai/mcp_server/adapters/prompts.py +306 -0
- praisonai/mcp_server/adapters/resources.py +124 -0
- praisonai/mcp_server/adapters/tools_bridge.py +280 -0
- praisonai/mcp_server/auth/__init__.py +48 -0
- praisonai/mcp_server/auth/api_key.py +291 -0
- praisonai/mcp_server/auth/oauth.py +460 -0
- praisonai/mcp_server/auth/oidc.py +289 -0
- praisonai/mcp_server/auth/scopes.py +260 -0
- praisonai/mcp_server/cli.py +852 -0
- praisonai/mcp_server/elicitation.py +445 -0
- praisonai/mcp_server/icons.py +302 -0
- praisonai/mcp_server/recipe_adapter.py +573 -0
- praisonai/mcp_server/recipe_cli.py +824 -0
- praisonai/mcp_server/registry.py +703 -0
- praisonai/mcp_server/sampling.py +422 -0
- praisonai/mcp_server/server.py +490 -0
- praisonai/mcp_server/tasks.py +443 -0
- praisonai/mcp_server/transports/__init__.py +18 -0
- praisonai/mcp_server/transports/http_stream.py +376 -0
- praisonai/mcp_server/transports/stdio.py +132 -0
- praisonai/persistence/__init__.py +84 -0
- praisonai/persistence/config.py +238 -0
- praisonai/persistence/conversation/__init__.py +25 -0
- praisonai/persistence/conversation/async_mysql.py +427 -0
- praisonai/persistence/conversation/async_postgres.py +410 -0
- praisonai/persistence/conversation/async_sqlite.py +371 -0
- praisonai/persistence/conversation/base.py +151 -0
- praisonai/persistence/conversation/json_store.py +250 -0
- praisonai/persistence/conversation/mysql.py +387 -0
- praisonai/persistence/conversation/postgres.py +401 -0
- praisonai/persistence/conversation/singlestore.py +240 -0
- praisonai/persistence/conversation/sqlite.py +341 -0
- praisonai/persistence/conversation/supabase.py +203 -0
- praisonai/persistence/conversation/surrealdb.py +287 -0
- praisonai/persistence/factory.py +301 -0
- praisonai/persistence/hooks/__init__.py +18 -0
- praisonai/persistence/hooks/agent_hooks.py +297 -0
- praisonai/persistence/knowledge/__init__.py +26 -0
- praisonai/persistence/knowledge/base.py +144 -0
- praisonai/persistence/knowledge/cassandra.py +232 -0
- praisonai/persistence/knowledge/chroma.py +295 -0
- praisonai/persistence/knowledge/clickhouse.py +242 -0
- praisonai/persistence/knowledge/cosmosdb_vector.py +438 -0
- praisonai/persistence/knowledge/couchbase.py +286 -0
- praisonai/persistence/knowledge/lancedb.py +216 -0
- praisonai/persistence/knowledge/langchain_adapter.py +291 -0
- praisonai/persistence/knowledge/lightrag_adapter.py +212 -0
- praisonai/persistence/knowledge/llamaindex_adapter.py +256 -0
- praisonai/persistence/knowledge/milvus.py +277 -0
- praisonai/persistence/knowledge/mongodb_vector.py +306 -0
- praisonai/persistence/knowledge/pgvector.py +335 -0
- praisonai/persistence/knowledge/pinecone.py +253 -0
- praisonai/persistence/knowledge/qdrant.py +301 -0
- praisonai/persistence/knowledge/redis_vector.py +291 -0
- praisonai/persistence/knowledge/singlestore_vector.py +299 -0
- praisonai/persistence/knowledge/surrealdb_vector.py +309 -0
- praisonai/persistence/knowledge/upstash_vector.py +266 -0
- praisonai/persistence/knowledge/weaviate.py +223 -0
- praisonai/persistence/migrations/__init__.py +10 -0
- praisonai/persistence/migrations/manager.py +251 -0
- praisonai/persistence/orchestrator.py +406 -0
- praisonai/persistence/state/__init__.py +21 -0
- praisonai/persistence/state/async_mongodb.py +200 -0
- praisonai/persistence/state/base.py +107 -0
- praisonai/persistence/state/dynamodb.py +226 -0
- praisonai/persistence/state/firestore.py +175 -0
- praisonai/persistence/state/gcs.py +155 -0
- praisonai/persistence/state/memory.py +245 -0
- praisonai/persistence/state/mongodb.py +158 -0
- praisonai/persistence/state/redis.py +190 -0
- praisonai/persistence/state/upstash.py +144 -0
- praisonai/persistence/tests/__init__.py +3 -0
- praisonai/persistence/tests/test_all_backends.py +633 -0
- praisonai/profiler.py +1214 -0
- praisonai/recipe/__init__.py +134 -0
- praisonai/recipe/bridge.py +278 -0
- praisonai/recipe/core.py +893 -0
- praisonai/recipe/exceptions.py +54 -0
- praisonai/recipe/history.py +402 -0
- praisonai/recipe/models.py +266 -0
- praisonai/recipe/operations.py +440 -0
- praisonai/recipe/policy.py +422 -0
- praisonai/recipe/registry.py +849 -0
- praisonai/recipe/runtime.py +214 -0
- praisonai/recipe/security.py +711 -0
- praisonai/recipe/serve.py +859 -0
- praisonai/recipe/server.py +613 -0
- praisonai/scheduler/__init__.py +45 -0
- praisonai/scheduler/agent_scheduler.py +552 -0
- praisonai/scheduler/base.py +124 -0
- praisonai/scheduler/daemon_manager.py +225 -0
- praisonai/scheduler/state_manager.py +155 -0
- praisonai/scheduler/yaml_loader.py +193 -0
- praisonai/scheduler.py +194 -0
- praisonai/setup/__init__.py +1 -0
- praisonai/setup/build.py +21 -0
- praisonai/setup/post_install.py +23 -0
- praisonai/setup/setup_conda_env.py +25 -0
- praisonai/setup.py +16 -0
- praisonai/templates/__init__.py +116 -0
- praisonai/templates/cache.py +364 -0
- praisonai/templates/dependency_checker.py +358 -0
- praisonai/templates/discovery.py +391 -0
- praisonai/templates/loader.py +564 -0
- praisonai/templates/registry.py +511 -0
- praisonai/templates/resolver.py +206 -0
- praisonai/templates/security.py +327 -0
- praisonai/templates/tool_override.py +498 -0
- praisonai/templates/tools_doctor.py +256 -0
- praisonai/test.py +105 -0
- praisonai/train.py +562 -0
- praisonai/train_vision.py +306 -0
- praisonai/ui/agents.py +824 -0
- praisonai/ui/callbacks.py +57 -0
- praisonai/ui/chainlit_compat.py +246 -0
- praisonai/ui/chat.py +532 -0
- praisonai/ui/code.py +717 -0
- praisonai/ui/colab.py +474 -0
- praisonai/ui/colab_chainlit.py +81 -0
- praisonai/ui/components/aicoder.py +284 -0
- praisonai/ui/context.py +283 -0
- praisonai/ui/database_config.py +56 -0
- praisonai/ui/db.py +294 -0
- praisonai/ui/realtime.py +488 -0
- praisonai/ui/realtimeclient/__init__.py +756 -0
- praisonai/ui/realtimeclient/tools.py +242 -0
- praisonai/ui/sql_alchemy.py +710 -0
- praisonai/upload_vision.py +140 -0
- praisonai/version.py +1 -0
- praisonai-3.0.0.dist-info/METADATA +3493 -0
- praisonai-3.0.0.dist-info/RECORD +393 -0
- praisonai-3.0.0.dist-info/WHEEL +5 -0
- praisonai-3.0.0.dist-info/entry_points.txt +4 -0
- 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}")
|