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.
Files changed (642) hide show
  1. {praisonai-4.6.139 → praisonai-4.6.141}/PKG-INFO +4 -4
  2. {praisonai-4.6.139 → praisonai-4.6.141}/PraisonAI.egg-info/PKG-INFO +4 -4
  3. {praisonai-4.6.139 → praisonai-4.6.141}/PraisonAI.egg-info/requires.txt +3 -3
  4. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/app.py +7 -0
  5. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/knowledge.py +13 -2
  6. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/interactive/async_tui.py +90 -0
  7. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/observability/hooks.py +102 -3
  8. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/orchestrator.py +37 -22
  9. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/security/__init__.py +7 -2
  10. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/security/injection.py +59 -8
  11. praisonai-4.6.141/praisonai/version.py +1 -0
  12. {praisonai-4.6.139 → praisonai-4.6.141}/pyproject.toml +3 -3
  13. praisonai-4.6.139/praisonai/version.py +0 -1
  14. {praisonai-4.6.139 → praisonai-4.6.141}/PraisonAI.egg-info/SOURCES.txt +0 -0
  15. {praisonai-4.6.139 → praisonai-4.6.141}/PraisonAI.egg-info/dependency_links.txt +0 -0
  16. {praisonai-4.6.139 → praisonai-4.6.141}/PraisonAI.egg-info/entry_points.txt +0 -0
  17. {praisonai-4.6.139 → praisonai-4.6.141}/PraisonAI.egg-info/top_level.txt +0 -0
  18. {praisonai-4.6.139 → praisonai-4.6.141}/README.md +0 -0
  19. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/__init__.py +0 -0
  20. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/__main__.py +0 -0
  21. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_approval_spec.py +0 -0
  22. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_async_bridge.py +0 -0
  23. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_bootstrap.py +0 -0
  24. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/__init__.py +0 -0
  25. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/api_md.py +0 -0
  26. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/__init__.py +0 -0
  27. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/docs_extractor.py +0 -0
  28. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/docs_generator.py +0 -0
  29. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/generator.py +0 -0
  30. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/python_docs_extractor.py +0 -0
  31. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/python_extractor.py +0 -0
  32. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/rust_docs_extractor.py +0 -0
  33. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/rust_extractor.py +0 -0
  34. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/topic_normalizer.py +0 -0
  35. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/ts_docs_extractor.py +0 -0
  36. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_dev/parity/typescript_extractor.py +0 -0
  37. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_entrypoint.py +0 -0
  38. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_framework_availability.py +0 -0
  39. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_lazy_cache.py +0 -0
  40. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_lockmap.py +0 -0
  41. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_logging.py +0 -0
  42. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_registry.py +0 -0
  43. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/_safe_loader.py +0 -0
  44. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/acp/__init__.py +0 -0
  45. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/acp/config.py +0 -0
  46. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/acp/safe_edit.py +0 -0
  47. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/acp/server.py +0 -0
  48. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/acp/session.py +0 -0
  49. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/adapters/__init__.py +0 -0
  50. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/adapters/readers.py +0 -0
  51. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/adapters/rerankers.py +0 -0
  52. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/adapters/retrievers.py +0 -0
  53. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/adapters/vector_stores.py +0 -0
  54. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/agent.py +0 -0
  55. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/agent_scheduler.py +0 -0
  56. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/agents_generator.py +0 -0
  57. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/api/agent_invoke.py +0 -0
  58. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/api/call.py +0 -0
  59. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/app/__init__.py +0 -0
  60. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/app/agentos.py +0 -0
  61. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/async_agent_scheduler.py +0 -0
  62. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/audit/__init__.py +0 -0
  63. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/audit/agent_centric.py +0 -0
  64. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/auto.py +0 -0
  65. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/bots/__init__.py +0 -0
  66. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/__init__.py +0 -0
  67. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/agent.py +0 -0
  68. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/benchmark.py +0 -0
  69. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/cdp_agent.py +0 -0
  70. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/cdp_utils.py +0 -0
  71. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/cli.py +0 -0
  72. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/diagnostics.py +0 -0
  73. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/launcher.py +0 -0
  74. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/playwright_agent.py +0 -0
  75. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/profiling.py +0 -0
  76. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/protocol.py +0 -0
  77. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/report.py +0 -0
  78. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/server.py +0 -0
  79. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/sessions.py +0 -0
  80. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/browser/video.py +0 -0
  81. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/__init__.py +0 -0
  82. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/a2a.py +0 -0
  83. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/assistants.py +0 -0
  84. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/audio.py +0 -0
  85. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/batches.py +0 -0
  86. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/completions.py +0 -0
  87. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/container_files.py +0 -0
  88. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/containers.py +0 -0
  89. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/embeddings.py +0 -0
  90. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/files.py +0 -0
  91. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/fine_tuning.py +0 -0
  92. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/guardrails.py +0 -0
  93. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/images.py +0 -0
  94. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/mcp.py +0 -0
  95. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/messages.py +0 -0
  96. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/moderations.py +0 -0
  97. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/ocr.py +0 -0
  98. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/passthrough.py +0 -0
  99. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/rag.py +0 -0
  100. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/realtime.py +0 -0
  101. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/rerank.py +0 -0
  102. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/responses.py +0 -0
  103. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/search.py +0 -0
  104. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/skills.py +0 -0
  105. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/vector_store_files.py +0 -0
  106. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/vector_stores.py +0 -0
  107. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/capabilities/videos.py +0 -0
  108. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/claw/__init__.py +0 -0
  109. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/__init__.py +0 -0
  110. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/_paths.py +0 -0
  111. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/_shim.py +0 -0
  112. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/_warnings.py +0 -0
  113. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/app.py +0 -0
  114. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/approval_backend.py +0 -0
  115. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/branding.py +0 -0
  116. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/__init__.py +0 -0
  117. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/acp.py +0 -0
  118. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/agent.py +0 -0
  119. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/agents.py +0 -0
  120. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/attach.py +0 -0
  121. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/audit.py +0 -0
  122. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/auth.py +0 -0
  123. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/batch.py +0 -0
  124. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/benchmark.py +0 -0
  125. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/bot.py +0 -0
  126. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/browser.py +0 -0
  127. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/call.py +0 -0
  128. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/chat.py +0 -0
  129. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/checkpoint.py +0 -0
  130. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/claw.py +0 -0
  131. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/code.py +0 -0
  132. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/command.py +0 -0
  133. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/commit.py +0 -0
  134. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/completion.py +0 -0
  135. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/config.py +0 -0
  136. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/context.py +0 -0
  137. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/daemon.py +0 -0
  138. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/dashboard.py +0 -0
  139. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/debug.py +0 -0
  140. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/deploy.py +0 -0
  141. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/diag.py +0 -0
  142. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/docs.py +0 -0
  143. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/doctor.py +0 -0
  144. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/endpoints.py +0 -0
  145. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/environment.py +0 -0
  146. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/eval.py +0 -0
  147. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/examples.py +0 -0
  148. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/flow.py +0 -0
  149. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/gateway.py +0 -0
  150. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/github.py +0 -0
  151. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/hooks.py +0 -0
  152. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/identity.py +0 -0
  153. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/init.py +0 -0
  154. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/kanban.py +0 -0
  155. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/langextract.py +0 -0
  156. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/langfuse.py +0 -0
  157. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/loop.py +0 -0
  158. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/lsp.py +0 -0
  159. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/managed.py +0 -0
  160. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/mcp.py +0 -0
  161. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/memory.py +0 -0
  162. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/mint_link.py +0 -0
  163. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/models.py +0 -0
  164. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/n8n.py +0 -0
  165. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/obs.py +0 -0
  166. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/onboard.py +0 -0
  167. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/package.py +0 -0
  168. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/pairing.py +0 -0
  169. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/paths.py +0 -0
  170. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/permissions.py +0 -0
  171. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/plugins.py +0 -0
  172. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/port.py +0 -0
  173. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/profile.py +0 -0
  174. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/publish.py +0 -0
  175. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/rag.py +0 -0
  176. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/realtime.py +0 -0
  177. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/recipe.py +0 -0
  178. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/registry.py +0 -0
  179. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/replay.py +0 -0
  180. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/research.py +0 -0
  181. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/retrieval.py +0 -0
  182. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/rules.py +0 -0
  183. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/run.py +0 -0
  184. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/sandbox.py +0 -0
  185. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/schedule.py +0 -0
  186. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/serve.py +0 -0
  187. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/session.py +0 -0
  188. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/setup.py +0 -0
  189. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/skills.py +0 -0
  190. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/standardise.py +0 -0
  191. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/templates.py +0 -0
  192. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/test.py +0 -0
  193. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/todo.py +0 -0
  194. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/tools.py +0 -0
  195. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/traces.py +0 -0
  196. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/tracker.py +0 -0
  197. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/train.py +0 -0
  198. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/ui.py +0 -0
  199. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/up.py +0 -0
  200. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/validate.py +0 -0
  201. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/version.py +0 -0
  202. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/commands/workflow.py +0 -0
  203. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/config_loader.py +0 -0
  204. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/configuration/__init__.py +0 -0
  205. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/configuration/config.schema.json +0 -0
  206. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/execution/__init__.py +0 -0
  207. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/fallback_schema.py +0 -0
  208. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/__init__.py +0 -0
  209. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/acp.py +0 -0
  210. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/agent_scheduler.py +0 -0
  211. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/agent_tools.py +0 -0
  212. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/approval.py +0 -0
  213. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/background.py +0 -0
  214. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/bots_cli.py +0 -0
  215. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/deploy.py +0 -0
  216. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/endpoints.py +0 -0
  217. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/eval.py +0 -0
  218. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/gateway.py +0 -0
  219. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/ollama.py +0 -0
  220. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/onboard.py +0 -0
  221. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/persistence.py +0 -0
  222. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/recipe.py +0 -0
  223. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/recipe_optimizer.py +0 -0
  224. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/registry.py +0 -0
  225. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/sandbox_cli.py +0 -0
  226. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/serve.py +0 -0
  227. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/templates.py +0 -0
  228. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/tools.py +0 -0
  229. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/tui/__init__.py +0 -0
  230. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/tui/app.py +0 -0
  231. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/features/workflow.py +0 -0
  232. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/interactive/__init__.py +0 -0
  233. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/interactive/core.py +0 -0
  234. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/langfuse_client.py +0 -0
  235. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/__init__.py +0 -0
  236. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/direct_prompt.py +0 -0
  237. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
  238. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/dispatch/argparse_builder.py +0 -0
  239. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
  240. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/framework_run.py +0 -0
  241. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
  242. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/interactive_legacy.py +0 -0
  243. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
  244. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/legacy/workflow_commands.py +0 -0
  245. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/main.py +0 -0
  246. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/output/__init__.py +0 -0
  247. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/schedule_cli.py +0 -0
  248. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/schema_provider.py +0 -0
  249. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/session/__init__.py +0 -0
  250. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/state/__init__.py +0 -0
  251. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/ui/__init__.py +0 -0
  252. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/unified_schema.py +0 -0
  253. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli/utils/__init__.py +0 -0
  254. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/cli_backends/__init__.py +0 -0
  255. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/__init__.py +0 -0
  256. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/agent_tools.py +0 -0
  257. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/diff/__init__.py +0 -0
  258. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/diff/diff_strategy.py +0 -0
  259. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/tools/__init__.py +0 -0
  260. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/tools/apply_diff.py +0 -0
  261. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/tools/execute_command.py +0 -0
  262. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/tools/list_files.py +0 -0
  263. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/tools/read_file.py +0 -0
  264. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/tools/search_replace.py +0 -0
  265. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/tools/write_file.py +0 -0
  266. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/utils/__init__.py +0 -0
  267. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/utils/file_utils.py +0 -0
  268. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/utils/ignore_utils.py +0 -0
  269. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/code/utils/text_utils.py +0 -0
  270. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/config/__init__.py +0 -0
  271. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/config/schema.py +0 -0
  272. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/config/validator.py +0 -0
  273. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/__init__.py +0 -0
  274. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/_storage_path.py +0 -0
  275. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/artifact_store.py +0 -0
  276. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/config.py +0 -0
  277. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/history_store.py +0 -0
  278. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/queue.py +0 -0
  279. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/setup.py +0 -0
  280. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/context/terminal_logger.py +0 -0
  281. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/daemon/__init__.py +0 -0
  282. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/db/__init__.py +0 -0
  283. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/db/adapter.py +0 -0
  284. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/__init__.py +0 -0
  285. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/api.py +0 -0
  286. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/docker.py +0 -0
  287. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/doctor.py +0 -0
  288. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/main.py +0 -0
  289. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/models.py +0 -0
  290. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/providers/__init__.py +0 -0
  291. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/providers/_registry.py +0 -0
  292. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/providers/aws.py +0 -0
  293. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/providers/azure.py +0 -0
  294. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/providers/base.py +0 -0
  295. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/providers/gcp.py +0 -0
  296. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/deploy/schema.py +0 -0
  297. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/__init__.py +0 -0
  298. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/a2u_server.py +0 -0
  299. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/discovery.py +0 -0
  300. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/__init__.py +0 -0
  301. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/a2a.py +0 -0
  302. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/a2u.py +0 -0
  303. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/agents_api.py +0 -0
  304. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/base.py +0 -0
  305. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/mcp.py +0 -0
  306. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/openai_compat.py +0 -0
  307. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/recipe.py +0 -0
  308. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/providers/tools_mcp.py +0 -0
  309. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/registry.py +0 -0
  310. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/endpoints/server.py +0 -0
  311. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/flow/__init__.py +0 -0
  312. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/flow/client.py +0 -0
  313. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
  314. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
  315. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/flow/components/__init__.py +0 -0
  316. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/flow/converter.py +0 -0
  317. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/flow/helpers.py +0 -0
  318. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/__init__.py +0 -0
  319. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/_config_builder.py +0 -0
  320. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/autogen_adapter.py +0 -0
  321. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/base.py +0 -0
  322. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/crewai_adapter.py +0 -0
  323. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/praisonai_adapter.py +0 -0
  324. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/registry.py +0 -0
  325. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/validators.py +0 -0
  326. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/framework_adapters/workflow_framework.py +0 -0
  327. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/gateway/__init__.py +0 -0
  328. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/inbuilt_tools/__init__.py +0 -0
  329. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  330. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/inc/__init__.py +0 -0
  331. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/inc/config.py +0 -0
  332. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/inc/models.py +0 -0
  333. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/__init__.py +0 -0
  334. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/bridges/__init__.py +0 -0
  335. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/bridges/approvals_bridge.py +0 -0
  336. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/bridges/hooks_query.py +0 -0
  337. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/bridges/kanban_bridge.py +0 -0
  338. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/bridges/schedules_runner.py +0 -0
  339. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/bridges/usage_bridge.py +0 -0
  340. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/bridges/workflows_service.py +0 -0
  341. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/context_files.py +0 -0
  342. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/gateway_host.py +0 -0
  343. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/host_app.py +0 -0
  344. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/pages/__init__.py +0 -0
  345. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/pages/bot_health.py +0 -0
  346. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integration/pages/workflow_runs.py +0 -0
  347. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/__init__.py +0 -0
  348. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/_session_info.py +0 -0
  349. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/_tool_aliases.py +0 -0
  350. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/_unified_registry.py +0 -0
  351. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/backend_registry.py +0 -0
  352. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/base.py +0 -0
  353. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/claude_code.py +0 -0
  354. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/codex_cli.py +0 -0
  355. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/compute/__init__.py +0 -0
  356. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/compute/daytona.py +0 -0
  357. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/compute/docker.py +0 -0
  358. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/compute/e2b.py +0 -0
  359. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/compute/flyio.py +0 -0
  360. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/compute/local.py +0 -0
  361. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/compute/modal_compute.py +0 -0
  362. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/cursor_cli.py +0 -0
  363. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/db_session_adapter.py +0 -0
  364. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/gemini_cli.py +0 -0
  365. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/hosted_agent.py +0 -0
  366. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/local_agent.py +0 -0
  367. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/managed_agents.py +0 -0
  368. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/managed_local.py +0 -0
  369. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/registry.py +0 -0
  370. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/integrations/sandboxed_agent.py +0 -0
  371. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/jobs/__init__.py +0 -0
  372. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/jobs/executor.py +0 -0
  373. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/jobs/models.py +0 -0
  374. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/jobs/path_validation.py +0 -0
  375. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/jobs/router.py +0 -0
  376. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/jobs/server.py +0 -0
  377. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/jobs/store.py +0 -0
  378. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/kanban/__init__.py +0 -0
  379. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/llm/__init__.py +0 -0
  380. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/llm/catalogue.py +0 -0
  381. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/llm/config.py +0 -0
  382. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/llm/credentials.py +0 -0
  383. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/llm/env.py +0 -0
  384. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/llm/gateways.py +0 -0
  385. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/llm/registry.py +0 -0
  386. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/__init__.py +0 -0
  387. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/__init__.py +0 -0
  388. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/agents.py +0 -0
  389. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/capabilities.py +0 -0
  390. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/cli_tools.py +0 -0
  391. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/extended_capabilities.py +0 -0
  392. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/knowledge.py +0 -0
  393. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/memory.py +0 -0
  394. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/prompts.py +0 -0
  395. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/resources.py +0 -0
  396. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/adapters/tools_bridge.py +0 -0
  397. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/auth/__init__.py +0 -0
  398. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/auth/api_key.py +0 -0
  399. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/auth/oauth.py +0 -0
  400. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/auth/oidc.py +0 -0
  401. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/auth/scopes.py +0 -0
  402. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/cli.py +0 -0
  403. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/elicitation.py +0 -0
  404. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/icons.py +0 -0
  405. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/recipe_adapter.py +0 -0
  406. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/recipe_cli.py +0 -0
  407. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/registry.py +0 -0
  408. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/sampling.py +0 -0
  409. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/server.py +0 -0
  410. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/tasks.py +0 -0
  411. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/tool_index.py +0 -0
  412. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/transports/__init__.py +0 -0
  413. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/transports/http_stream.py +0 -0
  414. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/mcp_server/transports/stdio.py +0 -0
  415. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/n8n/__init__.py +0 -0
  416. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/n8n/client.py +0 -0
  417. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/n8n/converter.py +0 -0
  418. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/n8n/preview.py +0 -0
  419. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/n8n/reverse_converter.py +0 -0
  420. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/observability/__init__.py +0 -0
  421. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/observability/langextract.py +0 -0
  422. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/observability/langfuse.py +0 -0
  423. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/__init__.py +0 -0
  424. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/_valkey_client.py +0 -0
  425. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/config.py +0 -0
  426. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/__init__.py +0 -0
  427. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/_sql_base.py +0 -0
  428. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
  429. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/async_mysql.py +0 -0
  430. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/async_postgres.py +0 -0
  431. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/async_sqlite.py +0 -0
  432. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/base.py +0 -0
  433. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/json_store.py +0 -0
  434. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/mysql.py +0 -0
  435. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/postgres.py +0 -0
  436. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/singlestore.py +0 -0
  437. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/sqlite.py +0 -0
  438. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/supabase.py +0 -0
  439. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/surrealdb.py +0 -0
  440. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
  441. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/conversation/turso.py +0 -0
  442. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/factory.py +0 -0
  443. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/hooks/__init__.py +0 -0
  444. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/hooks/agent_hooks.py +0 -0
  445. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/__init__.py +0 -0
  446. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/base.py +0 -0
  447. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/cassandra.py +0 -0
  448. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/chroma.py +0 -0
  449. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/clickhouse.py +0 -0
  450. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
  451. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/couchbase.py +0 -0
  452. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/lancedb.py +0 -0
  453. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
  454. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
  455. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
  456. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/milvus.py +0 -0
  457. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
  458. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/pgvector.py +0 -0
  459. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/pinecone.py +0 -0
  460. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/qdrant.py +0 -0
  461. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/redis_vector.py +0 -0
  462. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
  463. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
  464. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
  465. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
  466. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/knowledge/weaviate.py +0 -0
  467. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/migrations/__init__.py +0 -0
  468. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/migrations/manager.py +0 -0
  469. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/registry.py +0 -0
  470. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/__init__.py +0 -0
  471. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/async_mongodb.py +0 -0
  472. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/base.py +0 -0
  473. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/dynamodb.py +0 -0
  474. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/firestore.py +0 -0
  475. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/gcs.py +0 -0
  476. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/memory.py +0 -0
  477. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/mongodb.py +0 -0
  478. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/redis.py +0 -0
  479. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/upstash.py +0 -0
  480. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/state/valkey.py +0 -0
  481. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/tests/__init__.py +0 -0
  482. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/tests/test_all_backends.py +0 -0
  483. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/tests/test_registry_lazy.py +0 -0
  484. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/persistence/tests/test_valkey_backends.py +0 -0
  485. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/profiler.py +0 -0
  486. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/push/__init__.py +0 -0
  487. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/push/client.py +0 -0
  488. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/push/transports.py +0 -0
  489. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/__init__.py +0 -0
  490. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/bridge.py +0 -0
  491. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/core.py +0 -0
  492. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/exceptions.py +0 -0
  493. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/history.py +0 -0
  494. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/models.py +0 -0
  495. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/operations.py +0 -0
  496. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/policy.py +0 -0
  497. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/registry.py +0 -0
  498. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/runtime.py +0 -0
  499. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/security.py +0 -0
  500. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/serve.py +0 -0
  501. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/recipe/server.py +0 -0
  502. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/__init__.py +0 -0
  503. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/analyzer.py +0 -0
  504. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/applier.py +0 -0
  505. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/judge.py +0 -0
  506. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/plan.py +0 -0
  507. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/player.py +0 -0
  508. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/reader.py +0 -0
  509. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/storage.py +0 -0
  510. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/replay/writer.py +0 -0
  511. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/runtime/__init__.py +0 -0
  512. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/runtime/__main__.py +0 -0
  513. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/__init__.py +0 -0
  514. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/_compat.py +0 -0
  515. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/_registry.py +0 -0
  516. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/_shell.py +0 -0
  517. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/daytona.py +0 -0
  518. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/docker.py +0 -0
  519. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/e2b.py +0 -0
  520. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/modal.py +0 -0
  521. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/sandlock.py +0 -0
  522. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/ssh.py +0 -0
  523. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/sandbox/subprocess.py +0 -0
  524. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/__init__.py +0 -0
  525. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/_base_scheduler.py +0 -0
  526. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/_dispatch.py +0 -0
  527. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/agent_scheduler.py +0 -0
  528. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/async_agent_scheduler.py +0 -0
  529. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/base.py +0 -0
  530. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/blueprint_catalogue.py +0 -0
  531. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/condition_gate.py +0 -0
  532. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/daemon_manager.py +0 -0
  533. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/deployment.py +0 -0
  534. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/executor.py +0 -0
  535. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/run_policy.py +0 -0
  536. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/shared.py +0 -0
  537. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/state_manager.py +0 -0
  538. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/suggestion_engine.py +0 -0
  539. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/scheduler/yaml_loader.py +0 -0
  540. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/security/audit.py +0 -0
  541. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/security/protected.py +0 -0
  542. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/setup/__init__.py +0 -0
  543. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/setup/build.py +0 -0
  544. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/setup/post_install.py +0 -0
  545. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/setup/setup_conda_env.py +0 -0
  546. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/setup.py +0 -0
  547. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/__init__.py +0 -0
  548. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/ai_generator.py +0 -0
  549. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/config.py +0 -0
  550. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/dedupe.py +0 -0
  551. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/discovery.py +0 -0
  552. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/drift.py +0 -0
  553. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/engine.py +0 -0
  554. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/enhanced_templates.py +0 -0
  555. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/example_verifier.py +0 -0
  556. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/manifest.py +0 -0
  557. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/models.py +0 -0
  558. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/reports.py +0 -0
  559. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/templates.py +0 -0
  560. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/undo_redo.py +0 -0
  561. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/standardise/validator.py +0 -0
  562. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/storage/__init__.py +0 -0
  563. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/storage/dynamodb_adapter.py +0 -0
  564. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/storage/mongodb_adapter.py +0 -0
  565. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/storage/postgresql_adapter.py +0 -0
  566. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/storage/redis_adapter.py +0 -0
  567. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/storage/valkey_adapter.py +0 -0
  568. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/__init__.py +0 -0
  569. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/batch_source.py +0 -0
  570. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/cli_docs_source.py +0 -0
  571. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/discovery.py +0 -0
  572. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/docs_source.py +0 -0
  573. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/examples_source.py +0 -0
  574. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/executor.py +0 -0
  575. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/models.py +0 -0
  576. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/report_viewer.py +0 -0
  577. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/reporter.py +0 -0
  578. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/suite_runner/runner.py +0 -0
  579. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/__init__.py +0 -0
  580. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/cache.py +0 -0
  581. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/dependency_checker.py +0 -0
  582. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/discovery.py +0 -0
  583. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/loader.py +0 -0
  584. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/registry.py +0 -0
  585. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/resolver.py +0 -0
  586. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/security.py +0 -0
  587. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/tool_override.py +0 -0
  588. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/templates/tools_doctor.py +0 -0
  589. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tool_registry.py +0 -0
  590. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tool_resolver.py +0 -0
  591. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tools/__init__.py +0 -0
  592. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tools/audio.py +0 -0
  593. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tools/glob_tool.py +0 -0
  594. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tools/grep_tool.py +0 -0
  595. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tools/kanban_tools.py +0 -0
  596. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tools/multiedit.py +0 -0
  597. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/tools/skill_manage.py +0 -0
  598. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/__init__.py +0 -0
  599. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/_ollama.py +0 -0
  600. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/agents/__init__.py +0 -0
  601. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/agents/grader.py +0 -0
  602. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/agents/hook.py +0 -0
  603. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/agents/models.py +0 -0
  604. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/agents/orchestrator.py +0 -0
  605. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/agents/storage.py +0 -0
  606. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/llm/__init__.py +0 -0
  607. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train/llm/trainer.py +0 -0
  608. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train.py +0 -0
  609. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/train_vision.py +0 -0
  610. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui/_aiui_datastore.py +0 -0
  611. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui/_external_agents.py +0 -0
  612. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui/callbacks.py +0 -0
  613. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui/components/aicoder.py +0 -0
  614. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui/context.py +0 -0
  615. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui/database_config.py +0 -0
  616. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_agents/__init__.py +0 -0
  617. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_agents/default_app.py +0 -0
  618. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_bot/__init__.py +0 -0
  619. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_bot/default_app.py +0 -0
  620. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_chat/__init__.py +0 -0
  621. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_chat/default_app.py +0 -0
  622. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_dashboard/default_app.py +0 -0
  623. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_realtime/__init__.py +0 -0
  624. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/ui_realtime/default_app.py +0 -0
  625. {praisonai-4.6.139 → praisonai-4.6.141}/praisonai/upload_vision.py +0 -0
  626. {praisonai-4.6.139 → praisonai-4.6.141}/setup.cfg +0 -0
  627. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test.py +0 -0
  628. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_agents_playbook.py +0 -0
  629. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_approval_system.py +0 -0
  630. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_basic.py +0 -0
  631. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_cli_features.py +0 -0
  632. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_custom_tools_fix.py +0 -0
  633. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_double_api_fix.py +0 -0
  634. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_n8n_agent_invoke.py +0 -0
  635. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_n8n_cli_feature.py +0 -0
  636. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_n8n_integration.py +0 -0
  637. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_phase2_refactor.py +0 -0
  638. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_recipe.py +0 -0
  639. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_registry.py +0 -0
  640. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_runner.py +0 -0
  641. {praisonai-4.6.139 → praisonai-4.6.141}/tests/test_sandboxed_agent_compatibility.py +0 -0
  642. {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.139
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.142
15
- Requires-Dist: praisonai-code>=0.0.38
16
- Requires-Dist: praisonai-bot>=0.0.23
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.139
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.142
15
- Requires-Dist: praisonai-code>=0.0.38
16
- Requires-Dist: praisonai-bot>=0.0.23
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,9 +1,9 @@
1
1
  rich>=13.7
2
2
  markdown>=3.5
3
3
  pyparsing>=3.0.0
4
- praisonaiagents>=1.6.142
5
- praisonai-code>=0.0.38
6
- praisonai-bot>=0.0.23
4
+ praisonaiagents>=1.6.144
5
+ praisonai-code>=0.0.40
6
+ praisonai-bot>=0.0.25
7
7
  python-dotenv>=0.19.0
8
8
  litellm<2,>=1.83.14
9
9
  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
- if not results:
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 (default), 2 = HIGH, 1 = MEDIUM.
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
- threshold = ThreatLevel(block_threshold) if block_threshold is not None else ThreatLevel.CRITICAL
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(text):
259
+ if detect_instruction_patterns(normalized):
211
260
  triggered.append("instruction_override")
212
- if detect_authority_claims(text):
261
+ if detect_authority_claims(normalized):
213
262
  triggered.append("authority_claim")
214
- if detect_boundary_manipulation(text):
263
+ if detect_boundary_manipulation(normalized):
215
264
  triggered.append("boundary_manipulation")
216
- if detect_obfuscation(text):
265
+ if detect_obfuscation(normalized):
217
266
  triggered.append("obfuscation")
218
- if detect_financial_manipulation(text):
267
+ if detect_financial_manipulation(normalized):
219
268
  triggered.append("financial_manipulation")
220
- if detect_self_harm_instructions(text):
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, text, re.IGNORECASE):
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"