PraisonAI 4.6.161__tar.gz → 4.6.162__tar.gz
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-4.6.161 → praisonai-4.6.162}/PKG-INFO +9 -9
- {praisonai-4.6.161 → praisonai-4.6.162}/PraisonAI.egg-info/PKG-INFO +9 -9
- {praisonai-4.6.161 → praisonai-4.6.162}/PraisonAI.egg-info/requires.txt +8 -8
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/api/agent_invoke.py +52 -14
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/eval.py +0 -81
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/recipe_optimizer.py +7 -127
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/sandbox_cli.py +0 -66
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/interactive/async_tui.py +138 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/interactive_legacy.py +9 -2
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/workflow_commands.py +8 -3
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/db/adapter.py +103 -43
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/base.py +9 -10
- praisonai-4.6.162/praisonai/integration/pages/workflow_runs.py +9 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/observability/hooks.py +44 -19
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/orchestrator.py +48 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/security/injection.py +100 -15
- praisonai-4.6.162/praisonai/version.py +1 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/pyproject.toml +8 -8
- praisonai-4.6.161/praisonai/integration/pages/workflow_runs.py +0 -16
- praisonai-4.6.161/praisonai/version.py +0 -1
- {praisonai-4.6.161 → praisonai-4.6.162}/PraisonAI.egg-info/SOURCES.txt +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/PraisonAI.egg-info/dependency_links.txt +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/PraisonAI.egg-info/entry_points.txt +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/PraisonAI.egg-info/top_level.txt +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/README.md +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/__main__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_api_auth.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_approval_spec.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_async_bridge.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_bootstrap.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/api_md.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/docs_extractor.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/docs_generator.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/generator.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/python_docs_extractor.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/python_extractor.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/rust_docs_extractor.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/rust_extractor.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/topic_normalizer.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/ts_docs_extractor.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/typescript_extractor.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_entrypoint.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_framework_availability.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_lazy_cache.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_logging.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_safe_loader.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/acp/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/acp/config.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/acp/safe_edit.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/acp/server.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/acp/session.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/adapters/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/adapters/readers.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/adapters/rerankers.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/adapters/retrievers.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/adapters/vector_stores.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/agent.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/agent_scheduler.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/agents_generator.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/api/call.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/app/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/app/agentos.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/async_agent_scheduler.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/audit/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/audit/agent_centric.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/auto.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/bots/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/browser/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/a2a.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/assistants.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/audio.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/batches.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/completions.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/container_files.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/containers.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/embeddings.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/files.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/fine_tuning.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/guardrails.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/images.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/mcp.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/messages.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/moderations.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/ocr.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/passthrough.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/rag.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/realtime.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/rerank.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/responses.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/search.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/skills.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/vector_store_files.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/vector_stores.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/videos.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/claw/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/_paths.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/_shim.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/_warnings.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/app.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/approval_backend.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/branding.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/_profiling.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/acp.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/agent.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/agents.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/app.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/attach.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/audit.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/auth.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/batch.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/benchmark.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/bot.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/browser.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/call.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/chat.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/checkpoint.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/claw.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/code.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/command.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/commit.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/completion.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/config.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/context.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/daemon.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/dashboard.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/debug.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/deploy.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/diag.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/docs.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/doctor.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/endpoints.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/environment.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/eval.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/examples.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/flow.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/gateway.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/github.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/hooks.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/identity.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/init.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/kanban.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/knowledge.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/langextract.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/langfuse.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/loop.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/lsp.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/managed.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/mcp.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/memory.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/mint_link.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/models.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/n8n.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/obs.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/onboard.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/package.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/pairing.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/paths.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/permissions.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/plugins.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/port.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/profile.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/publish.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/rag.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/realtime.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/recipe.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/replay.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/research.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/retrieval.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/rules.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/run.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/sandbox.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/schedule.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/serve.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/session.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/setup.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/skills.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/standardise.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/templates.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/test.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/todo.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/tools.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/traces.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/tracker.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/train.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/ui.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/up.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/validate.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/version.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/workflow.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/config_loader.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/configuration/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/configuration/config.schema.json +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/execution/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/fallback_schema.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/acp.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/agent_scheduler.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/agent_tools.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/approval.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/background.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/bots_cli.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/deploy.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/endpoints.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/gateway.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/ollama.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/onboard.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/persistence.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/recipe.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/serve.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/templates.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/tools.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/tui/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/tui/app.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/workflow.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/interactive/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/interactive/core.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/langfuse_client.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/direct_prompt.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/dispatch/argparse_builder.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/framework_run.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/main.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/output/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/schedule_cli.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/schema_provider.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/session/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/state/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/ui/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/unified_schema.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/utils/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli_backends/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/agent_tools.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/diff/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/diff/diff_strategy.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/tools/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/tools/apply_diff.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/tools/execute_command.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/tools/list_files.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/tools/read_file.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/tools/search_replace.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/tools/write_file.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/utils/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/utils/file_utils.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/utils/ignore_utils.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/utils/text_utils.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/config/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/config/agents.schema.json +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/config/schema.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/config/validator.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/_storage_path.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/artifact_store.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/config.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/history_store.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/queue.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/setup.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/terminal_logger.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/daemon/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/db/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/deploy/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/a2u_server.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/discovery.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/a2a.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/a2u.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/agents_api.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/base.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/mcp.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/openai_compat.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/recipe.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/tools_mcp.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/server.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/flow/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/flow/client.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/flow/components/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/flow/converter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/flow/helpers.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/_config_builder.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/autogen_adapter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/crewai_adapter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/praisonai_adapter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/validators.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/workflow_framework.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/gateway/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/inbuilt_tools/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/inc/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/inc/config.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/inc/models.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/bridges/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/bridges/approvals_bridge.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/bridges/hooks_query.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/bridges/kanban_bridge.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/bridges/schedules_runner.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/bridges/usage_bridge.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/bridges/workflows_service.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/context_files.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/gateway_host.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/host_app.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/pages/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/pages/bot_health.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/_cli_loaders.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/_session_info.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/_tool_aliases.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/_unified_registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/backend_registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/base.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/claude_code.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/codex_cli.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/compute/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/compute/daytona.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/compute/docker.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/compute/e2b.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/compute/flyio.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/compute/local.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/compute/modal_compute.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/cursor_cli.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/db_session_adapter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/gemini_cli.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/hosted_agent.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/local_agent.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/managed_agents.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/managed_local.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/sandboxed_agent.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/jobs/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/jobs/executor.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/jobs/models.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/jobs/path_validation.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/jobs/router.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/jobs/server.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/jobs/store.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/kanban/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/llm/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/llm/catalogue.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/llm/config.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/llm/credentials.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/llm/env.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/llm/gateways.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/llm/registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/mcp_server/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/n8n/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/n8n/client.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/n8n/converter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/n8n/preview.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/n8n/reverse_converter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/observability/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/observability/langextract.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/observability/langfuse.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/_valkey_client.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/config.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/_ops.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/_sql_base.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/async_mysql.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/async_postgres.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/async_sqlite.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/base.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/json_store.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/mysql.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/postgres.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/singlestore.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/sqlite.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/supabase.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/surrealdb.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/turso.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/factory.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/hooks/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/hooks/agent_hooks.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/base.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/cassandra.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/chroma.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/clickhouse.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/couchbase.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/lancedb.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/milvus.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/pgvector.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/pinecone.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/qdrant.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/redis_vector.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/weaviate.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/migrations/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/migrations/manager.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/async_mongodb.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/base.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/dynamodb.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/firestore.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/gcs.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/memory.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/mongodb.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/redis.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/upstash.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/valkey.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/tests/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/tests/test_all_backends.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/tests/test_registry_lazy.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/tests/test_valkey_backends.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/profiler.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/push/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/push/client.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/push/transports.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/bridge.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/core.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/exceptions.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/history.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/models.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/operations.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/policy.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/runtime.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/security.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/serve.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/server.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/analyzer.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/applier.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/judge.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/plan.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/player.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/reader.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/storage.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/writer.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/runtime/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/runtime/__main__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/sandbox/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/sandbox/_registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/_base_scheduler.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/_delivery.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/_dispatch.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/agent_scheduler.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/async_agent_scheduler.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/base.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/blueprint_catalogue.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/condition_gate.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/daemon_manager.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/deployment.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/executor.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/run_policy.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/shared.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/state_manager.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/suggestion_engine.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/yaml_loader.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/security/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/security/audit.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/security/protected.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/setup/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/setup/build.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/setup/post_install.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/setup/setup_conda_env.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/setup.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/ai_generator.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/config.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/dedupe.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/discovery.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/drift.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/engine.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/enhanced_templates.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/example_verifier.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/manifest.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/models.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/reports.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/templates.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/undo_redo.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/validator.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/storage/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/storage/dynamodb_adapter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/storage/mongodb_adapter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/storage/postgresql_adapter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/storage/redis_adapter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/storage/valkey_adapter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/batch_source.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/cli_docs_source.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/discovery.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/docs_source.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/examples_source.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/executor.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/models.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/report_viewer.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/reporter.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/runner.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/_tool_sources.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/cache.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/dependency_checker.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/discovery.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/loader.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/resolver.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/security.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/tool_override.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/tools_doctor.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tool_registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tool_resolver.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tools/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tools/audio.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tools/glob_tool.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tools/grep_tool.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tools/kanban_tools.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tools/multiedit.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tools/skill_manage.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/train/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/train.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/train_vision.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui/_aiui_datastore.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui/_external_agents.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui/context.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui/database_config.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_agents/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_agents/default_app.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_bot/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_bot/default_app.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_chat/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_chat/default_app.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_dashboard/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_dashboard/default_app.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_realtime/__init__.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_realtime/default_app.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/upload_vision.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/setup.cfg +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_agents_playbook.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_approval_system.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_basic.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_cli_features.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_custom_tools_fix.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_double_api_fix.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_n8n_agent_invoke.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_n8n_cli_feature.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_n8n_integration.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_phase2_refactor.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_recipe.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_registry.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_runner.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_sandboxed_agent_compatibility.py +0 -0
- {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_serve_features.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 4.6.
|
|
3
|
+
Version: 4.6.162
|
|
4
4
|
Summary: PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration.
|
|
5
5
|
Author: Mervin Praison
|
|
6
6
|
License: MIT
|
|
@@ -11,14 +11,14 @@ Description-Content-Type: text/markdown
|
|
|
11
11
|
Requires-Dist: rich>=13.7
|
|
12
12
|
Requires-Dist: markdown>=3.5
|
|
13
13
|
Requires-Dist: pyparsing>=3.0.0
|
|
14
|
-
Requires-Dist: praisonaiagents>=1.6.
|
|
15
|
-
Requires-Dist: praisonai-code>=0.0.
|
|
16
|
-
Requires-Dist: praisonai-bot>=0.0.
|
|
17
|
-
Requires-Dist: praisonai-train>=0.0.
|
|
18
|
-
Requires-Dist: praisonai-browser>=0.0.
|
|
19
|
-
Requires-Dist: praisonai-mcp>=0.0.
|
|
20
|
-
Requires-Dist: praisonai-sandbox>=0.0.
|
|
21
|
-
Requires-Dist: praisonai-deploy>=0.0.
|
|
14
|
+
Requires-Dist: praisonaiagents>=1.6.166
|
|
15
|
+
Requires-Dist: praisonai-code>=0.0.62
|
|
16
|
+
Requires-Dist: praisonai-bot>=0.0.47
|
|
17
|
+
Requires-Dist: praisonai-train>=0.0.17
|
|
18
|
+
Requires-Dist: praisonai-browser>=0.0.13
|
|
19
|
+
Requires-Dist: praisonai-mcp>=0.0.13
|
|
20
|
+
Requires-Dist: praisonai-sandbox>=0.0.11
|
|
21
|
+
Requires-Dist: praisonai-deploy>=0.0.6
|
|
22
22
|
Requires-Dist: python-dotenv>=0.19.0
|
|
23
23
|
Requires-Dist: litellm<2,>=1.83.14
|
|
24
24
|
Requires-Dist: PyYAML>=6.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PraisonAI
|
|
3
|
-
Version: 4.6.
|
|
3
|
+
Version: 4.6.162
|
|
4
4
|
Summary: PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration.
|
|
5
5
|
Author: Mervin Praison
|
|
6
6
|
License: MIT
|
|
@@ -11,14 +11,14 @@ Description-Content-Type: text/markdown
|
|
|
11
11
|
Requires-Dist: rich>=13.7
|
|
12
12
|
Requires-Dist: markdown>=3.5
|
|
13
13
|
Requires-Dist: pyparsing>=3.0.0
|
|
14
|
-
Requires-Dist: praisonaiagents>=1.6.
|
|
15
|
-
Requires-Dist: praisonai-code>=0.0.
|
|
16
|
-
Requires-Dist: praisonai-bot>=0.0.
|
|
17
|
-
Requires-Dist: praisonai-train>=0.0.
|
|
18
|
-
Requires-Dist: praisonai-browser>=0.0.
|
|
19
|
-
Requires-Dist: praisonai-mcp>=0.0.
|
|
20
|
-
Requires-Dist: praisonai-sandbox>=0.0.
|
|
21
|
-
Requires-Dist: praisonai-deploy>=0.0.
|
|
14
|
+
Requires-Dist: praisonaiagents>=1.6.166
|
|
15
|
+
Requires-Dist: praisonai-code>=0.0.62
|
|
16
|
+
Requires-Dist: praisonai-bot>=0.0.47
|
|
17
|
+
Requires-Dist: praisonai-train>=0.0.17
|
|
18
|
+
Requires-Dist: praisonai-browser>=0.0.13
|
|
19
|
+
Requires-Dist: praisonai-mcp>=0.0.13
|
|
20
|
+
Requires-Dist: praisonai-sandbox>=0.0.11
|
|
21
|
+
Requires-Dist: praisonai-deploy>=0.0.6
|
|
22
22
|
Requires-Dist: python-dotenv>=0.19.0
|
|
23
23
|
Requires-Dist: litellm<2,>=1.83.14
|
|
24
24
|
Requires-Dist: PyYAML>=6.0
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
rich>=13.7
|
|
2
2
|
markdown>=3.5
|
|
3
3
|
pyparsing>=3.0.0
|
|
4
|
-
praisonaiagents>=1.6.
|
|
5
|
-
praisonai-code>=0.0.
|
|
6
|
-
praisonai-bot>=0.0.
|
|
7
|
-
praisonai-train>=0.0.
|
|
8
|
-
praisonai-browser>=0.0.
|
|
9
|
-
praisonai-mcp>=0.0.
|
|
10
|
-
praisonai-sandbox>=0.0.
|
|
11
|
-
praisonai-deploy>=0.0.
|
|
4
|
+
praisonaiagents>=1.6.166
|
|
5
|
+
praisonai-code>=0.0.62
|
|
6
|
+
praisonai-bot>=0.0.47
|
|
7
|
+
praisonai-train>=0.0.17
|
|
8
|
+
praisonai-browser>=0.0.13
|
|
9
|
+
praisonai-mcp>=0.0.13
|
|
10
|
+
praisonai-sandbox>=0.0.11
|
|
11
|
+
praisonai-deploy>=0.0.6
|
|
12
12
|
python-dotenv>=0.19.0
|
|
13
13
|
litellm<2,>=1.83.14
|
|
14
14
|
PyYAML>=6.0
|
|
@@ -142,32 +142,70 @@ else:
|
|
|
142
142
|
|
|
143
143
|
|
|
144
144
|
# Agent Registry
|
|
145
|
-
|
|
145
|
+
import threading
|
|
146
146
|
|
|
147
147
|
|
|
148
|
-
|
|
148
|
+
class AgentRegistry:
|
|
149
|
+
"""Thread-safe registry of agents scoped to an embedding/tenant.
|
|
150
|
+
|
|
151
|
+
Encapsulates the previously module-global dict so multiple ``AgentOS`` /
|
|
152
|
+
``praisonai serve`` gateways sharing one interpreter can each hold an
|
|
153
|
+
isolated registry, and so concurrent unregisters are race-free.
|
|
154
|
+
"""
|
|
155
|
+
|
|
156
|
+
def __init__(self) -> None:
|
|
157
|
+
self._agents: Dict[str, Any] = {}
|
|
158
|
+
self._lock = threading.RLock()
|
|
159
|
+
|
|
160
|
+
def register(self, agent_id: str, agent: Any) -> None:
|
|
161
|
+
with self._lock:
|
|
162
|
+
self._agents[agent_id] = agent
|
|
163
|
+
logger.debug(f"Registered agent: {agent_id}")
|
|
164
|
+
|
|
165
|
+
def unregister(self, agent_id: str) -> bool:
|
|
166
|
+
# Atomic under the lock: test membership and pop together so a concurrent
|
|
167
|
+
# unregister can't race between the check and the delete, while still
|
|
168
|
+
# reporting removal correctly even when the stored value is falsy/None.
|
|
169
|
+
_MISSING = object()
|
|
170
|
+
with self._lock:
|
|
171
|
+
removed = self._agents.pop(agent_id, _MISSING) is not _MISSING
|
|
172
|
+
if removed:
|
|
173
|
+
logger.debug(f"Unregistered agent: {agent_id}")
|
|
174
|
+
return removed
|
|
175
|
+
|
|
176
|
+
def get(self, agent_id: str) -> Optional[Any]:
|
|
177
|
+
with self._lock:
|
|
178
|
+
return self._agents.get(agent_id)
|
|
179
|
+
|
|
180
|
+
def list(self) -> list:
|
|
181
|
+
with self._lock:
|
|
182
|
+
return list(self._agents.keys())
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
_default_registry = AgentRegistry()
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def register_agent(agent_id: str, agent: Any,
|
|
189
|
+
*, registry: Optional[AgentRegistry] = None) -> None:
|
|
149
190
|
"""Register an agent for invocation via API."""
|
|
150
|
-
|
|
151
|
-
logger.debug(f"Registered agent: {agent_id}")
|
|
191
|
+
(registry or _default_registry).register(agent_id, agent)
|
|
152
192
|
|
|
153
193
|
|
|
154
|
-
def unregister_agent(agent_id: str
|
|
194
|
+
def unregister_agent(agent_id: str,
|
|
195
|
+
*, registry: Optional[AgentRegistry] = None) -> bool:
|
|
155
196
|
"""Unregister an agent."""
|
|
156
|
-
|
|
157
|
-
del _agent_registry[agent_id]
|
|
158
|
-
logger.debug(f"Unregistered agent: {agent_id}")
|
|
159
|
-
return True
|
|
160
|
-
return False
|
|
197
|
+
return (registry or _default_registry).unregister(agent_id)
|
|
161
198
|
|
|
162
199
|
|
|
163
|
-
def get_agent(agent_id: str
|
|
200
|
+
def get_agent(agent_id: str,
|
|
201
|
+
*, registry: Optional[AgentRegistry] = None) -> Optional[Any]:
|
|
164
202
|
"""Get a registered agent by ID."""
|
|
165
|
-
return
|
|
203
|
+
return (registry or _default_registry).get(agent_id)
|
|
166
204
|
|
|
167
205
|
|
|
168
|
-
def list_registered_agents() -> list:
|
|
206
|
+
def list_registered_agents(*, registry: Optional[AgentRegistry] = None) -> list:
|
|
169
207
|
"""List all registered agent IDs."""
|
|
170
|
-
return
|
|
208
|
+
return (registry or _default_registry).list()
|
|
171
209
|
|
|
172
210
|
|
|
173
211
|
def _is_real_agent(agent: Any) -> bool:
|
|
@@ -476,84 +476,3 @@ def add_eval_parser_subcommands(subparsers) -> None:
|
|
|
476
476
|
perf_parser.add_argument('--output', '-o', help='Output file')
|
|
477
477
|
perf_parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')
|
|
478
478
|
perf_parser.add_argument('--quiet', '-q', action='store_true', help='Suppress JSON output')
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
def add_eval_parser(subparsers) -> None:
|
|
482
|
-
"""
|
|
483
|
-
Add eval subcommand parser.
|
|
484
|
-
|
|
485
|
-
Args:
|
|
486
|
-
subparsers: Argument parser subparsers
|
|
487
|
-
"""
|
|
488
|
-
eval_parser = subparsers.add_parser(
|
|
489
|
-
'eval',
|
|
490
|
-
help='Run agent evaluations'
|
|
491
|
-
)
|
|
492
|
-
|
|
493
|
-
eval_subparsers = eval_parser.add_subparsers(dest='eval_type')
|
|
494
|
-
|
|
495
|
-
accuracy_parser = eval_subparsers.add_parser(
|
|
496
|
-
'accuracy',
|
|
497
|
-
help='Run accuracy evaluation'
|
|
498
|
-
)
|
|
499
|
-
accuracy_parser.add_argument('--agent', '-a', help='Agent config file (optional if --prompt used)')
|
|
500
|
-
accuracy_parser.add_argument('--prompt', '-p', help='Direct prompt (alternative to --agent)')
|
|
501
|
-
accuracy_parser.add_argument('--llm', help='LLM model for agent (when using --prompt)')
|
|
502
|
-
accuracy_parser.add_argument('--input', '-i', help='Input text (defaults to --prompt if not provided)')
|
|
503
|
-
accuracy_parser.add_argument('--expected', '-e', required=True, help='Expected output')
|
|
504
|
-
accuracy_parser.add_argument('--iterations', '-n', type=int, default=1, help='Number of iterations')
|
|
505
|
-
accuracy_parser.add_argument('--model', '-m', help='Judge model')
|
|
506
|
-
accuracy_parser.add_argument('--output', '-o', help='Output file')
|
|
507
|
-
accuracy_parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')
|
|
508
|
-
accuracy_parser.add_argument('--quiet', '-q', action='store_true', help='Suppress JSON output')
|
|
509
|
-
|
|
510
|
-
perf_parser = eval_subparsers.add_parser(
|
|
511
|
-
'performance',
|
|
512
|
-
help='Run performance evaluation'
|
|
513
|
-
)
|
|
514
|
-
perf_parser.add_argument('--agent', '-a', default='agents.yaml', help='Agent config file')
|
|
515
|
-
perf_parser.add_argument('--input', '-i', default='Hello', help='Input text')
|
|
516
|
-
perf_parser.add_argument('--iterations', '-n', type=int, default=10, help='Number of iterations')
|
|
517
|
-
perf_parser.add_argument('--warmup', '-w', type=int, default=2, help='Warmup runs')
|
|
518
|
-
perf_parser.add_argument('--memory', action='store_true', default=True, help='Track memory')
|
|
519
|
-
perf_parser.add_argument('--output', '-o', help='Output file')
|
|
520
|
-
perf_parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')
|
|
521
|
-
perf_parser.add_argument('--quiet', '-q', action='store_true', help='Suppress JSON output')
|
|
522
|
-
|
|
523
|
-
rel_parser = eval_subparsers.add_parser(
|
|
524
|
-
'reliability',
|
|
525
|
-
help='Run reliability evaluation'
|
|
526
|
-
)
|
|
527
|
-
rel_parser.add_argument('--agent', '-a', default='agents.yaml', help='Agent config file')
|
|
528
|
-
rel_parser.add_argument('--input', '-i', required=True, help='Input text')
|
|
529
|
-
rel_parser.add_argument('--expected-tools', '-t', required=True, help='Expected tools (comma-separated)')
|
|
530
|
-
rel_parser.add_argument('--forbidden-tools', '-f', help='Forbidden tools (comma-separated)')
|
|
531
|
-
rel_parser.add_argument('--output', '-o', help='Output file')
|
|
532
|
-
rel_parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')
|
|
533
|
-
rel_parser.add_argument('--quiet', '-q', action='store_true', help='Suppress JSON output')
|
|
534
|
-
|
|
535
|
-
criteria_parser = eval_subparsers.add_parser(
|
|
536
|
-
'criteria',
|
|
537
|
-
help='Run criteria-based evaluation'
|
|
538
|
-
)
|
|
539
|
-
criteria_parser.add_argument('--agent', '-a', default='agents.yaml', help='Agent config file')
|
|
540
|
-
criteria_parser.add_argument('--input', '-i', required=True, help='Input text')
|
|
541
|
-
criteria_parser.add_argument('--criteria', '-c', required=True, help='Evaluation criteria')
|
|
542
|
-
criteria_parser.add_argument('--scoring', '-s', choices=['numeric', 'binary'], default='numeric', help='Scoring type')
|
|
543
|
-
criteria_parser.add_argument('--threshold', type=float, default=7.0, help='Pass threshold')
|
|
544
|
-
criteria_parser.add_argument('--iterations', '-n', type=int, default=1, help='Number of iterations')
|
|
545
|
-
criteria_parser.add_argument('--model', '-m', help='Judge model')
|
|
546
|
-
criteria_parser.add_argument('--output', '-o', help='Output file')
|
|
547
|
-
criteria_parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')
|
|
548
|
-
criteria_parser.add_argument('--quiet', '-q', action='store_true', help='Suppress JSON output')
|
|
549
|
-
|
|
550
|
-
batch_parser = eval_subparsers.add_parser(
|
|
551
|
-
'batch',
|
|
552
|
-
help='Run batch evaluation from test file'
|
|
553
|
-
)
|
|
554
|
-
batch_parser.add_argument('--agent', '-a', default='agents.yaml', help='Agent config file')
|
|
555
|
-
batch_parser.add_argument('--test-file', '-t', required=True, help='JSON test file')
|
|
556
|
-
batch_parser.add_argument('--batch-type', '-b', choices=['accuracy', 'criteria'], default='accuracy', help='Evaluation type')
|
|
557
|
-
batch_parser.add_argument('--output', '-o', help='Output file')
|
|
558
|
-
batch_parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')
|
|
559
|
-
batch_parser.add_argument('--quiet', '-q', action='store_true', help='Suppress JSON output')
|
|
@@ -12,140 +12,20 @@ DRY: Reuses ContextEffectivenessJudge from replay module.
|
|
|
12
12
|
import os
|
|
13
13
|
import re
|
|
14
14
|
import logging
|
|
15
|
-
import base64
|
|
16
15
|
from pathlib import Path
|
|
17
16
|
from typing import Optional, List, Tuple, Any, Dict
|
|
18
17
|
|
|
19
18
|
# DRY: Import SDK knowledge from shared modules
|
|
20
19
|
from .sdk_knowledge import get_sdk_knowledge_prompt
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
Uses vision LLM to describe the image content so the optimizer can
|
|
30
|
-
validate if agent outputs match the actual image.
|
|
31
|
-
|
|
32
|
-
Args:
|
|
33
|
-
image_path: Local file path or URL to the image
|
|
34
|
-
model: Vision-capable model to use
|
|
35
|
-
|
|
36
|
-
Returns:
|
|
37
|
-
Description of the image content
|
|
38
|
-
"""
|
|
39
|
-
try:
|
|
40
|
-
import litellm
|
|
41
|
-
|
|
42
|
-
# Prepare image content
|
|
43
|
-
if image_path.startswith(('http://', 'https://')):
|
|
44
|
-
# URL - pass directly
|
|
45
|
-
image_content = {
|
|
46
|
-
"type": "image_url",
|
|
47
|
-
"image_url": {"url": image_path}
|
|
48
|
-
}
|
|
49
|
-
elif os.path.exists(image_path):
|
|
50
|
-
# Local file - encode as base64
|
|
51
|
-
with open(image_path, 'rb') as f:
|
|
52
|
-
image_data = base64.b64encode(f.read()).decode('utf-8')
|
|
53
|
-
|
|
54
|
-
# Detect mime type
|
|
55
|
-
ext = os.path.splitext(image_path)[1].lower()
|
|
56
|
-
mime_types = {
|
|
57
|
-
'.jpg': 'image/jpeg', '.jpeg': 'image/jpeg',
|
|
58
|
-
'.png': 'image/png', '.gif': 'image/gif',
|
|
59
|
-
'.webp': 'image/webp', '.bmp': 'image/bmp'
|
|
60
|
-
}
|
|
61
|
-
mime_type = mime_types.get(ext, 'image/jpeg')
|
|
62
|
-
|
|
63
|
-
image_content = {
|
|
64
|
-
"type": "image_url",
|
|
65
|
-
"image_url": {"url": f"data:{mime_type};base64,{image_data}"}
|
|
66
|
-
}
|
|
67
|
-
else:
|
|
68
|
-
return f"[Image not found: {image_path}]"
|
|
69
|
-
|
|
70
|
-
# Use vision model to describe the image
|
|
71
|
-
response = litellm.completion(
|
|
72
|
-
model=model,
|
|
73
|
-
messages=[{
|
|
74
|
-
"role": "user",
|
|
75
|
-
"content": [
|
|
76
|
-
{"type": "text", "text": "Describe this image in detail. Include: main subject, colors, text visible, key elements, and overall composition. Be factual and specific."},
|
|
77
|
-
image_content
|
|
78
|
-
]
|
|
79
|
-
}],
|
|
80
|
-
max_tokens=500,
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
description = response.choices[0].message.content or ""
|
|
84
|
-
return f"[IMAGE DESCRIPTION: {description}]"
|
|
85
|
-
|
|
86
|
-
except Exception as e:
|
|
87
|
-
logger.warning(f"Failed to read image for optimizer: {e}")
|
|
88
|
-
return f"[Failed to read image: {str(e)[:100]}]"
|
|
21
|
+
# DRY: Reuse image reading and URL crawling from the canonical judge module
|
|
22
|
+
# instead of maintaining verbatim copies here.
|
|
23
|
+
from praisonai.replay.judge import (
|
|
24
|
+
_read_image_for_judge as _read_image_for_optimizer,
|
|
25
|
+
_crawl_url_for_judge as _crawl_url_for_optimizer,
|
|
26
|
+
)
|
|
89
27
|
|
|
90
|
-
|
|
91
|
-
def _crawl_url_for_optimizer(url: str) -> str:
|
|
92
|
-
"""
|
|
93
|
-
Crawl a URL to get content for optimizer context.
|
|
94
|
-
|
|
95
|
-
Uses the web_crawl tool to extract content so the optimizer can
|
|
96
|
-
validate if agent outputs match the actual URL content.
|
|
97
|
-
|
|
98
|
-
Args:
|
|
99
|
-
url: URL to crawl
|
|
100
|
-
|
|
101
|
-
Returns:
|
|
102
|
-
Extracted content from the URL (truncated)
|
|
103
|
-
"""
|
|
104
|
-
try:
|
|
105
|
-
# Try to use the web_crawl tool
|
|
106
|
-
from praisonaiagents.tools import web_crawl
|
|
107
|
-
|
|
108
|
-
result = web_crawl(url)
|
|
109
|
-
|
|
110
|
-
if isinstance(result, dict):
|
|
111
|
-
if result.get('error'):
|
|
112
|
-
return f"[URL crawl error: {result.get('error')}]"
|
|
113
|
-
content = result.get('content', '')
|
|
114
|
-
title = result.get('title', '')
|
|
115
|
-
provider = result.get('provider', 'unknown')
|
|
116
|
-
|
|
117
|
-
# Truncate content for optimizer context
|
|
118
|
-
if len(content) > 3000:
|
|
119
|
-
content = content[:3000] + "... [truncated]"
|
|
120
|
-
|
|
121
|
-
return f"[URL CONTENT (via {provider})]\nTitle: {title}\n\n{content}"
|
|
122
|
-
|
|
123
|
-
return f"[URL content: {str(result)[:3000]}]"
|
|
124
|
-
|
|
125
|
-
except ImportError:
|
|
126
|
-
# Fallback to basic HTTP fetch
|
|
127
|
-
try:
|
|
128
|
-
import urllib.request
|
|
129
|
-
|
|
130
|
-
with urllib.request.urlopen(url, timeout=30) as response:
|
|
131
|
-
content = response.read().decode('utf-8', errors='ignore')
|
|
132
|
-
|
|
133
|
-
# Basic HTML to text
|
|
134
|
-
content = re.sub(r'<script[^>]*>.*?</script>', '', content, flags=re.DOTALL | re.IGNORECASE)
|
|
135
|
-
content = re.sub(r'<style[^>]*>.*?</style>', '', content, flags=re.DOTALL | re.IGNORECASE)
|
|
136
|
-
content = re.sub(r'<[^>]+>', ' ', content)
|
|
137
|
-
content = re.sub(r'\s+', ' ', content).strip()
|
|
138
|
-
|
|
139
|
-
if len(content) > 3000:
|
|
140
|
-
content = content[:3000] + "... [truncated]"
|
|
141
|
-
|
|
142
|
-
return f"[URL CONTENT (via urllib)]\n{content}"
|
|
143
|
-
|
|
144
|
-
except Exception as e:
|
|
145
|
-
return f"[Failed to crawl URL: {str(e)[:100]}]"
|
|
146
|
-
except Exception as e:
|
|
147
|
-
logger.warning(f"Failed to crawl URL for optimizer: {e}")
|
|
148
|
-
return f"[Failed to crawl URL: {str(e)[:100]}]"
|
|
28
|
+
logger = logging.getLogger(__name__)
|
|
149
29
|
|
|
150
30
|
|
|
151
31
|
# Common issue patterns and their fixes - comprehensive patterns
|
|
@@ -227,69 +227,3 @@ def handle_sandbox_command(args) -> None:
|
|
|
227
227
|
else:
|
|
228
228
|
print(f"Unknown sandbox command: {subcommand}")
|
|
229
229
|
print("Available commands: run, shell, status")
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
def add_sandbox_parser(subparsers) -> None:
|
|
233
|
-
"""Add sandbox subparser to CLI."""
|
|
234
|
-
sandbox_parser = subparsers.add_parser(
|
|
235
|
-
"sandbox",
|
|
236
|
-
help="Run code in a sandbox",
|
|
237
|
-
)
|
|
238
|
-
|
|
239
|
-
sandbox_subparsers = sandbox_parser.add_subparsers(
|
|
240
|
-
dest="sandbox_command",
|
|
241
|
-
help="Sandbox commands",
|
|
242
|
-
)
|
|
243
|
-
|
|
244
|
-
run_parser = sandbox_subparsers.add_parser(
|
|
245
|
-
"run",
|
|
246
|
-
help="Run code in sandbox",
|
|
247
|
-
)
|
|
248
|
-
run_parser.add_argument(
|
|
249
|
-
"--code", "-c",
|
|
250
|
-
help="Code to execute",
|
|
251
|
-
)
|
|
252
|
-
run_parser.add_argument(
|
|
253
|
-
"--file", "-f",
|
|
254
|
-
help="File to execute",
|
|
255
|
-
)
|
|
256
|
-
run_parser.add_argument(
|
|
257
|
-
"--type", "-t",
|
|
258
|
-
choices=["subprocess", "docker", "daytona"],
|
|
259
|
-
default="subprocess",
|
|
260
|
-
help="Sandbox type (default: subprocess)",
|
|
261
|
-
)
|
|
262
|
-
run_parser.add_argument(
|
|
263
|
-
"--image",
|
|
264
|
-
default="python:3.11-slim",
|
|
265
|
-
help="Docker image (default: python:3.11-slim)",
|
|
266
|
-
)
|
|
267
|
-
run_parser.add_argument(
|
|
268
|
-
"--timeout",
|
|
269
|
-
type=int,
|
|
270
|
-
default=60,
|
|
271
|
-
help="Timeout in seconds (default: 60)",
|
|
272
|
-
)
|
|
273
|
-
|
|
274
|
-
shell_parser = sandbox_subparsers.add_parser(
|
|
275
|
-
"shell",
|
|
276
|
-
help="Start interactive sandbox shell",
|
|
277
|
-
)
|
|
278
|
-
shell_parser.add_argument(
|
|
279
|
-
"--type", "-t",
|
|
280
|
-
choices=["subprocess", "docker", "daytona"],
|
|
281
|
-
default="subprocess",
|
|
282
|
-
help="Sandbox type (default: subprocess)",
|
|
283
|
-
)
|
|
284
|
-
shell_parser.add_argument(
|
|
285
|
-
"--image",
|
|
286
|
-
default="python:3.11-slim",
|
|
287
|
-
help="Docker image (default: python:3.11-slim)",
|
|
288
|
-
)
|
|
289
|
-
|
|
290
|
-
sandbox_subparsers.add_parser(
|
|
291
|
-
"status",
|
|
292
|
-
help="Check sandbox availability",
|
|
293
|
-
)
|
|
294
|
-
|
|
295
|
-
sandbox_parser.set_defaults(func=handle_sandbox_command)
|
|
@@ -230,6 +230,8 @@ class AsyncTUI:
|
|
|
230
230
|
self._runtime = None # InteractiveRuntime for ACP/LSP
|
|
231
231
|
self._runtime_started = False
|
|
232
232
|
self._registry = None # Unified command registry (lazy)
|
|
233
|
+
self._checkpoints = None # SessionCheckpointManager (lazy)
|
|
234
|
+
self._checkpoints_ready = False
|
|
233
235
|
self._prev_permission_mode = None # Approval mode to restore when leaving PLAN
|
|
234
236
|
# Sync PLAN indicator/toggle with a backend launched via --approval plan.
|
|
235
237
|
self._sync_plan_mode_from_backend()
|
|
@@ -262,6 +264,123 @@ class AsyncTUI:
|
|
|
262
264
|
except Exception:
|
|
263
265
|
pass
|
|
264
266
|
|
|
267
|
+
def _get_checkpoints(self):
|
|
268
|
+
"""Lazily build the coherent turn-checkpoint manager for this session.
|
|
269
|
+
|
|
270
|
+
Binds ``SessionCheckpointManager`` to a view over the TUI's in-memory
|
|
271
|
+
conversation history so ``/undo`` and ``/revert`` roll back **files and
|
|
272
|
+
chat history together** on the default path — the same proven engine the
|
|
273
|
+
legacy REPL uses. Enabled by default for interactive runs
|
|
274
|
+
(``default=True``); opt out with ``checkpoints.auto: false`` or
|
|
275
|
+
``PRAISONAI_CHECKPOINTS=off``. Degrades to ``None`` on any failure so a
|
|
276
|
+
checkpoint problem never breaks the TUI.
|
|
277
|
+
"""
|
|
278
|
+
if self._checkpoints_ready:
|
|
279
|
+
return self._checkpoints
|
|
280
|
+
self._checkpoints_ready = True
|
|
281
|
+
try:
|
|
282
|
+
from praisonai_code.cli.interactive.repl import (
|
|
283
|
+
_InMemoryConversationStore,
|
|
284
|
+
)
|
|
285
|
+
from praisonai.cli.features.session_checkpoints import (
|
|
286
|
+
SessionCheckpointManager,
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
config = None
|
|
290
|
+
try:
|
|
291
|
+
from praisonai.cli.configuration.resolver import resolve_config
|
|
292
|
+
|
|
293
|
+
config = resolve_config().extra
|
|
294
|
+
except Exception:
|
|
295
|
+
config = None
|
|
296
|
+
|
|
297
|
+
store = _InMemoryConversationStore(
|
|
298
|
+
self._conversation_history,
|
|
299
|
+
agent_provider=lambda: self._agent,
|
|
300
|
+
)
|
|
301
|
+
mgr = SessionCheckpointManager.from_config(
|
|
302
|
+
workspace_dir=(
|
|
303
|
+
os.environ.get("PRAISONAI_WORKSPACE")
|
|
304
|
+
or self.config.workspace
|
|
305
|
+
or os.getcwd()
|
|
306
|
+
),
|
|
307
|
+
config=config,
|
|
308
|
+
verbose=self.config.debug,
|
|
309
|
+
session_store=store,
|
|
310
|
+
session_id=self.session_id or "tui",
|
|
311
|
+
default=True,
|
|
312
|
+
)
|
|
313
|
+
if mgr.enabled:
|
|
314
|
+
mgr.checkpoint_turn("session start")
|
|
315
|
+
self._checkpoints = mgr
|
|
316
|
+
except Exception as exc: # pragma: no cover - defensive
|
|
317
|
+
logger.debug("Session checkpoints unavailable: %s", exc)
|
|
318
|
+
self._checkpoints = None
|
|
319
|
+
return self._checkpoints
|
|
320
|
+
|
|
321
|
+
def _checkpoint_turn(self, label: str) -> None:
|
|
322
|
+
"""Record a pre-turn checkpoint so the revert timeline exists."""
|
|
323
|
+
ckpt = self._get_checkpoints()
|
|
324
|
+
if ckpt is not None:
|
|
325
|
+
try:
|
|
326
|
+
ckpt.checkpoint_turn(label)
|
|
327
|
+
except Exception: # pragma: no cover - never break a turn
|
|
328
|
+
pass
|
|
329
|
+
|
|
330
|
+
def _handle_undo(self) -> None:
|
|
331
|
+
"""/undo — roll files + conversation back to the previous turn."""
|
|
332
|
+
ckpt = self._get_checkpoints()
|
|
333
|
+
if ckpt is None or not getattr(ckpt, "enabled", False) or not ckpt.turns:
|
|
334
|
+
self.messages.append(ChatMessage(role="system", content="Nothing to undo."))
|
|
335
|
+
return
|
|
336
|
+
ckpt.preview(1)
|
|
337
|
+
restored = ckpt.revert(1)
|
|
338
|
+
if restored:
|
|
339
|
+
self.messages.append(ChatMessage(
|
|
340
|
+
role="system",
|
|
341
|
+
content=f"Undone last turn — files + conversation reverted to {restored.short_id}.",
|
|
342
|
+
))
|
|
343
|
+
else:
|
|
344
|
+
self.messages.append(ChatMessage(role="system", content="No checkpoint to undo."))
|
|
345
|
+
|
|
346
|
+
def _handle_revert(self, args: str) -> None:
|
|
347
|
+
"""/revert [n] — roll files + conversation back n turns (default 1)."""
|
|
348
|
+
ckpt = self._get_checkpoints()
|
|
349
|
+
if ckpt is None or not getattr(ckpt, "enabled", False):
|
|
350
|
+
self.messages.append(ChatMessage(
|
|
351
|
+
role="system",
|
|
352
|
+
content=(
|
|
353
|
+
"Checkpointing is disabled. Enable with checkpoints.auto: true "
|
|
354
|
+
"or PRAISONAI_CHECKPOINTS=on."
|
|
355
|
+
),
|
|
356
|
+
))
|
|
357
|
+
return
|
|
358
|
+
if not ckpt.turns:
|
|
359
|
+
self.messages.append(ChatMessage(role="system", content="No checkpoints to revert to."))
|
|
360
|
+
return
|
|
361
|
+
n = 1
|
|
362
|
+
token = str(args).strip().lower()
|
|
363
|
+
if token and token != "last":
|
|
364
|
+
try:
|
|
365
|
+
n = int(token)
|
|
366
|
+
except ValueError:
|
|
367
|
+
self.messages.append(ChatMessage(role="system", content="Usage: /revert [n|last]"))
|
|
368
|
+
return
|
|
369
|
+
if n < 1 or n > len(ckpt.turns):
|
|
370
|
+
self.messages.append(ChatMessage(
|
|
371
|
+
role="system", content=f"Can only revert 1..{len(ckpt.turns)} turn(s).",
|
|
372
|
+
))
|
|
373
|
+
return
|
|
374
|
+
ckpt.preview(n)
|
|
375
|
+
restored = ckpt.revert(n)
|
|
376
|
+
if restored:
|
|
377
|
+
self.messages.append(ChatMessage(
|
|
378
|
+
role="system",
|
|
379
|
+
content=f"Reverted {n} turn(s) — files + conversation restored to {restored.short_id}.",
|
|
380
|
+
))
|
|
381
|
+
else:
|
|
382
|
+
self.messages.append(ChatMessage(role="system", content="Failed to revert."))
|
|
383
|
+
|
|
265
384
|
def _process_file_mentions(self, prompt: str) -> str:
|
|
266
385
|
"""Process @file mentions and include file contents."""
|
|
267
386
|
import os
|
|
@@ -645,6 +764,8 @@ class AsyncTUI:
|
|
|
645
764
|
"multiline": "Toggle multiline input mode",
|
|
646
765
|
"files": "List workspace files for @ mentions",
|
|
647
766
|
"queue": "Show pending prompts in queue",
|
|
767
|
+
"undo": "Undo the last turn (files + conversation)",
|
|
768
|
+
"revert": "Revert the last N turns (files + conversation)",
|
|
648
769
|
}
|
|
649
770
|
|
|
650
771
|
def _get_registry(self):
|
|
@@ -708,6 +829,8 @@ class AsyncTUI:
|
|
|
708
829
|
/multiline Toggle multiline input mode
|
|
709
830
|
/files List workspace files for @ mentions
|
|
710
831
|
/queue Show pending prompts in queue
|
|
832
|
+
/undo Undo the last turn (files + conversation)
|
|
833
|
+
/revert [n] Revert the last N turns (files + conversation)
|
|
711
834
|
|
|
712
835
|
Keyboard Shortcuts:
|
|
713
836
|
PageUp/Down Scroll output
|
|
@@ -1101,6 +1224,14 @@ Example: /handoff code "refactor the auth module" """
|
|
|
1101
1224
|
))
|
|
1102
1225
|
return True
|
|
1103
1226
|
|
|
1227
|
+
elif cmd == "undo":
|
|
1228
|
+
self._handle_undo()
|
|
1229
|
+
return True
|
|
1230
|
+
|
|
1231
|
+
elif cmd == "revert":
|
|
1232
|
+
self._handle_revert(args)
|
|
1233
|
+
return True
|
|
1234
|
+
|
|
1104
1235
|
else:
|
|
1105
1236
|
# Not a built-in: consult the unified command registry so custom
|
|
1106
1237
|
# .praisonai/commands/*.md commands are first-class /name commands.
|
|
@@ -1363,6 +1494,13 @@ Example: /handoff code "refactor the auth module" """
|
|
|
1363
1494
|
else self._process_file_mentions(prompt)
|
|
1364
1495
|
)
|
|
1365
1496
|
|
|
1497
|
+
# Checkpoint files + conversation at the turn boundary before the
|
|
1498
|
+
# agent may mutate the workspace, so /undo and /revert can roll both
|
|
1499
|
+
# back together. Read-only turns (reviews) never mutate files, so
|
|
1500
|
+
# skip them to keep the revert timeline meaningful.
|
|
1501
|
+
if not read_only:
|
|
1502
|
+
self._checkpoint_turn(prompt[:60])
|
|
1503
|
+
|
|
1366
1504
|
# Add to conversation history
|
|
1367
1505
|
self._conversation_history.append({"role": "user", "content": prompt})
|
|
1368
1506
|
|