PraisonAI 4.6.38__tar.gz → 4.6.40__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.38 → praisonai-4.6.40}/PKG-INFO +2 -2
- {praisonai-4.6.38 → praisonai-4.6.40}/PraisonAI.egg-info/PKG-INFO +2 -2
- {praisonai-4.6.38 → praisonai-4.6.40}/PraisonAI.egg-info/requires.txt +1 -1
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/__init__.py +36 -9
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_registry.py +70 -6
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/agents_generator.py +21 -14
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/api/agent_invoke.py +14 -2
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/auto.py +35 -43
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/guardrails.py +4 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/rag.py +2 -2
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli_backends/registry.py +48 -35
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/tools/write_file.py +10 -11
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/db/adapter.py +156 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/deploy.py +6 -4
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/exec_approval.py +34 -9
- praisonai-4.6.40/praisonai/inbuilt_tools/__init__.py +33 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/jobs/store.py +22 -14
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/llm/registry.py +117 -175
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/adapters/cli_tools.py +33 -5
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/registry.py +77 -91
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/profiler.py +405 -516
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/scheduler/agent_scheduler.py +5 -3
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/tool_registry.py +24 -12
- praisonai-4.6.40/praisonai/version.py +1 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/pyproject.toml +1 -1
- praisonai-4.6.38/praisonai/inbuilt_tools/__init__.py +0 -49
- praisonai-4.6.38/praisonai/version.py +0 -1
- {praisonai-4.6.38 → praisonai-4.6.40}/PraisonAI.egg-info/SOURCES.txt +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/PraisonAI.egg-info/dependency_links.txt +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/PraisonAI.egg-info/entry_points.txt +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/PraisonAI.egg-info/top_level.txt +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/README.md +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/__main__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_approval_spec.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_async_bridge.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_dev/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_dev/api_md.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_dev/parity/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_dev/parity/docs_extractor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_dev/parity/docs_generator.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_dev/parity/generator.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_dev/parity/python_docs_extractor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_dev/parity/python_extractor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_dev/parity/rust_docs_extractor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_dev/parity/rust_extractor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_dev/parity/topic_normalizer.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_dev/parity/ts_docs_extractor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_dev/parity/typescript_extractor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_logging.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/_safe_loader.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/acp/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/acp/config.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/acp/safe_edit.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/acp/server.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/acp/session.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/adapters/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/adapters/readers.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/adapters/rerankers.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/adapters/retrievers.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/adapters/vector_stores.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/agent.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/agent_scheduler.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/api/call.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/app/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/app/agentos.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/async_agent_scheduler.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/audit/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/audit/agent_centric.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_ack.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_approval.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_approval_base.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_auth.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_chunk.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_commands.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_config_schema.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_debounce.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_defaults.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_discord_approval.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_dlq.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_email_utils.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_http_approval.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_mirror.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_pairing_ui.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_protocol_mixin.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_rate_limit.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_registry.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_resilience.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_session.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_slack_approval.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_telegram_approval.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_unknown_user.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_webhook_approval.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/_whatsapp_web_adapter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/agentmail.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/bot.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/botos.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/discord.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/email.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/linear.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/media.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/slack.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/telegram.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/bots/whatsapp.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/agent.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/benchmark.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/cdp_agent.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/cdp_utils.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/cli.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/diagnostics.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/launcher.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/playwright_agent.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/profiling.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/protocol.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/report.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/server.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/sessions.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/browser/video.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/a2a.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/assistants.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/audio.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/batches.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/completions.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/container_files.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/containers.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/embeddings.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/files.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/fine_tuning.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/images.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/mcp.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/messages.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/moderations.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/ocr.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/passthrough.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/realtime.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/rerank.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/responses.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/search.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/skills.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/vector_store_files.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/vector_stores.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/capabilities/videos.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/claw/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/claw/default_app.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/_paths.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/app.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/branding.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/acp.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/agents.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/app.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/audit.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/batch.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/benchmark.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/bot.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/browser.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/call.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/chat.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/claw.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/code.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/commit.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/completion.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/config.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/context.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/dashboard.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/debug.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/deploy.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/diag.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/docs.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/doctor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/endpoints.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/environment.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/eval.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/examples.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/flow.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/gateway.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/github.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/hooks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/knowledge.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/langextract.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/langfuse.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/loop.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/lsp.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/managed.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/mcp.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/memory.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/mint_link.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/n8n.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/obs.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/onboard.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/package.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/pairing.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/paths.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/plugins.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/port.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/profile.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/publish.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/rag.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/realtime.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/recipe.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/registry.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/replay.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/research.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/retrieval.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/rules.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/run.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/sandbox.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/schedule.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/serve.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/session.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/setup.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/skills.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/standardise.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/templates.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/test.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/todo.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/tools.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/traces.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/tracker.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/train.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/ui.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/up.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/version.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/commands/workflow.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/config_loader.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/configuration/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/configuration/loader.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/configuration/paths.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/configuration/schema.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/execution/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/execution/core.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/execution/profiler.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/execution/request.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/execution/result.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/fallback_schema.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/acp.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/action_orchestrator.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/agent_scheduler.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/agent_tools.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/agents.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/approval.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/at_mentions.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/audit_cli.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/auto_memory.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/auto_mode.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/autonomy_mode.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/background.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/base.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/benchmark.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/bots_cli.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/capabilities.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/checkpoints.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/cli_profiler.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/code_intelligence.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/compaction.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/compare.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/config_hierarchy.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/context_manager.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/cost_tracker.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/csv_test_runner.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/debug.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/deploy.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/diag.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/display_jsonl.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/acp_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/bot_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/config_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/db_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/env_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/lsp_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/mcp_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/memory_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/network_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/obs_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/performance_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/permissions_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/selftest_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/serve_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/skills_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/checks/tools_checks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/engine.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/formatters.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/handler.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/models.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/doctor/registry.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/endpoints.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/eval.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/examples.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/external_agents.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/fast_context.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/file_history.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/flow_display.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/gateway.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/git_attribution.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/git_integration.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/guardrail.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/handoff.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/hooks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/hybrid_workflow.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/image.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/interactive_core_headless.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/interactive_runtime.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/interactive_test_harness.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/interactive_tools.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/interactive_tui.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/job_workflow.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/jobs.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/knowledge.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/knowledge_cli.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/lite.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/logs.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/lsp_cli.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/lsp_diagnostics.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/mcp.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/message_queue.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/metrics.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/migrate.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/migration_flow.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/migration_spec.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/n8n.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/observability.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/ollama.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/onboard.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/output_modes.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/output_style.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/package.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/performance.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/persistence.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/plugin_cli.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/profile.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/profiler/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/profiler/core.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/profiler/optimizations.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/profiler/suite.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/profiling.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/queue/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/queue/manager.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/queue/models.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/queue/persistence.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/queue/scheduler.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/queue/worker.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/recipe.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/recipe_creator.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/recipe_optimizer.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/recipe_prompts.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/recipes.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/registry.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/repo_map.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/router.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/safe_shell.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/sandbox_cli.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/sandbox_executor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/sdk_knowledge.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/serve.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/session.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/setup/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/setup/handler.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/setup/templates.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/skills.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/slash_commands.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/telemetry.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/templates.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/thinking.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/todo.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tools.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/app.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/cli.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/config.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/debug.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/events.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/mock_provider.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/orchestrator.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/screens/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/screens/help.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/screens/main.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/screens/queue.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/screens/session.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/screens/settings.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/session_store.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/widgets/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/widgets/chat.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/widgets/command_popup.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/widgets/composer.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/widgets/file_popup.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/widgets/queue_panel.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/widgets/status.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/tui/widgets/tool_panel.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/wizard.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/workflow.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/features/yaml_utils.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/interactive/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/interactive/async_tui.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/interactive/config.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/interactive/core.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/interactive/events.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/interactive/frontends/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/interactive/frontends/rich_frontend.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/interactive/frontends/textual_frontend.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/interactive/praison_io.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/interactive/repl.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/interactive/split_tui.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/interactive/tui_app.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/langfuse_client.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/legacy.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/main.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/output/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/output/console.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/schedule_cli.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/schema_provider.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/session/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/session/unified.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/state/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/state/identifiers.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/state/sessions.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/ui/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/ui/config.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/ui/events.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/ui/mg_backend.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/ui/plain.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/ui/rich_backend.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli/unified_schema.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli_backends/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/cli_backends/claude.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/agent_tools.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/diff/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/diff/diff_strategy.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/tools/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/tools/apply_diff.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/tools/execute_command.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/tools/list_files.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/tools/read_file.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/tools/search_replace.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/utils/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/utils/file_utils.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/utils/ignore_utils.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/code/utils/text_utils.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/context/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/context/artifact_store.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/context/config.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/context/history_store.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/context/queue.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/context/setup.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/context/terminal_logger.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/daemon/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/daemon/launchd.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/daemon/systemd.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/daemon/windows.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/db/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/deploy/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/deploy/api.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/deploy/docker.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/deploy/doctor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/deploy/main.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/deploy/models.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/deploy/providers/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/deploy/providers/aws.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/deploy/providers/azure.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/deploy/providers/base.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/deploy/providers/gcp.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/deploy/schema.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/docs_runner/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/docs_runner/classifier.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/docs_runner/executor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/docs_runner/extractor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/docs_runner/reporter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/docs_runner/runner.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/docs_runner/workspace.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/endpoints/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/endpoints/a2u_server.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/endpoints/discovery.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/endpoints/providers/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/endpoints/providers/a2a.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/endpoints/providers/a2u.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/endpoints/providers/agents_api.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/endpoints/providers/base.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/endpoints/providers/mcp.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/endpoints/providers/recipe.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/endpoints/providers/tools_mcp.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/endpoints/registry.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/endpoints/server.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/flow/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/flow/client.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/flow/components/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/flow/converter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/flow/helpers.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/framework_adapters/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/framework_adapters/autogen_adapter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/framework_adapters/base.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/framework_adapters/crewai_adapter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/framework_adapters/praisonai_adapter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/framework_adapters/registry.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/framework_adapters/validators.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/auth.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/cookie_auth.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/gateway_approval.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/magic_link.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/origin_check.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/pairing.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/pairing_routes.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/push_channels.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/push_delivery.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/push_polling.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/push_presence.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/rate_limiter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/redis_pubsub.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/gateway/server.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/inc/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/inc/config.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/inc/models.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/_session_info.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/_tool_aliases.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/base.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/claude_code.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/codex_cli.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/compute/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/compute/daytona.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/compute/docker.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/compute/e2b.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/compute/flyio.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/compute/local.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/compute/modal_compute.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/cursor_cli.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/db_session_adapter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/gemini_cli.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/hosted_agent.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/local_agent.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/managed_agents.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/managed_local.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/registry.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/integrations/sandboxed_agent.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/jobs/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/jobs/executor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/jobs/models.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/jobs/router.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/jobs/server.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/llm/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/llm/env.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/adapters/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/adapters/agents.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/adapters/capabilities.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/adapters/extended_capabilities.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/adapters/knowledge.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/adapters/memory.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/adapters/prompts.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/adapters/resources.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/adapters/tools_bridge.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/auth/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/auth/api_key.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/auth/oauth.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/auth/oidc.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/auth/scopes.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/cli.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/elicitation.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/icons.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/recipe_adapter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/recipe_cli.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/registry.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/sampling.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/server.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/tasks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/tool_index.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/transports/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/transports/http_stream.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/mcp_server/transports/stdio.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/n8n/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/n8n/client.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/n8n/converter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/n8n/preview.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/n8n/reverse_converter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/observability/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/observability/langextract.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/observability/langfuse.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/config.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/conversation/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/conversation/async_mysql.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/conversation/async_postgres.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/conversation/async_sqlite.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/conversation/base.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/conversation/json_store.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/conversation/mysql.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/conversation/postgres.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/conversation/singlestore.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/conversation/sqlite.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/conversation/supabase.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/conversation/surrealdb.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/conversation/turso.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/factory.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/hooks/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/hooks/agent_hooks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/base.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/cassandra.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/chroma.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/clickhouse.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/couchbase.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/lancedb.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/milvus.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/pgvector.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/pinecone.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/qdrant.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/redis_vector.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/knowledge/weaviate.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/migrations/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/migrations/manager.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/orchestrator.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/state/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/state/async_mongodb.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/state/base.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/state/dynamodb.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/state/firestore.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/state/gcs.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/state/memory.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/state/mongodb.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/state/redis.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/state/upstash.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/tests/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/persistence/tests/test_all_backends.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/push/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/push/client.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/push/transports.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/recipe/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/recipe/bridge.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/recipe/core.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/recipe/exceptions.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/recipe/history.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/recipe/models.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/recipe/operations.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/recipe/policy.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/recipe/registry.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/recipe/runtime.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/recipe/security.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/recipe/serve.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/recipe/server.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/replay/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/replay/analyzer.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/replay/applier.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/replay/judge.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/replay/plan.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/replay/player.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/replay/reader.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/replay/storage.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/replay/writer.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/sandbox/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/sandbox/_compat.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/sandbox/_shell.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/sandbox/daytona.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/sandbox/docker.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/sandbox/modal.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/sandbox/sandlock.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/sandbox/ssh.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/sandbox/subprocess.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/scheduler/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/scheduler/base.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/scheduler/daemon_manager.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/scheduler/executor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/scheduler/shared.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/scheduler/state_manager.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/scheduler/yaml_loader.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/scheduler.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/security/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/security/audit.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/security/injection.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/security/protected.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/setup/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/setup/build.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/setup/post_install.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/setup/setup_conda_env.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/setup.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/ai_generator.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/config.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/dedupe.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/discovery.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/drift.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/engine.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/enhanced_templates.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/example_verifier.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/manifest.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/models.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/reports.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/templates.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/undo_redo.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/standardise/validator.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/storage/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/storage/dynamodb_adapter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/storage/mongodb_adapter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/storage/postgresql_adapter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/storage/redis_adapter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/suite_runner/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/suite_runner/batch_source.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/suite_runner/cli_docs_source.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/suite_runner/discovery.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/suite_runner/docs_source.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/suite_runner/examples_source.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/suite_runner/executor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/suite_runner/models.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/suite_runner/report_viewer.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/suite_runner/reporter.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/suite_runner/runner.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/templates/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/templates/cache.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/templates/dependency_checker.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/templates/discovery.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/templates/loader.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/templates/registry.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/templates/resolver.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/templates/security.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/templates/tool_override.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/templates/tools_doctor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/test.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/tool_resolver.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/tools/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/tools/audio.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/tools/glob_tool.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/tools/grep_tool.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/tools/multiedit.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/tools/skill_manage.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/train/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/train/agents/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/train/agents/grader.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/train/agents/hook.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/train/agents/models.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/train/agents/orchestrator.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/train/agents/storage.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/train/llm/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/train/llm/trainer.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/train.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/train_vision.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/ui/_aiui_datastore.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/ui/_external_agents.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/ui/callbacks.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/ui/components/aicoder.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/ui/context.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/ui/database_config.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/ui_agents/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/ui_agents/default_app.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/ui_bot/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/ui_bot/default_app.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/ui_chat/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/ui_chat/default_app.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/ui_realtime/__init__.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/ui_realtime/default_app.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/praisonai/upload_vision.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/setup.cfg +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test_agents_playbook.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test_approval_system.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test_basic.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test_cli_features.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test_custom_tools_fix.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test_double_api_fix.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test_n8n_agent_invoke.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test_n8n_cli_feature.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test_n8n_integration.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test_phase2_refactor.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test_recipe.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test_registry.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test_runner.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/tests/test_sandboxed_agent_compatibility.py +0 -0
- {praisonai-4.6.38 → praisonai-4.6.40}/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.40
|
|
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,7 +11,7 @@ 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.
|
|
14
|
+
Requires-Dist: praisonaiagents>=1.6.40
|
|
15
15
|
Requires-Dist: python-dotenv>=0.19.0
|
|
16
16
|
Requires-Dist: litellm<2,>=1.83.14
|
|
17
17
|
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.40
|
|
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,7 +11,7 @@ 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.
|
|
14
|
+
Requires-Dist: praisonaiagents>=1.6.40
|
|
15
15
|
Requires-Dist: python-dotenv>=0.19.0
|
|
16
16
|
Requires-Dist: litellm<2,>=1.83.14
|
|
17
17
|
Requires-Dist: PyYAML>=6.0
|
|
@@ -36,10 +36,34 @@ __all__ = [
|
|
|
36
36
|
_telemetry_lock = threading.Lock()
|
|
37
37
|
_telemetry_initialized = False
|
|
38
38
|
|
|
39
|
+
def _get_telemetry_defaults() -> dict[str, str]:
|
|
40
|
+
"""Get telemetry environment defaults without mutating os.environ.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
Dict of environment variable defaults for telemetry
|
|
44
|
+
"""
|
|
45
|
+
import os
|
|
46
|
+
defaults = {}
|
|
47
|
+
|
|
48
|
+
# Respect any value the user already set
|
|
49
|
+
if "OTEL_SDK_DISABLED" not in os.environ:
|
|
50
|
+
langfuse_configured = bool(
|
|
51
|
+
os.getenv("LANGFUSE_PUBLIC_KEY")
|
|
52
|
+
or os.path.exists(os.path.expanduser("~/.praisonai/langfuse.env"))
|
|
53
|
+
)
|
|
54
|
+
defaults["OTEL_SDK_DISABLED"] = "false" if langfuse_configured else "true"
|
|
55
|
+
|
|
56
|
+
if "EC_TELEMETRY" not in os.environ:
|
|
57
|
+
defaults["EC_TELEMETRY"] = "false"
|
|
58
|
+
|
|
59
|
+
return defaults
|
|
60
|
+
|
|
61
|
+
|
|
39
62
|
def _ensure_telemetry_defaults() -> None:
|
|
40
63
|
"""Apply telemetry env defaults exactly once, on first observability use.
|
|
41
64
|
|
|
42
65
|
Thread-safe implementation using double-checked locking pattern.
|
|
66
|
+
DEPRECATED: Use _apply_telemetry_defaults() with explicit config instead.
|
|
43
67
|
"""
|
|
44
68
|
global _telemetry_initialized
|
|
45
69
|
if _telemetry_initialized: # fast path, OK without lock
|
|
@@ -47,18 +71,21 @@ def _ensure_telemetry_defaults() -> None:
|
|
|
47
71
|
with _telemetry_lock:
|
|
48
72
|
if _telemetry_initialized:
|
|
49
73
|
return
|
|
50
|
-
|
|
51
|
-
# Respect any value the user already set
|
|
52
|
-
if "OTEL_SDK_DISABLED" not in os.environ:
|
|
53
|
-
langfuse_configured = bool(
|
|
54
|
-
os.getenv("LANGFUSE_PUBLIC_KEY")
|
|
55
|
-
or os.path.exists(os.path.expanduser("~/.praisonai/langfuse.env"))
|
|
56
|
-
)
|
|
57
|
-
os.environ["OTEL_SDK_DISABLED"] = "false" if langfuse_configured else "true"
|
|
58
|
-
os.environ.setdefault("EC_TELEMETRY", "false") # respect user overrides
|
|
74
|
+
_apply_telemetry_defaults(_get_telemetry_defaults())
|
|
59
75
|
_telemetry_initialized = True
|
|
60
76
|
|
|
61
77
|
|
|
78
|
+
def _apply_telemetry_defaults(env_vars: dict[str, str]) -> None:
|
|
79
|
+
"""Apply telemetry defaults to os.environ.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
env_vars: Dict of environment variables to set
|
|
83
|
+
"""
|
|
84
|
+
import os
|
|
85
|
+
for key, value in env_vars.items():
|
|
86
|
+
os.environ.setdefault(key, value)
|
|
87
|
+
|
|
88
|
+
|
|
62
89
|
# Lazy loading for heavy imports
|
|
63
90
|
def __getattr__(name):
|
|
64
91
|
"""Lazy load heavy modules to improve import time."""
|
|
@@ -24,6 +24,7 @@ class PluginRegistry(Generic[T]):
|
|
|
24
24
|
- Built-in plugins with lazy loading
|
|
25
25
|
- Entry points discovery
|
|
26
26
|
- Runtime registration
|
|
27
|
+
- Alias support for alternative names
|
|
27
28
|
- Thread-safe operations
|
|
28
29
|
"""
|
|
29
30
|
|
|
@@ -41,6 +42,7 @@ class PluginRegistry(Generic[T]):
|
|
|
41
42
|
"""
|
|
42
43
|
self._entry_point_group = entry_point_group
|
|
43
44
|
self._items: Dict[str, Type[T]] = {}
|
|
45
|
+
self._aliases: Dict[str, str] = {} # alias -> canonical name
|
|
44
46
|
self._lock = threading.Lock()
|
|
45
47
|
|
|
46
48
|
# Load built-in plugins with error handling
|
|
@@ -76,15 +78,29 @@ class PluginRegistry(Generic[T]):
|
|
|
76
78
|
# entry_points() might not be available in older Python versions
|
|
77
79
|
logger.debug("Entry points not available for group %s", self._entry_point_group)
|
|
78
80
|
|
|
79
|
-
def register(
|
|
81
|
+
def register(
|
|
82
|
+
self,
|
|
83
|
+
name: str,
|
|
84
|
+
cls: Type[T],
|
|
85
|
+
*,
|
|
86
|
+
aliases: Optional[list[str]] = None
|
|
87
|
+
) -> None:
|
|
80
88
|
"""Register a plugin at runtime.
|
|
81
89
|
|
|
82
90
|
Args:
|
|
83
91
|
name: Plugin name
|
|
84
92
|
cls: Plugin class
|
|
93
|
+
aliases: Optional list of alias names for this plugin
|
|
85
94
|
"""
|
|
86
95
|
with self._lock:
|
|
87
|
-
|
|
96
|
+
canonical_name = name.lower()
|
|
97
|
+
self._items[canonical_name] = cls
|
|
98
|
+
|
|
99
|
+
# Register aliases
|
|
100
|
+
if aliases:
|
|
101
|
+
for alias in aliases:
|
|
102
|
+
normalized_alias = alias.lower()
|
|
103
|
+
self._aliases[normalized_alias] = canonical_name
|
|
88
104
|
|
|
89
105
|
def unregister(self, name: str) -> bool:
|
|
90
106
|
"""Unregister a plugin.
|
|
@@ -96,7 +112,27 @@ class PluginRegistry(Generic[T]):
|
|
|
96
112
|
True if plugin was found and removed, False otherwise
|
|
97
113
|
"""
|
|
98
114
|
with self._lock:
|
|
99
|
-
|
|
115
|
+
normalized_name = name.lower()
|
|
116
|
+
|
|
117
|
+
# Check if it's an alias
|
|
118
|
+
if normalized_name in self._aliases:
|
|
119
|
+
del self._aliases[normalized_name]
|
|
120
|
+
return True
|
|
121
|
+
|
|
122
|
+
# Check if it's a canonical name
|
|
123
|
+
if normalized_name in self._items:
|
|
124
|
+
# Remove all aliases pointing to this plugin
|
|
125
|
+
aliases_to_remove = [
|
|
126
|
+
alias for alias, canonical in self._aliases.items()
|
|
127
|
+
if canonical == normalized_name
|
|
128
|
+
]
|
|
129
|
+
for alias in aliases_to_remove:
|
|
130
|
+
del self._aliases[alias]
|
|
131
|
+
|
|
132
|
+
del self._items[normalized_name]
|
|
133
|
+
return True
|
|
134
|
+
|
|
135
|
+
return False
|
|
100
136
|
|
|
101
137
|
def resolve(self, name: str) -> Type[T]:
|
|
102
138
|
"""Resolve a plugin name to its class.
|
|
@@ -111,10 +147,20 @@ class PluginRegistry(Generic[T]):
|
|
|
111
147
|
ValueError: If plugin is not found
|
|
112
148
|
"""
|
|
113
149
|
with self._lock:
|
|
114
|
-
|
|
150
|
+
normalized_name = name.lower()
|
|
151
|
+
|
|
152
|
+
# Resolve alias to canonical name
|
|
153
|
+
canonical_name = self._aliases.get(normalized_name, normalized_name)
|
|
154
|
+
cls = self._items.get(canonical_name)
|
|
155
|
+
|
|
115
156
|
# Capture available plugins snapshot while holding lock
|
|
116
157
|
# to avoid race condition between check and error message
|
|
117
|
-
|
|
158
|
+
if cls is None:
|
|
159
|
+
available_plugins = sorted(self._items.keys())
|
|
160
|
+
available_aliases = sorted(self._aliases.keys())
|
|
161
|
+
available_snapshot = available_plugins + available_aliases
|
|
162
|
+
else:
|
|
163
|
+
available_snapshot = None
|
|
118
164
|
|
|
119
165
|
if cls is None:
|
|
120
166
|
raise ValueError(
|
|
@@ -161,4 +207,22 @@ class PluginRegistry(Generic[T]):
|
|
|
161
207
|
self.resolve(name)
|
|
162
208
|
return True
|
|
163
209
|
except ValueError:
|
|
164
|
-
return False
|
|
210
|
+
return False
|
|
211
|
+
|
|
212
|
+
def list_aliases(self) -> Dict[str, str]:
|
|
213
|
+
"""List all aliases and their target plugins.
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
Dict mapping alias -> canonical name
|
|
217
|
+
"""
|
|
218
|
+
with self._lock:
|
|
219
|
+
return dict(self._aliases)
|
|
220
|
+
|
|
221
|
+
def list_all_names(self) -> list[str]:
|
|
222
|
+
"""List all names including aliases.
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
Sorted list of all registered names and aliases
|
|
226
|
+
"""
|
|
227
|
+
with self._lock:
|
|
228
|
+
return sorted(list(self._items.keys()) + list(self._aliases.keys()))
|
|
@@ -1172,9 +1172,9 @@ class AgentsGenerator:
|
|
|
1172
1172
|
acp_enabled = global_config.get('acp', False)
|
|
1173
1173
|
lsp_enabled = global_config.get('lsp', False)
|
|
1174
1174
|
interactive_runtime = None
|
|
1175
|
-
interactive_loop = None
|
|
1176
1175
|
|
|
1177
1176
|
if acp_enabled or lsp_enabled:
|
|
1177
|
+
runtime_started = False
|
|
1178
1178
|
try:
|
|
1179
1179
|
import asyncio
|
|
1180
1180
|
from praisonai.cli.features.interactive_runtime import InteractiveRuntime, RuntimeConfig
|
|
@@ -1190,11 +1190,12 @@ class AgentsGenerator:
|
|
|
1190
1190
|
interactive_runtime = InteractiveRuntime(runtime_config)
|
|
1191
1191
|
self.logger.info(f"Starting InteractiveRuntime (ACP: {acp_enabled}, LSP: {lsp_enabled})")
|
|
1192
1192
|
|
|
1193
|
-
#
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1193
|
+
# Runs on the persistent background loop; safe from sync and async callers.
|
|
1194
|
+
# run_sync raises RuntimeError early if called from inside a running loop
|
|
1195
|
+
# so the bug is loud instead of a deadlock.
|
|
1196
|
+
from ._async_bridge import run_sync
|
|
1197
|
+
run_sync(interactive_runtime.start())
|
|
1198
|
+
runtime_started = True
|
|
1198
1199
|
|
|
1199
1200
|
centric_tools = create_agent_centric_tools(interactive_runtime)
|
|
1200
1201
|
self.logger.info(f"Loaded {len(centric_tools)} InteractiveRuntime tools")
|
|
@@ -1203,13 +1204,20 @@ class AgentsGenerator:
|
|
|
1203
1204
|
except ImportError as e:
|
|
1204
1205
|
self.logger.warning(f"Failed to load InteractiveRuntime components: {e}")
|
|
1205
1206
|
interactive_runtime = None
|
|
1206
|
-
|
|
1207
|
+
except RuntimeError:
|
|
1208
|
+
# Don't swallow RuntimeError from run_sync - preserve fail-fast semantics
|
|
1209
|
+
raise
|
|
1207
1210
|
except Exception as e:
|
|
1211
|
+
if runtime_started and interactive_runtime is not None:
|
|
1212
|
+
try:
|
|
1213
|
+
from ._async_bridge import run_sync
|
|
1214
|
+
run_sync(interactive_runtime.stop())
|
|
1215
|
+
except Exception as stop_error:
|
|
1216
|
+
self.logger.error(
|
|
1217
|
+
f"Error stopping partially started InteractiveRuntime: {stop_error}"
|
|
1218
|
+
)
|
|
1208
1219
|
self.logger.error(f"Error starting InteractiveRuntime: {e}")
|
|
1209
|
-
if 'interactive_loop' in locals() and interactive_loop is not None:
|
|
1210
|
-
interactive_loop.close()
|
|
1211
1220
|
interactive_runtime = None
|
|
1212
|
-
interactive_loop = None
|
|
1213
1221
|
|
|
1214
1222
|
# Create agents from config
|
|
1215
1223
|
for role, details in config['roles'].items():
|
|
@@ -1443,14 +1451,13 @@ class AgentsGenerator:
|
|
|
1443
1451
|
self.logger.debug(f"Result: {response}")
|
|
1444
1452
|
result = response if response else ""
|
|
1445
1453
|
finally:
|
|
1446
|
-
if interactive_runtime
|
|
1454
|
+
if interactive_runtime:
|
|
1447
1455
|
try:
|
|
1448
1456
|
self.logger.info("Stopping InteractiveRuntime...")
|
|
1449
|
-
|
|
1457
|
+
from ._async_bridge import run_sync
|
|
1458
|
+
run_sync(interactive_runtime.stop())
|
|
1450
1459
|
except Exception as e:
|
|
1451
1460
|
self.logger.error(f"Error stopping InteractiveRuntime: {e}")
|
|
1452
|
-
finally:
|
|
1453
|
-
interactive_loop.close()
|
|
1454
1461
|
|
|
1455
1462
|
if AGENTOPS_AVAILABLE:
|
|
1456
1463
|
import agentops
|
|
@@ -29,14 +29,26 @@ logger = logging.getLogger(__name__)
|
|
|
29
29
|
# Authentication
|
|
30
30
|
import os
|
|
31
31
|
CALL_SERVER_TOKEN = os.getenv('CALL_SERVER_TOKEN')
|
|
32
|
+
_CALL_AUTH_DISABLED = os.getenv('PRAISONAI_CALL_AUTH', '').lower() == 'disabled'
|
|
33
|
+
|
|
32
34
|
|
|
33
35
|
async def verify_token(
|
|
34
36
|
request: Request,
|
|
35
37
|
authorization: Optional[str] = Header(None)
|
|
36
38
|
) -> None:
|
|
37
39
|
"""Verify API token for authentication."""
|
|
38
|
-
if not FASTAPI_AVAILABLE
|
|
39
|
-
return
|
|
40
|
+
if not FASTAPI_AVAILABLE:
|
|
41
|
+
return
|
|
42
|
+
if _CALL_AUTH_DISABLED:
|
|
43
|
+
return
|
|
44
|
+
if not CALL_SERVER_TOKEN:
|
|
45
|
+
raise HTTPException(
|
|
46
|
+
status_code=503,
|
|
47
|
+
detail=(
|
|
48
|
+
"CALL_SERVER_TOKEN is not configured. Set CALL_SERVER_TOKEN or "
|
|
49
|
+
"PRAISONAI_CALL_AUTH=disabled to run without authentication."
|
|
50
|
+
),
|
|
51
|
+
)
|
|
40
52
|
|
|
41
53
|
token = None
|
|
42
54
|
|
|
@@ -15,9 +15,8 @@ from typing import Any, Dict, List, Optional, Type, TypeVar
|
|
|
15
15
|
import os
|
|
16
16
|
import json
|
|
17
17
|
import yaml
|
|
18
|
-
from rich import print
|
|
19
18
|
import threading
|
|
20
|
-
from
|
|
19
|
+
from rich import print
|
|
21
20
|
from praisonai._logging import get_logger
|
|
22
21
|
|
|
23
22
|
# Type variable for Pydantic models
|
|
@@ -59,10 +58,6 @@ def _load_optional(key: str, loader):
|
|
|
59
58
|
return _optional_cache[key]
|
|
60
59
|
|
|
61
60
|
|
|
62
|
-
# Bounded LRU cache for OpenAI clients (one per (api_key, base_url) tuple)
|
|
63
|
-
_OPENAI_CLIENT_CACHE_MAX = 8
|
|
64
|
-
_openai_clients: "OrderedDict[tuple, object]" = OrderedDict()
|
|
65
|
-
_openai_clients_lock = threading.Lock()
|
|
66
61
|
|
|
67
62
|
|
|
68
63
|
# --- CrewAI lazy loading ---
|
|
@@ -199,38 +194,6 @@ def _check_openai_available() -> bool:
|
|
|
199
194
|
return result is not None
|
|
200
195
|
|
|
201
196
|
|
|
202
|
-
def _get_openai_client(api_key: str = None, base_url: str = None):
|
|
203
|
-
"""Lazy load OpenAI client with bounded LRU cache (thread-safe, multi-tenant).
|
|
204
|
-
|
|
205
|
-
Multi-tenant safe: each (api_key, base_url) tuple gets its own cached client.
|
|
206
|
-
Bounded by _OPENAI_CLIENT_CACHE_MAX with proper LRU eviction.
|
|
207
|
-
"""
|
|
208
|
-
key = (api_key or os.environ.get("OPENAI_API_KEY"), base_url)
|
|
209
|
-
|
|
210
|
-
with _openai_clients_lock:
|
|
211
|
-
# Check if client exists and update LRU position
|
|
212
|
-
client = _openai_clients.get(key)
|
|
213
|
-
if client is not None:
|
|
214
|
-
_openai_clients.move_to_end(key)
|
|
215
|
-
return client
|
|
216
|
-
|
|
217
|
-
# Create new client
|
|
218
|
-
try:
|
|
219
|
-
from openai import OpenAI
|
|
220
|
-
except ImportError as e:
|
|
221
|
-
raise ImportError("Install with: pip install openai") from e
|
|
222
|
-
client = OpenAI(api_key=key[0], base_url=key[1])
|
|
223
|
-
_openai_clients[key] = client
|
|
224
|
-
|
|
225
|
-
# Bound the cache; close the LRU victim
|
|
226
|
-
if len(_openai_clients) > _OPENAI_CLIENT_CACHE_MAX:
|
|
227
|
-
_, victim = _openai_clients.popitem(last=False)
|
|
228
|
-
try:
|
|
229
|
-
victim.close()
|
|
230
|
-
except Exception:
|
|
231
|
-
pass # Best-effort cleanup
|
|
232
|
-
|
|
233
|
-
return client
|
|
234
197
|
|
|
235
198
|
|
|
236
199
|
# Use namespaced logger; root logger is configured only by the CLI
|
|
@@ -478,6 +441,38 @@ class BaseAutoGenerator:
|
|
|
478
441
|
'api_key': ep.api_key
|
|
479
442
|
}
|
|
480
443
|
]
|
|
444
|
+
self._openai_client = None # lazy, per-instance
|
|
445
|
+
self._openai_client_lock = threading.Lock()
|
|
446
|
+
|
|
447
|
+
def _get_openai_client(self):
|
|
448
|
+
"""Get or create the OpenAI client for this instance."""
|
|
449
|
+
if self._openai_client is None:
|
|
450
|
+
with self._openai_client_lock:
|
|
451
|
+
if self._openai_client is None:
|
|
452
|
+
try:
|
|
453
|
+
from openai import OpenAI
|
|
454
|
+
except ImportError as e:
|
|
455
|
+
raise ImportError("Install with: pip install openai") from e
|
|
456
|
+
cfg = self.config_list[0]
|
|
457
|
+
self._openai_client = OpenAI(
|
|
458
|
+
api_key=cfg.get("api_key") or os.environ.get("OPENAI_API_KEY"),
|
|
459
|
+
base_url=cfg.get("base_url"),
|
|
460
|
+
)
|
|
461
|
+
return self._openai_client
|
|
462
|
+
|
|
463
|
+
def close(self):
|
|
464
|
+
"""Close the OpenAI client if it exists."""
|
|
465
|
+
if not hasattr(self, '_openai_client_lock'):
|
|
466
|
+
return # Object was never fully initialized
|
|
467
|
+
with self._openai_client_lock:
|
|
468
|
+
client = getattr(self, '_openai_client', None)
|
|
469
|
+
self._openai_client = None
|
|
470
|
+
if client is not None:
|
|
471
|
+
client.close()
|
|
472
|
+
|
|
473
|
+
def __del__(self):
|
|
474
|
+
"""Best-effort cleanup, but the canonical path is explicit close()."""
|
|
475
|
+
self.close()
|
|
481
476
|
|
|
482
477
|
def _structured_completion(self, response_model: Type[T], messages: List[Dict], **kwargs) -> T:
|
|
483
478
|
"""
|
|
@@ -514,10 +509,7 @@ class BaseAutoGenerator:
|
|
|
514
509
|
|
|
515
510
|
# Fallback to OpenAI SDK (uses beta.chat.completions.parse)
|
|
516
511
|
if _check_openai_available():
|
|
517
|
-
client = _get_openai_client(
|
|
518
|
-
api_key=self.config_list[0].get('api_key'),
|
|
519
|
-
base_url=self.config_list[0].get('base_url')
|
|
520
|
-
)
|
|
512
|
+
client = self._get_openai_client()
|
|
521
513
|
response = client.beta.chat.completions.parse(
|
|
522
514
|
model=model_name,
|
|
523
515
|
messages=messages,
|
|
@@ -1537,4 +1529,4 @@ Generate a workflow for: {self.topic}
|
|
|
1537
1529
|
with open(full_path, 'w') as f:
|
|
1538
1530
|
yaml.dump(workflow_yaml, f, default_flow_style=False, sort_keys=False)
|
|
1539
1531
|
|
|
1540
|
-
return full_path
|
|
1532
|
+
return full_path
|
|
@@ -86,6 +86,8 @@ Only respond with the JSON, no other text."""
|
|
|
86
86
|
)
|
|
87
87
|
|
|
88
88
|
import json
|
|
89
|
+
if not response.choices or response.choices[0].message is None:
|
|
90
|
+
raise ValueError("LLM returned empty or filtered response")
|
|
89
91
|
result_text = response.choices[0].message.content
|
|
90
92
|
result_data = json.loads(result_text)
|
|
91
93
|
|
|
@@ -160,6 +162,8 @@ Only respond with the JSON, no other text."""
|
|
|
160
162
|
)
|
|
161
163
|
|
|
162
164
|
import json
|
|
165
|
+
if not response.choices or response.choices[0].message is None:
|
|
166
|
+
raise ValueError("LLM returned empty or filtered response")
|
|
163
167
|
result_text = response.choices[0].message.content
|
|
164
168
|
result_data = json.loads(result_text)
|
|
165
169
|
|
|
@@ -103,7 +103,7 @@ def rag_query(
|
|
|
103
103
|
**kwargs
|
|
104
104
|
)
|
|
105
105
|
|
|
106
|
-
answer = response.choices[0].message.content if response.choices else ""
|
|
106
|
+
answer = response.choices[0].message.content if response.choices and response.choices[0].message is not None else ""
|
|
107
107
|
|
|
108
108
|
usage = None
|
|
109
109
|
if hasattr(response, 'usage') and response.usage:
|
|
@@ -188,7 +188,7 @@ async def arag_query(
|
|
|
188
188
|
**kwargs
|
|
189
189
|
)
|
|
190
190
|
|
|
191
|
-
answer = response.choices[0].message.content if response.choices else ""
|
|
191
|
+
answer = response.choices[0].message.content if response.choices and response.choices[0].message is not None else ""
|
|
192
192
|
|
|
193
193
|
usage = None
|
|
194
194
|
if hasattr(response, 'usage') and response.usage:
|
|
@@ -8,10 +8,36 @@ Plugin registry for CLI backend implementations following AGENTS.md patterns:
|
|
|
8
8
|
|
|
9
9
|
import threading
|
|
10
10
|
from typing import Dict, Callable, Any, Optional, Union
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
from .._registry import PluginRegistry
|
|
12
|
+
|
|
13
|
+
# CLI Backend Registry using canonical PluginRegistry
|
|
14
|
+
def _get_builtin_cli_backend_loaders() -> Dict[str, Callable[[], Any]]:
|
|
15
|
+
"""Get built-in CLI backend loaders."""
|
|
16
|
+
def claude_loader():
|
|
17
|
+
def factory():
|
|
18
|
+
from .claude import ClaudeCodeBackend
|
|
19
|
+
return ClaudeCodeBackend()
|
|
20
|
+
return factory
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
"claude-code": claude_loader
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
# Global CLI backend registry instance
|
|
27
|
+
_cli_backend_registry: Optional[PluginRegistry] = None
|
|
28
|
+
_registry_lock = threading.Lock()
|
|
29
|
+
|
|
30
|
+
def _get_cli_backend_registry() -> PluginRegistry:
|
|
31
|
+
"""Get the CLI backend registry instance."""
|
|
32
|
+
global _cli_backend_registry
|
|
33
|
+
if _cli_backend_registry is None:
|
|
34
|
+
with _registry_lock:
|
|
35
|
+
if _cli_backend_registry is None:
|
|
36
|
+
_cli_backend_registry = PluginRegistry(
|
|
37
|
+
entry_point_group="praisonai.cli_backends",
|
|
38
|
+
builtins=_get_builtin_cli_backend_loaders()
|
|
39
|
+
)
|
|
40
|
+
return _cli_backend_registry
|
|
15
41
|
|
|
16
42
|
|
|
17
43
|
def register_cli_backend(backend_id: str, factory: Callable[[], Any]) -> None:
|
|
@@ -21,14 +47,18 @@ def register_cli_backend(backend_id: str, factory: Callable[[], Any]) -> None:
|
|
|
21
47
|
backend_id: Unique identifier (e.g., "claude-code", "codex-cli")
|
|
22
48
|
factory: Factory function that returns a CliBackendProtocol instance
|
|
23
49
|
"""
|
|
24
|
-
|
|
25
|
-
|
|
50
|
+
# Wrap factory in a loader function for PluginRegistry
|
|
51
|
+
def factory_loader():
|
|
52
|
+
return factory
|
|
53
|
+
|
|
54
|
+
registry = _get_cli_backend_registry()
|
|
55
|
+
registry.register(backend_id, factory_loader)
|
|
26
56
|
|
|
27
57
|
|
|
28
58
|
def list_cli_backends() -> list[str]:
|
|
29
59
|
"""List all registered CLI backend IDs."""
|
|
30
|
-
|
|
31
|
-
|
|
60
|
+
registry = _get_cli_backend_registry()
|
|
61
|
+
return registry.list_names()
|
|
32
62
|
|
|
33
63
|
|
|
34
64
|
def resolve_cli_backend(
|
|
@@ -47,12 +77,15 @@ def resolve_cli_backend(
|
|
|
47
77
|
Raises:
|
|
48
78
|
ValueError: If backend_id is not registered
|
|
49
79
|
"""
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
factory =
|
|
80
|
+
registry = _get_cli_backend_registry()
|
|
81
|
+
|
|
82
|
+
try:
|
|
83
|
+
# Get the factory loader and create the factory
|
|
84
|
+
factory_loader = registry.resolve(backend_id)
|
|
85
|
+
factory = factory_loader()
|
|
86
|
+
except ValueError:
|
|
87
|
+
available = registry.list_names()
|
|
88
|
+
raise ValueError(f"Unknown CLI backend: {backend_id}. Available: {available}")
|
|
56
89
|
|
|
57
90
|
# Create instance with factory
|
|
58
91
|
backend = factory()
|
|
@@ -77,24 +110,4 @@ def resolve_cli_backend(
|
|
|
77
110
|
return backend
|
|
78
111
|
|
|
79
112
|
|
|
80
|
-
|
|
81
|
-
"""Register built-in CLI backends (lazy loaded)."""
|
|
82
|
-
# Only register if not already done
|
|
83
|
-
with _REGISTRY_LOCK:
|
|
84
|
-
if "claude-code" in _REGISTRY:
|
|
85
|
-
return
|
|
86
|
-
|
|
87
|
-
def claude_factory():
|
|
88
|
-
from .claude import ClaudeCodeBackend
|
|
89
|
-
return ClaudeCodeBackend()
|
|
90
|
-
|
|
91
|
-
register_cli_backend("claude-code", claude_factory)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
# Auto-register built-in backends on first access
|
|
95
|
-
def __getattr__(name: str):
|
|
96
|
-
"""Lazy registration trigger."""
|
|
97
|
-
_register_builtin_backends()
|
|
98
|
-
raise AttributeError(f"No attribute {name}")
|
|
99
|
-
|
|
100
|
-
# Registration happens lazily via __getattr__ on first attribute access
|
|
113
|
+
# Built-in backends are now registered via _get_builtin_cli_backend_loaders()
|
|
@@ -58,9 +58,10 @@ def write_file(
|
|
|
58
58
|
>>> if result['success']:
|
|
59
59
|
... print(f"Wrote to {result['path']}")
|
|
60
60
|
"""
|
|
61
|
-
# Resolve path
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
# Resolve path — default workspace is cwd so relative paths cannot escape
|
|
62
|
+
effective_workspace = workspace or os.getcwd()
|
|
63
|
+
if not os.path.isabs(path):
|
|
64
|
+
abs_path = os.path.abspath(os.path.join(effective_workspace, path))
|
|
64
65
|
else:
|
|
65
66
|
abs_path = os.path.abspath(path)
|
|
66
67
|
|
|
@@ -73,14 +74,12 @@ def write_file(
|
|
|
73
74
|
'path': path,
|
|
74
75
|
}
|
|
75
76
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
'path': path,
|
|
83
|
-
}
|
|
77
|
+
if not is_path_within_directory(abs_path, effective_workspace):
|
|
78
|
+
return {
|
|
79
|
+
'success': False,
|
|
80
|
+
'error': f"Path '{path}' is outside the workspace",
|
|
81
|
+
'path': path,
|
|
82
|
+
}
|
|
84
83
|
|
|
85
84
|
# Process content
|
|
86
85
|
processed_content = content
|