PraisonAI 4.6.150__tar.gz → 4.6.152__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 (595) hide show
  1. {praisonai-4.6.150 → praisonai-4.6.152}/PKG-INFO +11 -10
  2. {praisonai-4.6.150 → praisonai-4.6.152}/PraisonAI.egg-info/PKG-INFO +11 -10
  3. {praisonai-4.6.150 → praisonai-4.6.152}/PraisonAI.egg-info/SOURCES.txt +0 -11
  4. {praisonai-4.6.150 → praisonai-4.6.152}/PraisonAI.egg-info/requires.txt +10 -9
  5. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_bootstrap.py +16 -0
  6. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/agents_generator.py +67 -34
  7. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/api/agent_invoke.py +122 -6
  8. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/auto.py +44 -36
  9. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/sandbox_cli.py +31 -19
  10. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/framework_adapters/crewai_adapter.py +17 -28
  11. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/framework_adapters/praisonai_adapter.py +4 -15
  12. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/framework_adapters/registry.py +7 -2
  13. praisonai-4.6.152/praisonai/framework_adapters/validators.py +45 -0
  14. praisonai-4.6.152/praisonai/sandbox/__init__.py +13 -0
  15. praisonai-4.6.152/praisonai/sandbox/_registry.py +13 -0
  16. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/_delivery.py +108 -16
  17. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/agent_scheduler.py +7 -1
  18. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/async_agent_scheduler.py +7 -1
  19. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/templates/tool_override.py +129 -69
  20. praisonai-4.6.152/praisonai/version.py +1 -0
  21. {praisonai-4.6.150 → praisonai-4.6.152}/pyproject.toml +11 -9
  22. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test_n8n_agent_invoke.py +135 -0
  23. praisonai-4.6.150/praisonai/framework_adapters/validators.py +0 -28
  24. praisonai-4.6.150/praisonai/sandbox/__init__.py +0 -51
  25. praisonai-4.6.150/praisonai/sandbox/_compat.py +0 -29
  26. praisonai-4.6.150/praisonai/sandbox/_registry.py +0 -67
  27. praisonai-4.6.150/praisonai/sandbox/_shell.py +0 -38
  28. praisonai-4.6.150/praisonai/sandbox/daytona.py +0 -440
  29. praisonai-4.6.150/praisonai/sandbox/docker.py +0 -466
  30. praisonai-4.6.150/praisonai/sandbox/e2b.py +0 -376
  31. praisonai-4.6.150/praisonai/sandbox/modal.py +0 -380
  32. praisonai-4.6.150/praisonai/sandbox/sandlock.py +0 -542
  33. praisonai-4.6.150/praisonai/sandbox/ssh.py +0 -554
  34. praisonai-4.6.150/praisonai/sandbox/subprocess.py +0 -496
  35. praisonai-4.6.150/praisonai/ui/callbacks.py +0 -57
  36. praisonai-4.6.150/praisonai/ui/components/aicoder.py +0 -343
  37. praisonai-4.6.150/praisonai/version.py +0 -1
  38. {praisonai-4.6.150 → praisonai-4.6.152}/PraisonAI.egg-info/dependency_links.txt +0 -0
  39. {praisonai-4.6.150 → praisonai-4.6.152}/PraisonAI.egg-info/entry_points.txt +0 -0
  40. {praisonai-4.6.150 → praisonai-4.6.152}/PraisonAI.egg-info/top_level.txt +0 -0
  41. {praisonai-4.6.150 → praisonai-4.6.152}/README.md +0 -0
  42. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/__init__.py +0 -0
  43. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/__main__.py +0 -0
  44. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_approval_spec.py +0 -0
  45. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_async_bridge.py +0 -0
  46. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_dev/__init__.py +0 -0
  47. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_dev/api_md.py +0 -0
  48. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_dev/parity/__init__.py +0 -0
  49. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_dev/parity/docs_extractor.py +0 -0
  50. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_dev/parity/docs_generator.py +0 -0
  51. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_dev/parity/generator.py +0 -0
  52. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_dev/parity/python_docs_extractor.py +0 -0
  53. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_dev/parity/python_extractor.py +0 -0
  54. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_dev/parity/rust_docs_extractor.py +0 -0
  55. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_dev/parity/rust_extractor.py +0 -0
  56. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_dev/parity/topic_normalizer.py +0 -0
  57. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_dev/parity/ts_docs_extractor.py +0 -0
  58. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_dev/parity/typescript_extractor.py +0 -0
  59. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_entrypoint.py +0 -0
  60. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_framework_availability.py +0 -0
  61. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_lazy_cache.py +0 -0
  62. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_logging.py +0 -0
  63. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_registry.py +0 -0
  64. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/_safe_loader.py +0 -0
  65. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/acp/__init__.py +0 -0
  66. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/acp/config.py +0 -0
  67. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/acp/safe_edit.py +0 -0
  68. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/acp/server.py +0 -0
  69. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/acp/session.py +0 -0
  70. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/adapters/__init__.py +0 -0
  71. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/adapters/readers.py +0 -0
  72. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/adapters/rerankers.py +0 -0
  73. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/adapters/retrievers.py +0 -0
  74. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/adapters/vector_stores.py +0 -0
  75. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/agent.py +0 -0
  76. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/agent_scheduler.py +0 -0
  77. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/api/call.py +0 -0
  78. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/app/__init__.py +0 -0
  79. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/app/agentos.py +0 -0
  80. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/async_agent_scheduler.py +0 -0
  81. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/audit/__init__.py +0 -0
  82. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/audit/agent_centric.py +0 -0
  83. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/bots/__init__.py +0 -0
  84. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/browser/__init__.py +0 -0
  85. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/__init__.py +0 -0
  86. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/a2a.py +0 -0
  87. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/assistants.py +0 -0
  88. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/audio.py +0 -0
  89. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/batches.py +0 -0
  90. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/completions.py +0 -0
  91. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/container_files.py +0 -0
  92. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/containers.py +0 -0
  93. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/embeddings.py +0 -0
  94. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/files.py +0 -0
  95. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/fine_tuning.py +0 -0
  96. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/guardrails.py +0 -0
  97. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/images.py +0 -0
  98. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/mcp.py +0 -0
  99. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/messages.py +0 -0
  100. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/moderations.py +0 -0
  101. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/ocr.py +0 -0
  102. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/passthrough.py +0 -0
  103. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/rag.py +0 -0
  104. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/realtime.py +0 -0
  105. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/rerank.py +0 -0
  106. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/responses.py +0 -0
  107. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/search.py +0 -0
  108. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/skills.py +0 -0
  109. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/vector_store_files.py +0 -0
  110. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/vector_stores.py +0 -0
  111. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/capabilities/videos.py +0 -0
  112. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/claw/__init__.py +0 -0
  113. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/__init__.py +0 -0
  114. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/_paths.py +0 -0
  115. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/_shim.py +0 -0
  116. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/_warnings.py +0 -0
  117. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/app.py +0 -0
  118. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/approval_backend.py +0 -0
  119. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/branding.py +0 -0
  120. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/__init__.py +0 -0
  121. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/acp.py +0 -0
  122. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/agent.py +0 -0
  123. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/agents.py +0 -0
  124. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/app.py +0 -0
  125. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/attach.py +0 -0
  126. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/audit.py +0 -0
  127. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/auth.py +0 -0
  128. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/batch.py +0 -0
  129. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/benchmark.py +0 -0
  130. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/bot.py +0 -0
  131. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/browser.py +0 -0
  132. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/call.py +0 -0
  133. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/chat.py +0 -0
  134. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/checkpoint.py +0 -0
  135. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/claw.py +0 -0
  136. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/code.py +0 -0
  137. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/command.py +0 -0
  138. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/commit.py +0 -0
  139. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/completion.py +0 -0
  140. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/config.py +0 -0
  141. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/context.py +0 -0
  142. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/daemon.py +0 -0
  143. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/dashboard.py +0 -0
  144. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/debug.py +0 -0
  145. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/deploy.py +0 -0
  146. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/diag.py +0 -0
  147. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/docs.py +0 -0
  148. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/doctor.py +0 -0
  149. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/endpoints.py +0 -0
  150. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/environment.py +0 -0
  151. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/eval.py +0 -0
  152. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/examples.py +0 -0
  153. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/flow.py +0 -0
  154. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/gateway.py +0 -0
  155. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/github.py +0 -0
  156. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/hooks.py +0 -0
  157. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/identity.py +0 -0
  158. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/init.py +0 -0
  159. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/kanban.py +0 -0
  160. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/knowledge.py +0 -0
  161. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/langextract.py +0 -0
  162. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/langfuse.py +0 -0
  163. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/loop.py +0 -0
  164. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/lsp.py +0 -0
  165. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/managed.py +0 -0
  166. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/mcp.py +0 -0
  167. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/memory.py +0 -0
  168. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/mint_link.py +0 -0
  169. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/models.py +0 -0
  170. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/n8n.py +0 -0
  171. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/obs.py +0 -0
  172. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/onboard.py +0 -0
  173. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/package.py +0 -0
  174. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/pairing.py +0 -0
  175. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/paths.py +0 -0
  176. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/permissions.py +0 -0
  177. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/plugins.py +0 -0
  178. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/port.py +0 -0
  179. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/profile.py +0 -0
  180. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/publish.py +0 -0
  181. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/rag.py +0 -0
  182. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/realtime.py +0 -0
  183. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/recipe.py +0 -0
  184. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/registry.py +0 -0
  185. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/replay.py +0 -0
  186. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/research.py +0 -0
  187. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/retrieval.py +0 -0
  188. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/rules.py +0 -0
  189. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/run.py +0 -0
  190. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/sandbox.py +0 -0
  191. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/schedule.py +0 -0
  192. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/serve.py +0 -0
  193. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/session.py +0 -0
  194. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/setup.py +0 -0
  195. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/skills.py +0 -0
  196. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/standardise.py +0 -0
  197. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/templates.py +0 -0
  198. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/test.py +0 -0
  199. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/todo.py +0 -0
  200. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/tools.py +0 -0
  201. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/traces.py +0 -0
  202. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/tracker.py +0 -0
  203. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/train.py +0 -0
  204. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/ui.py +0 -0
  205. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/up.py +0 -0
  206. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/validate.py +0 -0
  207. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/version.py +0 -0
  208. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/commands/workflow.py +0 -0
  209. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/config_loader.py +0 -0
  210. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/configuration/__init__.py +0 -0
  211. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/configuration/config.schema.json +0 -0
  212. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/execution/__init__.py +0 -0
  213. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/fallback_schema.py +0 -0
  214. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/__init__.py +0 -0
  215. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/acp.py +0 -0
  216. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/agent_scheduler.py +0 -0
  217. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/agent_tools.py +0 -0
  218. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/approval.py +0 -0
  219. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/background.py +0 -0
  220. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/bots_cli.py +0 -0
  221. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/deploy.py +0 -0
  222. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/endpoints.py +0 -0
  223. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/eval.py +0 -0
  224. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/gateway.py +0 -0
  225. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/ollama.py +0 -0
  226. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/onboard.py +0 -0
  227. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/persistence.py +0 -0
  228. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/recipe.py +0 -0
  229. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/recipe_optimizer.py +0 -0
  230. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/registry.py +0 -0
  231. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/serve.py +0 -0
  232. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/templates.py +0 -0
  233. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/tools.py +0 -0
  234. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/tui/__init__.py +0 -0
  235. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/tui/app.py +0 -0
  236. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/features/workflow.py +0 -0
  237. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/interactive/__init__.py +0 -0
  238. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/interactive/async_tui.py +0 -0
  239. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/interactive/core.py +0 -0
  240. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/langfuse_client.py +0 -0
  241. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/legacy/__init__.py +0 -0
  242. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/legacy/direct_prompt.py +0 -0
  243. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
  244. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/legacy/dispatch/argparse_builder.py +0 -0
  245. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
  246. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/legacy/framework_run.py +0 -0
  247. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
  248. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/legacy/interactive_legacy.py +0 -0
  249. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
  250. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/legacy/workflow_commands.py +0 -0
  251. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/main.py +0 -0
  252. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/output/__init__.py +0 -0
  253. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/schedule_cli.py +0 -0
  254. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/schema_provider.py +0 -0
  255. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/session/__init__.py +0 -0
  256. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/state/__init__.py +0 -0
  257. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/ui/__init__.py +0 -0
  258. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/unified_schema.py +0 -0
  259. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli/utils/__init__.py +0 -0
  260. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/cli_backends/__init__.py +0 -0
  261. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/__init__.py +0 -0
  262. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/agent_tools.py +0 -0
  263. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/diff/__init__.py +0 -0
  264. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/diff/diff_strategy.py +0 -0
  265. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/tools/__init__.py +0 -0
  266. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/tools/apply_diff.py +0 -0
  267. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/tools/execute_command.py +0 -0
  268. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/tools/list_files.py +0 -0
  269. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/tools/read_file.py +0 -0
  270. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/tools/search_replace.py +0 -0
  271. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/tools/write_file.py +0 -0
  272. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/utils/__init__.py +0 -0
  273. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/utils/file_utils.py +0 -0
  274. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/utils/ignore_utils.py +0 -0
  275. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/code/utils/text_utils.py +0 -0
  276. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/config/__init__.py +0 -0
  277. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/config/schema.py +0 -0
  278. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/config/validator.py +0 -0
  279. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/context/__init__.py +0 -0
  280. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/context/_storage_path.py +0 -0
  281. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/context/artifact_store.py +0 -0
  282. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/context/config.py +0 -0
  283. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/context/history_store.py +0 -0
  284. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/context/queue.py +0 -0
  285. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/context/setup.py +0 -0
  286. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/context/terminal_logger.py +0 -0
  287. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/daemon/__init__.py +0 -0
  288. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/db/__init__.py +0 -0
  289. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/db/adapter.py +0 -0
  290. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/deploy/__init__.py +0 -0
  291. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/deploy/api.py +0 -0
  292. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/deploy/docker.py +0 -0
  293. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/deploy/doctor.py +0 -0
  294. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/deploy/main.py +0 -0
  295. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/deploy/models.py +0 -0
  296. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/deploy/providers/__init__.py +0 -0
  297. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/deploy/providers/_registry.py +0 -0
  298. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/deploy/providers/aws.py +0 -0
  299. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/deploy/providers/azure.py +0 -0
  300. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/deploy/providers/base.py +0 -0
  301. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/deploy/providers/gcp.py +0 -0
  302. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/deploy/schema.py +0 -0
  303. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/endpoints/__init__.py +0 -0
  304. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/endpoints/a2u_server.py +0 -0
  305. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/endpoints/discovery.py +0 -0
  306. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/endpoints/providers/__init__.py +0 -0
  307. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/endpoints/providers/a2a.py +0 -0
  308. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/endpoints/providers/a2u.py +0 -0
  309. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/endpoints/providers/agents_api.py +0 -0
  310. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/endpoints/providers/base.py +0 -0
  311. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/endpoints/providers/mcp.py +0 -0
  312. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/endpoints/providers/openai_compat.py +0 -0
  313. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/endpoints/providers/recipe.py +0 -0
  314. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/endpoints/providers/tools_mcp.py +0 -0
  315. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/endpoints/registry.py +0 -0
  316. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/endpoints/server.py +0 -0
  317. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/flow/__init__.py +0 -0
  318. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/flow/client.py +0 -0
  319. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
  320. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
  321. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/flow/components/__init__.py +0 -0
  322. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/flow/converter.py +0 -0
  323. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/flow/helpers.py +0 -0
  324. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/framework_adapters/__init__.py +0 -0
  325. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/framework_adapters/_config_builder.py +0 -0
  326. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/framework_adapters/autogen_adapter.py +0 -0
  327. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/framework_adapters/base.py +0 -0
  328. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/framework_adapters/workflow_framework.py +0 -0
  329. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/gateway/__init__.py +0 -0
  330. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/inbuilt_tools/__init__.py +0 -0
  331. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  332. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/inc/__init__.py +0 -0
  333. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/inc/config.py +0 -0
  334. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/inc/models.py +0 -0
  335. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integration/__init__.py +0 -0
  336. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integration/bridges/__init__.py +0 -0
  337. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integration/bridges/approvals_bridge.py +0 -0
  338. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integration/bridges/hooks_query.py +0 -0
  339. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integration/bridges/kanban_bridge.py +0 -0
  340. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integration/bridges/schedules_runner.py +0 -0
  341. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integration/bridges/usage_bridge.py +0 -0
  342. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integration/bridges/workflows_service.py +0 -0
  343. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integration/context_files.py +0 -0
  344. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integration/gateway_host.py +0 -0
  345. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integration/host_app.py +0 -0
  346. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integration/pages/__init__.py +0 -0
  347. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integration/pages/bot_health.py +0 -0
  348. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integration/pages/workflow_runs.py +0 -0
  349. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/__init__.py +0 -0
  350. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/_cli_loaders.py +0 -0
  351. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/_session_info.py +0 -0
  352. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/_tool_aliases.py +0 -0
  353. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/_unified_registry.py +0 -0
  354. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/backend_registry.py +0 -0
  355. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/base.py +0 -0
  356. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/claude_code.py +0 -0
  357. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/codex_cli.py +0 -0
  358. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/compute/__init__.py +0 -0
  359. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/compute/daytona.py +0 -0
  360. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/compute/docker.py +0 -0
  361. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/compute/e2b.py +0 -0
  362. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/compute/flyio.py +0 -0
  363. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/compute/local.py +0 -0
  364. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/compute/modal_compute.py +0 -0
  365. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/cursor_cli.py +0 -0
  366. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/db_session_adapter.py +0 -0
  367. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/gemini_cli.py +0 -0
  368. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/hosted_agent.py +0 -0
  369. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/local_agent.py +0 -0
  370. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/managed_agents.py +0 -0
  371. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/managed_local.py +0 -0
  372. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/registry.py +0 -0
  373. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/integrations/sandboxed_agent.py +0 -0
  374. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/jobs/__init__.py +0 -0
  375. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/jobs/executor.py +0 -0
  376. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/jobs/models.py +0 -0
  377. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/jobs/path_validation.py +0 -0
  378. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/jobs/router.py +0 -0
  379. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/jobs/server.py +0 -0
  380. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/jobs/store.py +0 -0
  381. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/kanban/__init__.py +0 -0
  382. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/llm/__init__.py +0 -0
  383. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/llm/catalogue.py +0 -0
  384. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/llm/config.py +0 -0
  385. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/llm/credentials.py +0 -0
  386. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/llm/env.py +0 -0
  387. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/llm/gateways.py +0 -0
  388. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/llm/registry.py +0 -0
  389. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/mcp_server/__init__.py +0 -0
  390. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/n8n/__init__.py +0 -0
  391. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/n8n/client.py +0 -0
  392. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/n8n/converter.py +0 -0
  393. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/n8n/preview.py +0 -0
  394. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/n8n/reverse_converter.py +0 -0
  395. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/observability/__init__.py +0 -0
  396. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/observability/hooks.py +0 -0
  397. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/observability/langextract.py +0 -0
  398. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/observability/langfuse.py +0 -0
  399. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/__init__.py +0 -0
  400. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/_valkey_client.py +0 -0
  401. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/config.py +0 -0
  402. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/__init__.py +0 -0
  403. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/_sql_base.py +0 -0
  404. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
  405. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/async_mysql.py +0 -0
  406. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/async_postgres.py +0 -0
  407. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/async_sqlite.py +0 -0
  408. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/base.py +0 -0
  409. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/json_store.py +0 -0
  410. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/mysql.py +0 -0
  411. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/postgres.py +0 -0
  412. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/singlestore.py +0 -0
  413. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/sqlite.py +0 -0
  414. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/supabase.py +0 -0
  415. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/surrealdb.py +0 -0
  416. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
  417. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/conversation/turso.py +0 -0
  418. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/factory.py +0 -0
  419. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/hooks/__init__.py +0 -0
  420. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/hooks/agent_hooks.py +0 -0
  421. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/__init__.py +0 -0
  422. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/base.py +0 -0
  423. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/cassandra.py +0 -0
  424. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/chroma.py +0 -0
  425. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/clickhouse.py +0 -0
  426. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
  427. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/couchbase.py +0 -0
  428. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/lancedb.py +0 -0
  429. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
  430. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
  431. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
  432. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/milvus.py +0 -0
  433. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
  434. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/pgvector.py +0 -0
  435. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/pinecone.py +0 -0
  436. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/qdrant.py +0 -0
  437. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/redis_vector.py +0 -0
  438. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
  439. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
  440. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
  441. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
  442. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/knowledge/weaviate.py +0 -0
  443. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/migrations/__init__.py +0 -0
  444. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/migrations/manager.py +0 -0
  445. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/orchestrator.py +0 -0
  446. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/registry.py +0 -0
  447. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/state/__init__.py +0 -0
  448. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/state/async_mongodb.py +0 -0
  449. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/state/base.py +0 -0
  450. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/state/dynamodb.py +0 -0
  451. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/state/firestore.py +0 -0
  452. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/state/gcs.py +0 -0
  453. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/state/memory.py +0 -0
  454. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/state/mongodb.py +0 -0
  455. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/state/redis.py +0 -0
  456. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/state/upstash.py +0 -0
  457. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/state/valkey.py +0 -0
  458. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/tests/__init__.py +0 -0
  459. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/tests/test_all_backends.py +0 -0
  460. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/tests/test_registry_lazy.py +0 -0
  461. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/persistence/tests/test_valkey_backends.py +0 -0
  462. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/profiler.py +0 -0
  463. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/push/__init__.py +0 -0
  464. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/push/client.py +0 -0
  465. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/push/transports.py +0 -0
  466. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/recipe/__init__.py +0 -0
  467. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/recipe/bridge.py +0 -0
  468. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/recipe/core.py +0 -0
  469. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/recipe/exceptions.py +0 -0
  470. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/recipe/history.py +0 -0
  471. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/recipe/models.py +0 -0
  472. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/recipe/operations.py +0 -0
  473. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/recipe/policy.py +0 -0
  474. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/recipe/registry.py +0 -0
  475. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/recipe/runtime.py +0 -0
  476. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/recipe/security.py +0 -0
  477. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/recipe/serve.py +0 -0
  478. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/recipe/server.py +0 -0
  479. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/replay/__init__.py +0 -0
  480. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/replay/analyzer.py +0 -0
  481. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/replay/applier.py +0 -0
  482. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/replay/judge.py +0 -0
  483. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/replay/plan.py +0 -0
  484. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/replay/player.py +0 -0
  485. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/replay/reader.py +0 -0
  486. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/replay/storage.py +0 -0
  487. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/replay/writer.py +0 -0
  488. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/runtime/__init__.py +0 -0
  489. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/runtime/__main__.py +0 -0
  490. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/__init__.py +0 -0
  491. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/_base_scheduler.py +0 -0
  492. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/_dispatch.py +0 -0
  493. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/base.py +0 -0
  494. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/blueprint_catalogue.py +0 -0
  495. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/condition_gate.py +0 -0
  496. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/daemon_manager.py +0 -0
  497. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/deployment.py +0 -0
  498. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/executor.py +0 -0
  499. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/run_policy.py +0 -0
  500. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/shared.py +0 -0
  501. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/state_manager.py +0 -0
  502. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/suggestion_engine.py +0 -0
  503. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/scheduler/yaml_loader.py +0 -0
  504. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/security/__init__.py +0 -0
  505. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/security/audit.py +0 -0
  506. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/security/injection.py +0 -0
  507. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/security/protected.py +0 -0
  508. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/setup/__init__.py +0 -0
  509. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/setup/build.py +0 -0
  510. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/setup/post_install.py +0 -0
  511. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/setup/setup_conda_env.py +0 -0
  512. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/setup.py +0 -0
  513. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/__init__.py +0 -0
  514. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/ai_generator.py +0 -0
  515. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/config.py +0 -0
  516. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/dedupe.py +0 -0
  517. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/discovery.py +0 -0
  518. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/drift.py +0 -0
  519. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/engine.py +0 -0
  520. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/enhanced_templates.py +0 -0
  521. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/example_verifier.py +0 -0
  522. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/manifest.py +0 -0
  523. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/models.py +0 -0
  524. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/reports.py +0 -0
  525. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/templates.py +0 -0
  526. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/undo_redo.py +0 -0
  527. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/standardise/validator.py +0 -0
  528. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/storage/__init__.py +0 -0
  529. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/storage/dynamodb_adapter.py +0 -0
  530. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/storage/mongodb_adapter.py +0 -0
  531. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/storage/postgresql_adapter.py +0 -0
  532. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/storage/redis_adapter.py +0 -0
  533. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/storage/valkey_adapter.py +0 -0
  534. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/suite_runner/__init__.py +0 -0
  535. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/suite_runner/batch_source.py +0 -0
  536. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/suite_runner/cli_docs_source.py +0 -0
  537. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/suite_runner/discovery.py +0 -0
  538. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/suite_runner/docs_source.py +0 -0
  539. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/suite_runner/examples_source.py +0 -0
  540. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/suite_runner/executor.py +0 -0
  541. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/suite_runner/models.py +0 -0
  542. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/suite_runner/report_viewer.py +0 -0
  543. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/suite_runner/reporter.py +0 -0
  544. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/suite_runner/runner.py +0 -0
  545. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/templates/__init__.py +0 -0
  546. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/templates/cache.py +0 -0
  547. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/templates/dependency_checker.py +0 -0
  548. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/templates/discovery.py +0 -0
  549. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/templates/loader.py +0 -0
  550. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/templates/registry.py +0 -0
  551. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/templates/resolver.py +0 -0
  552. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/templates/security.py +0 -0
  553. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/templates/tools_doctor.py +0 -0
  554. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/tool_registry.py +0 -0
  555. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/tool_resolver.py +0 -0
  556. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/tools/__init__.py +0 -0
  557. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/tools/audio.py +0 -0
  558. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/tools/glob_tool.py +0 -0
  559. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/tools/grep_tool.py +0 -0
  560. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/tools/kanban_tools.py +0 -0
  561. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/tools/multiedit.py +0 -0
  562. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/tools/skill_manage.py +0 -0
  563. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/train/__init__.py +0 -0
  564. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/train.py +0 -0
  565. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/train_vision.py +0 -0
  566. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/ui/_aiui_datastore.py +0 -0
  567. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/ui/_external_agents.py +0 -0
  568. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/ui/context.py +0 -0
  569. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/ui/database_config.py +0 -0
  570. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/ui_agents/__init__.py +0 -0
  571. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/ui_agents/default_app.py +0 -0
  572. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/ui_bot/__init__.py +0 -0
  573. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/ui_bot/default_app.py +0 -0
  574. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/ui_chat/__init__.py +0 -0
  575. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/ui_chat/default_app.py +0 -0
  576. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/ui_dashboard/default_app.py +0 -0
  577. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/ui_realtime/__init__.py +0 -0
  578. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/ui_realtime/default_app.py +0 -0
  579. {praisonai-4.6.150 → praisonai-4.6.152}/praisonai/upload_vision.py +0 -0
  580. {praisonai-4.6.150 → praisonai-4.6.152}/setup.cfg +0 -0
  581. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test.py +0 -0
  582. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test_agents_playbook.py +0 -0
  583. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test_approval_system.py +0 -0
  584. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test_basic.py +0 -0
  585. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test_cli_features.py +0 -0
  586. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test_custom_tools_fix.py +0 -0
  587. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test_double_api_fix.py +0 -0
  588. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test_n8n_cli_feature.py +0 -0
  589. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test_n8n_integration.py +0 -0
  590. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test_phase2_refactor.py +0 -0
  591. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test_recipe.py +0 -0
  592. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test_registry.py +0 -0
  593. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test_runner.py +0 -0
  594. {praisonai-4.6.150 → praisonai-4.6.152}/tests/test_sandboxed_agent_compatibility.py +0 -0
  595. {praisonai-4.6.150 → praisonai-4.6.152}/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.150
