PraisonAI 4.6.139__tar.gz → 4.6.141__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.139 → praisonai-4.6.141}/PKG-INFO +4 -4
- {praisonai-4.6.139 → praisonai-4.6.141}/PraisonAI.egg-info/PKG-INFO +4 -4
- {praisonai-4.6.139 → praisonai-4.6.141}/PraisonAI.egg-info/requires.txt +3 -3
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/app.py +7 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/knowledge.py +13 -2
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/interactive/async_tui.py +90 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/observability/hooks.py +102 -3
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/orchestrator.py +37 -22
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/security/__init__.py +7 -2
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/security/injection.py +59 -8
- praisonai-4.6.141/praisonai/version.py +1 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/pyproject.toml +3 -3
- praisonai-4.6.139/praisonai/version.py +0 -1
- {praisonai-4.6.139 → praisonai-4.6.141}/PraisonAI.egg-info/SOURCES.txt +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/PraisonAI.egg-info/dependency_links.txt +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/PraisonAI.egg-info/entry_points.txt +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/PraisonAI.egg-info/top_level.txt +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/README.md +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/__main__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_approval_spec.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_async_bridge.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_bootstrap.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/api_md.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/docs_extractor.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/docs_generator.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/generator.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/python_docs_extractor.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/python_extractor.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/rust_docs_extractor.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/rust_extractor.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/topic_normalizer.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/ts_docs_extractor.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/typescript_extractor.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_entrypoint.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_framework_availability.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_lazy_cache.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_lockmap.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_logging.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_safe_loader.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/acp/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/acp/config.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/acp/safe_edit.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/acp/server.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/acp/session.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/adapters/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/adapters/readers.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/adapters/rerankers.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/adapters/retrievers.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/adapters/vector_stores.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/agent.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/agent_scheduler.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/agents_generator.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/api/agent_invoke.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/api/call.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/app/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/app/agentos.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/async_agent_scheduler.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/audit/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/audit/agent_centric.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/auto.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/bots/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/agent.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/benchmark.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/cdp_agent.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/cdp_utils.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/cli.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/diagnostics.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/launcher.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/playwright_agent.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/profiling.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/protocol.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/report.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/server.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/sessions.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/video.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/a2a.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/assistants.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/audio.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/batches.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/completions.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/container_files.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/containers.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/embeddings.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/files.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/fine_tuning.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/guardrails.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/images.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/mcp.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/messages.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/moderations.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/ocr.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/passthrough.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/rag.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/realtime.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/rerank.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/responses.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/search.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/skills.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/vector_store_files.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/vector_stores.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/videos.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/claw/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/_paths.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/_shim.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/_warnings.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/app.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/approval_backend.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/branding.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/acp.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/agent.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/agents.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/attach.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/audit.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/auth.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/batch.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/benchmark.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/bot.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/browser.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/call.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/chat.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/checkpoint.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/claw.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/code.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/command.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/commit.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/completion.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/config.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/context.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/daemon.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/dashboard.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/debug.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/deploy.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/diag.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/docs.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/doctor.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/endpoints.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/environment.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/eval.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/examples.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/flow.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/gateway.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/github.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/hooks.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/identity.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/init.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/kanban.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/langextract.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/langfuse.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/loop.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/lsp.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/managed.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/mcp.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/memory.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/mint_link.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/models.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/n8n.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/obs.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/onboard.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/package.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/pairing.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/paths.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/permissions.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/plugins.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/port.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/profile.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/publish.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/rag.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/realtime.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/recipe.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/replay.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/research.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/retrieval.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/rules.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/run.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/sandbox.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/schedule.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/serve.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/session.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/setup.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/skills.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/standardise.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/templates.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/test.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/todo.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/tools.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/traces.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/tracker.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/train.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/ui.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/up.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/validate.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/version.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/workflow.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/config_loader.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/configuration/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/configuration/config.schema.json +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/execution/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/fallback_schema.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/acp.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/agent_scheduler.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/agent_tools.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/approval.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/background.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/bots_cli.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/deploy.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/endpoints.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/eval.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/gateway.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/ollama.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/onboard.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/persistence.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/recipe.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/recipe_optimizer.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/sandbox_cli.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/serve.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/templates.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/tools.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/tui/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/tui/app.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/workflow.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/interactive/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/interactive/core.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/langfuse_client.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/direct_prompt.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/dispatch/argparse_builder.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/framework_run.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/interactive_legacy.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/workflow_commands.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/main.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/output/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/schedule_cli.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/schema_provider.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/session/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/state/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/ui/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/unified_schema.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/utils/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli_backends/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/agent_tools.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/diff/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/diff/diff_strategy.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/tools/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/tools/apply_diff.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/tools/execute_command.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/tools/list_files.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/tools/read_file.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/tools/search_replace.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/tools/write_file.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/utils/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/utils/file_utils.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/utils/ignore_utils.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/utils/text_utils.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/config/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/config/schema.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/config/validator.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/_storage_path.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/artifact_store.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/config.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/history_store.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/queue.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/setup.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/terminal_logger.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/daemon/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/db/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/db/adapter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/api.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/docker.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/doctor.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/main.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/models.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/providers/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/providers/_registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/providers/aws.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/providers/azure.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/providers/base.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/providers/gcp.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/schema.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/a2u_server.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/discovery.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/a2a.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/a2u.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/agents_api.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/base.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/mcp.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/openai_compat.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/recipe.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/tools_mcp.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/server.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/flow/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/flow/client.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/flow/components/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/flow/converter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/flow/helpers.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/_config_builder.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/autogen_adapter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/base.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/crewai_adapter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/praisonai_adapter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/validators.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/workflow_framework.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/gateway/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/inbuilt_tools/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/inc/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/inc/config.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/inc/models.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/bridges/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/bridges/approvals_bridge.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/bridges/hooks_query.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/bridges/kanban_bridge.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/bridges/schedules_runner.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/bridges/usage_bridge.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/bridges/workflows_service.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/context_files.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/gateway_host.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/host_app.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/pages/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/pages/bot_health.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/pages/workflow_runs.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/_session_info.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/_tool_aliases.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/_unified_registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/backend_registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/base.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/claude_code.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/codex_cli.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/compute/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/compute/daytona.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/compute/docker.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/compute/e2b.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/compute/flyio.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/compute/local.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/compute/modal_compute.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/cursor_cli.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/db_session_adapter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/gemini_cli.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/hosted_agent.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/local_agent.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/managed_agents.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/managed_local.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/sandboxed_agent.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/jobs/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/jobs/executor.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/jobs/models.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/jobs/path_validation.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/jobs/router.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/jobs/server.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/jobs/store.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/kanban/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/llm/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/llm/catalogue.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/llm/config.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/llm/credentials.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/llm/env.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/llm/gateways.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/llm/registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/agents.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/capabilities.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/cli_tools.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/extended_capabilities.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/knowledge.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/memory.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/prompts.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/resources.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/tools_bridge.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/auth/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/auth/api_key.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/auth/oauth.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/auth/oidc.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/auth/scopes.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/cli.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/elicitation.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/icons.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/recipe_adapter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/recipe_cli.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/sampling.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/server.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/tasks.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/tool_index.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/transports/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/transports/http_stream.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/transports/stdio.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/n8n/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/n8n/client.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/n8n/converter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/n8n/preview.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/n8n/reverse_converter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/observability/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/observability/langextract.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/observability/langfuse.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/_valkey_client.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/config.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/_sql_base.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/async_mysql.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/async_postgres.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/async_sqlite.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/base.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/json_store.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/mysql.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/postgres.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/singlestore.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/sqlite.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/supabase.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/surrealdb.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/turso.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/factory.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/hooks/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/hooks/agent_hooks.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/base.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/cassandra.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/chroma.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/clickhouse.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/couchbase.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/lancedb.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/milvus.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/pgvector.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/pinecone.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/qdrant.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/redis_vector.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/weaviate.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/migrations/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/migrations/manager.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/async_mongodb.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/base.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/dynamodb.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/firestore.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/gcs.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/memory.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/mongodb.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/redis.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/upstash.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/valkey.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/tests/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/tests/test_all_backends.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/tests/test_registry_lazy.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/tests/test_valkey_backends.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/profiler.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/push/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/push/client.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/push/transports.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/bridge.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/core.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/exceptions.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/history.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/models.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/operations.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/policy.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/runtime.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/security.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/serve.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/server.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/analyzer.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/applier.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/judge.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/plan.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/player.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/reader.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/storage.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/writer.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/runtime/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/runtime/__main__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/_compat.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/_registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/_shell.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/daytona.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/docker.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/e2b.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/modal.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/sandlock.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/ssh.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/subprocess.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/_base_scheduler.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/_dispatch.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/agent_scheduler.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/async_agent_scheduler.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/base.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/blueprint_catalogue.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/condition_gate.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/daemon_manager.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/deployment.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/executor.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/run_policy.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/shared.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/state_manager.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/suggestion_engine.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/yaml_loader.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/security/audit.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/security/protected.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/setup/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/setup/build.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/setup/post_install.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/setup/setup_conda_env.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/setup.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/ai_generator.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/config.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/dedupe.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/discovery.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/drift.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/engine.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/enhanced_templates.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/example_verifier.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/manifest.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/models.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/reports.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/templates.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/undo_redo.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/validator.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/storage/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/storage/dynamodb_adapter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/storage/mongodb_adapter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/storage/postgresql_adapter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/storage/redis_adapter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/storage/valkey_adapter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/batch_source.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/cli_docs_source.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/discovery.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/docs_source.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/examples_source.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/executor.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/models.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/report_viewer.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/reporter.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/runner.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/cache.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/dependency_checker.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/discovery.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/loader.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/resolver.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/security.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/tool_override.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/tools_doctor.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tool_registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tool_resolver.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tools/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tools/audio.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tools/glob_tool.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tools/grep_tool.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tools/kanban_tools.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tools/multiedit.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tools/skill_manage.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/_ollama.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/agents/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/agents/grader.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/agents/hook.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/agents/models.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/agents/orchestrator.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/agents/storage.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/llm/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/llm/trainer.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train_vision.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui/_aiui_datastore.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui/_external_agents.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui/callbacks.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui/components/aicoder.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui/context.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui/database_config.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_agents/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_agents/default_app.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_bot/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_bot/default_app.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_chat/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_chat/default_app.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_dashboard/default_app.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_realtime/__init__.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_realtime/default_app.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/upload_vision.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/setup.cfg +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_agents_playbook.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_approval_system.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_basic.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_cli_features.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_custom_tools_fix.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_double_api_fix.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_n8n_agent_invoke.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_n8n_cli_feature.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_n8n_integration.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_phase2_refactor.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_recipe.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_registry.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_runner.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_sandboxed_agent_compatibility.py +0 -0
- {praisonai-4.6.139 → praisonai-4.6.141}/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.141
|
|
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.144
|
|
15
|
+
Requires-Dist: praisonai-code>=0.0.40
|
|
16
|
+
Requires-Dist: praisonai-bot>=0.0.25
|
|
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.141
|
|
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.144
|
|
15
|
+
Requires-Dist: praisonai-code>=0.0.40
|
|
16
|
+
Requires-Dist: praisonai-bot>=0.0.25
|
|
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
|
|
@@ -137,3 +137,10 @@ def _load_agents_from_config(config_path: str, console) -> list:
|
|
|
137
137
|
console.print(f"[yellow]Warning: Could not load agents from config: {e}[/yellow]")
|
|
138
138
|
|
|
139
139
|
return agents
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
# Expose the command under the name the praisonai-code lazy loader looks up
|
|
143
|
+
# via getattr(module, "app"), so the wrapper owns the `app` command when
|
|
144
|
+
# installed (C8.2). Without this alias the loader raises AttributeError and
|
|
145
|
+
# silently falls back to the inline duplicate in praisonai-code.
|
|
146
|
+
app = app_command
|
|
@@ -326,7 +326,19 @@ def knowledge_search(
|
|
|
326
326
|
user_id=user_id, agent_id=agent_id, run_id=run_id,
|
|
327
327
|
)
|
|
328
328
|
|
|
329
|
-
|
|
329
|
+
# Normalize search results to a list of dicts.
|
|
330
|
+
# Knowledge.search() may return a typed SearchResult dataclass,
|
|
331
|
+
# a legacy dict with a "results" key, or a plain list.
|
|
332
|
+
if hasattr(results, "to_legacy_format"):
|
|
333
|
+
result_list = results.to_legacy_format().get("results", [])
|
|
334
|
+
elif isinstance(results, dict):
|
|
335
|
+
result_list = results.get("results", [])
|
|
336
|
+
elif isinstance(results, list):
|
|
337
|
+
result_list = results
|
|
338
|
+
else:
|
|
339
|
+
result_list = []
|
|
340
|
+
|
|
341
|
+
if not result_list:
|
|
330
342
|
console.print("[yellow]No results found.[/yellow]")
|
|
331
343
|
return
|
|
332
344
|
|
|
@@ -337,7 +349,6 @@ def knowledge_search(
|
|
|
337
349
|
table.add_column("Source", width=20)
|
|
338
350
|
table.add_column("Content", width=60)
|
|
339
351
|
|
|
340
|
-
result_list = results.get('results', results) if isinstance(results, dict) else results
|
|
341
352
|
for i, result in enumerate(result_list[:top_k], 1):
|
|
342
353
|
if isinstance(result, dict):
|
|
343
354
|
score = f"{result.get('score', 0):.3f}" if result.get('score') else "-"
|
|
@@ -30,6 +30,9 @@ from datetime import datetime
|
|
|
30
30
|
logger = logging.getLogger(__name__)
|
|
31
31
|
_debug_initialized = False
|
|
32
32
|
|
|
33
|
+
# Sentinel marking a failed registry build so it is not retried every command.
|
|
34
|
+
_REGISTRY_FAILED = object()
|
|
35
|
+
|
|
33
36
|
def _init_debug_logging():
|
|
34
37
|
"""Initialize debug logging to file. Only called when debug mode is enabled."""
|
|
35
38
|
global _debug_initialized
|
|
@@ -208,6 +211,7 @@ class AsyncTUI:
|
|
|
208
211
|
self._workspace_files: List[str] = [] # Files in workspace for @ completion
|
|
209
212
|
self._runtime = None # InteractiveRuntime for ACP/LSP
|
|
210
213
|
self._runtime_started = False
|
|
214
|
+
self._registry = None # Unified command registry (lazy)
|
|
211
215
|
|
|
212
216
|
# Terminal size
|
|
213
217
|
self.term_width, self.term_height = shutil.get_terminal_size((80, 24))
|
|
@@ -482,6 +486,56 @@ class AsyncTUI:
|
|
|
482
486
|
if self._app:
|
|
483
487
|
self._app.invalidate()
|
|
484
488
|
|
|
489
|
+
# Built-in slash commands registered into the unified registry so /help
|
|
490
|
+
# and autocomplete stay in lock-step with the dispatch branches below.
|
|
491
|
+
_BUILTIN_COMMANDS = {
|
|
492
|
+
"help": "Show this help",
|
|
493
|
+
"exit": "Exit Praison AI",
|
|
494
|
+
"quit": "Exit Praison AI",
|
|
495
|
+
"clear": "Clear conversation",
|
|
496
|
+
"new": "Start new conversation",
|
|
497
|
+
"model": "Show or change model",
|
|
498
|
+
"session": "Show current session info",
|
|
499
|
+
"sessions": "List all saved sessions",
|
|
500
|
+
"continue": "Continue most recent session",
|
|
501
|
+
"history": "Show conversation history",
|
|
502
|
+
"export": "Export conversation to file",
|
|
503
|
+
"import": "Import conversation from file",
|
|
504
|
+
"cost": "Show token usage and cost",
|
|
505
|
+
"status": "Show ACP/LSP runtime status",
|
|
506
|
+
"auto": "Toggle autonomy mode (auto-delegate complex tasks)",
|
|
507
|
+
"debug": "Toggle debug logging",
|
|
508
|
+
"plan": "Create a step-by-step plan for a task",
|
|
509
|
+
"handoff": "Delegate to specialized agent (code/research/review/docs)",
|
|
510
|
+
"compact": "Toggle compact output mode",
|
|
511
|
+
"multiline": "Toggle multiline input mode",
|
|
512
|
+
"files": "List workspace files for @ mentions",
|
|
513
|
+
"queue": "Show pending prompts in queue",
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
def _get_registry(self):
|
|
517
|
+
"""Lazily build the unified command registry (built-ins + custom).
|
|
518
|
+
|
|
519
|
+
Custom ``.praisonai/commands/*.md`` commands become first-class
|
|
520
|
+
``/name`` entries here, driven from the same discovery that powers
|
|
521
|
+
``praisonai run --command``. Failures degrade to built-ins only.
|
|
522
|
+
"""
|
|
523
|
+
if self._registry is None:
|
|
524
|
+
try:
|
|
525
|
+
from praisonai_code.cli.interactive.command_registry import (
|
|
526
|
+
create_default_registry,
|
|
527
|
+
)
|
|
528
|
+
|
|
529
|
+
self._registry = create_default_registry(
|
|
530
|
+
self._BUILTIN_COMMANDS, include_custom=True
|
|
531
|
+
)
|
|
532
|
+
except Exception as exc: # pragma: no cover - defensive
|
|
533
|
+
logger.debug("Command registry unavailable: %s", exc)
|
|
534
|
+
self._registry = _REGISTRY_FAILED
|
|
535
|
+
if self._registry is _REGISTRY_FAILED:
|
|
536
|
+
return None
|
|
537
|
+
return self._registry
|
|
538
|
+
|
|
485
539
|
def _handle_command(self, command: str) -> bool:
|
|
486
540
|
"""Handle slash commands. Returns True if handled."""
|
|
487
541
|
parts = command.split(maxsplit=1)
|
|
@@ -529,6 +583,17 @@ Tips:
|
|
|
529
583
|
Use @filename to include file contents in your prompt
|
|
530
584
|
Type multiple prompts while AI is thinking (queued)
|
|
531
585
|
Use --debug flag or /debug command to enable debug logging"""
|
|
586
|
+
registry = self._get_registry()
|
|
587
|
+
if registry:
|
|
588
|
+
custom = [
|
|
589
|
+
c for c in registry.list_commands()
|
|
590
|
+
if c.name not in self._BUILTIN_COMMANDS and c.kind.value != "builtin"
|
|
591
|
+
]
|
|
592
|
+
if custom:
|
|
593
|
+
lines = ["", "Custom Commands:"]
|
|
594
|
+
for c in custom:
|
|
595
|
+
lines.append(f" /{c.name:<14} {c.description}")
|
|
596
|
+
help_text += "\n" + "\n".join(lines)
|
|
532
597
|
self.messages.append(ChatMessage(role="system", content=help_text))
|
|
533
598
|
return True
|
|
534
599
|
|
|
@@ -807,6 +872,31 @@ Example: /handoff code "refactor the auth module" """
|
|
|
807
872
|
return True
|
|
808
873
|
|
|
809
874
|
else:
|
|
875
|
+
# Not a built-in: consult the unified command registry so custom
|
|
876
|
+
# .praisonai/commands/*.md commands are first-class /name commands.
|
|
877
|
+
registry = self._get_registry()
|
|
878
|
+
resolved = registry.get(cmd) if registry else None
|
|
879
|
+
if resolved is not None and resolved.handler is not None:
|
|
880
|
+
try:
|
|
881
|
+
prompt = resolved.handler(args)
|
|
882
|
+
except Exception as exc:
|
|
883
|
+
self.messages.append(ChatMessage(
|
|
884
|
+
role="system",
|
|
885
|
+
content=f"Command /{cmd} failed: {exc}",
|
|
886
|
+
))
|
|
887
|
+
return True
|
|
888
|
+
if prompt:
|
|
889
|
+
self.messages.append(ChatMessage(
|
|
890
|
+
role="system", content=f"Running /{cmd}..."
|
|
891
|
+
))
|
|
892
|
+
self._update_output()
|
|
893
|
+
self._queue_or_execute(prompt)
|
|
894
|
+
else:
|
|
895
|
+
self.messages.append(ChatMessage(
|
|
896
|
+
role="system",
|
|
897
|
+
content=f"Command /{cmd} produced no output.",
|
|
898
|
+
))
|
|
899
|
+
return True
|
|
810
900
|
self.messages.append(ChatMessage(role="system", content=f"Unknown command: /{cmd}. Use /help for available commands."))
|
|
811
901
|
return True
|
|
812
902
|
|
|
@@ -7,12 +7,93 @@ used consistently across all entry points without duplicating logic.
|
|
|
7
7
|
|
|
8
8
|
import os
|
|
9
9
|
import sys
|
|
10
|
+
import inspect
|
|
10
11
|
import logging
|
|
11
12
|
from contextlib import contextmanager
|
|
12
|
-
from typing import Callable, Iterator, List, Optional
|
|
13
|
+
from typing import Any, Callable, Iterator, List, Optional
|
|
13
14
|
|
|
14
15
|
logger = logging.getLogger(__name__)
|
|
15
16
|
|
|
17
|
+
# Sinks installed via entry-point discovery for the current run. Torn down in
|
|
18
|
+
# finalize_observability so flush()/close() always runs.
|
|
19
|
+
_installed_sinks: List[Any] = []
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class _FanoutSink:
|
|
23
|
+
"""TraceSinkProtocol implementation that forwards to every registered sink.
|
|
24
|
+
|
|
25
|
+
Lets multiple third-party sinks (e.g. Langfuse + Arize + a custom sink) all
|
|
26
|
+
receive the same trace stream instead of the last-registered one replacing
|
|
27
|
+
the rest. Every per-sink call is guarded so a broken sink can't break a run.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(self, sinks: List[Any]):
|
|
31
|
+
self._sinks = list(sinks)
|
|
32
|
+
|
|
33
|
+
def emit(self, event: Any) -> None:
|
|
34
|
+
for s in self._sinks:
|
|
35
|
+
try:
|
|
36
|
+
s.emit(event)
|
|
37
|
+
except Exception: # noqa: BLE001 -- telemetry must not crash the caller
|
|
38
|
+
logger.debug("sink emit failed", exc_info=True)
|
|
39
|
+
|
|
40
|
+
def flush(self) -> None:
|
|
41
|
+
for s in self._sinks:
|
|
42
|
+
try:
|
|
43
|
+
s.flush()
|
|
44
|
+
except Exception: # noqa: BLE001
|
|
45
|
+
logger.debug("sink flush failed", exc_info=True)
|
|
46
|
+
|
|
47
|
+
def close(self) -> None:
|
|
48
|
+
for s in self._sinks:
|
|
49
|
+
try:
|
|
50
|
+
s.close()
|
|
51
|
+
except Exception: # noqa: BLE001
|
|
52
|
+
logger.debug("sink close failed", exc_info=True)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _factory_wants_tag(factory: Callable) -> bool:
|
|
56
|
+
"""Whether a sink factory accepts the framework tag as its first argument.
|
|
57
|
+
|
|
58
|
+
Only positional-capable parameters count. A ``**kwargs``-only factory would
|
|
59
|
+
otherwise be mis-detected and called as ``factory(framework_tag)``, raising
|
|
60
|
+
``TypeError`` and silently dropping the sink.
|
|
61
|
+
"""
|
|
62
|
+
try:
|
|
63
|
+
sig = inspect.signature(factory)
|
|
64
|
+
positional_kinds = {
|
|
65
|
+
inspect.Parameter.POSITIONAL_ONLY,
|
|
66
|
+
inspect.Parameter.POSITIONAL_OR_KEYWORD,
|
|
67
|
+
inspect.Parameter.VAR_POSITIONAL,
|
|
68
|
+
}
|
|
69
|
+
return any(p.kind in positional_kinds for p in sig.parameters.values())
|
|
70
|
+
except (ValueError, TypeError):
|
|
71
|
+
return False
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _install_discovered_sinks(framework_tag: str) -> None:
|
|
75
|
+
"""Discover, instantiate and wire third-party trace sinks (best-effort)."""
|
|
76
|
+
sinks: List[Any] = []
|
|
77
|
+
for factory in discover_observability_sinks():
|
|
78
|
+
try:
|
|
79
|
+
sink = factory(framework_tag) if _factory_wants_tag(factory) else factory()
|
|
80
|
+
if sink is not None:
|
|
81
|
+
sinks.append(sink)
|
|
82
|
+
except Exception: # noqa: BLE001 -- a broken plugin must not break a run
|
|
83
|
+
logger.debug("observability sink factory %r failed", factory, exc_info=True)
|
|
84
|
+
|
|
85
|
+
if not sinks:
|
|
86
|
+
return
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
from praisonaiagents.trace.protocol import TraceEmitter, set_default_emitter
|
|
90
|
+
except Exception: # noqa: BLE001 -- core trace API unavailable; skip silently
|
|
91
|
+
logger.debug("trace protocol unavailable; skipping sink wiring", exc_info=True)
|
|
92
|
+
return
|
|
93
|
+
|
|
94
|
+
_installed_sinks.extend(sinks)
|
|
95
|
+
set_default_emitter(TraceEmitter(sink=_FanoutSink(sinks), enabled=True))
|
|
96
|
+
|
|
16
97
|
|
|
17
98
|
def init_observability(framework_tag: str, *, tags: Optional[List[str]] = None) -> None:
|
|
18
99
|
"""
|
|
@@ -24,7 +105,11 @@ def init_observability(framework_tag: str, *, tags: Optional[List[str]] = None)
|
|
|
24
105
|
"""
|
|
25
106
|
# Try to initialize AgentOps if available
|
|
26
107
|
_init_agentops(framework_tag, tags or [])
|
|
27
|
-
|
|
108
|
+
|
|
109
|
+
# Honour the documented "praisonai.observability_sinks" entry-point group so
|
|
110
|
+
# third-party TraceSinkProtocol implementations are actually loaded.
|
|
111
|
+
_install_discovered_sinks(framework_tag)
|
|
112
|
+
|
|
28
113
|
# Future: Add other observability providers here
|
|
29
114
|
# _init_langfuse(framework_tag, tags)
|
|
30
115
|
# _init_wandb(framework_tag, tags)
|
|
@@ -43,7 +128,21 @@ def finalize_observability(_framework_tag: str, *, status: str = "Success") -> N
|
|
|
43
128
|
status: Session status ("Success", "Failure", etc.)
|
|
44
129
|
"""
|
|
45
130
|
_end_agentops(status)
|
|
46
|
-
|
|
131
|
+
|
|
132
|
+
# Flush + close any entry-point sinks installed for this run. Each call is
|
|
133
|
+
# guarded independently so a failing flush() still lets close() release the
|
|
134
|
+
# sink's resources.
|
|
135
|
+
for sink in _installed_sinks:
|
|
136
|
+
try:
|
|
137
|
+
sink.flush()
|
|
138
|
+
except Exception: # noqa: BLE001 -- telemetry must not crash the caller
|
|
139
|
+
logger.debug("sink flush failed", exc_info=True)
|
|
140
|
+
try:
|
|
141
|
+
sink.close()
|
|
142
|
+
except Exception: # noqa: BLE001
|
|
143
|
+
logger.debug("sink close failed", exc_info=True)
|
|
144
|
+
_installed_sinks.clear()
|
|
145
|
+
|
|
47
146
|
# Future: Add other observability providers here
|
|
48
147
|
# _end_langfuse(status)
|
|
49
148
|
# _end_wandb(status)
|
|
@@ -83,6 +83,21 @@ class PersistenceOrchestrator:
|
|
|
83
83
|
self._current_session: Optional[ConversationSession] = None
|
|
84
84
|
self._session_cache: Dict[str, ConversationSession] = {}
|
|
85
85
|
self._cache_lock = threading.RLock() # RLock allows re-entrant access
|
|
86
|
+
|
|
87
|
+
def _sync(self, value: Any) -> Any:
|
|
88
|
+
"""Drive a store call to completion from a sync context.
|
|
89
|
+
|
|
90
|
+
Async backends (``mode="async"`` → ``AsyncConversationStore`` and friends)
|
|
91
|
+
return a coroutine from every method. Sync hooks that call them directly
|
|
92
|
+
would otherwise discard the coroutine unawaited — a silent no-op that loses
|
|
93
|
+
the write. When we detect a coroutine we run it via the shared async bridge
|
|
94
|
+
(single source of truth) so sync callers still get their result; otherwise
|
|
95
|
+
we pass the value through unchanged for genuinely sync stores.
|
|
96
|
+
"""
|
|
97
|
+
if inspect.iscoroutine(value):
|
|
98
|
+
from .._async_bridge import run_sync
|
|
99
|
+
return run_sync(value)
|
|
100
|
+
return value
|
|
86
101
|
|
|
87
102
|
@classmethod
|
|
88
103
|
def from_config(cls, config: PersistenceConfig) -> "PersistenceOrchestrator":
|
|
@@ -153,7 +168,7 @@ class PersistenceOrchestrator:
|
|
|
153
168
|
# Try to load existing session
|
|
154
169
|
session = None
|
|
155
170
|
if resume:
|
|
156
|
-
session = self.conversation.get_session(session_id)
|
|
171
|
+
session = self._sync(self.conversation.get_session(session_id))
|
|
157
172
|
|
|
158
173
|
if session:
|
|
159
174
|
logger.info(f"Resuming session: {session_id}")
|
|
@@ -161,7 +176,7 @@ class PersistenceOrchestrator:
|
|
|
161
176
|
self._cache_put(session)
|
|
162
177
|
|
|
163
178
|
# Load previous messages
|
|
164
|
-
messages = self.conversation.get_messages(session_id)
|
|
179
|
+
messages = self._sync(self.conversation.get_messages(session_id))
|
|
165
180
|
return messages
|
|
166
181
|
else:
|
|
167
182
|
# Create new session
|
|
@@ -173,7 +188,7 @@ class PersistenceOrchestrator:
|
|
|
173
188
|
name=f"Session {session_id[:8]}",
|
|
174
189
|
metadata={"agent_type": type(agent).__name__},
|
|
175
190
|
)
|
|
176
|
-
self.conversation.create_session(session)
|
|
191
|
+
self._sync(self.conversation.create_session(session))
|
|
177
192
|
logger.info(f"Created new session: {session_id}")
|
|
178
193
|
self._current_session = session
|
|
179
194
|
self._cache_put(session)
|
|
@@ -215,7 +230,7 @@ class PersistenceOrchestrator:
|
|
|
215
230
|
metadata=metadata,
|
|
216
231
|
)
|
|
217
232
|
|
|
218
|
-
self.conversation.add_message(session_id, message)
|
|
233
|
+
self._sync(self.conversation.add_message(session_id, message))
|
|
219
234
|
logger.debug(f"Persisted {role} message to session {session_id}")
|
|
220
235
|
return message
|
|
221
236
|
|
|
@@ -236,12 +251,12 @@ class PersistenceOrchestrator:
|
|
|
236
251
|
if not self.conversation:
|
|
237
252
|
return
|
|
238
253
|
|
|
239
|
-
session = self._cache_get(session_id) or self.conversation.get_session(session_id)
|
|
254
|
+
session = self._cache_get(session_id) or self._sync(self.conversation.get_session(session_id))
|
|
240
255
|
if session:
|
|
241
256
|
session.updated_at = time.time()
|
|
242
257
|
if metadata:
|
|
243
258
|
session.metadata = {**(session.metadata or {}), **metadata}
|
|
244
|
-
self.conversation.update_session(session)
|
|
259
|
+
self._sync(self.conversation.update_session(session))
|
|
245
260
|
# Update cache with the modified session
|
|
246
261
|
self._cache_put(session)
|
|
247
262
|
logger.debug(f"Updated session metadata: {session_id}")
|
|
@@ -426,12 +441,12 @@ class PersistenceOrchestrator:
|
|
|
426
441
|
logger.debug("No knowledge store configured")
|
|
427
442
|
return []
|
|
428
443
|
|
|
429
|
-
return self.knowledge.search(
|
|
444
|
+
return self._sync(self.knowledge.search(
|
|
430
445
|
collection=collection,
|
|
431
446
|
query_embedding=query_embedding,
|
|
432
447
|
limit=limit,
|
|
433
448
|
filters=filters,
|
|
434
|
-
)
|
|
449
|
+
))
|
|
435
450
|
|
|
436
451
|
def add_knowledge(
|
|
437
452
|
self,
|
|
@@ -451,7 +466,7 @@ class PersistenceOrchestrator:
|
|
|
451
466
|
if not self.knowledge:
|
|
452
467
|
raise ValueError("No knowledge store configured")
|
|
453
468
|
|
|
454
|
-
return self.knowledge.upsert(collection, documents)
|
|
469
|
+
return self._sync(self.knowledge.upsert(collection, documents))
|
|
455
470
|
|
|
456
471
|
# =========================================================================
|
|
457
472
|
# State Management
|
|
@@ -461,19 +476,19 @@ class PersistenceOrchestrator:
|
|
|
461
476
|
"""Get state value."""
|
|
462
477
|
if not self.state:
|
|
463
478
|
return None
|
|
464
|
-
return self.state.get(key)
|
|
479
|
+
return self._sync(self.state.get(key))
|
|
465
480
|
|
|
466
481
|
def set_state(self, key: str, value: Any, ttl: Optional[int] = None) -> None:
|
|
467
482
|
"""Set state value with optional TTL."""
|
|
468
483
|
if not self.state:
|
|
469
484
|
return
|
|
470
|
-
self.state.set(key, value, ttl)
|
|
485
|
+
self._sync(self.state.set(key, value, ttl))
|
|
471
486
|
|
|
472
487
|
def delete_state(self, key: str) -> bool:
|
|
473
488
|
"""Delete state value."""
|
|
474
489
|
if not self.state:
|
|
475
490
|
return False
|
|
476
|
-
return self.state.delete(key)
|
|
491
|
+
return self._sync(self.state.delete(key))
|
|
477
492
|
|
|
478
493
|
# =========================================================================
|
|
479
494
|
# Session Management
|
|
@@ -483,7 +498,7 @@ class PersistenceOrchestrator:
|
|
|
483
498
|
"""Get a session by ID."""
|
|
484
499
|
if not self.conversation:
|
|
485
500
|
return None
|
|
486
|
-
return self.conversation.get_session(session_id)
|
|
501
|
+
return self._sync(self.conversation.get_session(session_id))
|
|
487
502
|
|
|
488
503
|
def list_sessions(
|
|
489
504
|
self,
|
|
@@ -493,7 +508,7 @@ class PersistenceOrchestrator:
|
|
|
493
508
|
"""List sessions for a user."""
|
|
494
509
|
if not self.conversation:
|
|
495
510
|
return []
|
|
496
|
-
return self.conversation.list_sessions(user_id=user_id, limit=limit)
|
|
511
|
+
return self._sync(self.conversation.list_sessions(user_id=user_id, limit=limit))
|
|
497
512
|
|
|
498
513
|
def delete_session(self, session_id: str) -> bool:
|
|
499
514
|
"""Delete a session and all its messages."""
|
|
@@ -503,7 +518,7 @@ class PersistenceOrchestrator:
|
|
|
503
518
|
# Remove from cache using thread-safe method
|
|
504
519
|
self._cache_delete(session_id)
|
|
505
520
|
|
|
506
|
-
return self.conversation.delete_session(session_id)
|
|
521
|
+
return self._sync(self.conversation.delete_session(session_id))
|
|
507
522
|
|
|
508
523
|
def get_messages(
|
|
509
524
|
self,
|
|
@@ -513,7 +528,7 @@ class PersistenceOrchestrator:
|
|
|
513
528
|
"""Get messages from a session."""
|
|
514
529
|
if not self.conversation:
|
|
515
530
|
return []
|
|
516
|
-
return self.conversation.get_messages(session_id, limit=limit)
|
|
531
|
+
return self._sync(self.conversation.get_messages(session_id, limit=limit))
|
|
517
532
|
|
|
518
533
|
# =========================================================================
|
|
519
534
|
# Context Building
|
|
@@ -547,7 +562,7 @@ class PersistenceOrchestrator:
|
|
|
547
562
|
|
|
548
563
|
# Get conversation history
|
|
549
564
|
if self.conversation:
|
|
550
|
-
messages = self.conversation.get_messages(session_id, limit=history_limit)
|
|
565
|
+
messages = self._sync(self.conversation.get_messages(session_id, limit=history_limit))
|
|
551
566
|
context["history"] = [
|
|
552
567
|
{"role": m.role, "content": m.content}
|
|
553
568
|
for m in messages
|
|
@@ -555,11 +570,11 @@ class PersistenceOrchestrator:
|
|
|
555
570
|
|
|
556
571
|
# Get relevant knowledge
|
|
557
572
|
if self.knowledge and query_embedding:
|
|
558
|
-
docs = self.knowledge.search(
|
|
573
|
+
docs = self._sync(self.knowledge.search(
|
|
559
574
|
collection=knowledge_collection,
|
|
560
575
|
query_embedding=query_embedding,
|
|
561
576
|
limit=knowledge_limit,
|
|
562
|
-
)
|
|
577
|
+
))
|
|
563
578
|
context["knowledge"] = [
|
|
564
579
|
{"content": d.content, "metadata": d.metadata}
|
|
565
580
|
for d in docs
|
|
@@ -574,11 +589,11 @@ class PersistenceOrchestrator:
|
|
|
574
589
|
def close(self) -> None:
|
|
575
590
|
"""Close all stores and release resources."""
|
|
576
591
|
if self.conversation:
|
|
577
|
-
self.conversation.close()
|
|
592
|
+
self._sync(self.conversation.close())
|
|
578
593
|
if self.knowledge:
|
|
579
|
-
self.knowledge.close()
|
|
594
|
+
self._sync(self.knowledge.close())
|
|
580
595
|
if self.state:
|
|
581
|
-
self.state.close()
|
|
596
|
+
self._sync(self.state.close())
|
|
582
597
|
|
|
583
598
|
# Clear cache using thread-safe method
|
|
584
599
|
self._cache_clear()
|
|
@@ -96,7 +96,7 @@ def enable_injection_defense(
|
|
|
96
96
|
Args:
|
|
97
97
|
extra_patterns: Additional regex patterns to detect (appended to defaults).
|
|
98
98
|
block_threshold: Override the threat level that triggers blocking.
|
|
99
|
-
3 = CRITICAL
|
|
99
|
+
3 = CRITICAL, 2 = HIGH (default), 1 = MEDIUM.
|
|
100
100
|
trusted_sources: Source names that bypass blocking (in addition to defaults).
|
|
101
101
|
|
|
102
102
|
Returns:
|
|
@@ -109,7 +109,12 @@ def enable_injection_defense(
|
|
|
109
109
|
from .injection import InjectionDefense, ThreatLevel
|
|
110
110
|
from praisonaiagents.hooks import add_hook
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
# HIGH matches InjectionDefense()'s class default and scan_text()'s own
|
|
113
|
+
# blocking policy. It blocks any single dangerous-category hit (instruction
|
|
114
|
+
# override, financial manipulation, self-harm) or any two categories total,
|
|
115
|
+
# so the documented one-liner is genuinely "safe by default" rather than
|
|
116
|
+
# requiring 3+ distinct vectors that CRITICAL demanded.
|
|
117
|
+
threshold = ThreatLevel(block_threshold) if block_threshold is not None else ThreatLevel.HIGH
|
|
113
118
|
|
|
114
119
|
defense = InjectionDefense(
|
|
115
120
|
extra_patterns=extra_patterns,
|
|
@@ -9,6 +9,7 @@ Zero overhead when not enabled — all imports are local.
|
|
|
9
9
|
"""
|
|
10
10
|
import re
|
|
11
11
|
import logging
|
|
12
|
+
import unicodedata
|
|
12
13
|
from dataclasses import dataclass, field
|
|
13
14
|
from enum import IntEnum
|
|
14
15
|
from typing import Callable, List, Optional, Any
|
|
@@ -100,6 +101,50 @@ _SELF_HARM_PATTERNS: List[str] = [
|
|
|
100
101
|
|
|
101
102
|
_LONG_B64_RE = re.compile(r"^[A-Za-z0-9+/]{40,}={0,2}$")
|
|
102
103
|
|
|
104
|
+
# Zero-width / invisible characters commonly injected between letters to break
|
|
105
|
+
# token matches (e.g. "ig\u200bnore"). Stripped BEFORE pattern search.
|
|
106
|
+
_ZERO_WIDTH_RE = re.compile(
|
|
107
|
+
"[\u200b\u200c\u200d\u200e\u200f\u2060\ufeff\u00ad\u180e]"
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
# Cross-script homoglyph map. NFKC folds full-width / small-form / ligature
|
|
111
|
+
# glyphs into ASCII, but it does NOT fold Cyrillic/Greek look-alikes onto Latin
|
|
112
|
+
# (they are distinct code points in distinct scripts). This small confusables
|
|
113
|
+
# table catches the common one-liner bypass "іgnore …" (Cyrillic і) etc.
|
|
114
|
+
_CONFUSABLES = {
|
|
115
|
+
"\u0430": "a", # Cyrillic а
|
|
116
|
+
"\u0435": "e", # Cyrillic е
|
|
117
|
+
"\u043e": "o", # Cyrillic о
|
|
118
|
+
"\u0440": "p", # Cyrillic р
|
|
119
|
+
"\u0441": "c", # Cyrillic с
|
|
120
|
+
"\u0443": "y", # Cyrillic у
|
|
121
|
+
"\u0445": "x", # Cyrillic х
|
|
122
|
+
"\u0456": "i", # Cyrillic і
|
|
123
|
+
"\u0455": "s", # Cyrillic ѕ
|
|
124
|
+
"\u0501": "d", # Cyrillic ԁ
|
|
125
|
+
"\u04bb": "h", # Cyrillic һ
|
|
126
|
+
"\u0391": "A", "\u0392": "B", "\u0395": "E", "\u0396": "Z",
|
|
127
|
+
"\u0397": "H", "\u0399": "I", "\u039a": "K", "\u039c": "M",
|
|
128
|
+
"\u039d": "N", "\u039f": "O", "\u03a1": "P", "\u03a4": "T",
|
|
129
|
+
"\u03a5": "Y", "\u03a7": "X",
|
|
130
|
+
"\u03b1": "a", "\u03bf": "o", "\u03c1": "p", "\u03c5": "u",
|
|
131
|
+
}
|
|
132
|
+
_CONFUSABLES_TABLE = str.maketrans(_CONFUSABLES)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _normalize_for_scan(text: str) -> str:
|
|
136
|
+
"""Fold obfuscation into canonical ASCII so pattern matching sees intent.
|
|
137
|
+
|
|
138
|
+
- NFKC collapses full-width, small-form, ligature and superscript glyphs
|
|
139
|
+
into their ASCII-equivalent forms.
|
|
140
|
+
- Zero-width joiners/spaces are stripped so they can't break word tokens.
|
|
141
|
+
- A small confusables table maps common Cyrillic/Greek homoglyphs onto
|
|
142
|
+
their Latin look-alikes (NFKC alone does not fold across scripts).
|
|
143
|
+
"""
|
|
144
|
+
text = unicodedata.normalize("NFKC", text)
|
|
145
|
+
text = _ZERO_WIDTH_RE.sub("", text)
|
|
146
|
+
return text.translate(_CONFUSABLES_TABLE)
|
|
147
|
+
|
|
103
148
|
# Trust sources that bypass injection scanning
|
|
104
149
|
_TRUSTED_SOURCES = frozenset([
|
|
105
150
|
"trusted_tool", "internal", "system", "praisonai_core",
|
|
@@ -203,21 +248,25 @@ def scan_text(text: str, source: str = "external") -> ScanResult:
|
|
|
203
248
|
if not text or not isinstance(text, str):
|
|
204
249
|
return ScanResult(ThreatLevel.LOW, blocked=False, source=source)
|
|
205
250
|
|
|
251
|
+
# Fold full-width / zero-width / homoglyph obfuscation to canonical ASCII
|
|
252
|
+
# before matching so attackers can't slip past ASCII-anchored patterns.
|
|
253
|
+
normalized = _normalize_for_scan(text)
|
|
254
|
+
|
|
206
255
|
# Trusted sources: scan but never block
|
|
207
256
|
is_trusted = source in _TRUSTED_SOURCES
|
|
208
257
|
|
|
209
258
|
triggered = []
|
|
210
|
-
if detect_instruction_patterns(
|
|
259
|
+
if detect_instruction_patterns(normalized):
|
|
211
260
|
triggered.append("instruction_override")
|
|
212
|
-
if detect_authority_claims(
|
|
261
|
+
if detect_authority_claims(normalized):
|
|
213
262
|
triggered.append("authority_claim")
|
|
214
|
-
if detect_boundary_manipulation(
|
|
263
|
+
if detect_boundary_manipulation(normalized):
|
|
215
264
|
triggered.append("boundary_manipulation")
|
|
216
|
-
if detect_obfuscation(
|
|
265
|
+
if detect_obfuscation(normalized):
|
|
217
266
|
triggered.append("obfuscation")
|
|
218
|
-
if detect_financial_manipulation(
|
|
267
|
+
if detect_financial_manipulation(normalized):
|
|
219
268
|
triggered.append("financial_manipulation")
|
|
220
|
-
if detect_self_harm_instructions(
|
|
269
|
+
if detect_self_harm_instructions(normalized):
|
|
221
270
|
triggered.append("self_harm_instruction")
|
|
222
271
|
|
|
223
272
|
count = len(triggered)
|
|
@@ -297,10 +346,12 @@ class InjectionDefense:
|
|
|
297
346
|
"""
|
|
298
347
|
result = scan_text(text, source=source)
|
|
299
348
|
|
|
300
|
-
# Apply extra patterns as Check 1 extension
|
|
349
|
+
# Apply extra patterns as Check 1 extension (against normalized text so
|
|
350
|
+
# obfuscated payloads can't bypass custom patterns either).
|
|
301
351
|
if self._extra_patterns and text:
|
|
352
|
+
normalized = _normalize_for_scan(text)
|
|
302
353
|
for pat in self._extra_patterns:
|
|
303
|
-
if re.search(pat,
|
|
354
|
+
if re.search(pat, normalized, re.IGNORECASE):
|
|
304
355
|
if "extra_pattern" not in result.checks_triggered:
|
|
305
356
|
result.checks_triggered.append("extra_pattern")
|
|
306
357
|
# Escalate if extra pattern fires
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "4.6.141"
|