PraisonAI 4.6.161__tar.gz → 4.6.162__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 (576) hide show
  1. {praisonai-4.6.161 → praisonai-4.6.162}/PKG-INFO +9 -9
  2. {praisonai-4.6.161 → praisonai-4.6.162}/PraisonAI.egg-info/PKG-INFO +9 -9
  3. {praisonai-4.6.161 → praisonai-4.6.162}/PraisonAI.egg-info/requires.txt +8 -8
  4. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/api/agent_invoke.py +52 -14
  5. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/eval.py +0 -81
  6. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/recipe_optimizer.py +7 -127
  7. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/sandbox_cli.py +0 -66
  8. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/interactive/async_tui.py +138 -0
  9. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/interactive_legacy.py +9 -2
  10. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/workflow_commands.py +8 -3
  11. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/db/adapter.py +103 -43
  12. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/base.py +9 -10
  13. praisonai-4.6.162/praisonai/integration/pages/workflow_runs.py +9 -0
  14. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/observability/hooks.py +44 -19
  15. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/orchestrator.py +48 -0
  16. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/security/injection.py +100 -15
  17. praisonai-4.6.162/praisonai/version.py +1 -0
  18. {praisonai-4.6.161 → praisonai-4.6.162}/pyproject.toml +8 -8
  19. praisonai-4.6.161/praisonai/integration/pages/workflow_runs.py +0 -16
  20. praisonai-4.6.161/praisonai/version.py +0 -1
  21. {praisonai-4.6.161 → praisonai-4.6.162}/PraisonAI.egg-info/SOURCES.txt +0 -0
  22. {praisonai-4.6.161 → praisonai-4.6.162}/PraisonAI.egg-info/dependency_links.txt +0 -0
  23. {praisonai-4.6.161 → praisonai-4.6.162}/PraisonAI.egg-info/entry_points.txt +0 -0
  24. {praisonai-4.6.161 → praisonai-4.6.162}/PraisonAI.egg-info/top_level.txt +0 -0
  25. {praisonai-4.6.161 → praisonai-4.6.162}/README.md +0 -0
  26. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/__init__.py +0 -0
  27. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/__main__.py +0 -0
  28. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_api_auth.py +0 -0
  29. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_approval_spec.py +0 -0
  30. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_async_bridge.py +0 -0
  31. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_bootstrap.py +0 -0
  32. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/__init__.py +0 -0
  33. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/api_md.py +0 -0
  34. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/__init__.py +0 -0
  35. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/docs_extractor.py +0 -0
  36. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/docs_generator.py +0 -0
  37. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/generator.py +0 -0
  38. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/python_docs_extractor.py +0 -0
  39. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/python_extractor.py +0 -0
  40. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/rust_docs_extractor.py +0 -0
  41. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/rust_extractor.py +0 -0
  42. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/topic_normalizer.py +0 -0
  43. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/ts_docs_extractor.py +0 -0
  44. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_dev/parity/typescript_extractor.py +0 -0
  45. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_entrypoint.py +0 -0
  46. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_framework_availability.py +0 -0
  47. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_lazy_cache.py +0 -0
  48. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_logging.py +0 -0
  49. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_registry.py +0 -0
  50. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/_safe_loader.py +0 -0
  51. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/acp/__init__.py +0 -0
  52. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/acp/config.py +0 -0
  53. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/acp/safe_edit.py +0 -0
  54. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/acp/server.py +0 -0
  55. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/acp/session.py +0 -0
  56. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/adapters/__init__.py +0 -0
  57. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/adapters/readers.py +0 -0
  58. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/adapters/rerankers.py +0 -0
  59. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/adapters/retrievers.py +0 -0
  60. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/adapters/vector_stores.py +0 -0
  61. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/agent.py +0 -0
  62. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/agent_scheduler.py +0 -0
  63. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/agents_generator.py +0 -0
  64. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/api/call.py +0 -0
  65. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/app/__init__.py +0 -0
  66. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/app/agentos.py +0 -0
  67. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/async_agent_scheduler.py +0 -0
  68. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/audit/__init__.py +0 -0
  69. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/audit/agent_centric.py +0 -0
  70. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/auto.py +0 -0
  71. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/bots/__init__.py +0 -0
  72. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/browser/__init__.py +0 -0
  73. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/__init__.py +0 -0
  74. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/a2a.py +0 -0
  75. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/assistants.py +0 -0
  76. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/audio.py +0 -0
  77. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/batches.py +0 -0
  78. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/completions.py +0 -0
  79. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/container_files.py +0 -0
  80. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/containers.py +0 -0
  81. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/embeddings.py +0 -0
  82. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/files.py +0 -0
  83. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/fine_tuning.py +0 -0
  84. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/guardrails.py +0 -0
  85. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/images.py +0 -0
  86. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/mcp.py +0 -0
  87. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/messages.py +0 -0
  88. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/moderations.py +0 -0
  89. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/ocr.py +0 -0
  90. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/passthrough.py +0 -0
  91. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/rag.py +0 -0
  92. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/realtime.py +0 -0
  93. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/rerank.py +0 -0
  94. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/responses.py +0 -0
  95. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/search.py +0 -0
  96. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/skills.py +0 -0
  97. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/vector_store_files.py +0 -0
  98. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/vector_stores.py +0 -0
  99. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/capabilities/videos.py +0 -0
  100. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/claw/__init__.py +0 -0
  101. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/__init__.py +0 -0
  102. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/_paths.py +0 -0
  103. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/_shim.py +0 -0
  104. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/_warnings.py +0 -0
  105. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/app.py +0 -0
  106. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/approval_backend.py +0 -0
  107. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/branding.py +0 -0
  108. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/__init__.py +0 -0
  109. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/_profiling.py +0 -0
  110. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/acp.py +0 -0
  111. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/agent.py +0 -0
  112. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/agents.py +0 -0
  113. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/app.py +0 -0
  114. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/attach.py +0 -0
  115. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/audit.py +0 -0
  116. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/auth.py +0 -0
  117. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/batch.py +0 -0
  118. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/benchmark.py +0 -0
  119. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/bot.py +0 -0
  120. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/browser.py +0 -0
  121. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/call.py +0 -0
  122. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/chat.py +0 -0
  123. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/checkpoint.py +0 -0
  124. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/claw.py +0 -0
  125. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/code.py +0 -0
  126. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/command.py +0 -0
  127. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/commit.py +0 -0
  128. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/completion.py +0 -0
  129. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/config.py +0 -0
  130. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/context.py +0 -0
  131. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/daemon.py +0 -0
  132. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/dashboard.py +0 -0
  133. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/debug.py +0 -0
  134. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/deploy.py +0 -0
  135. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/diag.py +0 -0
  136. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/docs.py +0 -0
  137. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/doctor.py +0 -0
  138. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/endpoints.py +0 -0
  139. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/environment.py +0 -0
  140. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/eval.py +0 -0
  141. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/examples.py +0 -0
  142. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/flow.py +0 -0
  143. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/gateway.py +0 -0
  144. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/github.py +0 -0
  145. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/hooks.py +0 -0
  146. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/identity.py +0 -0
  147. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/init.py +0 -0
  148. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/kanban.py +0 -0
  149. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/knowledge.py +0 -0
  150. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/langextract.py +0 -0
  151. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/langfuse.py +0 -0
  152. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/loop.py +0 -0
  153. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/lsp.py +0 -0
  154. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/managed.py +0 -0
  155. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/mcp.py +0 -0
  156. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/memory.py +0 -0
  157. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/mint_link.py +0 -0
  158. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/models.py +0 -0
  159. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/n8n.py +0 -0
  160. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/obs.py +0 -0
  161. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/onboard.py +0 -0
  162. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/package.py +0 -0
  163. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/pairing.py +0 -0
  164. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/paths.py +0 -0
  165. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/permissions.py +0 -0
  166. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/plugins.py +0 -0
  167. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/port.py +0 -0
  168. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/profile.py +0 -0
  169. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/publish.py +0 -0
  170. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/rag.py +0 -0
  171. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/realtime.py +0 -0
  172. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/recipe.py +0 -0
  173. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/registry.py +0 -0
  174. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/replay.py +0 -0
  175. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/research.py +0 -0
  176. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/retrieval.py +0 -0
  177. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/rules.py +0 -0
  178. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/run.py +0 -0
  179. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/sandbox.py +0 -0
  180. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/schedule.py +0 -0
  181. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/serve.py +0 -0
  182. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/session.py +0 -0
  183. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/setup.py +0 -0
  184. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/skills.py +0 -0
  185. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/standardise.py +0 -0
  186. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/templates.py +0 -0
  187. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/test.py +0 -0
  188. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/todo.py +0 -0
  189. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/tools.py +0 -0
  190. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/traces.py +0 -0
  191. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/tracker.py +0 -0
  192. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/train.py +0 -0
  193. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/ui.py +0 -0
  194. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/up.py +0 -0
  195. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/validate.py +0 -0
  196. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/version.py +0 -0
  197. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/commands/workflow.py +0 -0
  198. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/config_loader.py +0 -0
  199. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/configuration/__init__.py +0 -0
  200. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/configuration/config.schema.json +0 -0
  201. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/execution/__init__.py +0 -0
  202. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/fallback_schema.py +0 -0
  203. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/__init__.py +0 -0
  204. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/acp.py +0 -0
  205. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/agent_scheduler.py +0 -0
  206. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/agent_tools.py +0 -0
  207. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/approval.py +0 -0
  208. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/background.py +0 -0
  209. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/bots_cli.py +0 -0
  210. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/deploy.py +0 -0
  211. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/endpoints.py +0 -0
  212. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/gateway.py +0 -0
  213. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/ollama.py +0 -0
  214. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/onboard.py +0 -0
  215. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/persistence.py +0 -0
  216. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/recipe.py +0 -0
  217. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/registry.py +0 -0
  218. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/serve.py +0 -0
  219. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/templates.py +0 -0
  220. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/tools.py +0 -0
  221. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/tui/__init__.py +0 -0
  222. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/tui/app.py +0 -0
  223. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/features/workflow.py +0 -0
  224. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/interactive/__init__.py +0 -0
  225. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/interactive/core.py +0 -0
  226. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/langfuse_client.py +0 -0
  227. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/__init__.py +0 -0
  228. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/direct_prompt.py +0 -0
  229. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
  230. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/dispatch/argparse_builder.py +0 -0
  231. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
  232. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/framework_run.py +0 -0
  233. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
  234. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
  235. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/main.py +0 -0
  236. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/output/__init__.py +0 -0
  237. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/schedule_cli.py +0 -0
  238. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/schema_provider.py +0 -0
  239. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/session/__init__.py +0 -0
  240. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/state/__init__.py +0 -0
  241. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/ui/__init__.py +0 -0
  242. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/unified_schema.py +0 -0
  243. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli/utils/__init__.py +0 -0
  244. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/cli_backends/__init__.py +0 -0
  245. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/__init__.py +0 -0
  246. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/agent_tools.py +0 -0
  247. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/diff/__init__.py +0 -0
  248. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/diff/diff_strategy.py +0 -0
  249. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/tools/__init__.py +0 -0
  250. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/tools/apply_diff.py +0 -0
  251. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/tools/execute_command.py +0 -0
  252. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/tools/list_files.py +0 -0
  253. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/tools/read_file.py +0 -0
  254. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/tools/search_replace.py +0 -0
  255. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/tools/write_file.py +0 -0
  256. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/utils/__init__.py +0 -0
  257. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/utils/file_utils.py +0 -0
  258. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/utils/ignore_utils.py +0 -0
  259. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/code/utils/text_utils.py +0 -0
  260. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/config/__init__.py +0 -0
  261. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/config/agents.schema.json +0 -0
  262. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/config/schema.py +0 -0
  263. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/config/validator.py +0 -0
  264. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/__init__.py +0 -0
  265. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/_storage_path.py +0 -0
  266. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/artifact_store.py +0 -0
  267. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/config.py +0 -0
  268. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/history_store.py +0 -0
  269. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/queue.py +0 -0
  270. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/setup.py +0 -0
  271. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/context/terminal_logger.py +0 -0
  272. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/daemon/__init__.py +0 -0
  273. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/db/__init__.py +0 -0
  274. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/deploy/__init__.py +0 -0
  275. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/__init__.py +0 -0
  276. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/a2u_server.py +0 -0
  277. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/discovery.py +0 -0
  278. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/__init__.py +0 -0
  279. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/a2a.py +0 -0
  280. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/a2u.py +0 -0
  281. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/agents_api.py +0 -0
  282. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/base.py +0 -0
  283. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/mcp.py +0 -0
  284. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/openai_compat.py +0 -0
  285. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/recipe.py +0 -0
  286. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/providers/tools_mcp.py +0 -0
  287. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/registry.py +0 -0
  288. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/endpoints/server.py +0 -0
  289. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/flow/__init__.py +0 -0
  290. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/flow/client.py +0 -0
  291. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
  292. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
  293. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/flow/components/__init__.py +0 -0
  294. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/flow/converter.py +0 -0
  295. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/flow/helpers.py +0 -0
  296. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/__init__.py +0 -0
  297. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/_config_builder.py +0 -0
  298. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/autogen_adapter.py +0 -0
  299. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/crewai_adapter.py +0 -0
  300. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/praisonai_adapter.py +0 -0
  301. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/registry.py +0 -0
  302. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/validators.py +0 -0
  303. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/framework_adapters/workflow_framework.py +0 -0
  304. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/gateway/__init__.py +0 -0
  305. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/inbuilt_tools/__init__.py +0 -0
  306. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  307. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/inc/__init__.py +0 -0
  308. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/inc/config.py +0 -0
  309. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/inc/models.py +0 -0
  310. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/__init__.py +0 -0
  311. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/bridges/__init__.py +0 -0
  312. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/bridges/approvals_bridge.py +0 -0
  313. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/bridges/hooks_query.py +0 -0
  314. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/bridges/kanban_bridge.py +0 -0
  315. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/bridges/schedules_runner.py +0 -0
  316. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/bridges/usage_bridge.py +0 -0
  317. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/bridges/workflows_service.py +0 -0
  318. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/context_files.py +0 -0
  319. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/gateway_host.py +0 -0
  320. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/host_app.py +0 -0
  321. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/pages/__init__.py +0 -0
  322. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integration/pages/bot_health.py +0 -0
  323. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/__init__.py +0 -0
  324. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/_cli_loaders.py +0 -0
  325. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/_session_info.py +0 -0
  326. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/_tool_aliases.py +0 -0
  327. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/_unified_registry.py +0 -0
  328. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/backend_registry.py +0 -0
  329. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/base.py +0 -0
  330. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/claude_code.py +0 -0
  331. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/codex_cli.py +0 -0
  332. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/compute/__init__.py +0 -0
  333. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/compute/daytona.py +0 -0
  334. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/compute/docker.py +0 -0
  335. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/compute/e2b.py +0 -0
  336. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/compute/flyio.py +0 -0
  337. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/compute/local.py +0 -0
  338. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/compute/modal_compute.py +0 -0
  339. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/cursor_cli.py +0 -0
  340. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/db_session_adapter.py +0 -0
  341. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/gemini_cli.py +0 -0
  342. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/hosted_agent.py +0 -0
  343. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/local_agent.py +0 -0
  344. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/managed_agents.py +0 -0
  345. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/managed_local.py +0 -0
  346. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/registry.py +0 -0
  347. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/integrations/sandboxed_agent.py +0 -0
  348. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/jobs/__init__.py +0 -0
  349. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/jobs/executor.py +0 -0
  350. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/jobs/models.py +0 -0
  351. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/jobs/path_validation.py +0 -0
  352. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/jobs/router.py +0 -0
  353. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/jobs/server.py +0 -0
  354. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/jobs/store.py +0 -0
  355. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/kanban/__init__.py +0 -0
  356. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/llm/__init__.py +0 -0
  357. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/llm/catalogue.py +0 -0
  358. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/llm/config.py +0 -0
  359. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/llm/credentials.py +0 -0
  360. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/llm/env.py +0 -0
  361. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/llm/gateways.py +0 -0
  362. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/llm/registry.py +0 -0
  363. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/mcp_server/__init__.py +0 -0
  364. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/n8n/__init__.py +0 -0
  365. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/n8n/client.py +0 -0
  366. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/n8n/converter.py +0 -0
  367. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/n8n/preview.py +0 -0
  368. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/n8n/reverse_converter.py +0 -0
  369. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/observability/__init__.py +0 -0
  370. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/observability/langextract.py +0 -0
  371. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/observability/langfuse.py +0 -0
  372. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/__init__.py +0 -0
  373. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/_valkey_client.py +0 -0
  374. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/config.py +0 -0
  375. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/__init__.py +0 -0
  376. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/_ops.py +0 -0
  377. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/_sql_base.py +0 -0
  378. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
  379. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/async_mysql.py +0 -0
  380. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/async_postgres.py +0 -0
  381. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/async_sqlite.py +0 -0
  382. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/base.py +0 -0
  383. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/json_store.py +0 -0
  384. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/mysql.py +0 -0
  385. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/postgres.py +0 -0
  386. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/singlestore.py +0 -0
  387. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/sqlite.py +0 -0
  388. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/supabase.py +0 -0
  389. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/surrealdb.py +0 -0
  390. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
  391. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/conversation/turso.py +0 -0
  392. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/factory.py +0 -0
  393. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/hooks/__init__.py +0 -0
  394. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/hooks/agent_hooks.py +0 -0
  395. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/__init__.py +0 -0
  396. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/base.py +0 -0
  397. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/cassandra.py +0 -0
  398. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/chroma.py +0 -0
  399. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/clickhouse.py +0 -0
  400. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
  401. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/couchbase.py +0 -0
  402. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/lancedb.py +0 -0
  403. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
  404. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
  405. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
  406. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/milvus.py +0 -0
  407. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
  408. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/pgvector.py +0 -0
  409. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/pinecone.py +0 -0
  410. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/qdrant.py +0 -0
  411. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/redis_vector.py +0 -0
  412. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
  413. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
  414. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
  415. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
  416. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/knowledge/weaviate.py +0 -0
  417. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/migrations/__init__.py +0 -0
  418. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/migrations/manager.py +0 -0
  419. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/registry.py +0 -0
  420. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/__init__.py +0 -0
  421. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/async_mongodb.py +0 -0
  422. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/base.py +0 -0
  423. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/dynamodb.py +0 -0
  424. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/firestore.py +0 -0
  425. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/gcs.py +0 -0
  426. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/memory.py +0 -0
  427. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/mongodb.py +0 -0
  428. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/redis.py +0 -0
  429. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/upstash.py +0 -0
  430. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/state/valkey.py +0 -0
  431. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/tests/__init__.py +0 -0
  432. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/tests/test_all_backends.py +0 -0
  433. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/tests/test_registry_lazy.py +0 -0
  434. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/persistence/tests/test_valkey_backends.py +0 -0
  435. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/profiler.py +0 -0
  436. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/push/__init__.py +0 -0
  437. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/push/client.py +0 -0
  438. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/push/transports.py +0 -0
  439. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/__init__.py +0 -0
  440. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/bridge.py +0 -0
  441. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/core.py +0 -0
  442. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/exceptions.py +0 -0
  443. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/history.py +0 -0
  444. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/models.py +0 -0
  445. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/operations.py +0 -0
  446. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/policy.py +0 -0
  447. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/registry.py +0 -0
  448. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/runtime.py +0 -0
  449. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/security.py +0 -0
  450. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/serve.py +0 -0
  451. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/recipe/server.py +0 -0
  452. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/__init__.py +0 -0
  453. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/analyzer.py +0 -0
  454. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/applier.py +0 -0
  455. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/judge.py +0 -0
  456. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/plan.py +0 -0
  457. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/player.py +0 -0
  458. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/reader.py +0 -0
  459. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/storage.py +0 -0
  460. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/replay/writer.py +0 -0
  461. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/runtime/__init__.py +0 -0
  462. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/runtime/__main__.py +0 -0
  463. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/sandbox/__init__.py +0 -0
  464. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/sandbox/_registry.py +0 -0
  465. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/__init__.py +0 -0
  466. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/_base_scheduler.py +0 -0
  467. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/_delivery.py +0 -0
  468. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/_dispatch.py +0 -0
  469. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/agent_scheduler.py +0 -0
  470. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/async_agent_scheduler.py +0 -0
  471. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/base.py +0 -0
  472. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/blueprint_catalogue.py +0 -0
  473. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/condition_gate.py +0 -0
  474. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/daemon_manager.py +0 -0
  475. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/deployment.py +0 -0
  476. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/executor.py +0 -0
  477. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/run_policy.py +0 -0
  478. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/shared.py +0 -0
  479. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/state_manager.py +0 -0
  480. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/suggestion_engine.py +0 -0
  481. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/scheduler/yaml_loader.py +0 -0
  482. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/security/__init__.py +0 -0
  483. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/security/audit.py +0 -0
  484. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/security/protected.py +0 -0
  485. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/setup/__init__.py +0 -0
  486. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/setup/build.py +0 -0
  487. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/setup/post_install.py +0 -0
  488. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/setup/setup_conda_env.py +0 -0
  489. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/setup.py +0 -0
  490. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/__init__.py +0 -0
  491. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/ai_generator.py +0 -0
  492. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/config.py +0 -0
  493. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/dedupe.py +0 -0
  494. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/discovery.py +0 -0
  495. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/drift.py +0 -0
  496. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/engine.py +0 -0
  497. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/enhanced_templates.py +0 -0
  498. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/example_verifier.py +0 -0
  499. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/manifest.py +0 -0
  500. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/models.py +0 -0
  501. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/reports.py +0 -0
  502. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/templates.py +0 -0
  503. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/undo_redo.py +0 -0
  504. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/standardise/validator.py +0 -0
  505. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/storage/__init__.py +0 -0
  506. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/storage/dynamodb_adapter.py +0 -0
  507. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/storage/mongodb_adapter.py +0 -0
  508. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/storage/postgresql_adapter.py +0 -0
  509. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/storage/redis_adapter.py +0 -0
  510. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/storage/valkey_adapter.py +0 -0
  511. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/__init__.py +0 -0
  512. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/batch_source.py +0 -0
  513. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/cli_docs_source.py +0 -0
  514. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/discovery.py +0 -0
  515. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/docs_source.py +0 -0
  516. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/examples_source.py +0 -0
  517. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/executor.py +0 -0
  518. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/models.py +0 -0
  519. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/report_viewer.py +0 -0
  520. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/reporter.py +0 -0
  521. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/suite_runner/runner.py +0 -0
  522. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/__init__.py +0 -0
  523. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/_tool_sources.py +0 -0
  524. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/cache.py +0 -0
  525. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/dependency_checker.py +0 -0
  526. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/discovery.py +0 -0
  527. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/loader.py +0 -0
  528. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/registry.py +0 -0
  529. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/resolver.py +0 -0
  530. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/security.py +0 -0
  531. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/tool_override.py +0 -0
  532. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/templates/tools_doctor.py +0 -0
  533. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tool_registry.py +0 -0
  534. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tool_resolver.py +0 -0
  535. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tools/__init__.py +0 -0
  536. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tools/audio.py +0 -0
  537. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tools/glob_tool.py +0 -0
  538. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tools/grep_tool.py +0 -0
  539. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tools/kanban_tools.py +0 -0
  540. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tools/multiedit.py +0 -0
  541. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/tools/skill_manage.py +0 -0
  542. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/train/__init__.py +0 -0
  543. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/train.py +0 -0
  544. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/train_vision.py +0 -0
  545. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui/_aiui_datastore.py +0 -0
  546. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui/_external_agents.py +0 -0
  547. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui/context.py +0 -0
  548. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui/database_config.py +0 -0
  549. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_agents/__init__.py +0 -0
  550. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_agents/default_app.py +0 -0
  551. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_bot/__init__.py +0 -0
  552. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_bot/default_app.py +0 -0
  553. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_chat/__init__.py +0 -0
  554. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_chat/default_app.py +0 -0
  555. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_dashboard/__init__.py +0 -0
  556. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_dashboard/default_app.py +0 -0
  557. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_realtime/__init__.py +0 -0
  558. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/ui_realtime/default_app.py +0 -0
  559. {praisonai-4.6.161 → praisonai-4.6.162}/praisonai/upload_vision.py +0 -0
  560. {praisonai-4.6.161 → praisonai-4.6.162}/setup.cfg +0 -0
  561. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test.py +0 -0
  562. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_agents_playbook.py +0 -0
  563. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_approval_system.py +0 -0
  564. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_basic.py +0 -0
  565. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_cli_features.py +0 -0
  566. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_custom_tools_fix.py +0 -0
  567. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_double_api_fix.py +0 -0
  568. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_n8n_agent_invoke.py +0 -0
  569. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_n8n_cli_feature.py +0 -0
  570. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_n8n_integration.py +0 -0
  571. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_phase2_refactor.py +0 -0
  572. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_recipe.py +0 -0
  573. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_registry.py +0 -0
  574. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_runner.py +0 -0
  575. {praisonai-4.6.161 → praisonai-4.6.162}/tests/test_sandboxed_agent_compatibility.py +0 -0
  576. {praisonai-4.6.161 → praisonai-4.6.162}/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.161
