PraisonAI 4.5.0__tar.gz → 4.5.2__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 (654) hide show
  1. {praisonai-4.5.0 → praisonai-4.5.2}/PKG-INFO +2 -2
  2. {praisonai-4.5.0 → praisonai-4.5.2}/PraisonAI.egg-info/PKG-INFO +2 -2
  3. {praisonai-4.5.0 → praisonai-4.5.2}/PraisonAI.egg-info/SOURCES.txt +17 -0
  4. {praisonai-4.5.0 → praisonai-4.5.2}/PraisonAI.egg-info/requires.txt +1 -1
  5. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/bots/__init__.py +22 -0
  6. praisonai-4.5.2/praisonai/bots/_ack.py +99 -0
  7. praisonai-4.5.2/praisonai/bots/_approval.py +149 -0
  8. praisonai-4.5.2/praisonai/bots/_approval_base.py +50 -0
  9. praisonai-4.5.2/praisonai/bots/_chunk.py +127 -0
  10. praisonai-4.5.2/praisonai/bots/_config_schema.py +152 -0
  11. praisonai-4.5.2/praisonai/bots/_debounce.py +122 -0
  12. praisonai-4.5.2/praisonai/bots/_discord_approval.py +337 -0
  13. praisonai-4.5.2/praisonai/bots/_http_approval.py +254 -0
  14. praisonai-4.5.2/praisonai/bots/_resilience.py +252 -0
  15. praisonai-4.5.2/praisonai/bots/_session.py +237 -0
  16. praisonai-4.5.2/praisonai/bots/_slack_approval.py +367 -0
  17. praisonai-4.5.2/praisonai/bots/_telegram_approval.py +340 -0
  18. praisonai-4.5.2/praisonai/bots/_webhook_approval.py +252 -0
  19. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/bots/_whatsapp_web_adapter.py +5 -0
  20. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/bots/bot.py +82 -2
  21. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/bots/botos.py +46 -5
  22. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/bots/discord.py +48 -3
  23. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/bots/slack.py +46 -2
  24. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/bots/telegram.py +160 -22
  25. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/bots/whatsapp.py +90 -10
  26. praisonai-4.5.2/praisonai/cli/features/doctor/checks/bot_checks.py +88 -0
  27. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/models.py +1 -0
  28. praisonai-4.5.2/praisonai/cli/features/onboard.py +253 -0
  29. praisonai-4.5.2/praisonai/daemon/__init__.py +62 -0
  30. praisonai-4.5.2/praisonai/daemon/launchd.py +138 -0
  31. praisonai-4.5.2/praisonai/daemon/systemd.py +123 -0
  32. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/deploy.py +1 -1
  33. praisonai-4.5.2/praisonai/version.py +1 -0
  34. {praisonai-4.5.0 → praisonai-4.5.2}/pyproject.toml +1 -1
  35. praisonai-4.5.0/praisonai/bots/_session.py +0 -120
  36. praisonai-4.5.0/praisonai/version.py +0 -1
  37. {praisonai-4.5.0 → praisonai-4.5.2}/PraisonAI.egg-info/dependency_links.txt +0 -0
  38. {praisonai-4.5.0 → praisonai-4.5.2}/PraisonAI.egg-info/entry_points.txt +0 -0
  39. {praisonai-4.5.0 → praisonai-4.5.2}/PraisonAI.egg-info/top_level.txt +0 -0
  40. {praisonai-4.5.0 → praisonai-4.5.2}/README.md +0 -0
  41. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/__init__.py +0 -0
  42. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/__main__.py +0 -0
  43. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/_dev/__init__.py +0 -0
  44. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/_dev/api_md.py +0 -0
  45. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/_dev/parity/__init__.py +0 -0
  46. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/_dev/parity/docs_extractor.py +0 -0
  47. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/_dev/parity/docs_generator.py +0 -0
  48. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/_dev/parity/generator.py +0 -0
  49. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/_dev/parity/python_docs_extractor.py +0 -0
  50. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/_dev/parity/python_extractor.py +0 -0
  51. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/_dev/parity/rust_docs_extractor.py +0 -0
  52. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/_dev/parity/rust_extractor.py +0 -0
  53. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/_dev/parity/topic_normalizer.py +0 -0
  54. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/_dev/parity/ts_docs_extractor.py +0 -0
  55. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/_dev/parity/typescript_extractor.py +0 -0
  56. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/acp/__init__.py +0 -0
  57. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/acp/config.py +0 -0
  58. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/acp/safe_edit.py +0 -0
  59. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/acp/server.py +0 -0
  60. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/acp/session.py +0 -0
  61. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/adapters/__init__.py +0 -0
  62. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/adapters/readers.py +0 -0
  63. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/adapters/rerankers.py +0 -0
  64. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/adapters/retrievers.py +0 -0
  65. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/adapters/vector_stores.py +0 -0
  66. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/agent_scheduler.py +0 -0
  67. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/agents_generator.py +0 -0
  68. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/api/call.py +0 -0
  69. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/app/__init__.py +0 -0
  70. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/app/agentos.py +0 -0
  71. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/audit/__init__.py +0 -0
  72. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/audit/agent_centric.py +0 -0
  73. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/auto.py +0 -0
  74. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/bots/_commands.py +0 -0
  75. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/bots/_protocol_mixin.py +0 -0
  76. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/bots/_registry.py +0 -0
  77. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/bots/media.py +0 -0
  78. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/__init__.py +0 -0
  79. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/agent.py +0 -0
  80. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/benchmark.py +0 -0
  81. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/cdp_agent.py +0 -0
  82. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/cdp_utils.py +0 -0
  83. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/cli.py +0 -0
  84. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/diagnostics.py +0 -0
  85. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/launcher.py +0 -0
  86. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/playwright_agent.py +0 -0
  87. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/profiling.py +0 -0
  88. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/protocol.py +0 -0
  89. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/report.py +0 -0
  90. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/server.py +0 -0
  91. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/sessions.py +0 -0
  92. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/browser/video.py +0 -0
  93. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/__init__.py +0 -0
  94. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/a2a.py +0 -0
  95. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/assistants.py +0 -0
  96. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/audio.py +0 -0
  97. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/batches.py +0 -0
  98. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/completions.py +0 -0
  99. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/container_files.py +0 -0
  100. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/containers.py +0 -0
  101. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/embeddings.py +0 -0
  102. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/files.py +0 -0
  103. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/fine_tuning.py +0 -0
  104. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/guardrails.py +0 -0
  105. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/images.py +0 -0
  106. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/mcp.py +0 -0
  107. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/messages.py +0 -0
  108. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/moderations.py +0 -0
  109. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/ocr.py +0 -0
  110. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/passthrough.py +0 -0
  111. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/rag.py +0 -0
  112. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/realtime.py +0 -0
  113. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/rerank.py +0 -0
  114. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/responses.py +0 -0
  115. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/search.py +0 -0
  116. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/skills.py +0 -0
  117. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/vector_store_files.py +0 -0
  118. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/vector_stores.py +0 -0
  119. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/capabilities/videos.py +0 -0
  120. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/chainlit_ui.py +0 -0
  121. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/chat/__init__.py +0 -0
  122. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/chat/app.py +0 -0
  123. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/__init__.py +0 -0
  124. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/app.py +0 -0
  125. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/branding.py +0 -0
  126. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/__init__.py +0 -0
  127. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/acp.py +0 -0
  128. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/agents.py +0 -0
  129. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/app.py +0 -0
  130. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/audit.py +0 -0
  131. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/batch.py +0 -0
  132. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/benchmark.py +0 -0
  133. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/bot.py +0 -0
  134. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/browser.py +0 -0
  135. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/call.py +0 -0
  136. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/chat.py +0 -0
  137. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/code.py +0 -0
  138. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/commit.py +0 -0
  139. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/completion.py +0 -0
  140. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/config.py +0 -0
  141. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/context.py +0 -0
  142. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/debug.py +0 -0
  143. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/deploy.py +0 -0
  144. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/diag.py +0 -0
  145. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/docs.py +0 -0
  146. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/doctor.py +0 -0
  147. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/endpoints.py +0 -0
  148. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/environment.py +0 -0
  149. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/eval.py +0 -0
  150. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/examples.py +0 -0
  151. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/gateway.py +0 -0
  152. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/hooks.py +0 -0
  153. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/knowledge.py +0 -0
  154. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/loop.py +0 -0
  155. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/lsp.py +0 -0
  156. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/mcp.py +0 -0
  157. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/memory.py +0 -0
  158. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/obs.py +0 -0
  159. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/package.py +0 -0
  160. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/plugins.py +0 -0
  161. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/profile.py +0 -0
  162. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/rag.py +0 -0
  163. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/realtime.py +0 -0
  164. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/recipe.py +0 -0
  165. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/registry.py +0 -0
  166. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/replay.py +0 -0
  167. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/research.py +0 -0
  168. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/retrieval.py +0 -0
  169. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/rules.py +0 -0
  170. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/run.py +0 -0
  171. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/sandbox.py +0 -0
  172. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/schedule.py +0 -0
  173. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/serve.py +0 -0
  174. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/session.py +0 -0
  175. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/skills.py +0 -0
  176. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/standardise.py +0 -0
  177. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/templates.py +0 -0
  178. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/test.py +0 -0
  179. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/todo.py +0 -0
  180. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/tools.py +0 -0
  181. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/traces.py +0 -0
  182. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/train.py +0 -0
  183. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/ui.py +0 -0
  184. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/version.py +0 -0
  185. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/commands/workflow.py +0 -0
  186. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/config_loader.py +0 -0
  187. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/configuration/__init__.py +0 -0
  188. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/configuration/loader.py +0 -0
  189. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/configuration/paths.py +0 -0
  190. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/configuration/schema.py +0 -0
  191. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/execution/__init__.py +0 -0
  192. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/execution/core.py +0 -0
  193. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/execution/profiler.py +0 -0
  194. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/execution/request.py +0 -0
  195. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/execution/result.py +0 -0
  196. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/__init__.py +0 -0
  197. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/acp.py +0 -0
  198. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/action_orchestrator.py +0 -0
  199. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/agent_scheduler.py +0 -0
  200. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/agent_tools.py +0 -0
  201. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/agents.py +0 -0
  202. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/at_mentions.py +0 -0
  203. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/audit_cli.py +0 -0
  204. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/auto_memory.py +0 -0
  205. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/auto_mode.py +0 -0
  206. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/autonomy_mode.py +0 -0
  207. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/background.py +0 -0
  208. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/base.py +0 -0
  209. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/benchmark.py +0 -0
  210. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/bots_cli.py +0 -0
  211. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/capabilities.py +0 -0
  212. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/checkpoints.py +0 -0
  213. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/cli_profiler.py +0 -0
  214. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/code_intelligence.py +0 -0
  215. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/compaction.py +0 -0
  216. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/compare.py +0 -0
  217. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/config_hierarchy.py +0 -0
  218. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/context_manager.py +0 -0
  219. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/cost_tracker.py +0 -0
  220. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/csv_test_runner.py +0 -0
  221. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/debug.py +0 -0
  222. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/deploy.py +0 -0
  223. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/diag.py +0 -0
  224. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/__init__.py +0 -0
  225. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/__init__.py +0 -0
  226. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/acp_checks.py +0 -0
  227. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/config_checks.py +0 -0
  228. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/db_checks.py +0 -0
  229. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/env_checks.py +0 -0
  230. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/lsp_checks.py +0 -0
  231. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/mcp_checks.py +0 -0
  232. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/memory_checks.py +0 -0
  233. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/network_checks.py +0 -0
  234. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/obs_checks.py +0 -0
  235. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/performance_checks.py +0 -0
  236. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/permissions_checks.py +0 -0
  237. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/selftest_checks.py +0 -0
  238. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/serve_checks.py +0 -0
  239. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/skills_checks.py +0 -0
  240. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/checks/tools_checks.py +0 -0
  241. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/engine.py +0 -0
  242. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/formatters.py +0 -0
  243. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/handler.py +0 -0
  244. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/doctor/registry.py +0 -0
  245. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/endpoints.py +0 -0
  246. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/eval.py +0 -0
  247. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/examples.py +0 -0
  248. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/external_agents.py +0 -0
  249. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/fast_context.py +0 -0
  250. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/file_history.py +0 -0
  251. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/flow_display.py +0 -0
  252. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/gateway.py +0 -0
  253. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/git_attribution.py +0 -0
  254. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/git_integration.py +0 -0
  255. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/guardrail.py +0 -0
  256. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/handoff.py +0 -0
  257. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/hooks.py +0 -0
  258. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/image.py +0 -0
  259. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/interactive_core_headless.py +0 -0
  260. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/interactive_runtime.py +0 -0
  261. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/interactive_test_harness.py +0 -0
  262. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/interactive_tools.py +0 -0
  263. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/interactive_tui.py +0 -0
  264. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/jobs.py +0 -0
  265. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/knowledge.py +0 -0
  266. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/knowledge_cli.py +0 -0
  267. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/lite.py +0 -0
  268. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/logs.py +0 -0
  269. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/lsp_cli.py +0 -0
  270. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/lsp_diagnostics.py +0 -0
  271. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/mcp.py +0 -0
  272. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/message_queue.py +0 -0
  273. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/metrics.py +0 -0
  274. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/migrate.py +0 -0
  275. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/migration_flow.py +0 -0
  276. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/migration_spec.py +0 -0
  277. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/n8n.py +0 -0
  278. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/observability.py +0 -0
  279. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/ollama.py +0 -0
  280. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/output_modes.py +0 -0
  281. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/output_style.py +0 -0
  282. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/package.py +0 -0
  283. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/performance.py +0 -0
  284. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/persistence.py +0 -0
  285. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/plugin_cli.py +0 -0
  286. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/profile.py +0 -0
  287. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/profiler/__init__.py +0 -0
  288. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/profiler/core.py +0 -0
  289. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/profiler/optimizations.py +0 -0
  290. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/profiler/suite.py +0 -0
  291. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/profiling.py +0 -0
  292. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/queue/__init__.py +0 -0
  293. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/queue/manager.py +0 -0
  294. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/queue/models.py +0 -0
  295. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/queue/persistence.py +0 -0
  296. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/queue/scheduler.py +0 -0
  297. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/queue/worker.py +0 -0
  298. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/recipe.py +0 -0
  299. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/recipe_creator.py +0 -0
  300. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/recipe_optimizer.py +0 -0
  301. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/recipe_prompts.py +0 -0
  302. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/recipes.py +0 -0
  303. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/registry.py +0 -0
  304. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/repo_map.py +0 -0
  305. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/router.py +0 -0
  306. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/safe_shell.py +0 -0
  307. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/sandbox_cli.py +0 -0
  308. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/sandbox_executor.py +0 -0
  309. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/sdk_knowledge.py +0 -0
  310. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/serve.py +0 -0
  311. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/session.py +0 -0
  312. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/skills.py +0 -0
  313. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/slash_commands.py +0 -0
  314. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/telemetry.py +0 -0
  315. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/templates.py +0 -0
  316. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/thinking.py +0 -0
  317. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/todo.py +0 -0
  318. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tools.py +0 -0
  319. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/__init__.py +0 -0
  320. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/app.py +0 -0
  321. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/cli.py +0 -0
  322. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/config.py +0 -0
  323. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/debug.py +0 -0
  324. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/events.py +0 -0
  325. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/mock_provider.py +0 -0
  326. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/orchestrator.py +0 -0
  327. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/screens/__init__.py +0 -0
  328. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/screens/help.py +0 -0
  329. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/screens/main.py +0 -0
  330. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/screens/queue.py +0 -0
  331. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/screens/session.py +0 -0
  332. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/screens/settings.py +0 -0
  333. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/session_store.py +0 -0
  334. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/widgets/__init__.py +0 -0
  335. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/widgets/chat.py +0 -0
  336. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/widgets/command_popup.py +0 -0
  337. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/widgets/composer.py +0 -0
  338. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/widgets/file_popup.py +0 -0
  339. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/widgets/queue_panel.py +0 -0
  340. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/widgets/status.py +0 -0
  341. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/tui/widgets/tool_panel.py +0 -0
  342. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/wizard.py +0 -0
  343. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/workflow.py +0 -0
  344. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/features/yaml_utils.py +0 -0
  345. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/interactive/__init__.py +0 -0
  346. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/interactive/async_tui.py +0 -0
  347. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/interactive/config.py +0 -0
  348. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/interactive/core.py +0 -0
  349. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/interactive/events.py +0 -0
  350. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/interactive/frontends/__init__.py +0 -0
  351. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/interactive/frontends/rich_frontend.py +0 -0
  352. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/interactive/frontends/textual_frontend.py +0 -0
  353. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/interactive/praison_io.py +0 -0
  354. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/interactive/repl.py +0 -0
  355. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/interactive/split_tui.py +0 -0
  356. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/interactive/tui_app.py +0 -0
  357. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/legacy.py +0 -0
  358. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/main.py +0 -0
  359. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/output/__init__.py +0 -0
  360. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/output/console.py +0 -0
  361. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/schedule_cli.py +0 -0
  362. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/session/__init__.py +0 -0
  363. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/session/unified.py +0 -0
  364. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/state/__init__.py +0 -0
  365. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/state/identifiers.py +0 -0
  366. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/state/sessions.py +0 -0
  367. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/ui/__init__.py +0 -0
  368. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/ui/config.py +0 -0
  369. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/ui/events.py +0 -0
  370. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/ui/mg_backend.py +0 -0
  371. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/ui/plain.py +0 -0
  372. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/cli/ui/rich_backend.py +0 -0
  373. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/__init__.py +0 -0
  374. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/agent_tools.py +0 -0
  375. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/diff/__init__.py +0 -0
  376. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/diff/diff_strategy.py +0 -0
  377. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/tools/__init__.py +0 -0
  378. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/tools/apply_diff.py +0 -0
  379. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/tools/execute_command.py +0 -0
  380. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/tools/list_files.py +0 -0
  381. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/tools/read_file.py +0 -0
  382. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/tools/search_replace.py +0 -0
  383. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/tools/write_file.py +0 -0
  384. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/utils/__init__.py +0 -0
  385. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/utils/file_utils.py +0 -0
  386. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/utils/ignore_utils.py +0 -0
  387. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/code/utils/text_utils.py +0 -0
  388. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/context/__init__.py +0 -0
  389. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/context/artifact_store.py +0 -0
  390. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/context/config.py +0 -0
  391. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/context/history_store.py +0 -0
  392. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/context/queue.py +0 -0
  393. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/context/setup.py +0 -0
  394. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/context/terminal_logger.py +0 -0
  395. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/db/__init__.py +0 -0
  396. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/db/adapter.py +0 -0
  397. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/deploy/__init__.py +0 -0
  398. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/deploy/api.py +0 -0
  399. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/deploy/docker.py +0 -0
  400. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/deploy/doctor.py +0 -0
  401. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/deploy/main.py +0 -0
  402. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/deploy/models.py +0 -0
  403. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/deploy/providers/__init__.py +0 -0
  404. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/deploy/providers/aws.py +0 -0
  405. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/deploy/providers/azure.py +0 -0
  406. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/deploy/providers/base.py +0 -0
  407. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/deploy/providers/gcp.py +0 -0
  408. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/deploy/schema.py +0 -0
  409. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/docs_runner/__init__.py +0 -0
  410. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/docs_runner/classifier.py +0 -0
  411. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/docs_runner/executor.py +0 -0
  412. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/docs_runner/extractor.py +0 -0
  413. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/docs_runner/reporter.py +0 -0
  414. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/docs_runner/runner.py +0 -0
  415. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/docs_runner/workspace.py +0 -0
  416. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/endpoints/__init__.py +0 -0
  417. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/endpoints/a2u_server.py +0 -0
  418. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/endpoints/discovery.py +0 -0
  419. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/endpoints/providers/__init__.py +0 -0
  420. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/endpoints/providers/a2a.py +0 -0
  421. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/endpoints/providers/a2u.py +0 -0
  422. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/endpoints/providers/agents_api.py +0 -0
  423. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/endpoints/providers/base.py +0 -0
  424. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/endpoints/providers/mcp.py +0 -0
  425. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/endpoints/providers/recipe.py +0 -0
  426. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/endpoints/providers/tools_mcp.py +0 -0
  427. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/endpoints/registry.py +0 -0
  428. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/endpoints/server.py +0 -0
  429. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/gateway/__init__.py +0 -0
  430. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/gateway/server.py +0 -0
  431. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/inbuilt_tools/__init__.py +0 -0
  432. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  433. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/inc/__init__.py +0 -0
  434. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/inc/config.py +0 -0
  435. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/inc/models.py +0 -0
  436. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/integrations/__init__.py +0 -0
  437. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/integrations/base.py +0 -0
  438. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/integrations/claude_code.py +0 -0
  439. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/integrations/codex_cli.py +0 -0
  440. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/integrations/cursor_cli.py +0 -0
  441. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/integrations/gemini_cli.py +0 -0
  442. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/jobs/__init__.py +0 -0
  443. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/jobs/executor.py +0 -0
  444. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/jobs/models.py +0 -0
  445. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/jobs/router.py +0 -0
  446. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/jobs/server.py +0 -0
  447. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/jobs/store.py +0 -0
  448. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/llm/__init__.py +0 -0
  449. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/llm/registry.py +0 -0
  450. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/__init__.py +0 -0
  451. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/adapters/__init__.py +0 -0
  452. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/adapters/agents.py +0 -0
  453. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/adapters/capabilities.py +0 -0
  454. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/adapters/cli_tools.py +0 -0
  455. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/adapters/extended_capabilities.py +0 -0
  456. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/adapters/knowledge.py +0 -0
  457. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/adapters/memory.py +0 -0
  458. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/adapters/prompts.py +0 -0
  459. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/adapters/resources.py +0 -0
  460. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/adapters/tools_bridge.py +0 -0
  461. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/auth/__init__.py +0 -0
  462. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/auth/api_key.py +0 -0
  463. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/auth/oauth.py +0 -0
  464. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/auth/oidc.py +0 -0
  465. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/auth/scopes.py +0 -0
  466. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/cli.py +0 -0
  467. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/elicitation.py +0 -0
  468. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/icons.py +0 -0
  469. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/recipe_adapter.py +0 -0
  470. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/recipe_cli.py +0 -0
  471. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/registry.py +0 -0
  472. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/sampling.py +0 -0
  473. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/server.py +0 -0
  474. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/tasks.py +0 -0
  475. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/tool_index.py +0 -0
  476. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/transports/__init__.py +0 -0
  477. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/transports/http_stream.py +0 -0
  478. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/mcp_server/transports/stdio.py +0 -0
  479. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/__init__.py +0 -0
  480. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/config.py +0 -0
  481. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/conversation/__init__.py +0 -0
  482. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/conversation/async_mysql.py +0 -0
  483. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/conversation/async_postgres.py +0 -0
  484. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/conversation/async_sqlite.py +0 -0
  485. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/conversation/base.py +0 -0
  486. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/conversation/json_store.py +0 -0
  487. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/conversation/mysql.py +0 -0
  488. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/conversation/postgres.py +0 -0
  489. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/conversation/singlestore.py +0 -0
  490. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/conversation/sqlite.py +0 -0
  491. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/conversation/supabase.py +0 -0
  492. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/conversation/surrealdb.py +0 -0
  493. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/factory.py +0 -0
  494. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/hooks/__init__.py +0 -0
  495. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/hooks/agent_hooks.py +0 -0
  496. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/__init__.py +0 -0
  497. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/base.py +0 -0
  498. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/cassandra.py +0 -0
  499. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/chroma.py +0 -0
  500. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/clickhouse.py +0 -0
  501. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
  502. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/couchbase.py +0 -0
  503. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/lancedb.py +0 -0
  504. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
  505. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
  506. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
  507. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/milvus.py +0 -0
  508. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
  509. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/pgvector.py +0 -0
  510. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/pinecone.py +0 -0
  511. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/qdrant.py +0 -0
  512. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/redis_vector.py +0 -0
  513. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
  514. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
  515. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
  516. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/knowledge/weaviate.py +0 -0
  517. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/migrations/__init__.py +0 -0
  518. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/migrations/manager.py +0 -0
  519. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/orchestrator.py +0 -0
  520. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/state/__init__.py +0 -0
  521. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/state/async_mongodb.py +0 -0
  522. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/state/base.py +0 -0
  523. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/state/dynamodb.py +0 -0
  524. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/state/firestore.py +0 -0
  525. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/state/gcs.py +0 -0
  526. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/state/memory.py +0 -0
  527. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/state/mongodb.py +0 -0
  528. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/state/redis.py +0 -0
  529. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/state/upstash.py +0 -0
  530. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/tests/__init__.py +0 -0
  531. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/persistence/tests/test_all_backends.py +0 -0
  532. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/profiler.py +0 -0
  533. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/recipe/__init__.py +0 -0
  534. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/recipe/bridge.py +0 -0
  535. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/recipe/core.py +0 -0
  536. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/recipe/exceptions.py +0 -0
  537. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/recipe/history.py +0 -0
  538. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/recipe/models.py +0 -0
  539. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/recipe/operations.py +0 -0
  540. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/recipe/policy.py +0 -0
  541. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/recipe/registry.py +0 -0
  542. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/recipe/runtime.py +0 -0
  543. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/recipe/security.py +0 -0
  544. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/recipe/serve.py +0 -0
  545. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/recipe/server.py +0 -0
  546. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/replay/__init__.py +0 -0
  547. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/replay/analyzer.py +0 -0
  548. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/replay/applier.py +0 -0
  549. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/replay/judge.py +0 -0
  550. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/replay/plan.py +0 -0
  551. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/replay/player.py +0 -0
  552. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/replay/reader.py +0 -0
  553. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/replay/storage.py +0 -0
  554. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/replay/writer.py +0 -0
  555. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/sandbox/__init__.py +0 -0
  556. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/sandbox/docker.py +0 -0
  557. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/sandbox/subprocess.py +0 -0
  558. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/scheduler/__init__.py +0 -0
  559. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/scheduler/agent_scheduler.py +0 -0
  560. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/scheduler/base.py +0 -0
  561. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/scheduler/daemon_manager.py +0 -0
  562. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/scheduler/state_manager.py +0 -0
  563. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/scheduler/yaml_loader.py +0 -0
  564. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/scheduler.py +0 -0
  565. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/setup/__init__.py +0 -0
  566. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/setup/build.py +0 -0
  567. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/setup/post_install.py +0 -0
  568. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/setup/setup_conda_env.py +0 -0
  569. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/setup.py +0 -0
  570. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/__init__.py +0 -0
  571. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/ai_generator.py +0 -0
  572. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/config.py +0 -0
  573. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/dedupe.py +0 -0
  574. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/discovery.py +0 -0
  575. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/drift.py +0 -0
  576. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/engine.py +0 -0
  577. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/enhanced_templates.py +0 -0
  578. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/example_verifier.py +0 -0
  579. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/manifest.py +0 -0
  580. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/models.py +0 -0
  581. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/reports.py +0 -0
  582. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/templates.py +0 -0
  583. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/undo_redo.py +0 -0
  584. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/standardise/validator.py +0 -0
  585. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/suite_runner/__init__.py +0 -0
  586. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/suite_runner/batch_source.py +0 -0
  587. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/suite_runner/cli_docs_source.py +0 -0
  588. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/suite_runner/discovery.py +0 -0
  589. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/suite_runner/docs_source.py +0 -0
  590. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/suite_runner/examples_source.py +0 -0
  591. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/suite_runner/executor.py +0 -0
  592. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/suite_runner/models.py +0 -0
  593. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/suite_runner/report_viewer.py +0 -0
  594. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/suite_runner/reporter.py +0 -0
  595. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/suite_runner/runner.py +0 -0
  596. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/templates/__init__.py +0 -0
  597. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/templates/cache.py +0 -0
  598. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/templates/dependency_checker.py +0 -0
  599. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/templates/discovery.py +0 -0
  600. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/templates/loader.py +0 -0
  601. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/templates/registry.py +0 -0
  602. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/templates/resolver.py +0 -0
  603. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/templates/security.py +0 -0
  604. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/templates/tool_override.py +0 -0
  605. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/templates/tools_doctor.py +0 -0
  606. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/test.py +0 -0
  607. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/tool_resolver.py +0 -0
  608. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/tools/__init__.py +0 -0
  609. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/tools/audio.py +0 -0
  610. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/tools/glob_tool.py +0 -0
  611. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/tools/grep_tool.py +0 -0
  612. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/tools/multiedit.py +0 -0
  613. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/train/__init__.py +0 -0
  614. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/train/agents/__init__.py +0 -0
  615. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/train/agents/grader.py +0 -0
  616. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/train/agents/hook.py +0 -0
  617. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/train/agents/models.py +0 -0
  618. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/train/agents/orchestrator.py +0 -0
  619. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/train/agents/storage.py +0 -0
  620. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/train/llm/__init__.py +0 -0
  621. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/train/llm/trainer.py +0 -0
  622. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/train.py +0 -0
  623. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/train_vision.py +0 -0
  624. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/agents.py +0 -0
  625. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/bot.py +0 -0
  626. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/callbacks.py +0 -0
  627. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/chainlit_compat.py +0 -0
  628. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/chat.py +0 -0
  629. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/code.py +0 -0
  630. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/colab.py +0 -0
  631. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/colab_chainlit.py +0 -0
  632. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/components/aicoder.py +0 -0
  633. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/context.py +0 -0
  634. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/database_config.py +0 -0
  635. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/db.py +0 -0
  636. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/realtime.py +0 -0
  637. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/realtimeclient/__init__.py +0 -0
  638. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/realtimeclient/tools.py +0 -0
  639. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/ui/sql_alchemy.py +0 -0
  640. {praisonai-4.5.0 → praisonai-4.5.2}/praisonai/upload_vision.py +0 -0
  641. {praisonai-4.5.0 → praisonai-4.5.2}/setup.cfg +0 -0
  642. {praisonai-4.5.0 → praisonai-4.5.2}/tests/test.py +0 -0
  643. {praisonai-4.5.0 → praisonai-4.5.2}/tests/test_agents_playbook.py +0 -0
  644. {praisonai-4.5.0 → praisonai-4.5.2}/tests/test_approval_system.py +0 -0
  645. {praisonai-4.5.0 → praisonai-4.5.2}/tests/test_basic.py +0 -0
  646. {praisonai-4.5.0 → praisonai-4.5.2}/tests/test_cli_features.py +0 -0
  647. {praisonai-4.5.0 → praisonai-4.5.2}/tests/test_custom_tools_fix.py +0 -0
  648. {praisonai-4.5.0 → praisonai-4.5.2}/tests/test_double_api_fix.py +0 -0
  649. {praisonai-4.5.0 → praisonai-4.5.2}/tests/test_n8n_integration.py +0 -0
  650. {praisonai-4.5.0 → praisonai-4.5.2}/tests/test_phase2_refactor.py +0 -0
  651. {praisonai-4.5.0 → praisonai-4.5.2}/tests/test_recipe.py +0 -0
  652. {praisonai-4.5.0 → praisonai-4.5.2}/tests/test_registry.py +0 -0
  653. {praisonai-4.5.0 → praisonai-4.5.2}/tests/test_runner.py +0 -0
  654. {praisonai-4.5.0 → praisonai-4.5.2}/tests/test_serve_features.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 4.5.0
