PraisonAI 4.6.143__tar.gz → 4.6.145__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.143 → praisonai-4.6.145}/PKG-INFO +4 -4
- {praisonai-4.6.143 → praisonai-4.6.145}/PraisonAI.egg-info/PKG-INFO +4 -4
- {praisonai-4.6.143 → praisonai-4.6.145}/PraisonAI.egg-info/requires.txt +3 -3
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/interactive/core.py +43 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/interactive_legacy.py +299 -62
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/managed_local.py +41 -3
- praisonai-4.6.145/praisonai/sandbox/_compat.py +29 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/shared.py +29 -17
- praisonai-4.6.145/praisonai/version.py +1 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/pyproject.toml +3 -3
- praisonai-4.6.143/praisonai/sandbox/_compat.py +0 -209
- praisonai-4.6.143/praisonai/version.py +0 -1
- {praisonai-4.6.143 → praisonai-4.6.145}/PraisonAI.egg-info/SOURCES.txt +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/PraisonAI.egg-info/dependency_links.txt +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/PraisonAI.egg-info/entry_points.txt +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/PraisonAI.egg-info/top_level.txt +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/README.md +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/__main__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_approval_spec.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_async_bridge.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_bootstrap.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/api_md.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/docs_extractor.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/docs_generator.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/generator.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/python_docs_extractor.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/python_extractor.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/rust_docs_extractor.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/rust_extractor.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/topic_normalizer.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/ts_docs_extractor.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/typescript_extractor.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_entrypoint.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_framework_availability.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_lazy_cache.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_logging.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_safe_loader.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/acp/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/acp/config.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/acp/safe_edit.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/acp/server.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/acp/session.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/adapters/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/adapters/readers.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/adapters/rerankers.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/adapters/retrievers.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/adapters/vector_stores.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/agent.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/agent_scheduler.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/agents_generator.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/api/agent_invoke.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/api/call.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/app/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/app/agentos.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/async_agent_scheduler.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/audit/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/audit/agent_centric.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/auto.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/bots/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/agent.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/benchmark.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/cdp_agent.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/cdp_utils.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/cli.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/diagnostics.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/launcher.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/playwright_agent.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/profiling.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/protocol.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/report.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/server.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/sessions.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/video.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/a2a.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/assistants.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/audio.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/batches.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/completions.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/container_files.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/containers.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/embeddings.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/files.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/fine_tuning.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/guardrails.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/images.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/mcp.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/messages.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/moderations.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/ocr.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/passthrough.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/rag.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/realtime.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/rerank.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/responses.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/search.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/skills.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/vector_store_files.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/vector_stores.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/videos.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/claw/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/_paths.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/_shim.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/_warnings.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/app.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/approval_backend.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/branding.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/acp.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/agent.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/agents.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/app.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/attach.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/audit.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/auth.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/batch.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/benchmark.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/bot.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/browser.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/call.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/chat.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/checkpoint.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/claw.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/code.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/command.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/commit.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/completion.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/config.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/context.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/daemon.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/dashboard.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/debug.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/deploy.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/diag.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/docs.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/doctor.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/endpoints.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/environment.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/eval.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/examples.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/flow.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/gateway.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/github.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/hooks.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/identity.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/init.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/kanban.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/knowledge.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/langextract.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/langfuse.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/loop.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/lsp.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/managed.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/mcp.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/memory.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/mint_link.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/models.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/n8n.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/obs.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/onboard.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/package.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/pairing.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/paths.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/permissions.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/plugins.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/port.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/profile.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/publish.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/rag.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/realtime.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/recipe.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/replay.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/research.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/retrieval.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/rules.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/run.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/sandbox.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/schedule.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/serve.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/session.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/setup.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/skills.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/standardise.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/templates.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/test.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/todo.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/tools.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/traces.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/tracker.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/train.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/ui.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/up.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/validate.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/version.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/workflow.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/config_loader.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/configuration/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/configuration/config.schema.json +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/execution/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/fallback_schema.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/acp.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/agent_scheduler.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/agent_tools.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/approval.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/background.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/bots_cli.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/deploy.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/endpoints.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/eval.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/gateway.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/ollama.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/onboard.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/persistence.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/recipe.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/recipe_optimizer.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/sandbox_cli.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/serve.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/templates.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/tools.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/tui/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/tui/app.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/workflow.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/interactive/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/interactive/async_tui.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/langfuse_client.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/direct_prompt.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/dispatch/argparse_builder.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/framework_run.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/workflow_commands.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/main.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/output/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/schedule_cli.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/schema_provider.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/session/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/state/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/ui/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/unified_schema.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/utils/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli_backends/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/agent_tools.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/diff/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/diff/diff_strategy.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/tools/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/tools/apply_diff.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/tools/execute_command.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/tools/list_files.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/tools/read_file.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/tools/search_replace.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/tools/write_file.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/utils/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/utils/file_utils.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/utils/ignore_utils.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/utils/text_utils.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/config/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/config/schema.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/config/validator.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/_storage_path.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/artifact_store.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/config.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/history_store.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/queue.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/setup.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/terminal_logger.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/daemon/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/db/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/db/adapter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/api.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/docker.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/doctor.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/main.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/models.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/providers/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/providers/_registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/providers/aws.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/providers/azure.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/providers/base.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/providers/gcp.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/schema.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/a2u_server.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/discovery.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/a2a.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/a2u.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/agents_api.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/base.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/mcp.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/openai_compat.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/recipe.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/tools_mcp.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/server.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/flow/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/flow/client.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/flow/components/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/flow/converter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/flow/helpers.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/_config_builder.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/autogen_adapter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/base.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/crewai_adapter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/praisonai_adapter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/validators.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/workflow_framework.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/gateway/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/inbuilt_tools/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/inc/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/inc/config.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/inc/models.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/bridges/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/bridges/approvals_bridge.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/bridges/hooks_query.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/bridges/kanban_bridge.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/bridges/schedules_runner.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/bridges/usage_bridge.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/bridges/workflows_service.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/context_files.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/gateway_host.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/host_app.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/pages/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/pages/bot_health.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/pages/workflow_runs.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/_cli_loaders.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/_session_info.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/_tool_aliases.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/_unified_registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/backend_registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/base.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/claude_code.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/codex_cli.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/compute/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/compute/daytona.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/compute/docker.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/compute/e2b.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/compute/flyio.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/compute/local.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/compute/modal_compute.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/cursor_cli.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/db_session_adapter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/gemini_cli.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/hosted_agent.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/local_agent.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/managed_agents.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/sandboxed_agent.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/jobs/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/jobs/executor.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/jobs/models.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/jobs/path_validation.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/jobs/router.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/jobs/server.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/jobs/store.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/kanban/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/llm/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/llm/catalogue.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/llm/config.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/llm/credentials.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/llm/env.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/llm/gateways.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/llm/registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/agents.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/capabilities.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/cli_tools.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/extended_capabilities.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/knowledge.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/memory.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/prompts.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/resources.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/tools_bridge.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/auth/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/auth/api_key.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/auth/oauth.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/auth/oidc.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/auth/scopes.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/cli.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/elicitation.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/icons.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/recipe_adapter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/recipe_cli.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/sampling.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/server.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/tasks.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/tool_index.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/transports/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/transports/http_stream.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/transports/stdio.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/n8n/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/n8n/client.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/n8n/converter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/n8n/preview.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/n8n/reverse_converter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/observability/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/observability/hooks.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/observability/langextract.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/observability/langfuse.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/_valkey_client.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/config.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/_sql_base.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/async_mysql.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/async_postgres.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/async_sqlite.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/base.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/json_store.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/mysql.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/postgres.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/singlestore.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/sqlite.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/supabase.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/surrealdb.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/turso.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/factory.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/hooks/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/hooks/agent_hooks.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/base.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/cassandra.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/chroma.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/clickhouse.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/couchbase.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/lancedb.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/milvus.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/pgvector.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/pinecone.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/qdrant.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/redis_vector.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/weaviate.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/migrations/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/migrations/manager.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/orchestrator.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/async_mongodb.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/base.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/dynamodb.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/firestore.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/gcs.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/memory.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/mongodb.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/redis.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/upstash.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/valkey.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/tests/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/tests/test_all_backends.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/tests/test_registry_lazy.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/tests/test_valkey_backends.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/profiler.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/push/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/push/client.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/push/transports.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/bridge.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/core.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/exceptions.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/history.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/models.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/operations.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/policy.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/runtime.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/security.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/serve.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/server.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/analyzer.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/applier.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/judge.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/plan.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/player.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/reader.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/storage.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/writer.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/runtime/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/runtime/__main__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/_registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/_shell.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/daytona.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/docker.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/e2b.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/modal.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/sandlock.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/ssh.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/subprocess.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/_base_scheduler.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/_dispatch.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/agent_scheduler.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/async_agent_scheduler.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/base.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/blueprint_catalogue.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/condition_gate.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/daemon_manager.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/deployment.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/executor.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/run_policy.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/state_manager.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/suggestion_engine.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/yaml_loader.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/security/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/security/audit.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/security/injection.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/security/protected.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/setup/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/setup/build.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/setup/post_install.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/setup/setup_conda_env.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/setup.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/ai_generator.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/config.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/dedupe.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/discovery.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/drift.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/engine.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/enhanced_templates.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/example_verifier.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/manifest.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/models.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/reports.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/templates.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/undo_redo.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/validator.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/storage/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/storage/dynamodb_adapter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/storage/mongodb_adapter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/storage/postgresql_adapter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/storage/redis_adapter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/storage/valkey_adapter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/batch_source.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/cli_docs_source.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/discovery.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/docs_source.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/examples_source.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/executor.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/models.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/report_viewer.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/reporter.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/runner.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/cache.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/dependency_checker.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/discovery.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/loader.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/resolver.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/security.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/tool_override.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/tools_doctor.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tool_registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tool_resolver.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tools/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tools/audio.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tools/glob_tool.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tools/grep_tool.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tools/kanban_tools.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tools/multiedit.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tools/skill_manage.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/_ollama.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/agents/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/agents/grader.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/agents/hook.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/agents/models.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/agents/orchestrator.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/agents/storage.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/llm/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/llm/trainer.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train_vision.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui/_aiui_datastore.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui/_external_agents.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui/callbacks.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui/components/aicoder.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui/context.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui/database_config.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_agents/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_agents/default_app.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_bot/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_bot/default_app.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_chat/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_chat/default_app.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_dashboard/default_app.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_realtime/__init__.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_realtime/default_app.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/upload_vision.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/setup.cfg +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_agents_playbook.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_approval_system.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_basic.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_cli_features.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_custom_tools_fix.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_double_api_fix.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_n8n_agent_invoke.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_n8n_cli_feature.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_n8n_integration.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_phase2_refactor.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_recipe.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_registry.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_runner.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_sandboxed_agent_compatibility.py +0 -0
- {praisonai-4.6.143 → praisonai-4.6.145}/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.145
|
|
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,9 +11,9 @@ 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.
|
|
14
|
+
Requires-Dist: praisonaiagents>=1.6.148
|
|
15
|
+
Requires-Dist: praisonai-code>=0.0.44
|
|
16
|
+
Requires-Dist: praisonai-bot>=0.0.29
|
|
17
17
|
Requires-Dist: python-dotenv>=0.19.0
|
|
18
18
|
Requires-Dist: litellm<2,>=1.83.14
|
|
19
19
|
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.145
|
|
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,9 +11,9 @@ 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.
|
|
14
|
+
Requires-Dist: praisonaiagents>=1.6.148
|
|
15
|
+
Requires-Dist: praisonai-code>=0.0.44
|
|
16
|
+
Requires-Dist: praisonai-bot>=0.0.29
|
|
17
17
|
Requires-Dist: python-dotenv>=0.19.0
|
|
18
18
|
Requires-Dist: litellm<2,>=1.83.14
|
|
19
19
|
Requires-Dist: PyYAML>=6.0
|
|
@@ -329,6 +329,10 @@ class InteractiveCore:
|
|
|
329
329
|
else:
|
|
330
330
|
agent_config["autonomy"] = True
|
|
331
331
|
|
|
332
|
+
session_registry = self._build_subtree_hook_registry(project_context)
|
|
333
|
+
if session_registry is not None:
|
|
334
|
+
agent_config["hooks"] = session_registry
|
|
335
|
+
|
|
332
336
|
self._agent = Agent(**agent_config)
|
|
333
337
|
|
|
334
338
|
agent = self._agent
|
|
@@ -408,6 +412,45 @@ class InteractiveCore:
|
|
|
408
412
|
self._project_context = context
|
|
409
413
|
return context
|
|
410
414
|
|
|
415
|
+
def _build_subtree_hook_registry(self, already_loaded: str):
|
|
416
|
+
"""Build a session-scoped ``HookRegistry`` for subtree instruction rules.
|
|
417
|
+
|
|
418
|
+
Complements the up-front (nearest-wins walk-up) project context by
|
|
419
|
+
lazily attaching a subdirectory's instruction file the first time the
|
|
420
|
+
agent reads/edits a file under it. The hook is registered on a *fresh*
|
|
421
|
+
registry (never the global default) so its per-session dedup state stays
|
|
422
|
+
isolated and cannot leak into other agents/sessions.
|
|
423
|
+
|
|
424
|
+
Returns the registry to pass as ``Agent(hooks=...)``, or ``None`` when
|
|
425
|
+
``--no-context`` is set or the wrapper helper is unavailable (the caller
|
|
426
|
+
then constructs the agent without a custom registry).
|
|
427
|
+
"""
|
|
428
|
+
if getattr(self.config, "no_context", False):
|
|
429
|
+
return None
|
|
430
|
+
try:
|
|
431
|
+
from praisonai.integration.context_files import (
|
|
432
|
+
build_subtree_context_hook,
|
|
433
|
+
file_tool_matcher,
|
|
434
|
+
)
|
|
435
|
+
from praisonaiagents.hooks import HookEvent, HookRegistry
|
|
436
|
+
except ImportError:
|
|
437
|
+
return None
|
|
438
|
+
|
|
439
|
+
try:
|
|
440
|
+
budget = getattr(self.config, "context_token_budget", 0) or 0
|
|
441
|
+
hook = build_subtree_context_hook(already_loaded, max_chars=budget)
|
|
442
|
+
registry = HookRegistry()
|
|
443
|
+
registry.register_function(
|
|
444
|
+
event=HookEvent.AFTER_TOOL,
|
|
445
|
+
func=hook,
|
|
446
|
+
matcher=file_tool_matcher(),
|
|
447
|
+
name="subtree_instruction_injection",
|
|
448
|
+
)
|
|
449
|
+
return registry
|
|
450
|
+
except Exception as e: # pragma: no cover - defensive wiring
|
|
451
|
+
logger.warning(f"Could not build subtree context hook: {e}")
|
|
452
|
+
return None
|
|
453
|
+
|
|
411
454
|
# ========== Tool Management ==========
|
|
412
455
|
|
|
413
456
|
def get_tools(self) -> List:
|
|
@@ -79,6 +79,9 @@ def _start_interactive_mode(self, args):
|
|
|
79
79
|
'error_tasks': [], # Queue of error tasks to display
|
|
80
80
|
'tool_activity': None, # Current tool being used
|
|
81
81
|
'last_status_line': None, # For transient status updates
|
|
82
|
+
'stream_deltas': queue_module.Queue(), # Real streaming deltas (worker -> display)
|
|
83
|
+
'stream_active': False, # True while a turn is actively streaming
|
|
84
|
+
'stream_header_shown': False, # Whether the streaming header was printed
|
|
82
85
|
}
|
|
83
86
|
|
|
84
87
|
# Task counter for unique IDs (FIFO position tracking)
|
|
@@ -220,18 +223,51 @@ def _start_interactive_mode(self, args):
|
|
|
220
223
|
"""
|
|
221
224
|
while display_running['value']:
|
|
222
225
|
try:
|
|
223
|
-
#
|
|
224
|
-
|
|
226
|
+
# Render real streaming deltas as they arrive from the worker.
|
|
227
|
+
# This replaces the previous post-hoc simulated word replay:
|
|
228
|
+
# text now appears incrementally, in real time-to-first-token.
|
|
229
|
+
stream_deltas = worker_state.get('stream_deltas')
|
|
230
|
+
if stream_deltas is not None:
|
|
231
|
+
drained_any = False
|
|
232
|
+
while True:
|
|
233
|
+
try:
|
|
234
|
+
delta = stream_deltas.get_nowait()
|
|
235
|
+
except queue_module.Empty:
|
|
236
|
+
break
|
|
237
|
+
if delta is None:
|
|
238
|
+
continue
|
|
239
|
+
# First delta of a turn: clear status line + print header.
|
|
240
|
+
if not worker_state.get('stream_header_shown'):
|
|
241
|
+
if worker_state.get('last_status_line'):
|
|
242
|
+
console.print("\r" + " " * 80 + "\r", end="")
|
|
243
|
+
worker_state['last_status_line'] = None
|
|
244
|
+
console.print() # New line before response
|
|
245
|
+
if verbose_mode:
|
|
246
|
+
console.print("[bold blue]A:[/bold blue] ", end="")
|
|
247
|
+
worker_state['stream_header_shown'] = True
|
|
248
|
+
console.print(delta, end="")
|
|
249
|
+
sys.stdout.flush()
|
|
250
|
+
drained_any = True
|
|
251
|
+
if drained_any:
|
|
252
|
+
# Yield briefly so input/status threads stay responsive.
|
|
253
|
+
time.sleep(0.001)
|
|
254
|
+
|
|
255
|
+
# Check for completed tasks to display (FIFO order guaranteed).
|
|
256
|
+
# Defer finalisation until the delta queue is fully drained so the
|
|
257
|
+
# last streamed chunks are not clipped by the completion path.
|
|
258
|
+
deltas_pending = (
|
|
259
|
+
stream_deltas is not None and not stream_deltas.empty()
|
|
260
|
+
)
|
|
261
|
+
if worker_state['completed_tasks'] and not deltas_pending:
|
|
225
262
|
task = worker_state['completed_tasks'].pop(0)
|
|
226
263
|
response = task.get('response', '')
|
|
264
|
+
streamed = task.get('streamed', False)
|
|
227
265
|
|
|
228
266
|
# Clear any transient status line
|
|
229
267
|
if worker_state.get('last_status_line'):
|
|
230
268
|
console.print("\r" + " " * 80 + "\r", end="")
|
|
231
269
|
worker_state['last_status_line'] = None
|
|
232
270
|
|
|
233
|
-
console.print() # New line before response
|
|
234
|
-
|
|
235
271
|
if verbose_mode:
|
|
236
272
|
# VERBOSE: Full task lifecycle with metadata
|
|
237
273
|
question = task.get('question', '')
|
|
@@ -240,18 +276,22 @@ def _start_interactive_mode(self, args):
|
|
|
240
276
|
word_count = len(response.split()) if response else 0
|
|
241
277
|
q_display = question[:80] + "..." if len(question) > 80 else question
|
|
242
278
|
|
|
243
|
-
|
|
279
|
+
if not streamed:
|
|
280
|
+
console.print() # New line before response
|
|
281
|
+
console.print(f"\n[bold cyan]─── Task #{task_id} completed ({elapsed:.1f}s, {word_count} words) ───[/bold cyan]")
|
|
244
282
|
console.print(f"[bold green]Q:[/bold green] {q_display}")
|
|
245
|
-
|
|
283
|
+
if not streamed:
|
|
284
|
+
console.print(f"[bold blue]A:[/bold blue] ", end="")
|
|
246
285
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
286
|
+
if streamed:
|
|
287
|
+
# Text already rendered live via stream_deltas; just finalise.
|
|
288
|
+
console.print()
|
|
289
|
+
else:
|
|
290
|
+
# Fallback path (streaming unavailable): print the full text.
|
|
291
|
+
console.print() # New line before response
|
|
292
|
+
if response:
|
|
293
|
+
console.print(response, end="")
|
|
294
|
+
console.print()
|
|
255
295
|
|
|
256
296
|
if verbose_mode:
|
|
257
297
|
task_id = task.get('task_id', 0)
|
|
@@ -860,6 +900,121 @@ Provide a concise summary (max 200 words):"""
|
|
|
860
900
|
except Exception as e:
|
|
861
901
|
console.print(f"[red]Error compacting: {e}[/red]")
|
|
862
902
|
|
|
903
|
+
|
|
904
|
+
# Coarse per-model context-window map used only as a fallback when a precise
|
|
905
|
+
# lookup is unavailable. Values are conservative (input side); the output
|
|
906
|
+
# reserve is subtracted separately by _usable_context_budget().
|
|
907
|
+
_MODEL_CONTEXT_WINDOW = {
|
|
908
|
+
'gpt-4o': 128000,
|
|
909
|
+
'gpt-4o-mini': 128000,
|
|
910
|
+
'gpt-4-turbo': 128000,
|
|
911
|
+
'gpt-4': 8192,
|
|
912
|
+
'gpt-3.5-turbo': 16385,
|
|
913
|
+
'o1': 200000,
|
|
914
|
+
'o1-mini': 128000,
|
|
915
|
+
'claude-3-5-sonnet': 200000,
|
|
916
|
+
'claude-3-5-haiku': 200000,
|
|
917
|
+
'claude-3-opus': 200000,
|
|
918
|
+
'claude-3-sonnet': 200000,
|
|
919
|
+
'claude-3-haiku': 200000,
|
|
920
|
+
'gemini-1.5-pro': 1000000,
|
|
921
|
+
'gemini-1.5-flash': 1000000,
|
|
922
|
+
'gemini-2.0-flash': 1000000,
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
|
|
926
|
+
def _model_context_window(model):
|
|
927
|
+
"""Best-effort context-window size (in tokens) for a model name.
|
|
928
|
+
|
|
929
|
+
Prefers litellm's model registry when available, then falls back to a
|
|
930
|
+
coarse built-in map, then a safe default. Never raises.
|
|
931
|
+
"""
|
|
932
|
+
if not model:
|
|
933
|
+
return 128000
|
|
934
|
+
name = str(model).lower().split('/')[-1]
|
|
935
|
+
try:
|
|
936
|
+
import litellm # type: ignore
|
|
937
|
+
info = litellm.get_model_info(name)
|
|
938
|
+
window = info.get('max_input_tokens') or info.get('max_tokens')
|
|
939
|
+
if window:
|
|
940
|
+
return int(window)
|
|
941
|
+
except Exception:
|
|
942
|
+
pass
|
|
943
|
+
for key, window in _MODEL_CONTEXT_WINDOW.items():
|
|
944
|
+
if name.startswith(key) or key in name:
|
|
945
|
+
return window
|
|
946
|
+
return 128000
|
|
947
|
+
|
|
948
|
+
|
|
949
|
+
def _usable_context_budget(session_state):
|
|
950
|
+
"""Usable input-token budget = context window minus the output reserve."""
|
|
951
|
+
config = session_state.get('context_config', {}) or {}
|
|
952
|
+
model = session_state.get('current_model')
|
|
953
|
+
window = _model_context_window(model)
|
|
954
|
+
output_reserve = int(config.get('output_reserve', 8000) or 8000)
|
|
955
|
+
# Never let the output reserve swallow the whole window; on small-context
|
|
956
|
+
# models (e.g. gpt-4 with an 8192 window) an 8000-token reserve would leave
|
|
957
|
+
# almost no usable input budget and trigger compaction on nearly every turn.
|
|
958
|
+
output_reserve = min(output_reserve, max(1, window // 4))
|
|
959
|
+
return max(1, window - output_reserve)
|
|
960
|
+
|
|
961
|
+
|
|
962
|
+
def _maybe_auto_compact(self, console, session_state):
|
|
963
|
+
"""Proactively compact conversation history when nearing the context budget.
|
|
964
|
+
|
|
965
|
+
Honours session_state['context_config']['auto_compact'] (write-only until
|
|
966
|
+
now) and the configured threshold. Reuses the existing _handle_compact_command
|
|
967
|
+
summariser rather than reimplementing compaction. Returns True if a
|
|
968
|
+
compaction ran, else False. Never raises.
|
|
969
|
+
"""
|
|
970
|
+
try:
|
|
971
|
+
config = session_state.get('context_config', {}) or {}
|
|
972
|
+
if not config.get('auto_compact', True):
|
|
973
|
+
return False
|
|
974
|
+
|
|
975
|
+
history = session_state.get('conversation_history', []) or []
|
|
976
|
+
if len(history) < 4:
|
|
977
|
+
return False
|
|
978
|
+
|
|
979
|
+
try:
|
|
980
|
+
from praisonaiagents.context.tokens import estimate_messages_tokens
|
|
981
|
+
used_tokens = estimate_messages_tokens(history)
|
|
982
|
+
except Exception:
|
|
983
|
+
used_tokens = sum(len(str(m.get('content', ''))) for m in history) // 4
|
|
984
|
+
|
|
985
|
+
budget = _usable_context_budget(session_state)
|
|
986
|
+
threshold = float(config.get('threshold', 0.8) or 0.8)
|
|
987
|
+
|
|
988
|
+
if used_tokens < budget * threshold:
|
|
989
|
+
return False
|
|
990
|
+
|
|
991
|
+
console.print(
|
|
992
|
+
f"[dim]Auto-compacting: ~{used_tokens} tokens ≈ "
|
|
993
|
+
f"{int(100 * used_tokens / budget)}% of usable budget "
|
|
994
|
+
f"({budget}).[/dim]"
|
|
995
|
+
)
|
|
996
|
+
_handle_compact_command(self, console, session_state)
|
|
997
|
+
return True
|
|
998
|
+
except Exception:
|
|
999
|
+
return False
|
|
1000
|
+
|
|
1001
|
+
|
|
1002
|
+
def _is_context_length_error(exc):
|
|
1003
|
+
"""Heuristically detect context-window/token-limit errors from a provider."""
|
|
1004
|
+
message = str(exc).lower()
|
|
1005
|
+
markers = (
|
|
1006
|
+
'context length',
|
|
1007
|
+
'context window',
|
|
1008
|
+
'maximum context',
|
|
1009
|
+
'context_length_exceeded',
|
|
1010
|
+
'too many tokens',
|
|
1011
|
+
'reduce the length',
|
|
1012
|
+
'prompt is too long',
|
|
1013
|
+
'string too long',
|
|
1014
|
+
)
|
|
1015
|
+
return any(marker in message for marker in markers)
|
|
1016
|
+
|
|
1017
|
+
|
|
863
1018
|
def _handle_context_command(self, console, args, session_state):
|
|
864
1019
|
"""
|
|
865
1020
|
Handle /context command - manage context budgeting and monitoring.
|
|
@@ -1229,43 +1384,110 @@ def _start_execution_worker(self, tools_list, console, session_state):
|
|
|
1229
1384
|
warnings.filterwarnings("ignore")
|
|
1230
1385
|
|
|
1231
1386
|
model = session_state.get('current_model')
|
|
1232
|
-
|
|
1233
|
-
|
|
1387
|
+
|
|
1388
|
+
# Proactive auto-compaction: if the running history is
|
|
1389
|
+
# nearing the model's usable context budget and
|
|
1390
|
+
# auto_compact is enabled, summarise older turns before
|
|
1391
|
+
# building the agent so the turn stays within budget.
|
|
1392
|
+
_maybe_auto_compact(self, console, session_state)
|
|
1393
|
+
|
|
1234
1394
|
live_status.update_status("Creating agent...")
|
|
1235
|
-
|
|
1236
|
-
# Build backstory with context
|
|
1237
|
-
backstory = "You are a helpful AI assistant with access to tools for file operations, code intelligence, and shell commands."
|
|
1238
1395
|
|
|
1239
1396
|
# Auto-load AGENTS.md/CLAUDE.md project context (unless --no-context)
|
|
1397
|
+
_project_context = None
|
|
1240
1398
|
if not getattr(getattr(self, 'args', None), 'no_context', False):
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
for
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1399
|
+
_project_context = _load_cli_project_context(self)
|
|
1400
|
+
|
|
1401
|
+
def _build_agent():
|
|
1402
|
+
# Build the agent from the CURRENT conversation history
|
|
1403
|
+
# so that a post-compaction retry rebuilds with the
|
|
1404
|
+
# summarised (smaller) context rather than reusing the
|
|
1405
|
+
# stale, oversized backstory baked in before compaction.
|
|
1406
|
+
backstory = "You are a helpful AI assistant with access to tools for file operations, code intelligence, and shell commands."
|
|
1407
|
+
if _project_context:
|
|
1408
|
+
backstory += "\n\n# Project Context\n" + _project_context
|
|
1409
|
+
|
|
1410
|
+
history = session_state.get('conversation_history', [])
|
|
1411
|
+
if history:
|
|
1412
|
+
recent = history[-10:]
|
|
1413
|
+
context_lines = []
|
|
1414
|
+
for msg in recent:
|
|
1415
|
+
role = msg.get('role', 'unknown')
|
|
1416
|
+
content = msg.get('content', '')[:200]
|
|
1417
|
+
context_lines.append(f"{role}: {content}")
|
|
1418
|
+
if context_lines:
|
|
1419
|
+
backstory += "\n\nRecent conversation context:\n" + "\n".join(context_lines)
|
|
1420
|
+
|
|
1421
|
+
return Agent(
|
|
1422
|
+
name="Assistant",
|
|
1423
|
+
role="Helpful AI Assistant",
|
|
1424
|
+
goal="Help the user with their tasks",
|
|
1425
|
+
backstory=backstory,
|
|
1426
|
+
tools=tools_list if tools_list else None,
|
|
1427
|
+
output="minimal",
|
|
1428
|
+
llm=model
|
|
1429
|
+
)
|
|
1430
|
+
|
|
1431
|
+
agent = _build_agent()
|
|
1432
|
+
|
|
1265
1433
|
live_status.update_status(f"Task #{task_id}: Calling LLM...")
|
|
1266
1434
|
|
|
1267
|
-
|
|
1268
|
-
|
|
1435
|
+
# Consume REAL token streaming from core (iter_stream yields
|
|
1436
|
+
# incremental chunks) and push each delta to the display thread
|
|
1437
|
+
# so text renders as it is generated — real time-to-first-token
|
|
1438
|
+
# instead of the previous post-hoc simulated word replay.
|
|
1439
|
+
response_str = ""
|
|
1440
|
+
streamed = False
|
|
1441
|
+
stream_deltas = worker_state.get('stream_deltas')
|
|
1442
|
+
try:
|
|
1443
|
+
worker_state['stream_header_shown'] = False
|
|
1444
|
+
worker_state['stream_active'] = True
|
|
1445
|
+
for chunk in agent.iter_stream(prompt):
|
|
1446
|
+
if chunk:
|
|
1447
|
+
response_str += chunk
|
|
1448
|
+
if stream_deltas is not None:
|
|
1449
|
+
stream_deltas.put(chunk)
|
|
1450
|
+
streamed = True
|
|
1451
|
+
except Exception:
|
|
1452
|
+
# If chunks were already emitted to the live display,
|
|
1453
|
+
# do NOT re-run the prompt via chat() — that would show
|
|
1454
|
+
# partial streamed tokens followed by a full second
|
|
1455
|
+
# answer. Keep the partial streamed text as-is and let
|
|
1456
|
+
# the display finalise it. Only fall back to the
|
|
1457
|
+
# non-streamed path when nothing streamed yet.
|
|
1458
|
+
if response_str:
|
|
1459
|
+
streamed = True
|
|
1460
|
+
else:
|
|
1461
|
+
try:
|
|
1462
|
+
response = agent.chat(prompt, stream=False)
|
|
1463
|
+
except Exception as chat_exc:
|
|
1464
|
+
# Reactive safety net: on a context-length
|
|
1465
|
+
# error, force a compaction (ignoring the
|
|
1466
|
+
# proactive threshold) and retry the turn once
|
|
1467
|
+
# instead of surfacing the raw provider error.
|
|
1468
|
+
# Skipped when the user has disabled
|
|
1469
|
+
# auto-compaction so their history is never
|
|
1470
|
+
# rewritten without consent.
|
|
1471
|
+
_auto_compact_enabled = (
|
|
1472
|
+
session_state.get('context_config', {}) or {}
|
|
1473
|
+
).get('auto_compact', True)
|
|
1474
|
+
if _is_context_length_error(chat_exc) and _auto_compact_enabled:
|
|
1475
|
+
console.print(
|
|
1476
|
+
"[yellow]Context limit hit; compacting "
|
|
1477
|
+
"and retrying...[/yellow]"
|
|
1478
|
+
)
|
|
1479
|
+
_handle_compact_command(self, console, session_state)
|
|
1480
|
+
# Rebuild the agent so the retry uses the
|
|
1481
|
+
# compacted history instead of the stale
|
|
1482
|
+
# oversized backstory.
|
|
1483
|
+
agent = _build_agent()
|
|
1484
|
+
response = agent.chat(prompt, stream=False)
|
|
1485
|
+
else:
|
|
1486
|
+
raise
|
|
1487
|
+
response_str = str(response) if response else ""
|
|
1488
|
+
streamed = False
|
|
1489
|
+
finally:
|
|
1490
|
+
worker_state['stream_active'] = False
|
|
1269
1491
|
|
|
1270
1492
|
# Calculate elapsed time
|
|
1271
1493
|
elapsed = time.time() - start_time
|
|
@@ -1277,6 +1499,7 @@ def _start_execution_worker(self, tools_list, console, session_state):
|
|
|
1277
1499
|
'response': response_str,
|
|
1278
1500
|
'elapsed': elapsed,
|
|
1279
1501
|
'status': 'completed',
|
|
1502
|
+
'streamed': streamed,
|
|
1280
1503
|
}
|
|
1281
1504
|
worker_state['completed_tasks'].append(completed_task)
|
|
1282
1505
|
|
|
@@ -1421,30 +1644,44 @@ def _process_interactive_prompt(self, prompt, tools_list, console, show_profilin
|
|
|
1421
1644
|
|
|
1422
1645
|
timings['llm_start'] = time.time()
|
|
1423
1646
|
|
|
1424
|
-
#
|
|
1425
|
-
|
|
1426
|
-
|
|
1647
|
+
# Consume REAL token streaming from core: render each incremental chunk
|
|
1648
|
+
# as it is generated (real time-to-first-token) rather than replaying a
|
|
1649
|
+
# finished string word-by-word with fixed sleeps.
|
|
1650
|
+
timings['display_start'] = time.time()
|
|
1651
|
+
response_str = ""
|
|
1652
|
+
streamed = False
|
|
1653
|
+
try:
|
|
1654
|
+
for chunk in agent.iter_stream(prompt):
|
|
1655
|
+
if chunk:
|
|
1656
|
+
response_str += chunk
|
|
1657
|
+
console.print(chunk, end="")
|
|
1658
|
+
sys.stdout.flush()
|
|
1659
|
+
streamed = True
|
|
1660
|
+
if response_str:
|
|
1661
|
+
console.print() # Final newline
|
|
1662
|
+
except Exception:
|
|
1663
|
+
if response_str:
|
|
1664
|
+
# Chunks were already printed to the console — do NOT re-run the
|
|
1665
|
+
# prompt via chat(), otherwise the user sees partial streamed
|
|
1666
|
+
# output followed by a full second answer. Keep the partial
|
|
1667
|
+
# streamed text and just terminate the line.
|
|
1668
|
+
streamed = True
|
|
1669
|
+
console.print() # Final newline
|
|
1670
|
+
else:
|
|
1671
|
+
# Nothing streamed yet: fall back to the non-streamed path.
|
|
1672
|
+
response = agent.chat(prompt, stream=False)
|
|
1673
|
+
response_str = str(response) if response else ""
|
|
1674
|
+
if response_str:
|
|
1675
|
+
console.print(response_str)
|
|
1427
1676
|
timings['llm_end'] = time.time()
|
|
1677
|
+
timings['display_end'] = time.time()
|
|
1428
1678
|
|
|
1429
1679
|
# Check if tools were used by looking at agent's tool execution history
|
|
1430
|
-
if hasattr(agent, '_tool_calls') and agent._tool_calls:
|
|
1680
|
+
if not streamed and hasattr(agent, '_tool_calls') and agent._tool_calls:
|
|
1431
1681
|
for tool_call in agent._tool_calls:
|
|
1432
1682
|
tool_name = tool_call.get('name', 'unknown')
|
|
1433
1683
|
console.print(f"[dim]⚙ Used tool: {tool_name}[/dim]")
|
|
1434
1684
|
|
|
1435
|
-
# Print response with simulated streaming effect
|
|
1436
|
-
timings['display_start'] = time.time()
|
|
1437
|
-
response_str = str(response) if response else ""
|
|
1438
|
-
if response_str:
|
|
1439
|
-
words = response_str.split()
|
|
1440
|
-
for i, word in enumerate(words):
|
|
1441
|
-
console.print(word + " ", end="")
|
|
1442
|
-
sys.stdout.flush()
|
|
1443
|
-
if i % 15 == 14: # Small pause every 15 words for streaming effect
|
|
1444
|
-
time.sleep(0.005)
|
|
1445
|
-
console.print() # Final newline
|
|
1446
|
-
timings['display_end'] = time.time()
|
|
1447
|
-
|
|
1448
1685
|
# Update session state with token estimates and history
|
|
1449
1686
|
if session_state is not None:
|
|
1450
1687
|
# Estimate tokens (rough: ~4 chars per token)
|
|
@@ -312,11 +312,24 @@ class LocalManagedAgent:
|
|
|
312
312
|
# Import tools lazily
|
|
313
313
|
tools = []
|
|
314
314
|
compute_bridged_tools = {"execute_command", "read_file", "write_file", "list_files"}
|
|
315
|
-
|
|
315
|
+
resolver = self._get_tool_resolver()
|
|
316
|
+
|
|
316
317
|
for name in resolved_names:
|
|
317
318
|
try:
|
|
318
|
-
|
|
319
|
-
|
|
319
|
+
# Route through the canonical ToolResolver chain
|
|
320
|
+
# (local -> core -> praisonai-tools -> plugins) so tools that
|
|
321
|
+
# resolve elsewhere in the wrapper resolve here too. Fall back
|
|
322
|
+
# to the historical praisonaiagents.tools getattr lookup when
|
|
323
|
+
# the resolver is unavailable so behaviour never narrows.
|
|
324
|
+
func = None
|
|
325
|
+
if resolver is not None:
|
|
326
|
+
try:
|
|
327
|
+
func = resolver.resolve(name)
|
|
328
|
+
except Exception as e:
|
|
329
|
+
logger.debug("[local_managed] resolver failed for %s: %s", name, e)
|
|
330
|
+
if func is None:
|
|
331
|
+
from praisonaiagents import tools as tool_module
|
|
332
|
+
func = getattr(tool_module, name, None)
|
|
320
333
|
if func is not None:
|
|
321
334
|
# Bridge shell-based tools to compute when available
|
|
322
335
|
if self._compute and name in compute_bridged_tools:
|
|
@@ -345,6 +358,31 @@ class LocalManagedAgent:
|
|
|
345
358
|
|
|
346
359
|
return tools
|
|
347
360
|
|
|
361
|
+
def _get_tool_resolver(self):
|
|
362
|
+
"""Return a cached canonical ToolResolver, or None if unavailable.
|
|
363
|
+
|
|
364
|
+
The resolver (owned by ``praisonai-code``) walks the full resolution
|
|
365
|
+
chain (local tools.py -> praisonaiagents.tools -> praisonai-tools ->
|
|
366
|
+
entry-point plugins), matching how tool names resolve in the YAML /
|
|
367
|
+
Python / other CLI paths. It is imported lazily and cached; if the
|
|
368
|
+
optional ``praisonai-code`` package is not installed, callers fall
|
|
369
|
+
back to the historical ``praisonaiagents.tools`` getattr lookup.
|
|
370
|
+
"""
|
|
371
|
+
resolver = getattr(self, "_tool_resolver", None)
|
|
372
|
+
if resolver is not None:
|
|
373
|
+
return resolver
|
|
374
|
+
if getattr(self, "_tool_resolver_unavailable", False):
|
|
375
|
+
return None
|
|
376
|
+
try:
|
|
377
|
+
from praisonai_code.tool_resolver import ToolResolver
|
|
378
|
+
resolver = ToolResolver()
|
|
379
|
+
except Exception as e: # praisonai-code optional / import failure
|
|
380
|
+
logger.debug("[local_managed] ToolResolver unavailable: %s", e)
|
|
381
|
+
self._tool_resolver_unavailable = True
|
|
382
|
+
return None
|
|
383
|
+
self._tool_resolver = resolver
|
|
384
|
+
return resolver
|
|
385
|
+
|
|
348
386
|
def _create_compute_bridge_tool(self, tool_name: str, original_func: Callable) -> Callable:
|
|
349
387
|
"""Create a compute-bridged version of a tool.
|
|
350
388
|
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""Path-safety helper for sandbox backends."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
logger = logging.getLogger(__name__)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def safe_sandbox_path(temp_dir: str | None, path: str) -> str | None:
|
|
10
|
+
"""Resolve a caller-supplied path to an absolute path inside temp_dir.
|
|
11
|
+
|
|
12
|
+
Returns None if the resolved path would escape the sandbox root,
|
|
13
|
+
preventing path-traversal attacks via sequences like `../../../etc/passwd`.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
temp_dir: The sandbox root directory
|
|
17
|
+
path: User-supplied path to resolve
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
Safe absolute path within sandbox, or None if path escapes sandbox
|
|
21
|
+
"""
|
|
22
|
+
if not temp_dir:
|
|
23
|
+
return None
|
|
24
|
+
candidate = os.path.realpath(os.path.join(temp_dir, path.lstrip("/")))
|
|
25
|
+
sandbox_root = os.path.realpath(temp_dir)
|
|
26
|
+
if not (candidate == sandbox_root or candidate.startswith(sandbox_root + os.sep)):
|
|
27
|
+
logger.warning("Path traversal attempt blocked: %s", path)
|
|
28
|
+
return None
|
|
29
|
+
return candidate
|