3
+ Version: 4.6.162
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,14 +11,14 @@ 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.165
15
- Requires-Dist: praisonai-code>=0.0.61
16
- Requires-Dist: praisonai-bot>=0.0.46
17
- Requires-Dist: praisonai-train>=0.0.16
18
- Requires-Dist: praisonai-browser>=0.0.12
19
- Requires-Dist: praisonai-mcp>=0.0.12
20
- Requires-Dist: praisonai-sandbox>=0.0.10
21
- Requires-Dist: praisonai-deploy>=0.0.5
14
+ Requires-Dist: praisonaiagents>=1.6.166
15
+ Requires-Dist: praisonai-code>=0.0.62
16
+ Requires-Dist: praisonai-bot>=0.0.47
17
+ Requires-Dist: praisonai-train>=0.0.17
18
+ Requires-Dist: praisonai-browser>=0.0.13
19
+ Requires-Dist: praisonai-mcp>=0.0.13
20
+ Requires-Dist: praisonai-sandbox>=0.0.11
21
+ Requires-Dist: praisonai-deploy>=0.0.6
22
22
  Requires-Dist: python-dotenv>=0.19.0
23
23
  Requires-Dist: litellm<2,>=1.83.14
24
24
  Requires-Dist: PyYAML>=6.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 4.6.161
