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,54 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Simple CLI entry point for praisonai schedule command.
|
|
3
|
+
|
|
4
|
+
This provides a standalone entry point that can be called from main.py
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
from praisonai.cli.features.agent_scheduler import AgentSchedulerHandler
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def main():
|
|
12
|
+
"""Main entry point for schedule CLI command."""
|
|
13
|
+
import argparse
|
|
14
|
+
|
|
15
|
+
parser = argparse.ArgumentParser(
|
|
16
|
+
description='Schedule an agent to run continuously at regular intervals'
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
parser.add_argument(
|
|
20
|
+
'schedule_yaml',
|
|
21
|
+
nargs='?',
|
|
22
|
+
default='agents.yaml',
|
|
23
|
+
help='Path to agents.yaml file (default: agents.yaml)'
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
parser.add_argument(
|
|
27
|
+
'--interval',
|
|
28
|
+
dest='schedule_interval',
|
|
29
|
+
type=str,
|
|
30
|
+
help='Override schedule interval (e.g., "hourly", "*/30m", "daily")'
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
parser.add_argument(
|
|
34
|
+
'--max-retries',
|
|
35
|
+
dest='schedule_max_retries',
|
|
36
|
+
type=int,
|
|
37
|
+
help='Override maximum retry attempts (default: from YAML or 3)'
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
parser.add_argument(
|
|
41
|
+
'--verbose', '-v',
|
|
42
|
+
action='store_true',
|
|
43
|
+
help='Enable verbose logging'
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
args = parser.parse_args()
|
|
47
|
+
|
|
48
|
+
# Call the handler
|
|
49
|
+
exit_code = AgentSchedulerHandler.handle_schedule_command(args)
|
|
50
|
+
sys.exit(exit_code)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
if __name__ == '__main__':
|
|
54
|
+
main()
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""
|
|
2
|
+
PraisonAI CLI State Module.
|
|
3
|
+
|
|
4
|
+
Provides state management for run IDs, trace IDs, agent IDs, and sessions.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .identifiers import (
|
|
8
|
+
generate_run_id,
|
|
9
|
+
generate_trace_id,
|
|
10
|
+
generate_agent_id,
|
|
11
|
+
RunContext,
|
|
12
|
+
get_current_context,
|
|
13
|
+
set_current_context,
|
|
14
|
+
)
|
|
15
|
+
from .sessions import (
|
|
16
|
+
SessionManager,
|
|
17
|
+
SessionMetadata,
|
|
18
|
+
get_session_manager,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
'generate_run_id',
|
|
23
|
+
'generate_trace_id',
|
|
24
|
+
'generate_agent_id',
|
|
25
|
+
'RunContext',
|
|
26
|
+
'get_current_context',
|
|
27
|
+
'set_current_context',
|
|
28
|
+
'SessionManager',
|
|
29
|
+
'SessionMetadata',
|
|
30
|
+
'get_session_manager',
|
|
31
|
+
]
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Identifier generation for PraisonAI CLI.
|
|
3
|
+
|
|
4
|
+
Provides stable, unique identifiers for runs, traces, and agents.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import hashlib
|
|
8
|
+
import os
|
|
9
|
+
import secrets
|
|
10
|
+
import threading
|
|
11
|
+
from dataclasses import dataclass, field
|
|
12
|
+
from datetime import datetime
|
|
13
|
+
from typing import Dict, Optional
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def generate_run_id() -> str:
|
|
17
|
+
"""
|
|
18
|
+
Generate a unique run ID.
|
|
19
|
+
|
|
20
|
+
Format: run_YYYYMMDD_HHMMSS_<random>
|
|
21
|
+
Example: run_20241231_143022_a1b2c3
|
|
22
|
+
"""
|
|
23
|
+
timestamp = datetime.utcnow().strftime("%Y%m%d_%H%M%S")
|
|
24
|
+
random_suffix = secrets.token_hex(3) # 6 characters
|
|
25
|
+
return f"run_{timestamp}_{random_suffix}"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def generate_trace_id() -> str:
|
|
29
|
+
"""
|
|
30
|
+
Generate a unique trace ID.
|
|
31
|
+
|
|
32
|
+
Format: trace_<random>
|
|
33
|
+
Example: trace_a1b2c3d4e5f6
|
|
34
|
+
"""
|
|
35
|
+
return f"trace_{secrets.token_hex(6)}"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def generate_agent_id(agent_name: str, run_id: str, index: int = 0) -> str:
|
|
39
|
+
"""
|
|
40
|
+
Generate a deterministic agent ID.
|
|
41
|
+
|
|
42
|
+
The ID is deterministic based on agent name, run ID, and index,
|
|
43
|
+
ensuring consistent IDs across the same run.
|
|
44
|
+
|
|
45
|
+
Format: agent_<hash>_<index>
|
|
46
|
+
Example: agent_a1b2c3_001
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
agent_name: Name of the agent
|
|
50
|
+
run_id: Current run ID
|
|
51
|
+
index: Agent index within the run
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
Deterministic agent ID
|
|
55
|
+
"""
|
|
56
|
+
# Create deterministic hash from agent name and run ID
|
|
57
|
+
hash_input = f"{agent_name}:{run_id}:{index}"
|
|
58
|
+
hash_value = hashlib.sha256(hash_input.encode()).hexdigest()[:6]
|
|
59
|
+
return f"agent_{hash_value}_{index:03d}"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@dataclass
|
|
63
|
+
class RunContext:
|
|
64
|
+
"""
|
|
65
|
+
Context for a single run.
|
|
66
|
+
|
|
67
|
+
Holds all identifiers and metadata for the current execution.
|
|
68
|
+
"""
|
|
69
|
+
run_id: str = field(default_factory=generate_run_id)
|
|
70
|
+
trace_id: str = field(default_factory=generate_trace_id)
|
|
71
|
+
start_time: datetime = field(default_factory=datetime.utcnow)
|
|
72
|
+
|
|
73
|
+
# Agent tracking
|
|
74
|
+
agents: Dict[str, str] = field(default_factory=dict) # name -> agent_id
|
|
75
|
+
_agent_counter: int = field(default=0, repr=False)
|
|
76
|
+
|
|
77
|
+
# Metadata
|
|
78
|
+
config_summary: Dict[str, str] = field(default_factory=dict)
|
|
79
|
+
workspace: Optional[str] = None
|
|
80
|
+
|
|
81
|
+
def get_agent_id(self, agent_name: str) -> str:
|
|
82
|
+
"""
|
|
83
|
+
Get or create an agent ID for the given agent name.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
agent_name: Name of the agent
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
Agent ID (creates new one if not exists)
|
|
90
|
+
"""
|
|
91
|
+
if agent_name not in self.agents:
|
|
92
|
+
agent_id = generate_agent_id(agent_name, self.run_id, self._agent_counter)
|
|
93
|
+
self.agents[agent_name] = agent_id
|
|
94
|
+
self._agent_counter += 1
|
|
95
|
+
return self.agents[agent_name]
|
|
96
|
+
|
|
97
|
+
def to_dict(self) -> Dict:
|
|
98
|
+
"""Convert to dictionary for serialization."""
|
|
99
|
+
return {
|
|
100
|
+
"run_id": self.run_id,
|
|
101
|
+
"trace_id": self.trace_id,
|
|
102
|
+
"start_time": self.start_time.isoformat(),
|
|
103
|
+
"agents": self.agents.copy(),
|
|
104
|
+
"config_summary": self.config_summary.copy(),
|
|
105
|
+
"workspace": self.workspace,
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
@classmethod
|
|
109
|
+
def from_dict(cls, data: Dict) -> "RunContext":
|
|
110
|
+
"""Create from dictionary."""
|
|
111
|
+
ctx = cls(
|
|
112
|
+
run_id=data.get("run_id", generate_run_id()),
|
|
113
|
+
trace_id=data.get("trace_id", generate_trace_id()),
|
|
114
|
+
workspace=data.get("workspace"),
|
|
115
|
+
)
|
|
116
|
+
ctx.agents = data.get("agents", {})
|
|
117
|
+
ctx.config_summary = data.get("config_summary", {})
|
|
118
|
+
ctx._agent_counter = len(ctx.agents)
|
|
119
|
+
|
|
120
|
+
start_time = data.get("start_time")
|
|
121
|
+
if start_time:
|
|
122
|
+
try:
|
|
123
|
+
ctx.start_time = datetime.fromisoformat(start_time)
|
|
124
|
+
except (ValueError, TypeError):
|
|
125
|
+
pass
|
|
126
|
+
|
|
127
|
+
return ctx
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
# Thread-local storage for current context
|
|
131
|
+
_context_local = threading.local()
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def get_current_context() -> Optional[RunContext]:
|
|
135
|
+
"""Get the current run context for this thread."""
|
|
136
|
+
return getattr(_context_local, "context", None)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def set_current_context(context: Optional[RunContext]) -> None:
|
|
140
|
+
"""Set the current run context for this thread."""
|
|
141
|
+
_context_local.context = context
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def create_context(workspace: Optional[str] = None) -> RunContext:
|
|
145
|
+
"""
|
|
146
|
+
Create a new run context and set it as current.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
workspace: Optional workspace path
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
New RunContext instance
|
|
153
|
+
"""
|
|
154
|
+
context = RunContext(workspace=workspace or os.getcwd())
|
|
155
|
+
set_current_context(context)
|
|
156
|
+
return context
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def clear_context() -> None:
|
|
160
|
+
"""Clear the current run context."""
|
|
161
|
+
set_current_context(None)
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Session management for PraisonAI CLI.
|
|
3
|
+
|
|
4
|
+
Provides persistence and resume functionality for sessions.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import os
|
|
9
|
+
import shutil
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any, Dict, List, Optional
|
|
14
|
+
|
|
15
|
+
from ..configuration.paths import get_sessions_dir, ensure_config_dirs
|
|
16
|
+
from .identifiers import RunContext
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class SessionMetadata:
|
|
21
|
+
"""Metadata for a session."""
|
|
22
|
+
session_id: str
|
|
23
|
+
run_id: str
|
|
24
|
+
trace_id: str
|
|
25
|
+
created_at: datetime
|
|
26
|
+
updated_at: datetime
|
|
27
|
+
name: Optional[str] = None
|
|
28
|
+
workspace: Optional[str] = None
|
|
29
|
+
config_summary: Dict[str, Any] = field(default_factory=dict)
|
|
30
|
+
event_count: int = 0
|
|
31
|
+
status: str = "active" # active, completed, error
|
|
32
|
+
|
|
33
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
34
|
+
"""Convert to dictionary."""
|
|
35
|
+
return {
|
|
36
|
+
"session_id": self.session_id,
|
|
37
|
+
"run_id": self.run_id,
|
|
38
|
+
"trace_id": self.trace_id,
|
|
39
|
+
"created_at": self.created_at.isoformat(),
|
|
40
|
+
"updated_at": self.updated_at.isoformat(),
|
|
41
|
+
"name": self.name,
|
|
42
|
+
"workspace": self.workspace,
|
|
43
|
+
"config_summary": self.config_summary,
|
|
44
|
+
"event_count": self.event_count,
|
|
45
|
+
"status": self.status,
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@classmethod
|
|
49
|
+
def from_dict(cls, data: Dict[str, Any]) -> "SessionMetadata":
|
|
50
|
+
"""Create from dictionary."""
|
|
51
|
+
return cls(
|
|
52
|
+
session_id=data["session_id"],
|
|
53
|
+
run_id=data["run_id"],
|
|
54
|
+
trace_id=data["trace_id"],
|
|
55
|
+
created_at=datetime.fromisoformat(data["created_at"]),
|
|
56
|
+
updated_at=datetime.fromisoformat(data["updated_at"]),
|
|
57
|
+
name=data.get("name"),
|
|
58
|
+
workspace=data.get("workspace"),
|
|
59
|
+
config_summary=data.get("config_summary", {}),
|
|
60
|
+
event_count=data.get("event_count", 0),
|
|
61
|
+
status=data.get("status", "active"),
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class SessionManager:
|
|
66
|
+
"""
|
|
67
|
+
Manages session persistence and retrieval.
|
|
68
|
+
|
|
69
|
+
Sessions are stored in ~/.praison/sessions/<session_id>/
|
|
70
|
+
Each session contains:
|
|
71
|
+
- metadata.json: Session metadata
|
|
72
|
+
- events.jsonl: Stream of events (NDJSON)
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
def __init__(self, sessions_dir: Optional[Path] = None):
|
|
76
|
+
self.sessions_dir = sessions_dir or get_sessions_dir()
|
|
77
|
+
ensure_config_dirs()
|
|
78
|
+
|
|
79
|
+
def _get_session_dir(self, session_id: str) -> Path:
|
|
80
|
+
"""Get the directory for a session."""
|
|
81
|
+
return self.sessions_dir / session_id
|
|
82
|
+
|
|
83
|
+
def _get_metadata_path(self, session_id: str) -> Path:
|
|
84
|
+
"""Get the metadata file path for a session."""
|
|
85
|
+
return self._get_session_dir(session_id) / "metadata.json"
|
|
86
|
+
|
|
87
|
+
def _get_events_path(self, session_id: str) -> Path:
|
|
88
|
+
"""Get the events file path for a session."""
|
|
89
|
+
return self._get_session_dir(session_id) / "events.jsonl"
|
|
90
|
+
|
|
91
|
+
def create(self, context: RunContext, name: Optional[str] = None) -> SessionMetadata:
|
|
92
|
+
"""
|
|
93
|
+
Create a new session from a run context.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
context: Run context to create session from
|
|
97
|
+
name: Optional session name
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
Session metadata
|
|
101
|
+
"""
|
|
102
|
+
session_id = context.run_id # Use run_id as session_id
|
|
103
|
+
session_dir = self._get_session_dir(session_id)
|
|
104
|
+
session_dir.mkdir(parents=True, exist_ok=True)
|
|
105
|
+
|
|
106
|
+
now = datetime.utcnow()
|
|
107
|
+
metadata = SessionMetadata(
|
|
108
|
+
session_id=session_id,
|
|
109
|
+
run_id=context.run_id,
|
|
110
|
+
trace_id=context.trace_id,
|
|
111
|
+
created_at=now,
|
|
112
|
+
updated_at=now,
|
|
113
|
+
name=name,
|
|
114
|
+
workspace=context.workspace,
|
|
115
|
+
config_summary=context.config_summary,
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
# Save metadata
|
|
119
|
+
self._save_metadata(metadata)
|
|
120
|
+
|
|
121
|
+
# Create empty events file
|
|
122
|
+
self._get_events_path(session_id).touch()
|
|
123
|
+
|
|
124
|
+
return metadata
|
|
125
|
+
|
|
126
|
+
def _save_metadata(self, metadata: SessionMetadata) -> None:
|
|
127
|
+
"""Save session metadata."""
|
|
128
|
+
path = self._get_metadata_path(metadata.session_id)
|
|
129
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
130
|
+
with open(path, "w", encoding="utf-8") as f:
|
|
131
|
+
json.dump(metadata.to_dict(), f, indent=2)
|
|
132
|
+
|
|
133
|
+
def _load_metadata(self, session_id: str) -> Optional[SessionMetadata]:
|
|
134
|
+
"""Load session metadata."""
|
|
135
|
+
path = self._get_metadata_path(session_id)
|
|
136
|
+
if not path.exists():
|
|
137
|
+
return None
|
|
138
|
+
try:
|
|
139
|
+
with open(path, "r", encoding="utf-8") as f:
|
|
140
|
+
data = json.load(f)
|
|
141
|
+
return SessionMetadata.from_dict(data)
|
|
142
|
+
except (json.JSONDecodeError, KeyError):
|
|
143
|
+
return None
|
|
144
|
+
|
|
145
|
+
def append_event(self, session_id: str, event: Dict[str, Any]) -> None:
|
|
146
|
+
"""
|
|
147
|
+
Append an event to a session.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
session_id: Session ID
|
|
151
|
+
event: Event data to append
|
|
152
|
+
"""
|
|
153
|
+
events_path = self._get_events_path(session_id)
|
|
154
|
+
if not events_path.parent.exists():
|
|
155
|
+
return
|
|
156
|
+
|
|
157
|
+
with open(events_path, "a", encoding="utf-8") as f:
|
|
158
|
+
f.write(json.dumps(event, default=str) + "\n")
|
|
159
|
+
|
|
160
|
+
# Update metadata
|
|
161
|
+
metadata = self._load_metadata(session_id)
|
|
162
|
+
if metadata:
|
|
163
|
+
metadata.event_count += 1
|
|
164
|
+
metadata.updated_at = datetime.utcnow()
|
|
165
|
+
self._save_metadata(metadata)
|
|
166
|
+
|
|
167
|
+
def get(self, session_id: str) -> Optional[SessionMetadata]:
|
|
168
|
+
"""Get session metadata by ID."""
|
|
169
|
+
return self._load_metadata(session_id)
|
|
170
|
+
|
|
171
|
+
def list(self, limit: int = 50) -> List[SessionMetadata]:
|
|
172
|
+
"""
|
|
173
|
+
List all sessions, sorted by updated_at descending.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
limit: Maximum number of sessions to return
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
List of session metadata
|
|
180
|
+
"""
|
|
181
|
+
sessions = []
|
|
182
|
+
|
|
183
|
+
if not self.sessions_dir.exists():
|
|
184
|
+
return sessions
|
|
185
|
+
|
|
186
|
+
for session_dir in self.sessions_dir.iterdir():
|
|
187
|
+
if session_dir.is_dir():
|
|
188
|
+
metadata = self._load_metadata(session_dir.name)
|
|
189
|
+
if metadata:
|
|
190
|
+
sessions.append(metadata)
|
|
191
|
+
|
|
192
|
+
# Sort by updated_at descending
|
|
193
|
+
sessions.sort(key=lambda s: s.updated_at, reverse=True)
|
|
194
|
+
|
|
195
|
+
return sessions[:limit]
|
|
196
|
+
|
|
197
|
+
def delete(self, session_id: str) -> bool:
|
|
198
|
+
"""
|
|
199
|
+
Delete a session.
|
|
200
|
+
|
|
201
|
+
Args:
|
|
202
|
+
session_id: Session ID to delete
|
|
203
|
+
|
|
204
|
+
Returns:
|
|
205
|
+
True if deleted, False if not found
|
|
206
|
+
"""
|
|
207
|
+
session_dir = self._get_session_dir(session_id)
|
|
208
|
+
if not session_dir.exists():
|
|
209
|
+
return False
|
|
210
|
+
|
|
211
|
+
shutil.rmtree(session_dir)
|
|
212
|
+
return True
|
|
213
|
+
|
|
214
|
+
def get_events(self, session_id: str) -> List[Dict[str, Any]]:
|
|
215
|
+
"""
|
|
216
|
+
Get all events for a session.
|
|
217
|
+
|
|
218
|
+
Args:
|
|
219
|
+
session_id: Session ID
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
List of events
|
|
223
|
+
"""
|
|
224
|
+
events_path = self._get_events_path(session_id)
|
|
225
|
+
if not events_path.exists():
|
|
226
|
+
return []
|
|
227
|
+
|
|
228
|
+
events = []
|
|
229
|
+
with open(events_path, "r", encoding="utf-8") as f:
|
|
230
|
+
for line in f:
|
|
231
|
+
line = line.strip()
|
|
232
|
+
if line:
|
|
233
|
+
try:
|
|
234
|
+
events.append(json.loads(line))
|
|
235
|
+
except json.JSONDecodeError:
|
|
236
|
+
pass
|
|
237
|
+
|
|
238
|
+
return events
|
|
239
|
+
|
|
240
|
+
def export(self, session_id: str, format: str = "md") -> Optional[str]:
|
|
241
|
+
"""
|
|
242
|
+
Export a session to a string.
|
|
243
|
+
|
|
244
|
+
Args:
|
|
245
|
+
session_id: Session ID
|
|
246
|
+
format: Export format ("md" or "json")
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
Exported content or None if not found
|
|
250
|
+
"""
|
|
251
|
+
metadata = self._load_metadata(session_id)
|
|
252
|
+
if not metadata:
|
|
253
|
+
return None
|
|
254
|
+
|
|
255
|
+
events = self.get_events(session_id)
|
|
256
|
+
|
|
257
|
+
if format == "json":
|
|
258
|
+
return json.dumps({
|
|
259
|
+
"metadata": metadata.to_dict(),
|
|
260
|
+
"events": events,
|
|
261
|
+
}, indent=2, default=str)
|
|
262
|
+
|
|
263
|
+
# Markdown format
|
|
264
|
+
lines = [
|
|
265
|
+
f"# Session: {metadata.name or metadata.session_id}",
|
|
266
|
+
"",
|
|
267
|
+
f"- **Run ID**: {metadata.run_id}",
|
|
268
|
+
f"- **Trace ID**: {metadata.trace_id}",
|
|
269
|
+
f"- **Created**: {metadata.created_at.isoformat()}",
|
|
270
|
+
f"- **Status**: {metadata.status}",
|
|
271
|
+
"",
|
|
272
|
+
"## Events",
|
|
273
|
+
"",
|
|
274
|
+
]
|
|
275
|
+
|
|
276
|
+
for event in events:
|
|
277
|
+
event_type = event.get("event", "unknown")
|
|
278
|
+
timestamp = event.get("timestamp", "")
|
|
279
|
+
message = event.get("message", "")
|
|
280
|
+
|
|
281
|
+
lines.append(f"### {event_type} ({timestamp})")
|
|
282
|
+
if message:
|
|
283
|
+
lines.append(f"\n{message}")
|
|
284
|
+
|
|
285
|
+
data = event.get("data", {})
|
|
286
|
+
if data:
|
|
287
|
+
lines.append("\n```json")
|
|
288
|
+
lines.append(json.dumps(data, indent=2, default=str))
|
|
289
|
+
lines.append("```")
|
|
290
|
+
|
|
291
|
+
lines.append("")
|
|
292
|
+
|
|
293
|
+
return "\n".join(lines)
|
|
294
|
+
|
|
295
|
+
def update_status(self, session_id: str, status: str) -> None:
|
|
296
|
+
"""Update session status."""
|
|
297
|
+
metadata = self._load_metadata(session_id)
|
|
298
|
+
if metadata:
|
|
299
|
+
metadata.status = status
|
|
300
|
+
metadata.updated_at = datetime.utcnow()
|
|
301
|
+
self._save_metadata(metadata)
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
# Global session manager
|
|
305
|
+
_session_manager: Optional[SessionManager] = None
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def get_session_manager() -> SessionManager:
|
|
309
|
+
"""Get the global session manager."""
|
|
310
|
+
global _session_manager
|
|
311
|
+
if _session_manager is None:
|
|
312
|
+
_session_manager = SessionManager()
|
|
313
|
+
return _session_manager
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""
|
|
2
|
+
PraisonAI Code - AI-powered code editing tools.
|
|
3
|
+
|
|
4
|
+
This module provides tools for AI agents to read, write, and modify code files
|
|
5
|
+
with precision using search/replace diff strategies similar to Kilo Code.
|
|
6
|
+
|
|
7
|
+
Features:
|
|
8
|
+
- read_file: Read file contents with optional line ranges
|
|
9
|
+
- write_file: Create or overwrite files
|
|
10
|
+
- list_files: List directory contents with filtering
|
|
11
|
+
- apply_diff: Apply SEARCH/REPLACE diffs with fuzzy matching
|
|
12
|
+
- search_replace: Multiple search/replace operations
|
|
13
|
+
- execute_command: Run shell commands safely
|
|
14
|
+
|
|
15
|
+
Example:
|
|
16
|
+
from praisonai.code import read_file, write_file, apply_diff
|
|
17
|
+
|
|
18
|
+
# Read a file
|
|
19
|
+
content = read_file("path/to/file.py")
|
|
20
|
+
|
|
21
|
+
# Write a file
|
|
22
|
+
write_file("path/to/new_file.py", "print('hello')")
|
|
23
|
+
|
|
24
|
+
# Apply a diff
|
|
25
|
+
result = apply_diff("path/to/file.py", diff_content)
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from .tools import (
|
|
29
|
+
read_file,
|
|
30
|
+
write_file,
|
|
31
|
+
list_files,
|
|
32
|
+
apply_diff,
|
|
33
|
+
search_replace,
|
|
34
|
+
execute_command,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
from .diff import (
|
|
38
|
+
DiffResult,
|
|
39
|
+
apply_search_replace_diff,
|
|
40
|
+
parse_diff_blocks,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
from .utils import (
|
|
44
|
+
FileAccessController,
|
|
45
|
+
add_line_numbers,
|
|
46
|
+
strip_line_numbers,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
from .agent_tools import (
|
|
50
|
+
set_workspace,
|
|
51
|
+
get_workspace,
|
|
52
|
+
code_read_file,
|
|
53
|
+
code_write_file,
|
|
54
|
+
code_list_files,
|
|
55
|
+
code_apply_diff,
|
|
56
|
+
code_search_replace,
|
|
57
|
+
code_execute_command,
|
|
58
|
+
CODE_TOOLS,
|
|
59
|
+
create_diff_block,
|
|
60
|
+
create_multi_diff,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
__all__ = [
|
|
64
|
+
# Main tools (low-level)
|
|
65
|
+
"read_file",
|
|
66
|
+
"write_file",
|
|
67
|
+
"list_files",
|
|
68
|
+
"apply_diff",
|
|
69
|
+
"search_replace",
|
|
70
|
+
"execute_command",
|
|
71
|
+
# Agent tools (high-level, string returns)
|
|
72
|
+
"set_workspace",
|
|
73
|
+
"get_workspace",
|
|
74
|
+
"code_read_file",
|
|
75
|
+
"code_write_file",
|
|
76
|
+
"code_list_files",
|
|
77
|
+
"code_apply_diff",
|
|
78
|
+
"code_search_replace",
|
|
79
|
+
"code_execute_command",
|
|
80
|
+
"CODE_TOOLS",
|
|
81
|
+
"create_diff_block",
|
|
82
|
+
"create_multi_diff",
|
|
83
|
+
# Diff utilities
|
|
84
|
+
"DiffResult",
|
|
85
|
+
"apply_search_replace_diff",
|
|
86
|
+
"parse_diff_blocks",
|
|
87
|
+
# Utilities
|
|
88
|
+
"FileAccessController",
|
|
89
|
+
"add_line_numbers",
|
|
90
|
+
"strip_line_numbers",
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
__version__ = "0.1.0"
|