3
+ Version: 4.6.152
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,12 +11,13 @@ 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.153
15
- Requires-Dist: praisonai-code>=0.0.49
16
- Requires-Dist: praisonai-bot>=0.0.34
17
- Requires-Dist: praisonai-train>=0.0.5
18
- Requires-Dist: praisonai-browser>=0.0.2
19
- Requires-Dist: praisonai-mcp>=0.0.2
14
+ Requires-Dist: praisonaiagents>=1.6.155
15
+ Requires-Dist: praisonai-code>=0.0.51
16
+ Requires-Dist: praisonai-bot>=0.0.36
17
+ Requires-Dist: praisonai-train>=0.0.7
18
+ Requires-Dist: praisonai-browser>=0.0.4
19
+ Requires-Dist: praisonai-mcp>=0.0.4
20
+ Requires-Dist: praisonai-sandbox>=0.0.2
20
21
  Requires-Dist: python-dotenv>=0.19.0
21
22
  Requires-Dist: litellm<2,>=1.83.14
22
23
  Requires-Dist: PyYAML>=6.0
@@ -60,11 +61,11 @@ Requires-Dist: tavily-python==0.5.0; extra == "code"
60
61
  Requires-Dist: crawl4ai>=0.7.0; extra == "code"
61
62
  Requires-Dist: playwright>=1.47.0; extra == "code"