3
+ Version: 4.6.162
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,14 +11,14 @@ 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.165
15
- Requires-Dist: praisonai-code>=0.0.61
16
- Requires-Dist: praisonai-bot>=0.0.46
17
- Requires-Dist: praisonai-train>=0.0.16
18
- Requires-Dist: praisonai-browser>=0.0.12
19
- Requires-Dist: praisonai-mcp>=0.0.12
20
- Requires-Dist: praisonai-sandbox>=0.0.10
21
- Requires-Dist: praisonai-deploy>=0.0.5
14
+ Requires-Dist: praisonaiagents>=1.6.166
15
+ Requires-Dist: praisonai-code>=0.0.62
16
+ Requires-Dist: praisonai-bot>=0.0.47
17
+ Requires-Dist: praisonai-train>=0.0.17
18
+ Requires-Dist: praisonai-browser>=0.0.13
19
+ Requires-Dist: praisonai-mcp>=0.0.13
20
+ Requires-Dist: praisonai-sandbox>=0.0.11
21
+ Requires-Dist: praisonai-deploy>=0.0.6
22
22
  Requires-Dist: python-dotenv>=0.19.0
23
23
  Requires-Dist: litellm<2,>=1.83.14
24
24
  Requires-Dist: PyYAML>=6.0
@@ -1,14 +1,14 @@
1
1
  rich>=13.7
