PraisonAI 4.6.143__tar.gz → 4.6.145__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 (643) hide show
  1. {praisonai-4.6.143 → praisonai-4.6.145}/PKG-INFO +4 -4
  2. {praisonai-4.6.143 → praisonai-4.6.145}/PraisonAI.egg-info/PKG-INFO +4 -4
  3. {praisonai-4.6.143 → praisonai-4.6.145}/PraisonAI.egg-info/requires.txt +3 -3
  4. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/interactive/core.py +43 -0
  5. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/interactive_legacy.py +299 -62
  6. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/managed_local.py +41 -3
  7. praisonai-4.6.145/praisonai/sandbox/_compat.py +29 -0
  8. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/shared.py +29 -17
  9. praisonai-4.6.145/praisonai/version.py +1 -0
  10. {praisonai-4.6.143 → praisonai-4.6.145}/pyproject.toml +3 -3
  11. praisonai-4.6.143/praisonai/sandbox/_compat.py +0 -209
  12. praisonai-4.6.143/praisonai/version.py +0 -1
  13. {praisonai-4.6.143 → praisonai-4.6.145}/PraisonAI.egg-info/SOURCES.txt +0 -0
  14. {praisonai-4.6.143 → praisonai-4.6.145}/PraisonAI.egg-info/dependency_links.txt +0 -0
  15. {praisonai-4.6.143 → praisonai-4.6.145}/PraisonAI.egg-info/entry_points.txt +0 -0
  16. {praisonai-4.6.143 → praisonai-4.6.145}/PraisonAI.egg-info/top_level.txt +0 -0
  17. {praisonai-4.6.143 → praisonai-4.6.145}/README.md +0 -0
  18. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/__init__.py +0 -0
  19. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/__main__.py +0 -0
  20. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_approval_spec.py +0 -0
  21. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_async_bridge.py +0 -0
  22. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_bootstrap.py +0 -0
  23. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/__init__.py +0 -0
  24. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/api_md.py +0 -0
  25. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/__init__.py +0 -0
  26. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/docs_extractor.py +0 -0
  27. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/docs_generator.py +0 -0
  28. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/generator.py +0 -0
  29. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/python_docs_extractor.py +0 -0
  30. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/python_extractor.py +0 -0
  31. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/rust_docs_extractor.py +0 -0
  32. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/rust_extractor.py +0 -0
  33. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/topic_normalizer.py +0 -0
  34. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/ts_docs_extractor.py +0 -0
  35. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_dev/parity/typescript_extractor.py +0 -0
  36. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_entrypoint.py +0 -0
  37. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_framework_availability.py +0 -0
  38. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_lazy_cache.py +0 -0
  39. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_logging.py +0 -0
  40. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_registry.py +0 -0
  41. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/_safe_loader.py +0 -0
  42. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/acp/__init__.py +0 -0
  43. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/acp/config.py +0 -0
  44. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/acp/safe_edit.py +0 -0
  45. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/acp/server.py +0 -0
  46. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/acp/session.py +0 -0
  47. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/adapters/__init__.py +0 -0
  48. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/adapters/readers.py +0 -0
  49. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/adapters/rerankers.py +0 -0
  50. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/adapters/retrievers.py +0 -0
  51. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/adapters/vector_stores.py +0 -0
  52. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/agent.py +0 -0
  53. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/agent_scheduler.py +0 -0
  54. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/agents_generator.py +0 -0
  55. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/api/agent_invoke.py +0 -0
  56. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/api/call.py +0 -0
  57. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/app/__init__.py +0 -0
  58. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/app/agentos.py +0 -0
  59. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/async_agent_scheduler.py +0 -0
  60. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/audit/__init__.py +0 -0
  61. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/audit/agent_centric.py +0 -0
  62. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/auto.py +0 -0
  63. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/bots/__init__.py +0 -0
  64. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/__init__.py +0 -0
  65. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/agent.py +0 -0
  66. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/benchmark.py +0 -0
  67. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/cdp_agent.py +0 -0
  68. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/cdp_utils.py +0 -0
  69. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/cli.py +0 -0
  70. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/diagnostics.py +0 -0
  71. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/launcher.py +0 -0
  72. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/playwright_agent.py +0 -0
  73. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/profiling.py +0 -0
  74. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/protocol.py +0 -0
  75. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/report.py +0 -0
  76. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/server.py +0 -0
  77. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/sessions.py +0 -0
  78. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/browser/video.py +0 -0
  79. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/__init__.py +0 -0
  80. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/a2a.py +0 -0
  81. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/assistants.py +0 -0
  82. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/audio.py +0 -0
  83. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/batches.py +0 -0
  84. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/completions.py +0 -0
  85. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/container_files.py +0 -0
  86. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/containers.py +0 -0
  87. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/embeddings.py +0 -0
  88. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/files.py +0 -0
  89. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/fine_tuning.py +0 -0
  90. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/guardrails.py +0 -0
  91. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/images.py +0 -0
  92. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/mcp.py +0 -0
  93. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/messages.py +0 -0
  94. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/moderations.py +0 -0
  95. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/ocr.py +0 -0
  96. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/passthrough.py +0 -0
  97. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/rag.py +0 -0
  98. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/realtime.py +0 -0
  99. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/rerank.py +0 -0
  100. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/responses.py +0 -0
  101. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/search.py +0 -0
  102. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/skills.py +0 -0
  103. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/vector_store_files.py +0 -0
  104. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/vector_stores.py +0 -0
  105. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/capabilities/videos.py +0 -0
  106. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/claw/__init__.py +0 -0
  107. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/__init__.py +0 -0
  108. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/_paths.py +0 -0
  109. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/_shim.py +0 -0
  110. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/_warnings.py +0 -0
  111. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/app.py +0 -0
  112. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/approval_backend.py +0 -0
  113. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/branding.py +0 -0
  114. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/__init__.py +0 -0
  115. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/acp.py +0 -0
  116. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/agent.py +0 -0
  117. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/agents.py +0 -0
  118. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/app.py +0 -0
  119. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/attach.py +0 -0
  120. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/audit.py +0 -0
  121. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/auth.py +0 -0
  122. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/batch.py +0 -0
  123. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/benchmark.py +0 -0
  124. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/bot.py +0 -0
  125. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/browser.py +0 -0
  126. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/call.py +0 -0
  127. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/chat.py +0 -0
  128. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/checkpoint.py +0 -0
  129. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/claw.py +0 -0
  130. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/code.py +0 -0
  131. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/command.py +0 -0
  132. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/commit.py +0 -0
  133. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/completion.py +0 -0
  134. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/config.py +0 -0
  135. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/context.py +0 -0
  136. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/daemon.py +0 -0
  137. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/dashboard.py +0 -0
  138. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/debug.py +0 -0
  139. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/deploy.py +0 -0
  140. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/diag.py +0 -0
  141. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/docs.py +0 -0
  142. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/doctor.py +0 -0
  143. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/endpoints.py +0 -0
  144. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/environment.py +0 -0
  145. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/eval.py +0 -0
  146. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/examples.py +0 -0
  147. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/flow.py +0 -0
  148. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/gateway.py +0 -0
  149. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/github.py +0 -0
  150. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/hooks.py +0 -0
  151. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/identity.py +0 -0
  152. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/init.py +0 -0
  153. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/kanban.py +0 -0
  154. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/knowledge.py +0 -0
  155. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/langextract.py +0 -0
  156. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/langfuse.py +0 -0
  157. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/loop.py +0 -0
  158. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/lsp.py +0 -0
  159. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/managed.py +0 -0
  160. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/mcp.py +0 -0
  161. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/memory.py +0 -0
  162. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/mint_link.py +0 -0
  163. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/models.py +0 -0
  164. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/n8n.py +0 -0
  165. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/obs.py +0 -0
  166. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/onboard.py +0 -0
  167. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/package.py +0 -0
  168. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/pairing.py +0 -0
  169. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/paths.py +0 -0
  170. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/permissions.py +0 -0
  171. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/plugins.py +0 -0
  172. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/port.py +0 -0
  173. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/profile.py +0 -0
  174. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/publish.py +0 -0
  175. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/rag.py +0 -0
  176. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/realtime.py +0 -0
  177. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/recipe.py +0 -0
  178. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/registry.py +0 -0
  179. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/replay.py +0 -0
  180. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/research.py +0 -0
  181. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/retrieval.py +0 -0
  182. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/rules.py +0 -0
  183. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/run.py +0 -0
  184. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/sandbox.py +0 -0
  185. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/schedule.py +0 -0
  186. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/serve.py +0 -0
  187. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/session.py +0 -0
  188. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/setup.py +0 -0
  189. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/skills.py +0 -0
  190. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/standardise.py +0 -0
  191. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/templates.py +0 -0
  192. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/test.py +0 -0
  193. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/todo.py +0 -0
  194. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/tools.py +0 -0
  195. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/traces.py +0 -0
  196. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/tracker.py +0 -0
  197. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/train.py +0 -0
  198. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/ui.py +0 -0
  199. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/up.py +0 -0
  200. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/validate.py +0 -0
  201. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/version.py +0 -0
  202. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/commands/workflow.py +0 -0
  203. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/config_loader.py +0 -0
  204. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/configuration/__init__.py +0 -0
  205. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/configuration/config.schema.json +0 -0
  206. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/execution/__init__.py +0 -0
  207. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/fallback_schema.py +0 -0
  208. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/__init__.py +0 -0
  209. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/acp.py +0 -0
  210. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/agent_scheduler.py +0 -0
  211. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/agent_tools.py +0 -0
  212. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/approval.py +0 -0
  213. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/background.py +0 -0
  214. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/bots_cli.py +0 -0
  215. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/deploy.py +0 -0
  216. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/endpoints.py +0 -0
  217. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/eval.py +0 -0
  218. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/gateway.py +0 -0
  219. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/ollama.py +0 -0
  220. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/onboard.py +0 -0
  221. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/persistence.py +0 -0
  222. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/recipe.py +0 -0
  223. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/recipe_optimizer.py +0 -0
  224. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/registry.py +0 -0
  225. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/sandbox_cli.py +0 -0
  226. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/serve.py +0 -0
  227. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/templates.py +0 -0
  228. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/tools.py +0 -0
  229. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/tui/__init__.py +0 -0
  230. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/tui/app.py +0 -0
  231. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/features/workflow.py +0 -0
  232. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/interactive/__init__.py +0 -0
  233. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/interactive/async_tui.py +0 -0
  234. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/langfuse_client.py +0 -0
  235. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/__init__.py +0 -0
  236. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/direct_prompt.py +0 -0
  237. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/dispatch/__init__.py +0 -0
  238. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/dispatch/argparse_builder.py +0 -0
  239. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/dispatch/legacy_dispatch.py +0 -0
  240. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/framework_run.py +0 -0
  241. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/inbuilt_tools.py +0 -0
  242. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/subcommand_handlers.py +0 -0
  243. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/legacy/workflow_commands.py +0 -0
  244. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/main.py +0 -0
  245. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/output/__init__.py +0 -0
  246. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/schedule_cli.py +0 -0
  247. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/schema_provider.py +0 -0
  248. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/session/__init__.py +0 -0
  249. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/state/__init__.py +0 -0
  250. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/ui/__init__.py +0 -0
  251. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/unified_schema.py +0 -0
  252. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli/utils/__init__.py +0 -0
  253. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/cli_backends/__init__.py +0 -0
  254. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/__init__.py +0 -0
  255. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/agent_tools.py +0 -0
  256. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/diff/__init__.py +0 -0
  257. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/diff/diff_strategy.py +0 -0
  258. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/tools/__init__.py +0 -0
  259. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/tools/apply_diff.py +0 -0
  260. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/tools/execute_command.py +0 -0
  261. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/tools/list_files.py +0 -0
  262. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/tools/read_file.py +0 -0
  263. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/tools/search_replace.py +0 -0
  264. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/tools/write_file.py +0 -0
  265. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/utils/__init__.py +0 -0
  266. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/utils/file_utils.py +0 -0
  267. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/utils/ignore_utils.py +0 -0
  268. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/code/utils/text_utils.py +0 -0
  269. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/config/__init__.py +0 -0
  270. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/config/schema.py +0 -0
  271. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/config/validator.py +0 -0
  272. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/__init__.py +0 -0
  273. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/_storage_path.py +0 -0
  274. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/artifact_store.py +0 -0
  275. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/config.py +0 -0
  276. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/history_store.py +0 -0
  277. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/queue.py +0 -0
  278. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/setup.py +0 -0
  279. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/context/terminal_logger.py +0 -0
  280. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/daemon/__init__.py +0 -0
  281. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/db/__init__.py +0 -0
  282. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/db/adapter.py +0 -0
  283. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/__init__.py +0 -0
  284. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/api.py +0 -0
  285. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/docker.py +0 -0
  286. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/doctor.py +0 -0
  287. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/main.py +0 -0
  288. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/models.py +0 -0
  289. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/providers/__init__.py +0 -0
  290. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/providers/_registry.py +0 -0
  291. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/providers/aws.py +0 -0
  292. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/providers/azure.py +0 -0
  293. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/providers/base.py +0 -0
  294. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/providers/gcp.py +0 -0
  295. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/deploy/schema.py +0 -0
  296. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/__init__.py +0 -0
  297. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/a2u_server.py +0 -0
  298. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/discovery.py +0 -0
  299. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/__init__.py +0 -0
  300. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/a2a.py +0 -0
  301. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/a2u.py +0 -0
  302. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/agents_api.py +0 -0
  303. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/base.py +0 -0
  304. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/mcp.py +0 -0
  305. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/openai_compat.py +0 -0
  306. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/recipe.py +0 -0
  307. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/providers/tools_mcp.py +0 -0
  308. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/registry.py +0 -0
  309. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/endpoints/server.py +0 -0
  310. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/flow/__init__.py +0 -0
  311. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/flow/client.py +0 -0
  312. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
  313. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
  314. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/flow/components/__init__.py +0 -0
  315. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/flow/converter.py +0 -0
  316. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/flow/helpers.py +0 -0
  317. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/__init__.py +0 -0
  318. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/_config_builder.py +0 -0
  319. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/autogen_adapter.py +0 -0
  320. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/base.py +0 -0
  321. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/crewai_adapter.py +0 -0
  322. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/praisonai_adapter.py +0 -0
  323. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/registry.py +0 -0
  324. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/validators.py +0 -0
  325. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/framework_adapters/workflow_framework.py +0 -0
  326. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/gateway/__init__.py +0 -0
  327. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/inbuilt_tools/__init__.py +0 -0
  328. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  329. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/inc/__init__.py +0 -0
  330. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/inc/config.py +0 -0
  331. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/inc/models.py +0 -0
  332. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/__init__.py +0 -0
  333. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/bridges/__init__.py +0 -0
  334. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/bridges/approvals_bridge.py +0 -0
  335. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/bridges/hooks_query.py +0 -0
  336. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/bridges/kanban_bridge.py +0 -0
  337. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/bridges/schedules_runner.py +0 -0
  338. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/bridges/usage_bridge.py +0 -0
  339. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/bridges/workflows_service.py +0 -0
  340. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/context_files.py +0 -0
  341. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/gateway_host.py +0 -0
  342. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/host_app.py +0 -0
  343. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/pages/__init__.py +0 -0
  344. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/pages/bot_health.py +0 -0
  345. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integration/pages/workflow_runs.py +0 -0
  346. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/__init__.py +0 -0
  347. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/_cli_loaders.py +0 -0
  348. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/_session_info.py +0 -0
  349. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/_tool_aliases.py +0 -0
  350. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/_unified_registry.py +0 -0
  351. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/backend_registry.py +0 -0
  352. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/base.py +0 -0
  353. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/claude_code.py +0 -0
  354. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/codex_cli.py +0 -0
  355. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/compute/__init__.py +0 -0
  356. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/compute/daytona.py +0 -0
  357. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/compute/docker.py +0 -0
  358. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/compute/e2b.py +0 -0
  359. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/compute/flyio.py +0 -0
  360. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/compute/local.py +0 -0
  361. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/compute/modal_compute.py +0 -0
  362. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/cursor_cli.py +0 -0
  363. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/db_session_adapter.py +0 -0
  364. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/gemini_cli.py +0 -0
  365. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/hosted_agent.py +0 -0
  366. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/local_agent.py +0 -0
  367. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/managed_agents.py +0 -0
  368. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/registry.py +0 -0
  369. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/integrations/sandboxed_agent.py +0 -0
  370. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/jobs/__init__.py +0 -0
  371. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/jobs/executor.py +0 -0
  372. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/jobs/models.py +0 -0
  373. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/jobs/path_validation.py +0 -0
  374. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/jobs/router.py +0 -0
  375. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/jobs/server.py +0 -0
  376. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/jobs/store.py +0 -0
  377. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/kanban/__init__.py +0 -0
  378. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/llm/__init__.py +0 -0
  379. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/llm/catalogue.py +0 -0
  380. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/llm/config.py +0 -0
  381. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/llm/credentials.py +0 -0
  382. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/llm/env.py +0 -0
  383. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/llm/gateways.py +0 -0
  384. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/llm/registry.py +0 -0
  385. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/__init__.py +0 -0
  386. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/__init__.py +0 -0
  387. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/agents.py +0 -0
  388. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/capabilities.py +0 -0
  389. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/cli_tools.py +0 -0
  390. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/extended_capabilities.py +0 -0
  391. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/knowledge.py +0 -0
  392. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/memory.py +0 -0
  393. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/prompts.py +0 -0
  394. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/resources.py +0 -0
  395. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/adapters/tools_bridge.py +0 -0
  396. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/auth/__init__.py +0 -0
  397. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/auth/api_key.py +0 -0
  398. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/auth/oauth.py +0 -0
  399. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/auth/oidc.py +0 -0
  400. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/auth/scopes.py +0 -0
  401. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/cli.py +0 -0
  402. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/elicitation.py +0 -0
  403. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/icons.py +0 -0
  404. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/recipe_adapter.py +0 -0
  405. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/recipe_cli.py +0 -0
  406. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/registry.py +0 -0
  407. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/sampling.py +0 -0
  408. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/server.py +0 -0
  409. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/tasks.py +0 -0
  410. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/tool_index.py +0 -0
  411. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/transports/__init__.py +0 -0
  412. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/transports/http_stream.py +0 -0
  413. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/mcp_server/transports/stdio.py +0 -0
  414. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/n8n/__init__.py +0 -0
  415. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/n8n/client.py +0 -0
  416. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/n8n/converter.py +0 -0
  417. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/n8n/preview.py +0 -0
  418. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/n8n/reverse_converter.py +0 -0
  419. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/observability/__init__.py +0 -0
  420. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/observability/hooks.py +0 -0
  421. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/observability/langextract.py +0 -0
  422. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/observability/langfuse.py +0 -0
  423. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/__init__.py +0 -0
  424. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/_valkey_client.py +0 -0
  425. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/config.py +0 -0
  426. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/__init__.py +0 -0
  427. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/_sql_base.py +0 -0
  428. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
  429. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/async_mysql.py +0 -0
  430. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/async_postgres.py +0 -0
  431. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/async_sqlite.py +0 -0
  432. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/base.py +0 -0
  433. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/json_store.py +0 -0
  434. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/mysql.py +0 -0
  435. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/postgres.py +0 -0
  436. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/singlestore.py +0 -0
  437. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/sqlite.py +0 -0
  438. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/supabase.py +0 -0
  439. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/surrealdb.py +0 -0
  440. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
  441. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/conversation/turso.py +0 -0
  442. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/factory.py +0 -0
  443. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/hooks/__init__.py +0 -0
  444. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/hooks/agent_hooks.py +0 -0
  445. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/__init__.py +0 -0
  446. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/base.py +0 -0
  447. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/cassandra.py +0 -0
  448. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/chroma.py +0 -0
  449. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/clickhouse.py +0 -0
  450. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
  451. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/couchbase.py +0 -0
  452. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/lancedb.py +0 -0
  453. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
  454. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
  455. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
  456. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/milvus.py +0 -0
  457. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
  458. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/pgvector.py +0 -0
  459. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/pinecone.py +0 -0
  460. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/qdrant.py +0 -0
  461. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/redis_vector.py +0 -0
  462. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
  463. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
  464. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
  465. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
  466. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/knowledge/weaviate.py +0 -0
  467. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/migrations/__init__.py +0 -0
  468. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/migrations/manager.py +0 -0
  469. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/orchestrator.py +0 -0
  470. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/registry.py +0 -0
  471. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/__init__.py +0 -0
  472. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/async_mongodb.py +0 -0
  473. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/base.py +0 -0
  474. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/dynamodb.py +0 -0
  475. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/firestore.py +0 -0
  476. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/gcs.py +0 -0
  477. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/memory.py +0 -0
  478. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/mongodb.py +0 -0
  479. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/redis.py +0 -0
  480. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/upstash.py +0 -0
  481. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/state/valkey.py +0 -0
  482. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/tests/__init__.py +0 -0
  483. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/tests/test_all_backends.py +0 -0
  484. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/tests/test_registry_lazy.py +0 -0
  485. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/persistence/tests/test_valkey_backends.py +0 -0
  486. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/profiler.py +0 -0
  487. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/push/__init__.py +0 -0
  488. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/push/client.py +0 -0
  489. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/push/transports.py +0 -0
  490. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/__init__.py +0 -0
  491. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/bridge.py +0 -0
  492. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/core.py +0 -0
  493. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/exceptions.py +0 -0
  494. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/history.py +0 -0
  495. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/models.py +0 -0
  496. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/operations.py +0 -0
  497. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/policy.py +0 -0
  498. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/registry.py +0 -0
  499. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/runtime.py +0 -0
  500. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/security.py +0 -0
  501. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/serve.py +0 -0
  502. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/recipe/server.py +0 -0
  503. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/__init__.py +0 -0
  504. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/analyzer.py +0 -0
  505. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/applier.py +0 -0
  506. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/judge.py +0 -0
  507. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/plan.py +0 -0
  508. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/player.py +0 -0
  509. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/reader.py +0 -0
  510. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/storage.py +0 -0
  511. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/replay/writer.py +0 -0
  512. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/runtime/__init__.py +0 -0
  513. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/runtime/__main__.py +0 -0
  514. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/__init__.py +0 -0
  515. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/_registry.py +0 -0
  516. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/_shell.py +0 -0
  517. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/daytona.py +0 -0
  518. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/docker.py +0 -0
  519. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/e2b.py +0 -0
  520. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/modal.py +0 -0
  521. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/sandlock.py +0 -0
  522. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/ssh.py +0 -0
  523. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/sandbox/subprocess.py +0 -0
  524. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/__init__.py +0 -0
  525. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/_base_scheduler.py +0 -0
  526. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/_dispatch.py +0 -0
  527. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/agent_scheduler.py +0 -0
  528. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/async_agent_scheduler.py +0 -0
  529. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/base.py +0 -0
  530. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/blueprint_catalogue.py +0 -0
  531. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/condition_gate.py +0 -0
  532. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/daemon_manager.py +0 -0
  533. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/deployment.py +0 -0
  534. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/executor.py +0 -0
  535. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/run_policy.py +0 -0
  536. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/state_manager.py +0 -0
  537. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/suggestion_engine.py +0 -0
  538. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/scheduler/yaml_loader.py +0 -0
  539. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/security/__init__.py +0 -0
  540. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/security/audit.py +0 -0
  541. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/security/injection.py +0 -0
  542. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/security/protected.py +0 -0
  543. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/setup/__init__.py +0 -0
  544. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/setup/build.py +0 -0
  545. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/setup/post_install.py +0 -0
  546. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/setup/setup_conda_env.py +0 -0
  547. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/setup.py +0 -0
  548. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/__init__.py +0 -0
  549. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/ai_generator.py +0 -0
  550. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/config.py +0 -0
  551. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/dedupe.py +0 -0
  552. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/discovery.py +0 -0
  553. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/drift.py +0 -0
  554. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/engine.py +0 -0
  555. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/enhanced_templates.py +0 -0
  556. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/example_verifier.py +0 -0
  557. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/manifest.py +0 -0
  558. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/models.py +0 -0
  559. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/reports.py +0 -0
  560. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/templates.py +0 -0
  561. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/undo_redo.py +0 -0
  562. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/standardise/validator.py +0 -0
  563. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/storage/__init__.py +0 -0
  564. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/storage/dynamodb_adapter.py +0 -0
  565. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/storage/mongodb_adapter.py +0 -0
  566. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/storage/postgresql_adapter.py +0 -0
  567. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/storage/redis_adapter.py +0 -0
  568. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/storage/valkey_adapter.py +0 -0
  569. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/__init__.py +0 -0
  570. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/batch_source.py +0 -0
  571. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/cli_docs_source.py +0 -0
  572. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/discovery.py +0 -0
  573. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/docs_source.py +0 -0
  574. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/examples_source.py +0 -0
  575. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/executor.py +0 -0
  576. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/models.py +0 -0
  577. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/report_viewer.py +0 -0
  578. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/reporter.py +0 -0
  579. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/suite_runner/runner.py +0 -0
  580. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/__init__.py +0 -0
  581. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/cache.py +0 -0
  582. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/dependency_checker.py +0 -0
  583. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/discovery.py +0 -0
  584. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/loader.py +0 -0
  585. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/registry.py +0 -0
  586. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/resolver.py +0 -0
  587. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/security.py +0 -0
  588. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/tool_override.py +0 -0
  589. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/templates/tools_doctor.py +0 -0
  590. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tool_registry.py +0 -0
  591. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tool_resolver.py +0 -0
  592. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tools/__init__.py +0 -0
  593. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tools/audio.py +0 -0
  594. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tools/glob_tool.py +0 -0
  595. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tools/grep_tool.py +0 -0
  596. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tools/kanban_tools.py +0 -0
  597. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tools/multiedit.py +0 -0
  598. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/tools/skill_manage.py +0 -0
  599. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/__init__.py +0 -0
  600. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/_ollama.py +0 -0
  601. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/agents/__init__.py +0 -0
  602. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/agents/grader.py +0 -0
  603. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/agents/hook.py +0 -0
  604. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/agents/models.py +0 -0
  605. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/agents/orchestrator.py +0 -0
  606. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/agents/storage.py +0 -0
  607. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/llm/__init__.py +0 -0
  608. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train/llm/trainer.py +0 -0
  609. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train.py +0 -0
  610. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/train_vision.py +0 -0
  611. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui/_aiui_datastore.py +0 -0
  612. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui/_external_agents.py +0 -0
  613. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui/callbacks.py +0 -0
  614. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui/components/aicoder.py +0 -0
  615. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui/context.py +0 -0
  616. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui/database_config.py +0 -0
  617. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_agents/__init__.py +0 -0
  618. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_agents/default_app.py +0 -0
  619. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_bot/__init__.py +0 -0
  620. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_bot/default_app.py +0 -0
  621. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_chat/__init__.py +0 -0
  622. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_chat/default_app.py +0 -0
  623. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_dashboard/default_app.py +0 -0
  624. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_realtime/__init__.py +0 -0
  625. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/ui_realtime/default_app.py +0 -0
  626. {praisonai-4.6.143 → praisonai-4.6.145}/praisonai/upload_vision.py +0 -0
  627. {praisonai-4.6.143 → praisonai-4.6.145}/setup.cfg +0 -0
  628. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test.py +0 -0
  629. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_agents_playbook.py +0 -0
  630. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_approval_system.py +0 -0
  631. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_basic.py +0 -0
  632. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_cli_features.py +0 -0
  633. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_custom_tools_fix.py +0 -0
  634. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_double_api_fix.py +0 -0
  635. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_n8n_agent_invoke.py +0 -0
  636. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_n8n_cli_feature.py +0 -0
  637. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_n8n_integration.py +0 -0
  638. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_phase2_refactor.py +0 -0
  639. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_recipe.py +0 -0
  640. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_registry.py +0 -0
  641. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_runner.py +0 -0
  642. {praisonai-4.6.143 → praisonai-4.6.145}/tests/test_sandboxed_agent_compatibility.py +0 -0
  643. {praisonai-4.6.143 → praisonai-4.6.145}/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.143