62
63
  Provides-Extra: sandbox
63
- Requires-Dist: sandlock>=0.1.0; extra == "sandbox"
64
+ Requires-Dist: praisonai-sandbox[all]; extra == "sandbox"
64
65
  Provides-Extra: ssh
65
- Requires-Dist: asyncssh>=2.14.0; extra == "ssh"
66
+ Requires-Dist: praisonai-sandbox[ssh]; extra == "ssh"
66
67
  Provides-Extra: modal
67
- Requires-Dist: modal>=0.64.0; extra == "modal"
68
+ Requires-Dist: praisonai-sandbox[modal]; extra == "modal"
68
69
  Provides-Extra: daytona
69
70
  Provides-Extra: realtime
70
71
  Requires-Dist: aiui<0.4,>=0.3.121; extra == "realtime"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 4.6.150
3
+ Version: 4.6.152
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,12 +11,13 @@ 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.153
15
- Requires-Dist: praisonai-code>=0.0.49
16
- Requires-Dist: praisonai-bot>=0.0.34
17
- Requires-Dist: praisonai-train>=0.0.5
18
- Requires-Dist: praisonai-browser>=0.0.2
19
- Requires-Dist: praisonai-mcp>=0.0.2
14
+ Requires-Dist: praisonaiagents>=1.6.155
15
+ Requires-Dist: praisonai-code>=0.0.51
16
+ Requires-Dist: praisonai-bot>=0.0.36
17
+ Requires-Dist: praisonai-train>=0.0.7
18
+ Requires-Dist: praisonai-browser>=0.0.4
19
+ Requires-Dist: praisonai-mcp>=0.0.4
20
+ Requires-Dist: praisonai-sandbox>=0.0.2
20
21
  Requires-Dist: python-dotenv>=0.19.0