2
2
  markdown>=3.5
3
3
  pyparsing>=3.0.0
4
- praisonaiagents>=1.6.165
5
- praisonai-code>=0.0.61
6
- praisonai-bot>=0.0.46
7
- praisonai-train>=0.0.16
8
- praisonai-browser>=0.0.12
9
- praisonai-mcp>=0.0.12
10
- praisonai-sandbox>=0.0.10
11
- praisonai-deploy>=0.0.5
4
+ praisonaiagents>=1.6.166
5
+ praisonai-code>=0.0.62
6
+ praisonai-bot>=0.0.47
7
+ praisonai-train>=0.0.17
8
+ praisonai-browser>=0.0.13
9
+ praisonai-mcp>=0.0.13
10
+ praisonai-sandbox>=0.0.11
11
+ praisonai-deploy>=0.0.6
12
12
  python-dotenv>=0.19.0
13
13
  litellm<2,>=1.83.14
14
14
  PyYAML>=6.0
@@ -142,32 +142,70 @@ else:
142
142
 
143
143
 
144
144
  # Agent Registry
145
- _agent_registry: Dict[str, Any] = {}
145
+ import threading
146
146
 
147
147
 
148
- def register_agent(agent_id: str, agent: Any) -> None:
148
+ class AgentRegistry:
149
+ """Thread-safe registry of agents scoped to an embedding/tenant.
150
+
151
+ Encapsulates the previously module-global dict so multiple ``AgentOS`` /
152
+ ``praisonai serve`` gateways sharing one interpreter can each hold an
153
+ isolated registry, and so concurrent unregisters are race-free.
154
+ """
155
+
156
+ def __init__(self) -> None:
157
+ self._agents: Dict[str, Any] = {}
158
+ self._lock = threading.RLock()
159
+
160
+ def register(self, agent_id: str, agent: Any) -> None:
161
+ with self._lock:
162
+ self._agents[agent_id] = agent
163
+ logger.debug(f"Registered agent: {agent_id}")
164
+
165
+ def unregister(self, agent_id: str) -> bool:
166
+ # Atomic under the lock: test membership and pop together so a concurrent
167
+ # unregister can't race between the check and the delete, while still
168
+ # reporting removal correctly even when the stored value is falsy/None.
169
+ _MISSING = object()
170
+ with self._lock:
171
+ removed = self._agents.pop(agent_id, _MISSING) is not _MISSING
172
+ if removed:
173
+ logger.debug(f"Unregistered agent: {agent_id}")
174
+ return removed
175
+
176
+ def get(self, agent_id: str) -> Optional[Any]:
177
+ with self._lock:
178
+ return self._agents.get(agent_id)
179
+
180
+ def list(self) -> list:
181
+ with self._lock:
182
+ return list(self._agents.keys())
183
+
184
+
185
+ _default_registry = AgentRegistry()
186
+
187
+
188
+ def register_agent(agent_id: str, agent: Any,
189
+ *, registry: Optional[AgentRegistry] = None) -> None:
149
190
  """Register an agent for invocation via API."""
