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,344 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Agent-compatible tool wrappers for PraisonAI Code.
|
|
3
|
+
|
|
4
|
+
These functions are designed to be used as tools with PraisonAI agents.
|
|
5
|
+
They return string results suitable for agent consumption.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import os
|
|
9
|
+
from typing import Optional
|
|
10
|
+
|
|
11
|
+
from .tools import (
|
|
12
|
+
read_file as _read_file,
|
|
13
|
+
write_file as _write_file,
|
|
14
|
+
list_files as _list_files,
|
|
15
|
+
apply_diff as _apply_diff,
|
|
16
|
+
search_replace as _search_replace,
|
|
17
|
+
execute_command as _execute_command,
|
|
18
|
+
)
|
|
19
|
+
from .tools.apply_diff import create_diff_block, create_multi_diff
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# Global workspace setting for tools
|
|
23
|
+
_workspace_root: Optional[str] = None
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def set_workspace(workspace_path: str) -> None:
|
|
27
|
+
"""
|
|
28
|
+
Set the workspace root for all code tools.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
workspace_path: Absolute path to the workspace root
|
|
32
|
+
"""
|
|
33
|
+
global _workspace_root
|
|
34
|
+
_workspace_root = os.path.abspath(workspace_path)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def get_workspace() -> Optional[str]:
|
|
38
|
+
"""Get the current workspace root."""
|
|
39
|
+
return _workspace_root
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def code_read_file(
|
|
43
|
+
path: str,
|
|
44
|
+
start_line: Optional[int] = None,
|
|
45
|
+
end_line: Optional[int] = None,
|
|
46
|
+
) -> str:
|
|
47
|
+
"""
|
|
48
|
+
Read the contents of a file.
|
|
49
|
+
|
|
50
|
+
Use this tool to read source code files. The content is returned with
|
|
51
|
+
line numbers for easy reference when making edits.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
path: Path to the file (relative to workspace or absolute)
|
|
55
|
+
start_line: First line to read (1-indexed, optional)
|
|
56
|
+
end_line: Last line to read (1-indexed, optional)
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
File content with line numbers, or error message
|
|
60
|
+
|
|
61
|
+
Example:
|
|
62
|
+
>>> content = code_read_file("src/main.py")
|
|
63
|
+
>>> content = code_read_file("src/main.py", start_line=10, end_line=50)
|
|
64
|
+
"""
|
|
65
|
+
result = _read_file(
|
|
66
|
+
path=path,
|
|
67
|
+
start_line=start_line,
|
|
68
|
+
end_line=end_line,
|
|
69
|
+
add_line_nums=True,
|
|
70
|
+
workspace=_workspace_root,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
if result['success']:
|
|
74
|
+
header = f"File: {path}"
|
|
75
|
+
if start_line or end_line:
|
|
76
|
+
header += f" (lines {result['start_line']}-{result['end_line']} of {result['total_lines']})"
|
|
77
|
+
else:
|
|
78
|
+
header += f" ({result['total_lines']} lines)"
|
|
79
|
+
return f"{header}\n\n{result['content']}"
|
|
80
|
+
else:
|
|
81
|
+
return f"Error reading {path}: {result['error']}"
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def code_write_file(path: str, content: str) -> str:
|
|
85
|
+
"""
|
|
86
|
+
Write content to a file, creating it if it doesn't exist.
|
|
87
|
+
|
|
88
|
+
Use this tool to create new files or completely replace existing files.
|
|
89
|
+
For partial modifications, use code_apply_diff instead.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
path: Path to the file (relative to workspace or absolute)
|
|
93
|
+
content: Content to write to the file
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
Success message or error
|
|
97
|
+
|
|
98
|
+
Example:
|
|
99
|
+
>>> result = code_write_file("src/new_module.py", "def hello():\\n print('Hello!')")
|
|
100
|
+
"""
|
|
101
|
+
result = _write_file(
|
|
102
|
+
path=path,
|
|
103
|
+
content=content,
|
|
104
|
+
workspace=_workspace_root,
|
|
105
|
+
create_directories=True,
|
|
106
|
+
strip_code_fences=True,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
if result['success']:
|
|
110
|
+
action = "Created" if result['created'] else "Updated"
|
|
111
|
+
return f"{action} file: {path} ({result['bytes_written']} bytes)"
|
|
112
|
+
else:
|
|
113
|
+
return f"Error writing {path}: {result['error']}"
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def code_list_files(
|
|
117
|
+
path: str = ".",
|
|
118
|
+
recursive: bool = False,
|
|
119
|
+
extensions: Optional[str] = None,
|
|
120
|
+
) -> str:
|
|
121
|
+
"""
|
|
122
|
+
List files in a directory.
|
|
123
|
+
|
|
124
|
+
Use this tool to explore the codebase structure.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
path: Directory path (relative to workspace or absolute)
|
|
128
|
+
recursive: Whether to list recursively
|
|
129
|
+
extensions: Comma-separated list of extensions to filter (e.g., "py,js,ts")
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
Formatted list of files and directories
|
|
133
|
+
|
|
134
|
+
Example:
|
|
135
|
+
>>> files = code_list_files("src", recursive=True, extensions="py")
|
|
136
|
+
"""
|
|
137
|
+
ext_list = None
|
|
138
|
+
if extensions:
|
|
139
|
+
ext_list = [e.strip() for e in extensions.split(',')]
|
|
140
|
+
|
|
141
|
+
result = _list_files(
|
|
142
|
+
path=path,
|
|
143
|
+
recursive=recursive,
|
|
144
|
+
workspace=_workspace_root,
|
|
145
|
+
extensions=ext_list,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
if result['success']:
|
|
149
|
+
lines = [f"Contents of {path}:"]
|
|
150
|
+
|
|
151
|
+
# Add directories
|
|
152
|
+
for d in result['directories']:
|
|
153
|
+
lines.append(f" 📁 {d['path']}/")
|
|
154
|
+
|
|
155
|
+
# Add files
|
|
156
|
+
for f in result['files']:
|
|
157
|
+
size = f.get('size', 0)
|
|
158
|
+
if size < 1024:
|
|
159
|
+
size_str = f"{size}B"
|
|
160
|
+
elif size < 1024 * 1024:
|
|
161
|
+
size_str = f"{size / 1024:.1f}KB"
|
|
162
|
+
else:
|
|
163
|
+
size_str = f"{size / (1024 * 1024):.1f}MB"
|
|
164
|
+
lines.append(f" 📄 {f['path']} ({size_str})")
|
|
165
|
+
|
|
166
|
+
if result.get('truncated'):
|
|
167
|
+
lines.append(f"\n ... (showing {result['total_count']} items, more available)")
|
|
168
|
+
|
|
169
|
+
return '\n'.join(lines)
|
|
170
|
+
else:
|
|
171
|
+
return f"Error listing {path}: {result['error']}"
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def code_apply_diff(path: str, diff: str) -> str:
|
|
175
|
+
"""
|
|
176
|
+
Apply a SEARCH/REPLACE diff to modify a file.
|
|
177
|
+
|
|
178
|
+
Use this tool for precise, surgical edits to existing files.
|
|
179
|
+
The SEARCH section must match existing content exactly.
|
|
180
|
+
|
|
181
|
+
Diff Format:
|
|
182
|
+
<<<<<<< SEARCH
|
|
183
|
+
:start_line:N
|
|
184
|
+
-------
|
|
185
|
+
[exact content to find]
|
|
186
|
+
=======
|
|
187
|
+
[new content to replace with]
|
|
188
|
+
>>>>>>> REPLACE
|
|
189
|
+
|
|
190
|
+
Args:
|
|
191
|
+
path: Path to the file to modify
|
|
192
|
+
diff: The SEARCH/REPLACE diff content
|
|
193
|
+
|
|
194
|
+
Returns:
|
|
195
|
+
Success message with number of changes, or error details
|
|
196
|
+
|
|
197
|
+
Example:
|
|
198
|
+
>>> diff = '''<<<<<<< SEARCH
|
|
199
|
+
... :start_line:10
|
|
200
|
+
... -------
|
|
201
|
+
... def old_function():
|
|
202
|
+
... pass
|
|
203
|
+
... =======
|
|
204
|
+
... def new_function():
|
|
205
|
+
... return True
|
|
206
|
+
... >>>>>>> REPLACE'''
|
|
207
|
+
>>> result = code_apply_diff("src/main.py", diff)
|
|
208
|
+
"""
|
|
209
|
+
result = _apply_diff(
|
|
210
|
+
path=path,
|
|
211
|
+
diff=diff,
|
|
212
|
+
workspace=_workspace_root,
|
|
213
|
+
fuzzy_threshold=0.95, # Allow slight fuzzy matching
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
if result['success']:
|
|
217
|
+
msg = f"Successfully applied {result['applied_count']} change(s) to {path}"
|
|
218
|
+
if result.get('failed_blocks'):
|
|
219
|
+
msg += f"\nWarning: {len(result['failed_blocks'])} block(s) failed to apply"
|
|
220
|
+
return msg
|
|
221
|
+
else:
|
|
222
|
+
error_msg = f"Error applying diff to {path}: {result['error']}"
|
|
223
|
+
if result.get('failed_blocks'):
|
|
224
|
+
for fb in result['failed_blocks'][:3]: # Show first 3 failures
|
|
225
|
+
error_msg += f"\n- {fb.get('error', 'Unknown error')}"
|
|
226
|
+
return error_msg
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def code_search_replace(
|
|
230
|
+
path: str,
|
|
231
|
+
search: str,
|
|
232
|
+
replace: str,
|
|
233
|
+
is_regex: bool = False,
|
|
234
|
+
) -> str:
|
|
235
|
+
"""
|
|
236
|
+
Perform a search and replace operation on a file.
|
|
237
|
+
|
|
238
|
+
Use this for simple text replacements. For complex multi-part edits,
|
|
239
|
+
use code_apply_diff instead.
|
|
240
|
+
|
|
241
|
+
Args:
|
|
242
|
+
path: Path to the file
|
|
243
|
+
search: Text to search for (or regex pattern if is_regex=True)
|
|
244
|
+
replace: Text to replace with
|
|
245
|
+
is_regex: Whether to treat search as a regex pattern
|
|
246
|
+
|
|
247
|
+
Returns:
|
|
248
|
+
Success message with replacement count, or error
|
|
249
|
+
|
|
250
|
+
Example:
|
|
251
|
+
>>> result = code_search_replace("src/main.py", "old_name", "new_name")
|
|
252
|
+
"""
|
|
253
|
+
result = _search_replace(
|
|
254
|
+
path=path,
|
|
255
|
+
operations=[{
|
|
256
|
+
'search': search,
|
|
257
|
+
'replace': replace,
|
|
258
|
+
'is_regex': is_regex,
|
|
259
|
+
}],
|
|
260
|
+
workspace=_workspace_root,
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
if result['success']:
|
|
264
|
+
return f"Replaced {result['total_replacements']} occurrence(s) in {path}"
|
|
265
|
+
else:
|
|
266
|
+
return f"Error: {result['error']}"
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def code_execute_command(
|
|
270
|
+
command: str,
|
|
271
|
+
cwd: Optional[str] = None,
|
|
272
|
+
) -> str:
|
|
273
|
+
"""
|
|
274
|
+
Execute a shell command.
|
|
275
|
+
|
|
276
|
+
Use this tool to run commands like tests, linters, or build tools.
|
|
277
|
+
|
|
278
|
+
Args:
|
|
279
|
+
command: The command to execute
|
|
280
|
+
cwd: Working directory (relative to workspace or absolute)
|
|
281
|
+
|
|
282
|
+
Returns:
|
|
283
|
+
Command output (stdout and stderr)
|
|
284
|
+
|
|
285
|
+
Example:
|
|
286
|
+
>>> result = code_execute_command("python -m pytest tests/")
|
|
287
|
+
>>> result = code_execute_command("npm test", cwd="frontend")
|
|
288
|
+
"""
|
|
289
|
+
work_dir = cwd
|
|
290
|
+
if work_dir and _workspace_root and not os.path.isabs(work_dir):
|
|
291
|
+
work_dir = os.path.join(_workspace_root, work_dir)
|
|
292
|
+
elif not work_dir and _workspace_root:
|
|
293
|
+
work_dir = _workspace_root
|
|
294
|
+
|
|
295
|
+
result = _execute_command(
|
|
296
|
+
command=command,
|
|
297
|
+
cwd=work_dir,
|
|
298
|
+
timeout=120,
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
output_parts = []
|
|
302
|
+
|
|
303
|
+
if result['stdout']:
|
|
304
|
+
output_parts.append(f"stdout:\n{result['stdout']}")
|
|
305
|
+
|
|
306
|
+
if result['stderr']:
|
|
307
|
+
output_parts.append(f"stderr:\n{result['stderr']}")
|
|
308
|
+
|
|
309
|
+
if result['success']:
|
|
310
|
+
status = f"Command completed successfully (exit code: {result['exit_code']})"
|
|
311
|
+
else:
|
|
312
|
+
if result.get('error'):
|
|
313
|
+
status = f"Command failed: {result['error']}"
|
|
314
|
+
else:
|
|
315
|
+
status = f"Command failed (exit code: {result['exit_code']})"
|
|
316
|
+
|
|
317
|
+
output_parts.insert(0, status)
|
|
318
|
+
|
|
319
|
+
return '\n\n'.join(output_parts)
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
# Export all agent tools
|
|
323
|
+
CODE_TOOLS = [
|
|
324
|
+
code_read_file,
|
|
325
|
+
code_write_file,
|
|
326
|
+
code_list_files,
|
|
327
|
+
code_apply_diff,
|
|
328
|
+
code_search_replace,
|
|
329
|
+
code_execute_command,
|
|
330
|
+
]
|
|
331
|
+
|
|
332
|
+
__all__ = [
|
|
333
|
+
'set_workspace',
|
|
334
|
+
'get_workspace',
|
|
335
|
+
'code_read_file',
|
|
336
|
+
'code_write_file',
|
|
337
|
+
'code_list_files',
|
|
338
|
+
'code_apply_diff',
|
|
339
|
+
'code_search_replace',
|
|
340
|
+
'code_execute_command',
|
|
341
|
+
'CODE_TOOLS',
|
|
342
|
+
'create_diff_block',
|
|
343
|
+
'create_multi_diff',
|
|
344
|
+
]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Diff handling for PraisonAI Code module.
|
|
3
|
+
|
|
4
|
+
Provides SEARCH/REPLACE diff parsing and application with fuzzy matching.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .diff_strategy import (
|
|
8
|
+
DiffResult,
|
|
9
|
+
DiffBlock,
|
|
10
|
+
apply_search_replace_diff,
|
|
11
|
+
parse_diff_blocks,
|
|
12
|
+
validate_diff_format,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"DiffResult",
|
|
17
|
+
"DiffBlock",
|
|
18
|
+
"apply_search_replace_diff",
|
|
19
|
+
"parse_diff_blocks",
|
|
20
|
+
"validate_diff_format",
|
|
21
|
+
]
|