3
+ Version: 4.5.2
4
4
  Summary: PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration.
5
5
  Author: Mervin Praison
6
6
  License: MIT
@@ -11,7 +11,7 @@ Description-Content-Type: text/markdown
11
11
  Requires-Dist: rich>=13.7
12
12
  Requires-Dist: markdown>=3.5
13
13
  Requires-Dist: pyparsing>=3.0.0
14
- Requires-Dist: praisonaiagents>=1.5.0
14
+ Requires-Dist: praisonaiagents>=1.5.2
15
15
  Requires-Dist: python-dotenv>=0.19.0
16
16
  Requires-Dist: litellm>=1.81.0
17
17
  Requires-Dist: PyYAML>=6.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 4.5.0
3
+ Version: 4.5.2
4
4
  Summary: PraisonAI is an AI Agents Framework with Self Reflection. PraisonAI application combines PraisonAI Agents, AutoGen, and CrewAI into a low-code solution for building and managing multi-agent LLM systems, focusing on simplicity, customisation, and efficient human-agent collaboration.
5
5
  Author: Mervin Praison
6
6
  License: MIT
@@ -11,7 +11,7 @@ Description-Content-Type: text/markdown
11
11
  Requires-Dist: rich>=13.7
12
12
  Requires-Dist: markdown>=3.5