150
- _agent_registry[agent_id] = agent
151
- logger.debug(f"Registered agent: {agent_id}")
191
+ (registry or _default_registry).register(agent_id, agent)
152
192
 
153
193
 
154
- def unregister_agent(agent_id: str) -> bool:
194
+ def unregister_agent(agent_id: str,
195
+ *, registry: Optional[AgentRegistry] = None) -> bool:
155
196
  """Unregister an agent."""
156
- if agent_id in _agent_registry:
157
- del _agent_registry[agent_id]
158
- logger.debug(f"Unregistered agent: {agent_id}")
159
- return True
160
- return False
197
+ return (registry or _default_registry).unregister(agent_id)
161
198
 
162
199
 
163
- def get_agent(agent_id: str) -> Optional[Any]:
200
+ def get_agent(agent_id: str,
201
+ *, registry: Optional[AgentRegistry] = None) -> Optional[Any]:
164
202
  """Get a registered agent by ID."""
165
- return _agent_registry.get(agent_id)
203
+ return (registry or _default_registry).get(agent_id)
166
204
 
167
205
 
168
- def list_registered_agents() -> list:
206
+ def list_registered_agents(*, registry: Optional[AgentRegistry] = None) -> list:
169
207
  """List all registered agent IDs."""
170
- return list(_agent_registry.keys())
208
+ return (registry or _default_registry).list()
171
209
 
172
210
 
173
211
  def _is_real_agent(agent: Any) -> bool:
@@ -476,84 +476,3 @@ def add_eval_parser_subcommands(subparsers) -> None:
476
476
  perf_parser.add_argument('--output', '-o', help='Output file')
477
477
  perf_parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')
478
478
  perf_parser.add_argument('--quiet', '-q', action='store_true', help='Suppress JSON output')