21
22
  Requires-Dist: litellm<2,>=1.83.14
22
23
  Requires-Dist: PyYAML>=6.0
@@ -60,11 +61,11 @@ Requires-Dist: tavily-python==0.5.0; extra == "code"
60
61
  Requires-Dist: crawl4ai>=0.7.0; extra == "code"
61
62
  Requires-Dist: playwright>=1.47.0; extra == "code"
62
63
  Provides-Extra: sandbox
63
- Requires-Dist: sandlock>=0.1.0; extra == "sandbox"
64
+ Requires-Dist: praisonai-sandbox[all]; extra == "sandbox"
64
65
  Provides-Extra: ssh
65
- Requires-Dist: asyncssh>=2.14.0; extra == "ssh"
66
+ Requires-Dist: praisonai-sandbox[ssh]; extra == "ssh"
66
67
  Provides-Extra: modal
67
- Requires-Dist: modal>=0.64.0; extra == "modal"
68
+ Requires-Dist: praisonai-sandbox[modal]; extra == "modal"
68
69
  Provides-Extra: daytona
69
70
  Provides-Extra: realtime
70
71
  Requires-Dist: aiui<0.4,>=0.3.121; extra == "realtime"
@@ -471,16 +471,7 @@ praisonai/replay/writer.py
471
471
  praisonai/runtime/__init__.py