3
+ Version: 4.6.145
4
4
  Summary: PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration.
5
5
  Author: Mervin Praison
6
6
  License: MIT
@@ -11,9 +11,9 @@ Description-Content-Type: text/markdown
11
11
  Requires-Dist: rich>=13.7
12
12
  Requires-Dist: markdown>=3.5
13
13
  Requires-Dist: pyparsing>=3.0.0
14
- Requires-Dist: praisonaiagents>=1.6.146
15
- Requires-Dist: praisonai-code>=0.0.42
16
- Requires-Dist: praisonai-bot>=0.0.27
14
+ Requires-Dist: praisonaiagents>=1.6.148
15
+ Requires-Dist: praisonai-code>=0.0.44
16
+ Requires-Dist: praisonai-bot>=0.0.29
17
17
  Requires-Dist: python-dotenv>=0.19.0
18
18
  Requires-Dist: litellm<2,>=1.83.14
19
19
  Requires-Dist: PyYAML>=6.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 4.6.143
3
+ Version: 4.6.145
4
4
  Summary: PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration.
5
5
  Author: Mervin Praison
6
6
  License: MIT
@@ -11,9 +11,9 @@ Description-Content-Type: text/markdown
11
11
  Requires-Dist: rich>=13.7
12
12
  Requires-Dist: markdown>=3.5