13
13
  Requires-Dist: pyparsing>=3.0.0
14
- Requires-Dist: praisonaiagents>=1.5.0
14
+ Requires-Dist: praisonaiagents>=1.5.2
15
15
  Requires-Dist: python-dotenv>=0.19.0
16
16
  Requires-Dist: litellm>=1.81.0
17
17
  Requires-Dist: PyYAML>=6.0
@@ -51,10 +51,22 @@ praisonai/app/agentos.py
51
51
  praisonai/audit/__init__.py
52
52
  praisonai/audit/agent_centric.py
53
53
  praisonai/bots/__init__.py
54
+ praisonai/bots/_ack.py
55
+ praisonai/bots/_approval.py
56
+ praisonai/bots/_approval_base.py
57
+ praisonai/bots/_chunk.py
54
58
  praisonai/bots/_commands.py
59
+ praisonai/bots/_config_schema.py
60
+ praisonai/bots/_debounce.py
61
+ praisonai/bots/_discord_approval.py
62
+ praisonai/bots/_http_approval.py
55
63
  praisonai/bots/_protocol_mixin.py
56
64
  praisonai/bots/_registry.py
65
+ praisonai/bots/_resilience.py
57
66
  praisonai/bots/_session.py
67
+ praisonai/bots/_slack_approval.py
68
+ praisonai/bots/_telegram_approval.py
69
+ praisonai/bots/_webhook_approval.py
58
70
  praisonai/bots/_whatsapp_web_adapter.py