472
472
  praisonai/runtime/__main__.py
473
473
  praisonai/sandbox/__init__.py
474
- praisonai/sandbox/_compat.py
475
474
  praisonai/sandbox/_registry.py
476
- praisonai/sandbox/_shell.py
477
- praisonai/sandbox/daytona.py
478
- praisonai/sandbox/docker.py
479
- praisonai/sandbox/e2b.py
480
- praisonai/sandbox/modal.py
481
- praisonai/sandbox/sandlock.py
482
- praisonai/sandbox/ssh.py
483
- praisonai/sandbox/subprocess.py
484
475
  praisonai/scheduler/__init__.py
485
476
  praisonai/scheduler/_base_scheduler.py
486
477
  praisonai/scheduler/_delivery.py
@@ -558,10 +549,8 @@ praisonai/tools/skill_manage.py
558
549
  praisonai/train/__init__.py
559
550
  praisonai/ui/_aiui_datastore.py
560
551
  praisonai/ui/_external_agents.py
561
- praisonai/ui/callbacks.py
562
552
  praisonai/ui/context.py
563
553
  praisonai/ui/database_config.py
564
- praisonai/ui/components/aicoder.py
565
554
  praisonai/ui_agents/__init__.py
566
555
  praisonai/ui_agents/default_app.py
567
556
  praisonai/ui_bot/__init__.py
@@ -1,12 +1,13 @@
1
1
  rich>=13.7
2
2
  markdown>=3.5
3
3
  pyparsing>=3.0.0
4
- praisonaiagents>=1.6.153
5
- praisonai-code>=0.0.49
6
- praisonai-bot>=0.0.34
7
- praisonai-train>=0.0.5
8
- praisonai-browser>=0.0.2
9
- praisonai-mcp>=0.0.2
4
+ praisonaiagents>=1.6.155
5
+ praisonai-code>=0.0.51
6
+ praisonai-bot>=0.0.36
7
+ praisonai-train>=0.0.7
8
+ praisonai-browser>=0.0.4
9
+ praisonai-mcp>=0.0.4
10
+ praisonai-sandbox>=0.0.2
10
11
  python-dotenv>=0.19.0
11
12
  litellm<2,>=1.83.14
12
13
  PyYAML>=6.0