13
13
  Requires-Dist: pyparsing>=3.0.0
14
- Requires-Dist: praisonaiagents>=1.6.146
15
- Requires-Dist: praisonai-code>=0.0.42
16
- Requires-Dist: praisonai-bot>=0.0.27
14
+ Requires-Dist: praisonaiagents>=1.6.148
15
+ Requires-Dist: praisonai-code>=0.0.44
16
+ Requires-Dist: praisonai-bot>=0.0.29
17
17
  Requires-Dist: python-dotenv>=0.19.0
18
18
  Requires-Dist: litellm<2,>=1.83.14
19
19
  Requires-Dist: PyYAML>=6.0
@@ -1,9 +1,9 @@
1
1
  rich>=13.7
2
2
  markdown>=3.5
3
3
  pyparsing>=3.0.0
4
- praisonaiagents>=1.6.146
5
- praisonai-code>=0.0.42
6
- praisonai-bot>=0.0.27
4
+ praisonaiagents>=1.6.148
5
+ praisonai-code>=0.0.44
6
+ praisonai-bot>=0.0.29
7
7
  python-dotenv>=0.19.0
8
8
  litellm<2,>=1.83.14
9
9
  PyYAML>=6.0
@@ -329,6 +329,10 @@ class InteractiveCore:
329
329
  else:
330
330
  agent_config["autonomy"] = True
331
331
 
332
+ session_registry = self._build_subtree_hook_registry(project_context)
333
+ if session_registry is not None:
334
+ agent_config["hooks"] = session_registry
335
+
332
336
  self._agent = Agent(**agent_config)
333
337
 
334
338
  agent = self._agent
@@ -408,6 +412,45 @@ class InteractiveCore:
408
412
  self._project_context = context
409
413
  return context
410
414
 
415
+ def _build_subtree_hook_registry(self, already_loaded: str):
416
+ """Build a session-scoped ``HookRegistry`` for subtree instruction rules.
417
+
418
+ Complements the up-front (nearest-wins walk-up) project context by
419
+ lazily attaching a subdirectory's instruction file the first time the
420
+ agent reads/edits a file under it. The hook is registered on a *fresh*
421
+ registry (never the global default) so its per-session dedup state stays
422
+ isolated and cannot leak into other agents/sessions.
423
+
424
+ Returns the registry to pass as ``Agent(hooks=...)``, or ``None`` when
425
+ ``--no-context`` is set or the wrapper helper is unavailable (the caller
426
+ then constructs the agent without a custom registry).
427
+ """
428
+ if getattr(self.config, "no_context", False):
429
+ return None
430
+ try:
431
+ from praisonai.integration.context_files import (
432
+ build_subtree_context_hook,
433
+ file_tool_matcher,
434
+ )
435
+ from praisonaiagents.hooks import HookEvent, HookRegistry
436
+ except ImportError:
437
+ return None
438
+
439
+ try:
440
+ budget = getattr(self.config, "context_token_budget", 0) or 0
441
+ hook = build_subtree_context_hook(already_loaded, max_chars=budget)
442
+ registry = HookRegistry()
443
+ registry.register_function(
444
+ event=HookEvent.AFTER_TOOL,
445
+ func=hook,
446
+ matcher=file_tool_matcher(),
447
+ name="subtree_instruction_injection",
448
+ )
449
+ return registry
450
+ except Exception as e: # pragma: no cover - defensive wiring
451
+ logger.warning(f"Could not build subtree context hook: {e}")
452
+ return None
453
+
411
454
  # ========== Tool Management ==========