479
-
480
-
481
- def add_eval_parser(subparsers) -> None:
482
- """
483
- Add eval subcommand parser.
484
-
485
- Args:
486
- subparsers: Argument parser subparsers
487
- """
488
- eval_parser = subparsers.add_parser(
489
- 'eval',
490
- help='Run agent evaluations'
491
- )
492
-
493
- eval_subparsers = eval_parser.add_subparsers(dest='eval_type')
494
-
495
- accuracy_parser = eval_subparsers.add_parser(
496
- 'accuracy',
497
- help='Run accuracy evaluation'
498
- )
499
- accuracy_parser.add_argument('--agent', '-a', help='Agent config file (optional if --prompt used)')
500
- accuracy_parser.add_argument('--prompt', '-p', help='Direct prompt (alternative to --agent)')
501
- accuracy_parser.add_argument('--llm', help='LLM model for agent (when using --prompt)')
502
- accuracy_parser.add_argument('--input', '-i', help='Input text (defaults to --prompt if not provided)')
503
- accuracy_parser.add_argument('--expected', '-e', required=True, help='Expected output')
504
- accuracy_parser.add_argument('--iterations', '-n', type=int, default=1, help='Number of iterations')
505
- accuracy_parser.add_argument('--model', '-m', help='Judge model')
506
- accuracy_parser.add_argument('--output', '-o', help='Output file')
507
- accuracy_parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')
508
- accuracy_parser.add_argument('--quiet', '-q', action='store_true', help='Suppress JSON output')
509
-
510
- perf_parser = eval_subparsers.add_parser(
511
- 'performance',
512
- help='Run performance evaluation'
513
- )
514
- perf_parser.add_argument('--agent', '-a', default='agents.yaml', help='Agent config file')
515
- perf_parser.add_argument('--input', '-i', default='Hello', help='Input text')
516
- perf_parser.add_argument('--iterations', '-n', type=int, default=10, help='Number of iterations')
517
- perf_parser.add_argument('--warmup', '-w', type=int, default=2, help='Warmup runs')
518
- perf_parser.add_argument('--memory', action='store_true', default=True, help='Track memory')
519
- perf_parser.add_argument('--output', '-o', help='Output file')
520
- perf_parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')
521
- perf_parser.add_argument('--quiet', '-q', action='store_true', help='Suppress JSON output')
522
-
523
- rel_parser = eval_subparsers.add_parser(
524
- 'reliability',
525
- help='Run reliability evaluation'
526
- )
527
- rel_parser.add_argument('--agent', '-a', default='agents.yaml', help='Agent config file')
528
- rel_parser.add_argument('--input', '-i', required=True, help='Input text')
529
- rel_parser.add_argument('--expected-tools', '-t', required=True, help='Expected tools (comma-separated)')
530
- rel_parser.add_argument('--forbidden-tools', '-f', help='Forbidden tools (comma-separated)')
531
- rel_parser.add_argument('--output', '-o', help='Output file')
532
- rel_parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')
533
- rel_parser.add_argument('--quiet', '-q', action='store_true', help='Suppress JSON output')
534
-
535
- criteria_parser = eval_subparsers.add_parser(
536
- 'criteria',
537
- help='Run criteria-based evaluation'
538
- )
539
- criteria_parser.add_argument('--agent', '-a', default='agents.yaml', help='Agent config file')
540
- criteria_parser.add_argument('--input', '-i', required=True, help='Input text')
541
- criteria_parser.add_argument('--criteria', '-c', required=True, help='Evaluation criteria')
542
- criteria_parser.add_argument('--scoring', '-s', choices=['numeric', 'binary'], default='numeric', help='Scoring type')
543
- criteria_parser.add_argument('--threshold', type=float, default=7.0, help='Pass threshold')
544
- criteria_parser.add_argument('--iterations', '-n', type=int, default=1, help='Number of iterations')
545
- criteria_parser.add_argument('--model', '-m', help='Judge model')
546
- criteria_parser.add_argument('--output', '-o', help='Output file')
547
- criteria_parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')
548
- criteria_parser.add_argument('--quiet', '-q', action='store_true', help='Suppress JSON output')
549
-
550
- batch_parser = eval_subparsers.add_parser(
551
- 'batch',
552
- help='Run batch evaluation from test file'
553
- )
554
- batch_parser.add_argument('--agent', '-a', default='agents.yaml', help='Agent config file')
555
- batch_parser.add_argument('--test-file', '-t', required=True, help='JSON test file')
556
- batch_parser.add_argument('--batch-type', '-b', choices=['accuracy', 'criteria'], default='accuracy', help='Evaluation type')
557
- batch_parser.add_argument('--output', '-o', help='Output file')
558
- batch_parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')
559
- batch_parser.add_argument('--quiet', '-q', action='store_true', help='Suppress JSON output')
@@ -12,140 +12,20 @@ DRY: Reuses ContextEffectivenessJudge from replay module.
12
12
  import os
13
13
  import re
14
14
  import logging
15
- import base64
16
15
  from pathlib import Path
17
16
  from typing import Optional, List, Tuple, Any, Dict
18
17
 
19
18
  # DRY: Import SDK knowledge from shared modules
20
19
  from .sdk_knowledge import get_sdk_knowledge_prompt
21
20
 
22
- logger = logging.getLogger(__name__)
23
-
24
-
25
- def _read_image_for_optimizer(image_path: str, model: str = "gpt-4o-mini") -> str:
26
- """
27
- Read and describe an image for optimizer context.
28
-
29
- Uses vision LLM to describe the image content so the optimizer can
30
- validate if agent outputs match the actual image.
31
-
32
- Args:
33
- image_path: Local file path or URL to the image
34
- model: Vision-capable model to use
35
-
36
- Returns:
37
- Description of the image content
38
- """
39
- try:
40
- import litellm
41
-
42
- # Prepare image content
43
- if image_path.startswith(('http://', 'https://')):
44
- # URL - pass directly
45
- image_content = {
46
- "type": "image_url",
47
- "image_url": {"url": image_path}
48
- }
49
- elif os.path.exists(image_path):
50
- # Local file - encode as base64
51
- with open(image_path, 'rb') as f:
52
- image_data = base64.b64encode(f.read()).decode('utf-8')
53
-
54
- # Detect mime type
55
- ext = os.path.splitext(image_path)[1].lower()
56
- mime_types = {
57
- '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg',
58
- '.png': 'image/png', '.gif': 'image/gif',
59
- '.webp': 'image/webp', '.bmp': 'image/bmp'
60
- }
61
- mime_type = mime_types.get(ext, 'image/jpeg')
62
-
63
- image_content = {
64
- "type": "image_url",
65
- "image_url": {"url": f"data:{mime_type};base64,{image_data}"}
66
- }
67
- else:
68
- return f"[Image not found: {image_path}]"
69
-
70
- # Use vision model to describe the image
71
- response = litellm.completion(
72
- model=model,
73
- messages=[{
74
- "role": "user",
75
- "content": [
76
- {"type": "text", "text": "Describe this image in detail. Include: main subject, colors, text visible, key elements, and overall composition. Be factual and specific."},
77
- image_content
78
- ]
79
- }],
80
- max_tokens=500,
81
- )
82
-
83
- description = response.choices[0].message.content or ""
84
- return f"[IMAGE DESCRIPTION: {description}]"
85
-
86
- except Exception as e:
87
- logger.warning(f"Failed to read image for optimizer: {e}")
88
- return f"[Failed to read image: {str(e)[:100]}]"
21
+ # DRY: Reuse image reading and URL crawling from the canonical judge module
22
+ # instead of maintaining verbatim copies here.
23
+ from praisonai.replay.judge import (
24
+ _read_image_for_judge as _read_image_for_optimizer,
25
+ _crawl_url_for_judge as _crawl_url_for_optimizer,
26
+ )
89
27
 