59
71
  praisonai/bots/bot.py
60
72
  praisonai/bots/botos.py
@@ -246,6 +258,7 @@ praisonai/cli/features/migration_spec.py
246
258
  praisonai/cli/features/n8n.py
247
259
  praisonai/cli/features/observability.py
248
260
  praisonai/cli/features/ollama.py
261
+ praisonai/cli/features/onboard.py
249
262
  praisonai/cli/features/output_modes.py
250
263
  praisonai/cli/features/output_style.py
251
264
  praisonai/cli/features/package.py
@@ -286,6 +299,7 @@ praisonai/cli/features/doctor/models.py
286
299
  praisonai/cli/features/doctor/registry.py
287
300
  praisonai/cli/features/doctor/checks/__init__.py
288
301
  praisonai/cli/features/doctor/checks/acp_checks.py
302
+ praisonai/cli/features/doctor/checks/bot_checks.py
289
303
  praisonai/cli/features/doctor/checks/config_checks.py
290
304
  praisonai/cli/features/doctor/checks/db_checks.py
291
305
  praisonai/cli/features/doctor/checks/env_checks.py
@@ -380,6 +394,9 @@ praisonai/context/history_store.py
380
394
  praisonai/context/queue.py
381
395
  praisonai/context/setup.py
382
396
  praisonai/context/terminal_logger.py