412
455
 
413
456
  def get_tools(self) -> List:
@@ -79,6 +79,9 @@ def _start_interactive_mode(self, args):
79
79
  'error_tasks': [], # Queue of error tasks to display
80
80
  'tool_activity': None, # Current tool being used
81
81
  'last_status_line': None, # For transient status updates
82
+ 'stream_deltas': queue_module.Queue(), # Real streaming deltas (worker -> display)
83
+ 'stream_active': False, # True while a turn is actively streaming
84
+ 'stream_header_shown': False, # Whether the streaming header was printed
82
85
  }
83
86
 
84
87
  # Task counter for unique IDs (FIFO position tracking)
@@ -220,18 +223,51 @@ def _start_interactive_mode(self, args):
220
223
  """
221
224
  while display_running['value']:
222
225
  try:
223
- # Check for completed tasks to display (FIFO order guaranteed)
224
- if worker_state['completed_tasks']:
226
+ # Render real streaming deltas as they arrive from the worker.
227
+ # This replaces the previous post-hoc simulated word replay:
228
+ # text now appears incrementally, in real time-to-first-token.
229
+ stream_deltas = worker_state.get('stream_deltas')
230
+ if stream_deltas is not None:
231
+ drained_any = False
232
+ while True:
233
+ try:
234
+ delta = stream_deltas.get_nowait()
235
+ except queue_module.Empty:
236
+ break
237
+ if delta is None:
238
+ continue
239
+ # First delta of a turn: clear status line + print header.
240
+ if not worker_state.get('stream_header_shown'):
241
+ if worker_state.get('last_status_line'):
242
+ console.print("\r" + " " * 80 + "\r", end="")
243
+ worker_state['last_status_line'] = None
244
+ console.print() # New line before response
245
+ if verbose_mode:
246
+ console.print("[bold blue]A:[/bold blue] ", end="")
247
+ worker_state['stream_header_shown'] = True
248
+ console.print(delta, end="")
249
+ sys.stdout.flush()
250
+ drained_any = True
251
+ if drained_any:
252
+ # Yield briefly so input/status threads stay responsive.
253
+ time.sleep(0.001)
254
+
255
+ # Check for completed tasks to display (FIFO order guaranteed).
256
+ # Defer finalisation until the delta queue is fully drained so the
257
+ # last streamed chunks are not clipped by the completion path.
258
+ deltas_pending = (
259
+ stream_deltas is not None and not stream_deltas.empty()
260
+ )
261
+ if worker_state['completed_tasks'] and not deltas_pending:
225
262
  task = worker_state['completed_tasks'].pop(0)
226
263
  response = task.get('response', '')
264
+ streamed = task.get('streamed', False)
227
265
 
228
266
  # Clear any transient status line
229
267
  if worker_state.get('last_status_line'):
230
268
  console.print("\r" + " " * 80 + "\r", end="")
231
269
  worker_state['last_status_line'] = None
232
270
 
233
- console.print() # New line before response
234
-
235
271
  if verbose_mode:
236
272
  # VERBOSE: Full task lifecycle with metadata
237
273
  question = task.get('question', '')
@@ -240,18 +276,22 @@ def _start_interactive_mode(self, args):
240
276
  word_count = len(response.split()) if response else 0
241
277
  q_display = question[:80] + "..." if len(question) > 80 else question
242
278
 
243
- console.print(f"[bold cyan]─── Task #{task_id} completed ({elapsed:.1f}s, {word_count} words) ───[/bold cyan]")
279
+ if not streamed:
280
+ console.print() # New line before response
281
+ console.print(f"\n[bold cyan]─── Task #{task_id} completed ({elapsed:.1f}s, {word_count} words) ───[/bold cyan]")
244
282
  console.print(f"[bold green]Q:[/bold green] {q_display}")
245
- console.print(f"[bold blue]A:[/bold blue] ", end="")
283
+ if not streamed:
284
+ console.print(f"[bold blue]A:[/bold blue] ", end="")
246
285
 
247
- # Stream response (both modes)
248
- if response:
249
- words = response.split()
250
- for i, word in enumerate(words):
251
- console.print(word + " ", end="")
252
- if i % 20 == 19:
253
- time.sleep(0.003)
254
- console.print()
286
+ if streamed:
287
+ # Text already rendered live via stream_deltas; just finalise.
288
+ console.print()
289
+ else:
290
+ # Fallback path (streaming unavailable): print the full text.
291
+ console.print() # New line before response
292
+ if response:
293
+ console.print(response, end="")
294
+ console.print()
255
295
 
256
296
  if verbose_mode:
257
297
  task_id = task.get('task_id', 0)
@@ -860,6 +900,121 @@ Provide a concise summary (max 200 words):"""
860
900
  except Exception as e:
861
901
  console.print(f"[red]Error compacting: {e}[/red]")
862
902
 
903
+
904
+ # Coarse per-model context-window map used only as a fallback when a precise
905
+ # lookup is unavailable. Values are conservative (input side); the output
906
+ # reserve is subtracted separately by _usable_context_budget().
907
+ _MODEL_CONTEXT_WINDOW = {
908
+ 'gpt-4o': 128000,
909
+ 'gpt-4o-mini': 128000,
910
+ 'gpt-4-turbo': 128000,
911
+ 'gpt-4': 8192,
912
+ 'gpt-3.5-turbo': 16385,
913
+ 'o1': 200000,
914
+ 'o1-mini': 128000,
915
+ 'claude-3-5-sonnet': 200000,
916
+ 'claude-3-5-haiku': 200000,
917
+ 'claude-3-opus': 200000,
918
+ 'claude-3-sonnet': 200000,
919
+ 'claude-3-haiku': 200000,
920
+ 'gemini-1.5-pro': 1000000,
921
+ 'gemini-1.5-flash': 1000000,
922
+ 'gemini-2.0-flash': 1000000,
923
+ }
924
+
925
+
926
+ def _model_context_window(model):
927
+ """Best-effort context-window size (in tokens) for a model name.
928
+
929
+ Prefers litellm's model registry when available, then falls back to a
930
+ coarse built-in map, then a safe default. Never raises.
931
+ """
932
+ if not model:
933
+ return 128000
934
+ name = str(model).lower().split('/')[-1]
935
+ try:
936
+ import litellm # type: ignore
937
+ info = litellm.get_model_info(name)
938
+ window = info.get('max_input_tokens') or info.get('max_tokens')
939
+ if window:
940
+ return int(window)
941
+ except Exception:
942
+ pass
943
+ for key, window in _MODEL_CONTEXT_WINDOW.items():
944
+ if name.startswith(key) or key in name:
945
+ return window
946
+ return 128000
947
+
948
+
949
+ def _usable_context_budget(session_state):
950
+ """Usable input-token budget = context window minus the output reserve."""
951
+ config = session_state.get('context_config', {}) or {}
952
+ model = session_state.get('current_model')
953
+ window = _model_context_window(model)
954
+ output_reserve = int(config.get('output_reserve', 8000) or 8000)
955
+ # Never let the output reserve swallow the whole window; on small-context
956
+ # models (e.g. gpt-4 with an 8192 window) an 8000-token reserve would leave
957
+ # almost no usable input budget and trigger compaction on nearly every turn.
958
+ output_reserve = min(output_reserve, max(1, window // 4))
959
+ return max(1, window - output_reserve)
960
+
961
+
962
+ def _maybe_auto_compact(self, console, session_state):
963
+ """Proactively compact conversation history when nearing the context budget.
964
+
965
+ Honours session_state['context_config']['auto_compact'] (write-only until
966
+ now) and the configured threshold. Reuses the existing _handle_compact_command
967
+ summariser rather than reimplementing compaction. Returns True if a
968
+ compaction ran, else False. Never raises.
969
+ """
970
+ try:
971
+ config = session_state.get('context_config', {}) or {}
972
+ if not config.get('auto_compact', True):
973
+ return False
974
+
975
+ history = session_state.get('conversation_history', []) or []
976
+ if len(history) < 4:
977
+ return False
978
+
979
+ try:
980
+ from praisonaiagents.context.tokens import estimate_messages_tokens
981
+ used_tokens = estimate_messages_tokens(history)
982
+ except Exception:
983
+ used_tokens = sum(len(str(m.get('content', ''))) for m in history) // 4
984
+
985
+ budget = _usable_context_budget(session_state)
986
+ threshold = float(config.get('threshold', 0.8) or 0.8)
987
+
988
+ if used_tokens < budget * threshold:
989
+ return False
990
+
991
+ console.print(
992
+ f"[dim]Auto-compacting: ~{used_tokens} tokens ≈ "
993
+ f"{int(100 * used_tokens / budget)}% of usable budget "
994
+ f"({budget}).[/dim]"
995
+ )
996
+ _handle_compact_command(self, console, session_state)
997
+ return True
998
+ except Exception:
999
+ return False
1000
+
1001
+
1002
+ def _is_context_length_error(exc):
1003
+ """Heuristically detect context-window/token-limit errors from a provider."""
1004
+ message = str(exc).lower()
1005
+ markers = (
1006
+ 'context length',
1007
+ 'context window',
1008
+ 'maximum context',
1009
+ 'context_length_exceeded',
1010
+ 'too many tokens',
1011
+ 'reduce the length',
1012
+ 'prompt is too long',
1013
+ 'string too long',
1014
+ )
1015
+ return any(marker in message for marker in markers)
1016
+
1017
+
863
1018
  def _handle_context_command(self, console, args, session_state):
864
1019
  """
865
1020
  Handle /context command - manage context budgeting and monitoring.
@@ -1229,43 +1384,110 @@ def _start_execution_worker(self, tools_list, console, session_state):
1229
1384
  warnings.filterwarnings("ignore")
1230
1385
 
1231
1386
  model = session_state.get('current_model')
1232
- conversation_history = session_state.get('conversation_history', [])
1233
-
1387
+
1388
+ # Proactive auto-compaction: if the running history is
1389
+ # nearing the model's usable context budget and
1390
+ # auto_compact is enabled, summarise older turns before
1391
+ # building the agent so the turn stays within budget.
1392
+ _maybe_auto_compact(self, console, session_state)
1393
+
1234
1394
  live_status.update_status("Creating agent...")
1235
-
1236
- # Build backstory with context
1237
- backstory = "You are a helpful AI assistant with access to tools for file operations, code intelligence, and shell commands."
1238
1395
 
1239
1396
  # Auto-load AGENTS.md/CLAUDE.md project context (unless --no-context)
1397
+ _project_context = None
1240
1398
  if not getattr(getattr(self, 'args', None), 'no_context', False):
1241
- project_context = _load_cli_project_context(self)
1242
- if project_context:
1243
- backstory += "\n\n# Project Context\n" + project_context
1244
-
1245
- if conversation_history:
1246
- recent = conversation_history[-10:]
1247
- context_lines = []
1248
- for msg in recent:
1249
- role = msg.get('role', 'unknown')
1250
- content = msg.get('content', '')[:200]
1251
- context_lines.append(f"{role}: {content}")
1252
- if context_lines:
1253
- backstory += "\n\nRecent conversation context:\n" + "\n".join(context_lines)
1254
-
1255
- agent = Agent(
1256
- name="Assistant",
1257
- role="Helpful AI Assistant",
1258
- goal="Help the user with their tasks",
1259
- backstory=backstory,
1260
- tools=tools_list if tools_list else None,
1261
- output="minimal",
1262
- llm=model
1263
- )
1264
-
1399
+ _project_context = _load_cli_project_context(self)
1400
+
1401
+ def _build_agent():
1402
+ # Build the agent from the CURRENT conversation history
1403
+ # so that a post-compaction retry rebuilds with the
1404
+ # summarised (smaller) context rather than reusing the
1405
+ # stale, oversized backstory baked in before compaction.
1406
+ backstory = "You are a helpful AI assistant with access to tools for file operations, code intelligence, and shell commands."
1407
+ if _project_context:
1408
+ backstory += "\n\n# Project Context\n" + _project_context
1409
+
1410
+ history = session_state.get('conversation_history', [])
1411
+ if history:
1412
+ recent = history[-10:]
1413
+ context_lines = []
1414
+ for msg in recent:
1415
+ role = msg.get('role', 'unknown')
1416
+ content = msg.get('content', '')[:200]
1417
+ context_lines.append(f"{role}: {content}")
1418
+ if context_lines:
1419
+ backstory += "\n\nRecent conversation context:\n" + "\n".join(context_lines)
1420
+
1421
+ return Agent(
1422
+ name="Assistant",
1423
+ role="Helpful AI Assistant",
1424
+ goal="Help the user with their tasks",
1425
+ backstory=backstory,
1426
+ tools=tools_list if tools_list else None,
1427
+ output="minimal",
1428
+ llm=model
1429
+ )
1430
+
1431
+ agent = _build_agent()
1432
+
1265
1433
  live_status.update_status(f"Task #{task_id}: Calling LLM...")
1266
1434
 
1267
- response = agent.chat(prompt, stream=False)
1268
- response_str = str(response) if response else ""
1435
+ # Consume REAL token streaming from core (iter_stream yields
1436
+ # incremental chunks) and push each delta to the display thread
1437
+ # so text renders as it is generated — real time-to-first-token
1438
+ # instead of the previous post-hoc simulated word replay.
1439
+ response_str = ""
1440
+ streamed = False
1441
+ stream_deltas = worker_state.get('stream_deltas')
1442
+ try:
1443
+ worker_state['stream_header_shown'] = False
1444
+ worker_state['stream_active'] = True
1445
+ for chunk in agent.iter_stream(prompt):
1446
+ if chunk:
1447
+ response_str += chunk
1448
+ if stream_deltas is not None:
1449
+ stream_deltas.put(chunk)
1450
+ streamed = True
1451
+ except Exception:
1452
+ # If chunks were already emitted to the live display,
1453
+ # do NOT re-run the prompt via chat() — that would show
1454
+ # partial streamed tokens followed by a full second
1455
+ # answer. Keep the partial streamed text as-is and let
1456
+ # the display finalise it. Only fall back to the
1457
+ # non-streamed path when nothing streamed yet.
1458
+ if response_str:
1459
+ streamed = True
1460
+ else:
1461
+ try:
1462
+ response = agent.chat(prompt, stream=False)
1463
+ except Exception as chat_exc:
1464
+ # Reactive safety net: on a context-length
1465
+ # error, force a compaction (ignoring the
1466
+ # proactive threshold) and retry the turn once
1467
+ # instead of surfacing the raw provider error.
1468
+ # Skipped when the user has disabled
1469
+ # auto-compaction so their history is never
1470
+ # rewritten without consent.
1471
+ _auto_compact_enabled = (
1472
+ session_state.get('context_config', {}) or {}
1473
+ ).get('auto_compact', True)
1474
+ if _is_context_length_error(chat_exc) and _auto_compact_enabled:
1475
+ console.print(
1476
+ "[yellow]Context limit hit; compacting "
1477
+ "and retrying...[/yellow]"
1478
+ )
1479
+ _handle_compact_command(self, console, session_state)
1480
+ # Rebuild the agent so the retry uses the
1481
+ # compacted history instead of the stale
1482
+ # oversized backstory.
1483
+ agent = _build_agent()
1484
+ response = agent.chat(prompt, stream=False)
1485
+ else:
1486
+ raise
1487
+ response_str = str(response) if response else ""
1488
+ streamed = False
1489
+ finally:
1490
+ worker_state['stream_active'] = False
1269
1491
 
1270
1492
  # Calculate elapsed time
1271
1493
  elapsed = time.time() - start_time
@@ -1277,6 +1499,7 @@ def _start_execution_worker(self, tools_list, console, session_state):
1277
1499
  'response': response_str,
1278
1500
  'elapsed': elapsed,
1279
1501
  'status': 'completed',
1502
+ 'streamed': streamed,
1280
1503
  }
1281
1504
  worker_state['completed_tasks'].append(completed_task)
1282
1505
 
@@ -1421,30 +1644,44 @@ def _process_interactive_prompt(self, prompt, tools_list, console, show_profilin
1421
1644
 
1422
1645
  timings['llm_start'] = time.time()
1423
1646
 
1424
- # Use chat method (streaming is handled internally by verbose mode)
1425
- response = agent.chat(prompt, stream=False)
1426
-
1647
+ # Consume REAL token streaming from core: render each incremental chunk
1648
+ # as it is generated (real time-to-first-token) rather than replaying a
1649
+ # finished string word-by-word with fixed sleeps.
1650
+ timings['display_start'] = time.time()
1651
+ response_str = ""
1652
+ streamed = False
1653
+ try:
1654
+ for chunk in agent.iter_stream(prompt):
1655
+ if chunk:
1656
+ response_str += chunk
1657
+ console.print(chunk, end="")
1658
+ sys.stdout.flush()
1659
+ streamed = True
1660
+ if response_str:
1661
+ console.print() # Final newline
1662
+ except Exception:
1663
+ if response_str:
1664
+ # Chunks were already printed to the console — do NOT re-run the
1665
+ # prompt via chat(), otherwise the user sees partial streamed
1666
+ # output followed by a full second answer. Keep the partial
1667
+ # streamed text and just terminate the line.
1668
+ streamed = True
1669
+ console.print() # Final newline
1670
+ else:
1671
+ # Nothing streamed yet: fall back to the non-streamed path.
1672
+ response = agent.chat(prompt, stream=False)
1673
+ response_str = str(response) if response else ""
1674
+ if response_str:
1675
+ console.print(response_str)
1427
1676
  timings['llm_end'] = time.time()
1677
+ timings['display_end'] = time.time()
1428
1678
 
1429
1679
  # Check if tools were used by looking at agent's tool execution history
1430
- if hasattr(agent, '_tool_calls') and agent._tool_calls:
1680
+ if not streamed and hasattr(agent, '_tool_calls') and agent._tool_calls:
1431
1681
  for tool_call in agent._tool_calls:
1432
1682
  tool_name = tool_call.get('name', 'unknown')
1433
1683
  console.print(f"[dim]⚙ Used tool: {tool_name}[/dim]")
1434
1684
 
1435
- # Print response with simulated streaming effect
1436
- timings['display_start'] = time.time()
1437
- response_str = str(response) if response else ""
1438
- if response_str:
1439
- words = response_str.split()
1440
- for i, word in enumerate(words):
1441
- console.print(word + " ", end="")
1442
- sys.stdout.flush()
1443
- if i % 15 == 14: # Small pause every 15 words for streaming effect
1444
- time.sleep(0.005)
1445
- console.print() # Final newline
1446
- timings['display_end'] = time.time()
1447
-
1448
1685
  # Update session state with token estimates and history
1449
1686
  if session_state is not None:
1450
1687
  # Estimate tokens (rough: ~4 chars per token)
@@ -312,11 +312,24 @@ class LocalManagedAgent:
312
312
  # Import tools lazily
313
313
  tools = []
314
314
  compute_bridged_tools = {"execute_command", "read_file", "write_file", "list_files"}
315
-
315
+ resolver = self._get_tool_resolver()
316
+
316
317
  for name in resolved_names:
317
318
  try:
318
- from praisonaiagents import tools as tool_module
319
- func = getattr(tool_module, name, None)
319
+ # Route through the canonical ToolResolver chain
320
+ # (local -> core -> praisonai-tools -> plugins) so tools that
321
+ # resolve elsewhere in the wrapper resolve here too. Fall back
322
+ # to the historical praisonaiagents.tools getattr lookup when
323
+ # the resolver is unavailable so behaviour never narrows.
324
+ func = None
325
+ if resolver is not None:
326
+ try:
327
+ func = resolver.resolve(name)
328
+ except Exception as e:
329
+ logger.debug("[local_managed] resolver failed for %s: %s", name, e)
330
+ if func is None:
331
+ from praisonaiagents import tools as tool_module
332
+ func = getattr(tool_module, name, None)
320
333
  if func is not None:
321
334
  # Bridge shell-based tools to compute when available
322
335
  if self._compute and name in compute_bridged_tools:
@@ -345,6 +358,31 @@ class LocalManagedAgent:
345
358
 
346
359
  return tools
347
360
 
361
+ def _get_tool_resolver(self):
362
+ """Return a cached canonical ToolResolver, or None if unavailable.
363
+
364
+ The resolver (owned by ``praisonai-code``) walks the full resolution
365
+ chain (local tools.py -> praisonaiagents.tools -> praisonai-tools ->
366
+ entry-point plugins), matching how tool names resolve in the YAML /
367
+ Python / other CLI paths. It is imported lazily and cached; if the
368
+ optional ``praisonai-code`` package is not installed, callers fall
369
+ back to the historical ``praisonaiagents.tools`` getattr lookup.
370
+ """
371
+ resolver = getattr(self, "_tool_resolver", None)
372
+ if resolver is not None:
373
+ return resolver
374
+ if getattr(self, "_tool_resolver_unavailable", False):
375
+ return None
376
+ try:
377
+ from praisonai_code.tool_resolver import ToolResolver
378
+ resolver = ToolResolver()
379
+ except Exception as e: # praisonai-code optional / import failure
380
+ logger.debug("[local_managed] ToolResolver unavailable: %s", e)
381
+ self._tool_resolver_unavailable = True
382
+ return None
383
+ self._tool_resolver = resolver
384
+ return resolver
385
+
348
386
  def _create_compute_bridge_tool(self, tool_name: str, original_func: Callable) -> Callable:
349
387
  """Create a compute-bridged version of a tool.
350
388
 
@@ -0,0 +1,29 @@
1
+ """Path-safety helper for sandbox backends."""
2
+
3
+ import logging
4
+ import os
5
+
6
+ logger = logging.getLogger(__name__)
7
+
8
+
9
+ def safe_sandbox_path(temp_dir: str | None, path: str) -> str | None:
10
+ """Resolve a caller-supplied path to an absolute path inside temp_dir.
11
+
12
+ Returns None if the resolved path would escape the sandbox root,
13
+ preventing path-traversal attacks via sequences like `../../../etc/passwd`.
14
+
15
+ Args:
16
+ temp_dir: The sandbox root directory
17
+ path: User-supplied path to resolve
18
+
19
+ Returns:
20
+ Safe absolute path within sandbox, or None if path escapes sandbox
21
+ """
22
+ if not temp_dir:
23
+ return None
24
+ candidate = os.path.realpath(os.path.join(temp_dir, path.lstrip("/")))
25
+ sandbox_root = os.path.realpath(temp_dir)
26
+ if not (candidate == sandbox_root or candidate.startswith(sandbox_root + os.sep)):
27
+ logger.warning("Path traversal attempt blocked: %s", path)
28
+ return None
29
+ return candidate