@@ -171,7 +172,7 @@ praisonai-tools>=0.1.0
171
172
  praisonai-mcp[all]
172
173
 
173
174
  [modal]
174
- modal>=0.64.0
175
+ praisonai-sandbox[modal]
175
176
 
176
177
  [mongodb]
177
178
  pymongo>=4.6.0
@@ -216,10 +217,10 @@ ddgs>=9.0.0
216
217
  redis>=5.0.0
217
218
 
218
219
  [sandbox]
219
- sandlock>=0.1.0
220
+ praisonai-sandbox[all]
220
221
 
221
222
  [ssh]
222
- asyncssh>=2.14.0
223
+ praisonai-sandbox[ssh]
223
224
 
224
225
  [train]
225
226
  praisonai-train[llm]
@@ -91,3 +91,19 @@ def ensure_praisonai_mcp() -> None:
91
91
  root = str(mcp_src)
92
92
  if root not in sys.path:
93
93
  sys.path.insert(0, root)
94
+
95
+
96
+ def ensure_praisonai_sandbox() -> None:
97
+ """Ensure ``praisonai_sandbox`` can be imported in monorepo dev layouts."""
98
+ try:
99
+ import praisonai_sandbox # noqa: F401
100
+ return
101
+ except ImportError:
102
+ pass
103
+
104
+ wrapper_src = Path(__file__).resolve().parents[1] # .../src/praisonai
105
+ sandbox_src = wrapper_src.parent / "praisonai-sandbox"
106
+ if (sandbox_src / "praisonai_sandbox").is_dir():
107
+ root = str(sandbox_src)
108
+ if root not in sys.path:
109
+ sys.path.insert(0, root)
@@ -401,7 +401,7 @@ def _resolve_yaml_cli_backend(cli_backend_config, logger):
401
401
 
402
402
 
403
403
  class AgentsGenerator:
404
- def __init__(self, agent_file, framework, config_list, log_level=None, agent_callback=None, task_callback=None, agent_yaml=None, tools=None, cli_config=None, adapter_registry=None, tool_timeout_executor=None):
404
+ def __init__(self, agent_file, framework, config_list, log_level=None, agent_callback=None, task_callback=None, agent_yaml=None, tools=None, cli_config=None, adapter_registry=None, tool_timeout_executor=None, tool_resolver=None):
405
405
  """
406
406
  Initialize the AgentsGenerator object.
407
407
 
@@ -416,6 +416,7 @@ class AgentsGenerator:
416
416
  tools (dict, optional): A dictionary containing the tools to be used for the agents. Defaults to None.
417
417
  cli_config (dict, optional): CLI configuration to override YAML settings. Defaults to None.
418
418
  adapter_registry (FrameworkAdapterRegistry, optional): Registry for framework adapters. Defaults to process default.
419
+ tool_resolver (ToolResolver, optional): Canonical tool resolver. Defaults to the shared context-local resolver so discovery runs once per run.
419
420
 
420
421
  Attributes:
421
422
  agent_file (str): The path to the agent file.
@@ -448,9 +449,14 @@ class AgentsGenerator:
448
449
  elif os.environ.get('LOGLEVEL'):
449
450
  self.logger.setLevel(getattr(logging, os.environ.get('LOGLEVEL', 'INFO').upper(), logging.INFO))
450
451
 
451
- # Initialize tool resolver (single source of truth for tool resolution)
452
- from .tool_resolver import ToolResolver
453
- self.tool_resolver = ToolResolver()
452
+ # Initialize tool resolver (single source of truth for tool resolution).
453
+ # DI-friendly: callers (e.g. AutoGenerator hand-off, tests) may pass a
454
+ # resolver; otherwise share the context-local default so tool discovery
455
+ # runs once per run instead of once per generator construction.
456
+ if tool_resolver is None:
457
+ from .tool_resolver import _get_default_resolver
458
+ tool_resolver = _get_default_resolver()
459
+ self.tool_resolver = tool_resolver
454
460
 
455
461
  # DI-friendly: tests/multi-tenant runtimes pass their own registry;
456
462
  # CLI users get the process default.
@@ -699,30 +705,40 @@ class AgentsGenerator:
699
705
  framework_name = self.framework or config.get('framework', 'praisonai')
700
706
  adapter = self._select_framework(framework_name, config)
701
707
 
702
- # Validate framework availability
708
+ # Validate framework availability through the injected registry so a
709
+ # scoped/per-tenant adapter registered on this generator's registry is
710
+ # not rejected just because it is absent from the process default.
703
711
  from .framework_adapters.validators import assert_framework_available
704
- assert_framework_available(adapter.name)
712
+ assert_framework_available(adapter.name, registry=self._adapter_registry)
705
713
 
706
714
  # Validate cli_backend compatibility
707
715
  self._validate_cli_backend_compatibility(config, adapter.name, adapter=adapter)
708
-
709
- # Initialize observability hooks
710
- from .observability.hooks import init_observability
711
- init_observability(adapter.name)
712
-
713
- # Run adapter setup hooks
714
- adapter.setup(framework_tag=adapter.name)
715
-
716
+
716
717
  # Update framework reference if resolution changed it
717
718
  self.framework = adapter.name
718
719
  self.framework_adapter = adapter
719
-
720
+
721
+ # NB: adapter setup is intentionally NOT run here. The caller opens the
722
+ # observability_session (which owns init/finalize for every adapter) and
723
+ # then invokes _run_adapter_setup INSIDE that session, so setup events —
724
+ # and any setup/import failure — are recorded and finalized instead of
725
+ # slipping outside observability. See generate_crew_and_kickoff /
726
+ # agenerate_crew_and_kickoff.
720
727
  return {
721
728
  'adapter': adapter,
722
729
  'config': config,
723
730
  'topic': topic,
724
731
  'tools_dict': tools_dict,
725
732
  }
733
+
734
+ def _run_adapter_setup(self, adapter):
735
+ """Run an adapter's setup hooks.
736
+
737
+ Kept as a tiny seam so both the sync and async run paths execute setup
738
+ *inside* the observability_session, keeping init/setup/run/finalize
739
+ bracketed together for every adapter.
740
+ """
741
+ adapter.setup(framework_tag=adapter.name)
726
742
 
727
743
  def _build_tools_dict(self, config):
728
744
  """Shared tool resolution logic for sync and async paths."""
@@ -991,15 +1007,22 @@ class AgentsGenerator:
991
1007
  prep = self._prepare_for_run(config)
992
1008
 
993
1009
  self.logger.info(f"Using framework: {prep['adapter'].name}")
994
- return prep['adapter'].run(
995
- prep['config'],
996
- self.config_list,
997
- prep['topic'],
998
- tools_dict=prep['tools_dict'],
999
- agent_callback=getattr(self, 'agent_callback', None),
1000
- task_callback=getattr(self, 'task_callback', None),
1001
- cli_config=getattr(self, 'cli_config', None),
1002
- )
1010
+ # Own the observability lifecycle here so init and finalize are always
1011
+ # paired for every adapter (the CM finalizes on success and error alike).
1012
+ from .observability.hooks import observability_session
1013
+ with observability_session(prep['adapter'].name):
1014
+ # Run setup INSIDE the session so setup events and any setup/import
1015
+ # failure are recorded and finalized, not dropped outside observability.
1016
+ self._run_adapter_setup(prep['adapter'])
1017
+ return prep['adapter'].run(
1018
+ prep['config'],
1019
+ self.config_list,
1020
+ prep['topic'],
1021
+ tools_dict=prep['tools_dict'],
1022
+ agent_callback=getattr(self, 'agent_callback', None),
1023
+ task_callback=getattr(self, 'task_callback', None),
1024
+ cli_config=getattr(self, 'cli_config', None),
1025
+ )
1003
1026
 
1004
1027
  async def _aload_config(self):
1005
1028
  """Async-safe config loading (blocking file I/O off the event loop)."""
@@ -1007,7 +1030,8 @@ class AgentsGenerator:
1007
1030
  return await asyncio.to_thread(self._load_config)
1008
1031
 
1009
1032
  async def _aprepare_for_run(self, config):
1010
- """Async-safe run preparation (heavy imports + adapter.setup() off the loop)."""
1033
+ """Async-safe run preparation (heavy imports off the loop). Adapter setup
1034
+ runs later, inside the observability_session (see agenerate_crew_and_kickoff)."""
1011
1035
  import asyncio
1012
1036
  return await asyncio.to_thread(self._prepare_for_run, config)
1013
1037
 
@@ -1026,15 +1050,24 @@ class AgentsGenerator:
1026
1050
  prep = await self._aprepare_for_run(config)
1027
1051
 
1028
1052
  self.logger.info(f"Using framework: {prep['adapter'].name}")
1029
- return await prep['adapter'].arun(
1030
- prep['config'],
1031
- self.config_list,
1032
- prep['topic'],
1033
- tools_dict=prep['tools_dict'],
1034
- agent_callback=getattr(self, 'agent_callback', None),
1035
- task_callback=getattr(self, 'task_callback', None),
1036
- cli_config=getattr(self, 'cli_config', None),
1037
- )
1053
+ # Own the observability lifecycle here so init and finalize are always
1054
+ # paired for every adapter (the CM finalizes on success and error alike).
1055
+ import asyncio
1056
+ from .observability.hooks import observability_session
1057
+ with observability_session(prep['adapter'].name):
1058
+ # Run setup INSIDE the session (off the event loop, as it may block)
1059
+ # so setup events and any setup/import failure are recorded and
1060
+ # finalized, not dropped outside observability.
1061
+ await asyncio.to_thread(self._run_adapter_setup, prep['adapter'])
1062
+ return await prep['adapter'].arun(
1063
+ prep['config'],
1064
+ self.config_list,
1065
+ prep['topic'],
1066
+ tools_dict=prep['tools_dict'],
1067
+ agent_callback=getattr(self, 'agent_callback', None),
1068
+ task_callback=getattr(self, 'task_callback', None),
1069
+ cli_config=getattr(self, 'cli_config', None),
1070
+ )
1038
1071
 
1039
1072
 
1040
1073
  def _build_yaml_workflow(self, config):
@@ -168,6 +168,109 @@ def list_registered_agents() -> list:
168
168
  return list(_agent_registry.keys())
169
169
 
170
170
 
171
+ def _is_real_agent(agent: Any) -> bool:
172
+ """Return True when ``agent`` is a genuine ``praisonaiagents`` ``Agent``.
173
+
174
+ Uses ``isinstance`` against the real ``Agent`` class so **subclasses defined
175
+ in application code** are recognised too (they inherit the per-session
176
+ machinery and ``clone_for_channel``). Plain mocks / lightweight callables are
177
+ not ``Agent`` instances, so they fall back to the shared instance for
178
+ backward compatibility. If ``praisonaiagents`` cannot be imported we treat
179
+ the object as non-isolatable.
180
+ """
181
+ try:
182
+ from praisonaiagents import Agent
183
+ except Exception:
184
+ return False
185
+ return isinstance(agent, Agent)
186
+
187
+
188
+ def _supports_session_isolation(agent: Any) -> bool:
189
+ """Return True when ``agent`` can be safely cloned per session.
190
+
191
+ A real ``Agent`` (or any subclass) exposes the per-session machinery
192
+ (``_session_id`` binding, ``chat_history`` and a safe clone path). Plain
193
+ mocks / lightweight callables do not, so they stay on the shared instance to
194
+ preserve backward compatibility.
195
+ """
196
+ if not _is_real_agent(agent):
197
+ return False
198
+ if not hasattr(agent, "_session_id"):
199
+ return False
200
+ if not hasattr(agent, "chat_history"):
201
+ return False
202
+ return callable(getattr(agent, "clone_for_channel", None))
203
+
204
+
205
+ def _clone_agent(agent: Any) -> Any:
206
+ """Create an independent copy of a real ``Agent``.
207
+
208
+ Prefers ``clone_for_channel`` (purpose-built for multi-channel isolation
209
+ with fresh locks), falling back to ``deepcopy``.
210
+ """
211
+ clone_for_channel = getattr(agent, "clone_for_channel", None)
212
+ if callable(clone_for_channel):
213
+ return clone_for_channel()
214
+ import copy as _copy
215
+
216
+ return _copy.deepcopy(agent)
217
+
218
+
219
+ def resolve_session_agent(agent_id: str, session_id: Optional[str]) -> Any:
220
+ """Resolve an isolated, session-scoped agent for a single request.
221
+
222
+ The registry holds a *template* agent, not a live conversation. Every
223
+ request gets its own clone so concurrent callers never share mutable
224
+ ``chat_history``:
225
+
226
+ - With a ``session_id``: the clone is bound to that session so its history
227
+ is loaded from (and persisted to) the shared, file-locked session store —
228
+ giving continuity across requests and isolation between sessions.
229
+ - Without a ``session_id``: the clone is ephemeral (no session binding), so
230
+ no global state is mutated.
231
+
232
+ Agents that don't support cloning/session binding (e.g. plain mocks) fall
233
+ back to the shared registry instance for backward compatibility.
234
+ """
235
+ template = get_agent(agent_id)
236
+ if template is None:
237
+ return None
238
+
239
+ if not _supports_session_isolation(template):
240
+ return template
241
+
242
+ try:
243
+ agent = _clone_agent(template)
244
+ except Exception as e:
245
+ # A clone failure must never silently fall back to the shared template:
246
+ # doing so would leak one session's chat_history into another. Fail the
247
+ # request instead so isolation is guaranteed.
248
+ logger.error(
249
+ f"Failed to clone agent '{agent_id}' for session isolation: {e}"
250
+ )
251
+ raise RuntimeError(
252
+ f"Failed to isolate agent '{agent_id}' for session: {e}"
253
+ ) from e
254
+
255
+ # Reset per-request conversation state so the clone starts clean and
256
+ # (re)loads the requested session's history lazily on first chat.
257
+ try:
258
+ agent.chat_history = []
259
+ except Exception:
260
+ pass
261
+ if hasattr(agent, "_session_store_initialized"):
262
+ agent._session_store_initialized = False
263
+ if session_id:
264
+ agent._session_id = session_id
265
+ if hasattr(agent, "_history_session_id"):
266
+ agent._history_session_id = session_id
267
+ else:
268
+ agent._session_id = None
269
+ if hasattr(agent, "_history_session_id"):
270
+ agent._history_session_id = None
271
+ return agent
272
+
273
+
171
274
  def _supports_async_start(agent: Any) -> bool:
172
275
  """Return True if agent.astart is a coroutine function."""
173
276
  astart = getattr(agent, "astart", None)
@@ -218,8 +321,17 @@ if FASTAPI_AVAILABLE and APIRouter is not None:
218
321
  }
219
322
  ```
220
323
  """