397
+ praisonai/daemon/__init__.py
398
+ praisonai/daemon/launchd.py
399
+ praisonai/daemon/systemd.py
383
400
  praisonai/db/__init__.py
384
401
  praisonai/db/adapter.py
385
402
  praisonai/deploy/__init__.py
@@ -1,7 +1,7 @@
1
1
  rich>=13.7
2
2
  markdown>=3.5
3
3
  pyparsing>=3.0.0
4
- praisonaiagents>=1.5.0
4
+ praisonaiagents>=1.5.2
5
5
  python-dotenv>=0.19.0
6
6
  litellm>=1.81.0
7
7
  PyYAML>=6.0
@@ -14,6 +14,11 @@ if TYPE_CHECKING:
14
14
  from .whatsapp import WhatsAppBot
15
15
  from .bot import Bot
16
16
  from .botos import BotOS
17
+ from ._slack_approval import SlackApproval
18
+ from ._telegram_approval import TelegramApproval
19
+ from ._discord_approval import DiscordApproval
20
+ from ._webhook_approval import WebhookApproval
21
+ from ._http_approval import HTTPApproval
17
22
 
18
23
  def __getattr__(name: str):
19
24
  """Lazy loading of bot components."""
@@ -35,9 +40,26 @@ def __getattr__(name: str):
35
40
  if name == "BotOS":
