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,338 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Checkpoints CLI Feature for PraisonAI.
|
|
3
|
+
|
|
4
|
+
Provides CLI commands for managing file-level checkpoints.
|
|
5
|
+
|
|
6
|
+
Commands:
|
|
7
|
+
- praisonai checkpoint save <message> # Save a checkpoint
|
|
8
|
+
- praisonai checkpoint restore <id> # Restore to a checkpoint
|
|
9
|
+
- praisonai checkpoint list # List all checkpoints
|
|
10
|
+
- praisonai checkpoint diff [from] [to] # Show diff between checkpoints
|
|
11
|
+
- praisonai checkpoint delete # Delete all checkpoints
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import os
|
|
15
|
+
import asyncio
|
|
16
|
+
from typing import Optional, List
|
|
17
|
+
from dataclasses import dataclass
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class CheckpointsHandler:
|
|
21
|
+
"""
|
|
22
|
+
Handler for checkpoints CLI commands.
|
|
23
|
+
|
|
24
|
+
Provides functionality to:
|
|
25
|
+
- Save checkpoints before file modifications
|
|
26
|
+
- Restore workspace to previous checkpoints
|
|
27
|
+
- View diffs between checkpoints
|
|
28
|
+
- List and manage checkpoints
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(self, workspace_dir: Optional[str] = None, verbose: bool = False):
|
|
32
|
+
self.workspace_dir = workspace_dir or os.getcwd()
|
|
33
|
+
self.verbose = verbose
|
|
34
|
+
self._service = None
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def feature_name(self) -> str:
|
|
38
|
+
return "checkpoints"
|
|
39
|
+
|
|
40
|
+
async def _get_service(self):
|
|
41
|
+
"""Lazy load the checkpoint service."""
|
|
42
|
+
if self._service is None:
|
|
43
|
+
from praisonaiagents.checkpoints import CheckpointService
|
|
44
|
+
self._service = CheckpointService(
|
|
45
|
+
workspace_dir=self.workspace_dir
|
|
46
|
+
)
|
|
47
|
+
await self._service.initialize()
|
|
48
|
+
return self._service
|
|
49
|
+
|
|
50
|
+
async def save(self, message: str, allow_empty: bool = False) -> bool:
|
|
51
|
+
"""
|
|
52
|
+
Save a checkpoint.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
message: Checkpoint message
|
|
56
|
+
allow_empty: Allow checkpoint even if no changes
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
True if successful
|
|
60
|
+
"""
|
|
61
|
+
service = await self._get_service()
|
|
62
|
+
result = await service.save(message, allow_empty=allow_empty)
|
|
63
|
+
|
|
64
|
+
if result.success:
|
|
65
|
+
self._print_success(f"Checkpoint saved: {result.checkpoint.short_id}")
|
|
66
|
+
self._print_info(f"Message: {result.checkpoint.message}")
|
|
67
|
+
return True
|
|
68
|
+
else:
|
|
69
|
+
self._print_error(f"Failed to save checkpoint: {result.error}")
|
|
70
|
+
return False
|
|
71
|
+
|
|
72
|
+
async def restore(self, checkpoint_id: str) -> bool:
|
|
73
|
+
"""
|
|
74
|
+
Restore to a checkpoint.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
checkpoint_id: Checkpoint ID to restore
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
True if successful
|
|
81
|
+
"""
|
|
82
|
+
service = await self._get_service()
|
|
83
|
+
result = await service.restore(checkpoint_id)
|
|
84
|
+
|
|
85
|
+
if result.success:
|
|
86
|
+
self._print_success(f"Restored to checkpoint: {result.checkpoint.short_id}")
|
|
87
|
+
return True
|
|
88
|
+
else:
|
|
89
|
+
self._print_error(f"Failed to restore: {result.error}")
|
|
90
|
+
return False
|
|
91
|
+
|
|
92
|
+
async def list_checkpoints(self, limit: int = 20) -> List[dict]:
|
|
93
|
+
"""
|
|
94
|
+
List all checkpoints.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
limit: Maximum number to show
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
List of checkpoint dictionaries
|
|
101
|
+
"""
|
|
102
|
+
service = await self._get_service()
|
|
103
|
+
checkpoints = await service.list_checkpoints(limit=limit)
|
|
104
|
+
|
|
105
|
+
if not checkpoints:
|
|
106
|
+
self._print_info("No checkpoints found")
|
|
107
|
+
return []
|
|
108
|
+
|
|
109
|
+
self._print_checkpoints_table(checkpoints)
|
|
110
|
+
return [cp.to_dict() for cp in checkpoints]
|
|
111
|
+
|
|
112
|
+
def _print_checkpoints_table(self, checkpoints):
|
|
113
|
+
"""Print checkpoints in table format."""
|
|
114
|
+
try:
|
|
115
|
+
from rich.console import Console
|
|
116
|
+
from rich.table import Table
|
|
117
|
+
|
|
118
|
+
console = Console()
|
|
119
|
+
table = Table(title="Checkpoints")
|
|
120
|
+
table.add_column("ID", style="cyan")
|
|
121
|
+
table.add_column("Message", style="green")
|
|
122
|
+
table.add_column("Timestamp", style="yellow")
|
|
123
|
+
|
|
124
|
+
for cp in checkpoints:
|
|
125
|
+
table.add_row(
|
|
126
|
+
cp.short_id,
|
|
127
|
+
cp.message[:50] + "..." if len(cp.message) > 50 else cp.message,
|
|
128
|
+
cp.timestamp.strftime("%Y-%m-%d %H:%M:%S")
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
console.print(table)
|
|
132
|
+
except ImportError:
|
|
133
|
+
print("Checkpoints:")
|
|
134
|
+
for cp in checkpoints:
|
|
135
|
+
print(f" {cp.short_id} - {cp.message} ({cp.timestamp})")
|
|
136
|
+
|
|
137
|
+
async def diff(
|
|
138
|
+
self,
|
|
139
|
+
from_id: Optional[str] = None,
|
|
140
|
+
to_id: Optional[str] = None
|
|
141
|
+
) -> dict:
|
|
142
|
+
"""
|
|
143
|
+
Show diff between checkpoints.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
from_id: Starting checkpoint (default: previous)
|
|
147
|
+
to_id: Ending checkpoint (default: current)
|
|
148
|
+
|
|
149
|
+
Returns:
|
|
150
|
+
Diff dictionary
|
|
151
|
+
"""
|
|
152
|
+
service = await self._get_service()
|
|
153
|
+
diff = await service.diff(from_id, to_id)
|
|
154
|
+
|
|
155
|
+
self._print_diff(diff)
|
|
156
|
+
return diff.to_dict()
|
|
157
|
+
|
|
158
|
+
def _print_diff(self, diff):
|
|
159
|
+
"""Print diff in a readable format."""
|
|
160
|
+
try:
|
|
161
|
+
from rich.console import Console
|
|
162
|
+
from rich.table import Table
|
|
163
|
+
|
|
164
|
+
console = Console()
|
|
165
|
+
|
|
166
|
+
if not diff.files:
|
|
167
|
+
console.print("[yellow]No changes[/yellow]")
|
|
168
|
+
return
|
|
169
|
+
|
|
170
|
+
console.print(f"\n[bold]Changes from {diff.from_checkpoint} to {diff.to_checkpoint or 'working directory'}[/bold]\n")
|
|
171
|
+
|
|
172
|
+
table = Table()
|
|
173
|
+
table.add_column("Status", style="cyan")
|
|
174
|
+
table.add_column("File", style="white")
|
|
175
|
+
table.add_column("+", style="green")
|
|
176
|
+
table.add_column("-", style="red")
|
|
177
|
+
|
|
178
|
+
for f in diff.files:
|
|
179
|
+
status_color = {
|
|
180
|
+
"added": "green",
|
|
181
|
+
"modified": "yellow",
|
|
182
|
+
"deleted": "red"
|
|
183
|
+
}.get(f.status, "white")
|
|
184
|
+
|
|
185
|
+
table.add_row(
|
|
186
|
+
f"[{status_color}]{f.status}[/{status_color}]",
|
|
187
|
+
f.path,
|
|
188
|
+
str(f.additions),
|
|
189
|
+
str(f.deletions)
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
console.print(table)
|
|
193
|
+
console.print(f"\n[green]+{diff.total_additions}[/green] [red]-{diff.total_deletions}[/red]")
|
|
194
|
+
except ImportError:
|
|
195
|
+
print(f"Changes from {diff.from_checkpoint} to {diff.to_checkpoint or 'working directory'}:")
|
|
196
|
+
for f in diff.files:
|
|
197
|
+
print(f" {f.status}: {f.path} (+{f.additions}/-{f.deletions})")
|
|
198
|
+
|
|
199
|
+
async def delete_all(self) -> bool:
|
|
200
|
+
"""
|
|
201
|
+
Delete all checkpoints.
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
True if successful
|
|
205
|
+
"""
|
|
206
|
+
service = await self._get_service()
|
|
207
|
+
result = await service.delete_all()
|
|
208
|
+
|
|
209
|
+
if result:
|
|
210
|
+
self._print_success("All checkpoints deleted")
|
|
211
|
+
return True
|
|
212
|
+
else:
|
|
213
|
+
self._print_error("Failed to delete checkpoints")
|
|
214
|
+
return False
|
|
215
|
+
|
|
216
|
+
def _print_success(self, message: str):
|
|
217
|
+
"""Print success message."""
|
|
218
|
+
try:
|
|
219
|
+
from rich.console import Console
|
|
220
|
+
Console().print(f"[green]✓[/green] {message}")
|
|
221
|
+
except ImportError:
|
|
222
|
+
print(f"✓ {message}")
|
|
223
|
+
|
|
224
|
+
def _print_error(self, message: str):
|
|
225
|
+
"""Print error message."""
|
|
226
|
+
try:
|
|
227
|
+
from rich.console import Console
|
|
228
|
+
Console().print(f"[red]✗[/red] {message}")
|
|
229
|
+
except ImportError:
|
|
230
|
+
print(f"✗ {message}")
|
|
231
|
+
|
|
232
|
+
def _print_info(self, message: str):
|
|
233
|
+
"""Print info message."""
|
|
234
|
+
try:
|
|
235
|
+
from rich.console import Console
|
|
236
|
+
Console().print(f"[dim]{message}[/dim]")
|
|
237
|
+
except ImportError:
|
|
238
|
+
print(message)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def handle_checkpoint_command(args: List[str], workspace_dir: Optional[str] = None, verbose: bool = False):
|
|
242
|
+
"""
|
|
243
|
+
Handle checkpoint CLI commands.
|
|
244
|
+
|
|
245
|
+
Usage:
|
|
246
|
+
praisonai checkpoint save <message> # Save a checkpoint
|
|
247
|
+
praisonai checkpoint restore <id> # Restore to a checkpoint
|
|
248
|
+
praisonai checkpoint list [--limit N] # List checkpoints
|
|
249
|
+
praisonai checkpoint diff [from] [to] # Show diff
|
|
250
|
+
praisonai checkpoint delete # Delete all checkpoints
|
|
251
|
+
"""
|
|
252
|
+
handler = CheckpointsHandler(workspace_dir=workspace_dir, verbose=verbose)
|
|
253
|
+
|
|
254
|
+
if not args:
|
|
255
|
+
print("Usage: praisonai checkpoint <command> [options]")
|
|
256
|
+
print("\nCommands:")
|
|
257
|
+
print(" save <message> Save a checkpoint with message")
|
|
258
|
+
print(" restore <id> Restore to a checkpoint")
|
|
259
|
+
print(" list [--limit N] List checkpoints (default: 20)")
|
|
260
|
+
print(" diff [from] [to] Show diff between checkpoints")
|
|
261
|
+
print(" delete Delete all checkpoints")
|
|
262
|
+
return
|
|
263
|
+
|
|
264
|
+
command = args[0]
|
|
265
|
+
|
|
266
|
+
if command == "save":
|
|
267
|
+
if len(args) < 2:
|
|
268
|
+
print("Usage: praisonai checkpoint save <message>")
|
|
269
|
+
return
|
|
270
|
+
|
|
271
|
+
message = " ".join(args[1:])
|
|
272
|
+
allow_empty = "--allow-empty" in args
|
|
273
|
+
if allow_empty:
|
|
274
|
+
message = message.replace("--allow-empty", "").strip()
|
|
275
|
+
|
|
276
|
+
asyncio.run(handler.save(message, allow_empty=allow_empty))
|
|
277
|
+
|
|
278
|
+
elif command == "restore":
|
|
279
|
+
if len(args) < 2:
|
|
280
|
+
print("Usage: praisonai checkpoint restore <checkpoint_id>")
|
|
281
|
+
return
|
|
282
|
+
|
|
283
|
+
asyncio.run(handler.restore(args[1]))
|
|
284
|
+
|
|
285
|
+
elif command == "list":
|
|
286
|
+
limit = 20
|
|
287
|
+
if "--limit" in args:
|
|
288
|
+
idx = args.index("--limit")
|
|
289
|
+
if idx + 1 < len(args):
|
|
290
|
+
try:
|
|
291
|
+
limit = int(args[idx + 1])
|
|
292
|
+
except ValueError:
|
|
293
|
+
pass
|
|
294
|
+
|
|
295
|
+
asyncio.run(handler.list_checkpoints(limit=limit))
|
|
296
|
+
|
|
297
|
+
elif command == "diff":
|
|
298
|
+
from_id = args[1] if len(args) > 1 else None
|
|
299
|
+
to_id = args[2] if len(args) > 2 else None
|
|
300
|
+
|
|
301
|
+
asyncio.run(handler.diff(from_id, to_id))
|
|
302
|
+
|
|
303
|
+
elif command == "delete":
|
|
304
|
+
# Confirm deletion
|
|
305
|
+
try:
|
|
306
|
+
from rich.console import Console
|
|
307
|
+
from rich.prompt import Confirm
|
|
308
|
+
|
|
309
|
+
console = Console()
|
|
310
|
+
if Confirm.ask("[yellow]Delete all checkpoints?[/yellow]"):
|
|
311
|
+
asyncio.run(handler.delete_all())
|
|
312
|
+
else:
|
|
313
|
+
console.print("[dim]Cancelled[/dim]")
|
|
314
|
+
except ImportError:
|
|
315
|
+
response = input("Delete all checkpoints? [y/N] ")
|
|
316
|
+
if response.lower() == 'y':
|
|
317
|
+
asyncio.run(handler.delete_all())
|
|
318
|
+
else:
|
|
319
|
+
print("Cancelled")
|
|
320
|
+
|
|
321
|
+
elif command == "help" or command == "--help":
|
|
322
|
+
print("Checkpoint CLI Commands:")
|
|
323
|
+
print("\n praisonai checkpoint save <message>")
|
|
324
|
+
print(" Save a checkpoint with the given message")
|
|
325
|
+
print(" Options: --allow-empty Allow checkpoint with no changes")
|
|
326
|
+
print("\n praisonai checkpoint restore <id>")
|
|
327
|
+
print(" Restore workspace to a specific checkpoint")
|
|
328
|
+
print("\n praisonai checkpoint list [--limit N]")
|
|
329
|
+
print(" List all checkpoints (default limit: 20)")
|
|
330
|
+
print("\n praisonai checkpoint diff [from_id] [to_id]")
|
|
331
|
+
print(" Show diff between checkpoints")
|
|
332
|
+
print(" If no IDs given, shows diff from last checkpoint to current")
|
|
333
|
+
print("\n praisonai checkpoint delete")
|
|
334
|
+
print(" Delete all checkpoints for this workspace")
|
|
335
|
+
|
|
336
|
+
else:
|
|
337
|
+
print(f"Unknown command: {command}")
|
|
338
|
+
print("Use 'praisonai checkpoint help' for available commands")
|