90
-
91
- def _crawl_url_for_optimizer(url: str) -> str:
92
- """
93
- Crawl a URL to get content for optimizer context.
94
-
95
- Uses the web_crawl tool to extract content so the optimizer can
96
- validate if agent outputs match the actual URL content.
97
-
98
- Args:
99
- url: URL to crawl
100
-
101
- Returns:
102
- Extracted content from the URL (truncated)
103
- """
104
- try:
105
- # Try to use the web_crawl tool
106
- from praisonaiagents.tools import web_crawl
107
-
108
- result = web_crawl(url)
109
-
110
- if isinstance(result, dict):
111
- if result.get('error'):
112
- return f"[URL crawl error: {result.get('error')}]"
113
- content = result.get('content', '')
114
- title = result.get('title', '')
115
- provider = result.get('provider', 'unknown')
116
-
117
- # Truncate content for optimizer context
118
- if len(content) > 3000:
119
- content = content[:3000] + "... [truncated]"
120
-
121
- return f"[URL CONTENT (via {provider})]\nTitle: {title}\n\n{content}"
122
-
123
- return f"[URL content: {str(result)[:3000]}]"
124
-
125
- except ImportError:
126
- # Fallback to basic HTTP fetch
127
- try:
128
- import urllib.request
129
-
130
- with urllib.request.urlopen(url, timeout=30) as response:
131
- content = response.read().decode('utf-8', errors='ignore')
132
-
133
- # Basic HTML to text
134
- content = re.sub(r'<script[^>]*>.*?</script>', '', content, flags=re.DOTALL | re.IGNORECASE)
135
- content = re.sub(r'<style[^>]*>.*?</style>', '', content, flags=re.DOTALL | re.IGNORECASE)
136
- content = re.sub(r'<[^>]+>', ' ', content)
137
- content = re.sub(r'\s+', ' ', content).strip()
138
-
139
- if len(content) > 3000:
140
- content = content[:3000] + "... [truncated]"
141
-
142
- return f"[URL CONTENT (via urllib)]\n{content}"
143
-
144
- except Exception as e:
145
- return f"[Failed to crawl URL: {str(e)[:100]}]"
146
- except Exception as e:
147
- logger.warning(f"Failed to crawl URL for optimizer: {e}")
148
- return f"[Failed to crawl URL: {str(e)[:100]}]"
28
+ logger = logging.getLogger(__name__)
149
29
 
150
30
 
151
31
  # Common issue patterns and their fixes - comprehensive patterns
@@ -227,69 +227,3 @@ def handle_sandbox_command(args) -> None:
227
227
  else:
228
228
  print(f"Unknown sandbox command: {subcommand}")
229
229
  print("Available commands: run, shell, status")
230
-
231
-
232
- def add_sandbox_parser(subparsers) -> None:
233
- """Add sandbox subparser to CLI."""
234
- sandbox_parser = subparsers.add_parser(
235
- "sandbox",
236
- help="Run code in a sandbox",
237
- )
238
-
239
- sandbox_subparsers = sandbox_parser.add_subparsers(
240
- dest="sandbox_command",
241
- help="Sandbox commands",
242
- )
243
-
244
- run_parser = sandbox_subparsers.add_parser(
245
- "run",
246
- help="Run code in sandbox",
247
- )
248
- run_parser.add_argument(
249
- "--code", "-c",
250
- help="Code to execute",
251
- )
252
- run_parser.add_argument(
253
- "--file", "-f",
254
- help="File to execute",
255
- )
256
- run_parser.add_argument(
257
- "--type", "-t",
258
- choices=["subprocess", "docker", "daytona"],
259
- default="subprocess",
260
- help="Sandbox type (default: subprocess)",
261
- )
262
- run_parser.add_argument(
263
- "--image",
264
- default="python:3.11-slim",
265
- help="Docker image (default: python:3.11-slim)",
266
- )
267
- run_parser.add_argument(
268
- "--timeout",
269
- type=int,
270
- default=60,
271
- help="Timeout in seconds (default: 60)",
272
- )
273
-
274
- shell_parser = sandbox_subparsers.add_parser(
275
- "shell",
276
- help="Start interactive sandbox shell",
277
- )
278
- shell_parser.add_argument(
279
- "--type", "-t",
280
- choices=["subprocess", "docker", "daytona"],
281
- default="subprocess",
282
- help="Sandbox type (default: subprocess)",
283
- )
284
- shell_parser.add_argument(
285
- "--image",
286
- default="python:3.11-slim",
287
- help="Docker image (default: python:3.11-slim)",
288
- )
289
-
290
- sandbox_subparsers.add_parser(
291
- "status",
292
- help="Check sandbox availability",
293
- )
294
-
295
- sandbox_parser.set_defaults(func=handle_sandbox_command)
@@ -230,6 +230,8 @@ class AsyncTUI:
230
230
  self._runtime = None # InteractiveRuntime for ACP/LSP
231
231
  self._runtime_started = False
232
232
  self._registry = None # Unified command registry (lazy)
233
+ self._checkpoints = None # SessionCheckpointManager (lazy)
234
+ self._checkpoints_ready = False
233
235
  self._prev_permission_mode = None # Approval mode to restore when leaving PLAN
234
236
  # Sync PLAN indicator/toggle with a backend launched via --approval plan.
235
237
  self._sync_plan_mode_from_backend()
@@ -262,6 +264,123 @@ class AsyncTUI:
262
264
  except Exception:
263
265
  pass
264
266
 