36
41
  from .botos import BotOS
37
42
  return BotOS
43
+ if name == "SlackApproval":
44
+ from ._slack_approval import SlackApproval
45
+ return SlackApproval
46
+ if name == "TelegramApproval":
47
+ from ._telegram_approval import TelegramApproval
48
+ return TelegramApproval
49
+ if name == "DiscordApproval":
50
+ from ._discord_approval import DiscordApproval
51
+ return DiscordApproval
52
+ if name == "WebhookApproval":
53
+ from ._webhook_approval import WebhookApproval
54
+ return WebhookApproval
55
+ if name == "HTTPApproval":
56
+ from ._http_approval import HTTPApproval
57
+ return HTTPApproval
38
58
  raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
39
59
 
40
60
  __all__ = [
41
61
  "TelegramBot", "DiscordBot", "SlackBot", "WhatsAppBot",
42
62
  "Bot", "BotOS",
63
+ "SlackApproval", "TelegramApproval", "DiscordApproval",
64
+ "WebhookApproval", "HTTPApproval",
43
65
  ]
@@ -0,0 +1,99 @@
1
+ """
2
+ Ack reaction helpers for PraisonAI bots.
3
+
4
+ Reacts to inbound messages with a configurable emoji (e.g. ⏳) to
5
+ acknowledge receipt, then swaps to a "done" emoji (e.g. ✅) when
6
+ the agent response is sent. Inspired by OpenClaw's ack-reactions.ts.
7
+
8
+ Usage::
9
+
10
+ ack = AckReactor(ack_emoji="⏳", done_emoji="✅")
11
+ ctx = await ack.ack(channel_id, message_id, react_fn)
12
+ # ... process message ...
13
+ await ack.done(ctx, channel_id, message_id, react_fn, unreact_fn)
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import logging
19
+ from dataclasses import dataclass
20
+ from typing import Any, Callable, Coroutine, Optional
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ @dataclass
26
+ class AckContext:
27
+ """Tracks state for a single ack-reaction lifecycle."""
28
+ acked: bool = False
29
+ emoji: str = ""
30
+
31
+
32
+ class AckReactor:
33
+ """Lightweight ack-reaction manager.
34
+
35
+ Args:
36
+ ack_emoji: Emoji to react with on message receipt (empty = disabled).
37
+ done_emoji: Emoji to react with on completion (default "✅").
38
+ """
39
+
40
+ def __init__(self, ack_emoji: str = "", done_emoji: str = "✅") -> None:
41
+ self._ack_emoji = ack_emoji
42
+ self._done_emoji = done_emoji
43
+
44
+ @property
45
+ def enabled(self) -> bool:
46
+ return bool(self._ack_emoji)
47
+
48
+ async def ack(
49
+ self,
50
+ react_fn: Callable[..., Coroutine],
51
+ **kwargs: Any,
52
+ ) -> AckContext:
53
+ """React with ack emoji. Returns context for later ``done()``.
54
+
55
+ Args:
56
+ react_fn: Platform-specific async function to add a reaction.
57
+ Called as ``await react_fn(emoji=self._ack_emoji, **kwargs)``.
58
+ **kwargs: Extra args forwarded to react_fn (chat_id, message_id, etc).
59
+ """
60
+ ctx = AckContext()
61
+ if not self.enabled:
62
+ return ctx
63
+ try:
64
+ await react_fn(emoji=self._ack_emoji, **kwargs)
65
+ ctx.acked = True
66
+ ctx.emoji = self._ack_emoji
67
+ except Exception as e:
68
+ logger.debug(f"AckReactor: failed to ack: {e}")
69
+ return ctx
70
+
71
+ async def done(
72
+ self,
73
+ ctx: AckContext,
74
+ react_fn: Callable[..., Coroutine],
75
+ unreact_fn: Optional[Callable[..., Coroutine]] = None,
76
+ **kwargs: Any,
77
+ ) -> None:
78
+ """Swap ack emoji for done emoji.
79
+
80
+ Args:
81
+ ctx: AckContext returned from ``ack()``.
82
+ react_fn: Async function to add a reaction.
83
+ unreact_fn: Async function to remove a reaction (optional).
84
+ **kwargs: Extra args forwarded to react/unreact fns.
85
+ """
86
+ if not ctx.acked:
87
+ return
88
+ # Remove ack emoji
89
+ if unreact_fn:
90
+ try:
91
+ await unreact_fn(emoji=ctx.emoji, **kwargs)
92
+ except Exception as e:
93
+ logger.debug(f"AckReactor: failed to remove ack: {e}")
94
+ # Add done emoji
95
+ if self._done_emoji:
96
+ try:
97
+ await react_fn(emoji=self._done_emoji, **kwargs)
98
+ except Exception as e:
99
+ logger.debug(f"AckReactor: failed to add done: {e}")
@@ -0,0 +1,149 @@
1
+ """
2
+ Bot Approval Backend for PraisonAI.
3
+
4
+ Sends tool execution approval requests as in-platform messages
5
+ (e.g., inline keyboard on Telegram) and waits for user reply.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import asyncio
11
+ import logging
12
+ import time
13
+ from typing import Any, Dict
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+ # Default timeout for approval requests (seconds)
18
+ DEFAULT_APPROVAL_TIMEOUT = 120
19
+
20
+
21
+ class BotApprovalBackend:
22
+ """In-chat approval backend for bot tool execution.
23
+
24
+ Sends an approval request message to the user in-chat and waits
25
+ for their reply (yes/no) with a configurable timeout.
26
+
27
+ Default behavior: deny on timeout (safe by default).
28
+
29
+ Usage:
30
+ approval = BotApprovalBackend(bot_adapter, timeout=60)
31
+ approved = await approval.request_approval(
32
+ user_id="123",
33
+ channel_id="456",
34
+ tool_name="execute_command",
35
+ tool_args={"command": "ls -la"},
36
+ )
37
+ """
38
+
39
+ def __init__(
40
+ self,
41
+ adapter: Any = None,
42
+ timeout: float = DEFAULT_APPROVAL_TIMEOUT,
43
+ default_on_timeout: bool = False,
44
+ ):
45
+ self._adapter = adapter
46
+ self._timeout = timeout
47
+ self._default_on_timeout = default_on_timeout
48
+ self._pending: Dict[str, asyncio.Future] = {}
49
+
50
+ async def request_approval(
51
+ self,
52
+ user_id: str,
53
+ channel_id: str,
54
+ tool_name: str,
55
+ tool_args: Dict[str, Any],
56
+ description: str = "",
57
+ ) -> bool:
58
+ """Send an approval request and wait for user response.
59
+
60
+ Args:
61
+ user_id: User to ask for approval
62
+ channel_id: Channel to send the request in
63
+ tool_name: Name of the tool requesting approval
64
+ tool_args: Arguments the tool wants to execute with
65
+ description: Human-readable description of the action
66
+
67
+ Returns:
68
+ True if approved, False if denied or timed out
69
+ """
70
+ request_id = f"approval_{user_id}_{int(time.time() * 1000)}"
71
+
72
+ # Format the approval message
73
+ args_preview = str(tool_args)[:200]
74
+ if description:
75
+ msg = f"🔐 Approval required:\n\n{description}\n\nTool: {tool_name}\nArgs: {args_preview}\n\nReply 'yes' to approve or 'no' to deny."
76
+ else:
77
+ msg = f"🔐 Approval required:\n\nTool: {tool_name}\nArgs: {args_preview}\n\nReply 'yes' to approve or 'no' to deny."
78
+
79
+ # Create a future to wait for the response
80
+ loop = asyncio.get_event_loop()
81
+ future: asyncio.Future = loop.create_future()
82
+ self._pending[request_id] = future
83
+
84
+ # Send the message
85
+ if self._adapter and hasattr(self._adapter, 'send_message'):
86
+ try:
87
+ await self._adapter.send_message(channel_id, msg)
88
+ except Exception as e:
89
+ logger.error(f"Failed to send approval request: {e}")
90
+ self._pending.pop(request_id, None)
91
+ return self._default_on_timeout
92
+
93
+ # Wait for response with timeout
94
+ try:
95
+ result = await asyncio.wait_for(future, timeout=self._timeout)
96
+ return result
97
+ except asyncio.TimeoutError:
98
+ logger.info(
99
+ f"Approval request timed out for {tool_name} "
100
+ f"(user={user_id}, default={'approve' if self._default_on_timeout else 'deny'})"
101
+ )
102
+ return self._default_on_timeout
103
+ finally:
104
+ self._pending.pop(request_id, None)
105
+
106
+ def resolve(self, request_id: str, approved: bool) -> bool:
107
+ """Resolve a pending approval request.
108
+
109
+ Args:
110
+ request_id: The approval request ID
111
+ approved: Whether the request is approved
112
+
113
+ Returns:
114
+ True if the request was found and resolved
115
+ """
116
+ future = self._pending.get(request_id)
117
+ if future and not future.done():
118
+ future.set_result(approved)
119
+ return True
120
+ return False
121
+
122
+ def resolve_by_user_reply(self, user_id: str, reply_text: str) -> bool:
123
+ """Resolve the most recent pending approval for a user based on reply text.
124
+
125
+ Args:
126
+ user_id: The user who replied
127
+ reply_text: The reply text (checked for yes/no)
128
+
129
+ Returns:
130
+ True if a pending request was resolved
131
+ """
132
+ reply_lower = reply_text.strip().lower()
133
+ approved = reply_lower in ("yes", "y", "approve", "ok", "confirm", "1", "true")
134
+ denied = reply_lower in ("no", "n", "deny", "reject", "cancel", "0", "false")
135
+
136
+ if not approved and not denied:
137
+ return False # Not an approval response
138
+
139
+ # Find most recent pending request for this user
140
+ for request_id in reversed(list(self._pending.keys())):
141
+ if f"_{user_id}_" in request_id:
142
+ return self.resolve(request_id, approved)
143
+
144
+ return False
145
+
146
+ @property
147
+ def pending_count(self) -> int:
148
+ """Number of pending approval requests."""
149
+ return len(self._pending)
@@ -0,0 +1,50 @@
1
+ """
2
+ Shared base class for messaging-platform approval backends.
3
+
4
+ Extracts the common sync-wrapper, timeout, poll_interval, and keyword
5
+ matching logic so that SlackApproval, TelegramApproval, and DiscordApproval
6
+ only need to implement the platform-specific bits.
7
+
8
+ This is an internal module — end users import the concrete classes.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import asyncio
14
+ import logging
15
+ from typing import Set
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+ APPROVE_KEYWORDS: Set[str] = {
20
+ "yes", "y", "approve", "approved", "ok", "allow", "go", "proceed", "confirm",
21
+ }
22
+ DENY_KEYWORDS: Set[str] = {
23
+ "no", "n", "deny", "denied", "reject", "block", "stop", "cancel", "refuse",
24
+ }
25
+
26
+
27
+ def classify_keyword(text: str) -> str | None:
28
+ """Classify *text* as ``'approve'``, ``'deny'``, or ``None``."""
29
+ t = text.strip().lower()
30
+ if t in APPROVE_KEYWORDS:
31
+ return "approve"
32
+ if t in DENY_KEYWORDS:
33
+ return "deny"
34
+ return None
35
+
36
+
37
+ def sync_wrapper(async_fn, timeout: float):
38
+ """Run *async_fn* (a coroutine) synchronously, handling nested loops."""
39
+ try:
40
+ loop = asyncio.get_running_loop()
41
+ except RuntimeError:
42
+ loop = None
43
+
44
+ if loop and loop.is_running():
45
+ import concurrent.futures
46
+ with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool:
47
+ future = pool.submit(asyncio.run, async_fn)
48
+ return future.result(timeout=timeout + 10)
49
+ else:
50
+ return asyncio.run(async_fn)
@@ -0,0 +1,127 @@
1
+ """
2
+ Markdown-aware message chunking for PraisonAI bots.
3
+
4
+ Splits long bot responses at paragraph boundaries while preserving
5
+ code fences and markdown structure. Inspired by OpenClaw's chunk.ts
6
+ but kept minimal (~120 lines).
7
+
8
+ Usage::
9
+
10
+ from praisonai.bots._chunk import chunk_message
11
+
12
+ chunks = chunk_message(text, max_length=4096, preserve_fences=True)
13
+ for chunk in chunks:
14
+ await bot.send_message(channel_id, chunk)
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import re
20
+ from typing import List
21
+
22
+
23
+ def chunk_message(
24
+ text: str,
25
+ max_length: int = 4096,
26
+ preserve_fences: bool = True,
27
+ ) -> List[str]:
28
+ """Split *text* into chunks of at most *max_length* characters.
29
+
30
+ Splitting strategy (in priority order):
31
+ 1. **Paragraph boundaries** (blank lines ``\\n\\n``)
32
+ 2. **Sentence boundaries** (``. `` followed by uppercase or newline)
33
+ 3. **Hard split** at *max_length* (last resort)
34
+
35
+ When *preserve_fences* is True, code fence blocks are never split
36
+ even if they exceed *max_length*.
37
+
38
+ Args:
39
+ text: The message text to split.
40
+ max_length: Maximum characters per chunk.
41
+ preserve_fences: Keep code fences intact (default True).
42
+
43
+ Returns:
44
+ List of text chunks.
45
+ """
46
+ if not text:
47
+ return [""]
48
+
49
+ if len(text) <= max_length:
50
+ return [text]
51
+
52
+ # Split into paragraphs (double newline)
53
+ paragraphs = re.split(r"\n\n", text)
54
+
55
+ chunks: List[str] = []
56
+ current = ""
57
+
58
+ for para in paragraphs:
59
+ candidate = (current + "\n\n" + para) if current else para
60
+
61
+ # Check if this paragraph is inside a fence span
62
+ # If the candidate is small enough, accumulate
63
+ if len(candidate) <= max_length:
64
+ current = candidate
65
+ continue
66
+
67
+ # Candidate too long — flush current first
68
+ if current:
69
+ chunks.append(current.strip())
70
+ current = ""
71
+
72
+ # Now handle the paragraph itself
73
+ if len(para) <= max_length:
74
+ current = para
75
+ elif preserve_fences and _is_fence_block(para):
76
+ # Code fence block — keep intact even if over limit
77
+ chunks.append(para.strip())
78
+ else:
79
+ # Paragraph too long — split at sentences or hard-split
80
+ sub_chunks = _split_long_paragraph(para, max_length)
81
+ chunks.extend(sub_chunks[:-1])
82
+ current = sub_chunks[-1] if sub_chunks else ""
83
+
84
+ if current.strip():
85
+ chunks.append(current.strip())
86
+
87
+ return chunks if chunks else [""]
88
+
89
+
90
+ def _is_fence_block(text: str) -> bool:
91
+ """Check if text is (or contains) a code fence block."""
92
+ stripped = text.strip()
93
+ return stripped.startswith("```")
94
+
95
+
96
+ def _split_long_paragraph(text: str, max_length: int) -> List[str]:
97
+ """Split a long paragraph at sentence boundaries, then hard-split."""
98
+ # Try sentence boundaries first
99
+ sentences = re.split(r"(?<=[.!?])\s+", text)
100
+
101
+ if len(sentences) > 1:
102
+ chunks: List[str] = []
103
+ current = ""
104
+ for sentence in sentences:
105
+ candidate = (current + " " + sentence) if current else sentence
106
+ if len(candidate) <= max_length:
107
+ current = candidate
108
+ else:
109
+ if current:
110
+ chunks.append(current.strip())
111
+ if len(sentence) <= max_length:
112
+ current = sentence
113
+ else:
114
+ # Sentence itself too long — hard split
115
+ chunks.extend(_hard_split(sentence, max_length))
116
+ current = ""
117
+ if current.strip():
118
+ chunks.append(current.strip())
119
+ return chunks if chunks else [""]
120
+
121
+ # No sentence boundaries — hard split
122
+ return _hard_split(text, max_length)
123
+
124
+
125
+ def _hard_split(text: str, max_length: int) -> List[str]:
126
+ """Last-resort character-level split."""
127
+ return [text[i:i + max_length] for i in range(0, len(text), max_length)]