221
- # Get agent from registry
222
- agent = get_agent(agent_id)
324
+ # Resolve a per-session isolated agent view so concurrent callers never
325
+ # share mutable chat_history. A provided session_id gives continuity via
326
+ # the shared session store; its absence yields an ephemeral conversation.
327
+ try:
328
+ agent = resolve_session_agent(agent_id, request.session_id)
329
+ except Exception as e:
330
+ logger.error(f"Failed to isolate agent {agent_id}: {e}")
331
+ raise HTTPException(
332
+ status_code=500,
333
+ detail=f"Agent execution failed: {str(e)}"
334
+ )
223
335
  if not agent:
224
336
  logger.error(f"Agent not found: {agent_id}")
225
337
  raise HTTPException(
@@ -228,7 +340,7 @@ if FASTAPI_AVAILABLE and APIRouter is not None:
228
340
  )
229
341
 
230
342
  try:
231
- # Set session ID if provided
343
+ # Session ID echoed back to the caller
232
344
  session_id = request.session_id or "default"
233
345
 
234
346
  # Apply agent config overrides if provided
@@ -362,15 +474,19 @@ async def invoke_agent_standalone(
362
474
  This can be used in environments where FastAPI is not available
363
475
  or when integrating with other web frameworks.
364
476
  """
365
- agent = get_agent(agent_id)
366
- if not agent:
477
+ if get_agent(agent_id) is None:
367
478
  return {
368
479
  "error": f"Agent '{agent_id}' not found",
369
480
  "status": "error",
370
481
  "available_agents": list_registered_agents()
371
482
  }
372
-
483
+
373
484
  try:
485
+ # Per-session isolated agent view (see resolve_session_agent). Done
486
+ # inside the try so a clone/isolation failure returns a clean error
487
+ # rather than leaking one session's history into another.
488
+ agent = resolve_session_agent(agent_id, session_id)
489
+
374
490
  # Apply config if provided
375
491
  if agent_config:
376
492
  logger.debug(f"Agent config provided: {agent_config}")
@@ -733,10 +733,50 @@ class BaseAutoGenerator:
733
733
  raise error[0]
734
734
  return result[0]
735
735
 
736
- @staticmethod
737
- def get_available_tools() -> List[str]:
738
- """Return list of available tools for agent assignment."""
739
- return AVAILABLE_TOOLS.copy()
736
+ def _get_tool_resolver(self):
737
+ """Lazily construct the canonical ToolResolver (single source of truth).
738
+
739
+ Uses the shared context-local resolver so every generator in a run
740
+ (auto phase + AgentsGenerator + workflow/job generators) reuses one
741
+ warm cache instead of repeating full tool discovery. Kept lazy so
742
+ importing auto.py stays cheap and so a resolver-construction failure
743
+ never blocks generation — callers fall back to keyword/legacy hints.
744
+ """
745
+ resolver = getattr(self, "_tool_resolver", None)
746
+ if resolver is None:
747
+ try:
748
+ from .tool_resolver import _get_default_resolver
749
+ resolver = _get_default_resolver()
750
+ except Exception as e: # pragma: no cover - defensive
751
+ logger.debug("ToolResolver unavailable (%s); using keyword hints only.", e)
752
+ resolver = False # sentinel: attempted, not available
753
+ self._tool_resolver = resolver
754
+ return resolver or None
755
+
756
+ def _available_tools(self) -> List[str]:
757
+ """Return the real, installed tool names from the canonical ToolResolver.
758
+
759
+ This is the single source of truth shared with AgentsGenerator. Returns
760
+ an empty list if the resolver is unavailable so callers can fall back.
761
+ """
762
+ resolver = self._get_tool_resolver()
763
+ if resolver is None:
764
+ return []
765
+ try:
766
+ return sorted(resolver.list_available().keys())
767
+ except Exception as e: # pragma: no cover - defensive
768
+ logger.debug("ToolResolver.list_available() failed (%s).", e)
769
+ return []
770
+
771
+ def get_available_tools(self) -> List[str]:
772
+ """Return list of available tools for agent assignment.
773
+
774
+ Routes through the canonical ToolResolver (single source of truth) so
775
+ the LLM is shown only tools that are actually installed. Falls back to
776
+ the frozen ``AVAILABLE_TOOLS`` list solely when the resolver is
777
+ unavailable or returns nothing.
778
+ """
779
+ return self._available_tools() or AVAILABLE_TOOLS.copy()
740
780
 
741
781
  @staticmethod
742
782
  def analyze_complexity(topic: str) -> str:
@@ -1103,38 +1143,6 @@ class AutoGenerator(BaseAutoGenerator):
1103
1143
 
1104
1144
  return merged_data
1105
1145
 
1106
- def _get_tool_resolver(self):
1107
- """Lazily construct the canonical ToolResolver (single source of truth).
1108
-
1109
- Kept lazy so importing auto.py stays cheap and so a resolver-construction
1110
- failure never blocks generation — callers fall back to keyword hints.
1111
- """
1112
- resolver = getattr(self, "_tool_resolver", None)
1113
- if resolver is None:
1114
- try:
1115
- from .tool_resolver import ToolResolver
1116
- resolver = ToolResolver()
1117
- except Exception as e: # pragma: no cover - defensive
1118
- logger.debug("ToolResolver unavailable (%s); using keyword hints only.", e)
1119
- resolver = False # sentinel: attempted, not available
1120
- self._tool_resolver = resolver
1121
- return resolver or None
1122
-
1123
- def _available_tools(self) -> List[str]:
1124
- """Return the real, installed tool names from the canonical ToolResolver.
1125
-
1126
- This is the single source of truth shared with AgentsGenerator. Returns
1127
- an empty list if the resolver is unavailable so callers can fall back.
1128
- """
1129
- resolver = self._get_tool_resolver()
1130
- if resolver is None:
1131
- return []
1132
- try:
1133
- return sorted(resolver.list_available().keys())
1134
- except Exception as e: # pragma: no cover - defensive
1135
- logger.debug("ToolResolver.list_available() failed (%s).", e)
1136
- return []
1137
-
1138
1146
  def discover_tools_for_topic(self) -> List[str]:
1139
1147
  """
1140
1148
  Discover appropriate tools for the topic.