267
+ def _get_checkpoints(self):
268
+ """Lazily build the coherent turn-checkpoint manager for this session.
269
+
270
+ Binds ``SessionCheckpointManager`` to a view over the TUI's in-memory
271
+ conversation history so ``/undo`` and ``/revert`` roll back **files and
272
+ chat history together** on the default path — the same proven engine the
273
+ legacy REPL uses. Enabled by default for interactive runs
274
+ (``default=True``); opt out with ``checkpoints.auto: false`` or
275
+ ``PRAISONAI_CHECKPOINTS=off``. Degrades to ``None`` on any failure so a
276
+ checkpoint problem never breaks the TUI.
277
+ """
278
+ if self._checkpoints_ready:
279
+ return self._checkpoints
280
+ self._checkpoints_ready = True
281
+ try:
282
+ from praisonai_code.cli.interactive.repl import (
283
+ _InMemoryConversationStore,
284
+ )
285
+ from praisonai.cli.features.session_checkpoints import (
286
+ SessionCheckpointManager,
287
+ )
288
+
289
+ config = None
290
+ try:
291
+ from praisonai.cli.configuration.resolver import resolve_config
292
+
293
+ config = resolve_config().extra
294
+ except Exception:
295
+ config = None
296
+
297
+ store = _InMemoryConversationStore(
298
+ self._conversation_history,
299
+ agent_provider=lambda: self._agent,
300
+ )
301
+ mgr = SessionCheckpointManager.from_config(
302
+ workspace_dir=(
303
+ os.environ.get("PRAISONAI_WORKSPACE")
304
+ or self.config.workspace
305
+ or os.getcwd()
306
+ ),
307
+ config=config,
308
+ verbose=self.config.debug,
309
+ session_store=store,
310
+ session_id=self.session_id or "tui",
311
+ default=True,
312
+ )
313
+ if mgr.enabled:
314
+ mgr.checkpoint_turn("session start")
315
+ self._checkpoints = mgr
316
+ except Exception as exc: # pragma: no cover - defensive
317
+ logger.debug("Session checkpoints unavailable: %s", exc)
318
+ self._checkpoints = None
319
+ return self._checkpoints
320
+
321
+ def _checkpoint_turn(self, label: str) -> None:
322
+ """Record a pre-turn checkpoint so the revert timeline exists."""
323
+ ckpt = self._get_checkpoints()
324
+ if ckpt is not None:
325
+ try:
326
+ ckpt.checkpoint_turn(label)
327
+ except Exception: # pragma: no cover - never break a turn
328
+ pass
329
+
330
+ def _handle_undo(self) -> None:
331
+ """/undo — roll files + conversation back to the previous turn."""
332
+ ckpt = self._get_checkpoints()
333
+ if ckpt is None or not getattr(ckpt, "enabled", False) or not ckpt.turns:
334
+ self.messages.append(ChatMessage(role="system", content="Nothing to undo."))
335
+ return
336
+ ckpt.preview(1)
337
+ restored = ckpt.revert(1)
338
+ if restored:
339
+ self.messages.append(ChatMessage(
340
+ role="system",
341
+ content=f"Undone last turn — files + conversation reverted to {restored.short_id}.",
342
+ ))
343
+ else:
344
+ self.messages.append(ChatMessage(role="system", content="No checkpoint to undo."))
345
+
346
+ def _handle_revert(self, args: str) -> None:
347
+ """/revert [n] — roll files + conversation back n turns (default 1)."""
348
+ ckpt = self._get_checkpoints()
349
+ if ckpt is None or not getattr(ckpt, "enabled", False):
350
+ self.messages.append(ChatMessage(
351
+ role="system",
352
+ content=(
353
+ "Checkpointing is disabled. Enable with checkpoints.auto: true "
354
+ "or PRAISONAI_CHECKPOINTS=on."
355
+ ),
356
+ ))
357
+ return
358
+ if not ckpt.turns:
359
+ self.messages.append(ChatMessage(role="system", content="No checkpoints to revert to."))
360
+ return
361
+ n = 1
362
+ token = str(args).strip().lower()
363
+ if token and token != "last":
364
+ try:
365
+ n = int(token)
366
+ except ValueError:
367
+ self.messages.append(ChatMessage(role="system", content="Usage: /revert [n|last]"))
368
+ return
369
+ if n < 1 or n > len(ckpt.turns):
370
+ self.messages.append(ChatMessage(
371
+ role="system", content=f"Can only revert 1..{len(ckpt.turns)} turn(s).",
372
+ ))
373
+ return
374
+ ckpt.preview(n)
375
+ restored = ckpt.revert(n)
376
+ if restored:
377
+ self.messages.append(ChatMessage(
378
+ role="system",
379
+ content=f"Reverted {n} turn(s) — files + conversation restored to {restored.short_id}.",
380
+ ))
381
+ else:
382
+ self.messages.append(ChatMessage(role="system", content="Failed to revert."))
383
+
265
384
  def _process_file_mentions(self, prompt: str) -> str:
266
385
  """Process @file mentions and include file contents."""
267
386
  import os
@@ -645,6 +764,8 @@ class AsyncTUI:
645
764
  "multiline": "Toggle multiline input mode",
646
765
  "files": "List workspace files for @ mentions",
647
766
  "queue": "Show pending prompts in queue",
767
+ "undo": "Undo the last turn (files + conversation)",
768
+ "revert": "Revert the last N turns (files + conversation)",
648
769
  }
649
770
 
650
771
  def _get_registry(self):
@@ -708,6 +829,8 @@ class AsyncTUI:
708
829
  /multiline Toggle multiline input mode
709
830
  /files List workspace files for @ mentions
710
831
  /queue Show pending prompts in queue
832
+ /undo Undo the last turn (files + conversation)
833
+ /revert [n] Revert the last N turns (files + conversation)
711
834
 
712
835
  Keyboard Shortcuts:
713
836
  PageUp/Down Scroll output
@@ -1101,6 +1224,14 @@ Example: /handoff code "refactor the auth module" """
1101
1224
  ))
1102
1225
  return True
1103
1226
 
1227
+ elif cmd == "undo":
1228
+ self._handle_undo()
1229
+ return True
1230
+
1231
+ elif cmd == "revert":
1232
+ self._handle_revert(args)
1233
+ return True
1234
+
1104
1235
  else:
1105
1236
  # Not a built-in: consult the unified command registry so custom
1106
1237
  # .praisonai/commands/*.md commands are first-class /name commands.
@@ -1363,6 +1494,13 @@ Example: /handoff code "refactor the auth module" """
1363
1494
  else self._process_file_mentions(prompt)
1364
1495
  )
1365
1496
 
1497
+ # Checkpoint files + conversation at the turn boundary before the
1498
+ # agent may mutate the workspace, so /undo and /revert can roll both
1499
+ # back together. Read-only turns (reviews) never mutate files, so
1500
+ # skip them to keep the revert timeline meaningful.
1501
+ if not read_only:
1502
+ self._checkpoint_turn(prompt[:60])
1503
+
1366
1504
  # Add to conversation history
1367
1505
  self._conversation_history.append({"role": "user", "content": prompt})
1368
1506