PraisonAI 4.6.108__tar.gz → 4.6.111__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 (711) hide show
  1. {praisonai-4.6.108 → praisonai-4.6.111}/PKG-INFO +3 -3
  2. {praisonai-4.6.108 → praisonai-4.6.111}/PraisonAI.egg-info/PKG-INFO +3 -3
  3. {praisonai-4.6.108 → praisonai-4.6.111}/PraisonAI.egg-info/SOURCES.txt +1 -0
  4. {praisonai-4.6.108 → praisonai-4.6.111}/PraisonAI.egg-info/requires.txt +2 -2
  5. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/agent.py +7 -2
  6. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/api/call.py +22 -21
  7. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/__init__.py +5 -0
  8. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_approval_base.py +46 -1
  9. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_config_schema.py +32 -2
  10. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_dead_targets.py +69 -4
  11. praisonai-4.6.111/praisonai/bots/_delivery_control_store.py +405 -0
  12. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_discord_approval.py +35 -3
  13. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_outbound_messenger.py +31 -1
  14. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_protocol_mixin.py +101 -15
  15. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_rate_limit.py +72 -6
  16. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_registry.py +25 -0
  17. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_slack_approval.py +35 -3
  18. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_telegram_approval.py +58 -4
  19. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/agentmail.py +4 -2
  20. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/botos.py +55 -13
  21. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/delivery.py +177 -2
  22. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/discord.py +3 -1
  23. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/email.py +4 -2
  24. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/slack.py +12 -3
  25. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/telegram.py +4 -2
  26. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/whatsapp.py +10 -2
  27. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/gateway.py +34 -0
  28. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/framework_adapters/autogen_adapter.py +2 -0
  29. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/framework_adapters/crewai_adapter.py +2 -0
  30. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/framework_adapters/praisonai_adapter.py +4 -1
  31. praisonai-4.6.111/praisonai/version.py +1 -0
  32. {praisonai-4.6.108 → praisonai-4.6.111}/pyproject.toml +2 -2
  33. praisonai-4.6.108/praisonai/version.py +0 -1
  34. {praisonai-4.6.108 → praisonai-4.6.111}/PraisonAI.egg-info/dependency_links.txt +0 -0
  35. {praisonai-4.6.108 → praisonai-4.6.111}/PraisonAI.egg-info/entry_points.txt +0 -0
  36. {praisonai-4.6.108 → praisonai-4.6.111}/PraisonAI.egg-info/top_level.txt +0 -0
  37. {praisonai-4.6.108 → praisonai-4.6.111}/README.md +0 -0
  38. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/__init__.py +0 -0
  39. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/__main__.py +0 -0
  40. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_approval_spec.py +0 -0
  41. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_async_bridge.py +0 -0
  42. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_bootstrap.py +0 -0
  43. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_dev/__init__.py +0 -0
  44. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_dev/api_md.py +0 -0
  45. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_dev/parity/__init__.py +0 -0
  46. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_dev/parity/docs_extractor.py +0 -0
  47. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_dev/parity/docs_generator.py +0 -0
  48. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_dev/parity/generator.py +0 -0
  49. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_dev/parity/python_docs_extractor.py +0 -0
  50. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_dev/parity/python_extractor.py +0 -0
  51. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_dev/parity/rust_docs_extractor.py +0 -0
  52. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_dev/parity/rust_extractor.py +0 -0
  53. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_dev/parity/topic_normalizer.py +0 -0
  54. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_dev/parity/ts_docs_extractor.py +0 -0
  55. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_dev/parity/typescript_extractor.py +0 -0
  56. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_entrypoint.py +0 -0
  57. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_framework_availability.py +0 -0
  58. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_lazy_cache.py +0 -0
  59. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_lockmap.py +0 -0
  60. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_logging.py +0 -0
  61. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_registry.py +0 -0
  62. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/_safe_loader.py +0 -0
  63. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/acp/__init__.py +0 -0
  64. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/acp/config.py +0 -0
  65. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/acp/safe_edit.py +0 -0
  66. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/acp/server.py +0 -0
  67. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/acp/session.py +0 -0
  68. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/adapters/__init__.py +0 -0
  69. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/adapters/readers.py +0 -0
  70. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/adapters/rerankers.py +0 -0
  71. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/adapters/retrievers.py +0 -0
  72. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/adapters/vector_stores.py +0 -0
  73. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/agent_scheduler.py +0 -0
  74. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/agents_generator.py +0 -0
  75. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/api/agent_invoke.py +0 -0
  76. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/app/__init__.py +0 -0
  77. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/app/agentos.py +0 -0
  78. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/async_agent_scheduler.py +0 -0
  79. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/audit/__init__.py +0 -0
  80. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/audit/agent_centric.py +0 -0
  81. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/auto.py +0 -0
  82. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_ack.py +0 -0
  83. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_admission.py +0 -0
  84. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_approval.py +0 -0
  85. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_approval_store.py +0 -0
  86. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_chunk.py +0 -0
  87. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_commands.py +0 -0
  88. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_correlation.py +0 -0
  89. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_debounce.py +0 -0
  90. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_defaults.py +0 -0
  91. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_delivery.py +0 -0
  92. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_dlq.py +0 -0
  93. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_durable_adapter.py +0 -0
  94. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_email_utils.py +0 -0
  95. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_http_approval.py +0 -0
  96. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_identity.py +0 -0
  97. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_ingress.py +0 -0
  98. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_media.py +0 -0
  99. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_metrics.py +0 -0
  100. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_mirror.py +0 -0
  101. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_outbound_media.py +0 -0
  102. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_outbound_resilience.py +0 -0
  103. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_outbox.py +0 -0
  104. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_pairing_ui.py +0 -0
  105. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_presentation_approval.py +0 -0
  106. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_presentation_approval_backend.py +0 -0
  107. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_presentation_renderer.py +0 -0
  108. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_relay_adapter.py +0 -0
  109. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_reliability.py +0 -0
  110. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_reset_policy.py +0 -0
  111. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_resilience.py +0 -0
  112. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_run_control.py +0 -0
  113. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_session.py +0 -0
  114. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_status.py +0 -0
  115. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_streaming.py +0 -0
  116. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_typing.py +0 -0
  117. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_typing_indicator.py +0 -0
  118. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_unknown_user.py +0 -0
  119. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_webhook_approval.py +0 -0
  120. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/_whatsapp_web_adapter.py +0 -0
  121. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/bot.py +0 -0
  122. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/linear.py +0 -0
  123. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/media.py +0 -0
  124. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/bots/webhook_security.py +0 -0
  125. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/__init__.py +0 -0
  126. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/agent.py +0 -0
  127. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/benchmark.py +0 -0
  128. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/cdp_agent.py +0 -0
  129. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/cdp_utils.py +0 -0
  130. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/cli.py +0 -0
  131. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/diagnostics.py +0 -0
  132. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/launcher.py +0 -0
  133. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/playwright_agent.py +0 -0
  134. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/profiling.py +0 -0
  135. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/protocol.py +0 -0
  136. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/report.py +0 -0
  137. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/server.py +0 -0
  138. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/sessions.py +0 -0
  139. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/browser/video.py +0 -0
  140. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/__init__.py +0 -0
  141. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/a2a.py +0 -0
  142. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/assistants.py +0 -0
  143. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/audio.py +0 -0
  144. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/batches.py +0 -0
  145. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/completions.py +0 -0
  146. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/container_files.py +0 -0
  147. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/containers.py +0 -0
  148. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/embeddings.py +0 -0
  149. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/files.py +0 -0
  150. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/fine_tuning.py +0 -0
  151. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/guardrails.py +0 -0
  152. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/images.py +0 -0
  153. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/mcp.py +0 -0
  154. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/messages.py +0 -0
  155. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/moderations.py +0 -0
  156. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/ocr.py +0 -0
  157. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/passthrough.py +0 -0
  158. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/rag.py +0 -0
  159. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/realtime.py +0 -0
  160. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/rerank.py +0 -0
  161. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/responses.py +0 -0
  162. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/search.py +0 -0
  163. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/skills.py +0 -0
  164. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/vector_store_files.py +0 -0
  165. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/vector_stores.py +0 -0
  166. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/capabilities/videos.py +0 -0
  167. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/claw/__init__.py +0 -0
  168. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/claw/default_app.py +0 -0
  169. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/__init__.py +0 -0
  170. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/_paths.py +0 -0
  171. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/_shim.py +0 -0
  172. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/_warnings.py +0 -0
  173. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/app.py +0 -0
  174. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/approval_backend.py +0 -0
  175. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/branding.py +0 -0
  176. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/__init__.py +0 -0
  177. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/acp.py +0 -0
  178. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/agent.py +0 -0
  179. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/agents.py +0 -0
  180. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/app.py +0 -0
  181. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/attach.py +0 -0
  182. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/audit.py +0 -0
  183. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/auth.py +0 -0
  184. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/batch.py +0 -0
  185. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/benchmark.py +0 -0
  186. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/bot.py +0 -0
  187. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/browser.py +0 -0
  188. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/call.py +0 -0
  189. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/chat.py +0 -0
  190. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/checkpoint.py +0 -0
  191. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/claw.py +0 -0
  192. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/code.py +0 -0
  193. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/command.py +0 -0
  194. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/commit.py +0 -0
  195. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/completion.py +0 -0
  196. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/config.py +0 -0
  197. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/context.py +0 -0
  198. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/daemon.py +0 -0
  199. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/dashboard.py +0 -0
  200. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/debug.py +0 -0
  201. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/deploy.py +0 -0
  202. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/diag.py +0 -0
  203. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/docs.py +0 -0
  204. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/doctor.py +0 -0
  205. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/endpoints.py +0 -0
  206. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/environment.py +0 -0
  207. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/eval.py +0 -0
  208. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/examples.py +0 -0
  209. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/flow.py +0 -0
  210. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/github.py +0 -0
  211. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/hooks.py +0 -0
  212. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/identity.py +0 -0
  213. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/init.py +0 -0
  214. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/kanban.py +0 -0
  215. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/knowledge.py +0 -0
  216. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/langextract.py +0 -0
  217. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/langfuse.py +0 -0
  218. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/loop.py +0 -0
  219. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/lsp.py +0 -0
  220. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/managed.py +0 -0
  221. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/mcp.py +0 -0
  222. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/memory.py +0 -0
  223. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/mint_link.py +0 -0
  224. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/models.py +0 -0
  225. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/n8n.py +0 -0
  226. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/obs.py +0 -0
  227. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/onboard.py +0 -0
  228. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/package.py +0 -0
  229. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/pairing.py +0 -0
  230. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/paths.py +0 -0
  231. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/permissions.py +0 -0
  232. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/plugins.py +0 -0
  233. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/port.py +0 -0
  234. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/profile.py +0 -0
  235. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/publish.py +0 -0
  236. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/rag.py +0 -0
  237. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/realtime.py +0 -0
  238. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/recipe.py +0 -0
  239. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/registry.py +0 -0
  240. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/replay.py +0 -0
  241. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/research.py +0 -0
  242. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/retrieval.py +0 -0
  243. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/rules.py +0 -0
  244. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/run.py +0 -0
  245. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/sandbox.py +0 -0
  246. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/schedule.py +0 -0
  247. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/serve.py +0 -0
  248. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/session.py +0 -0
  249. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/setup.py +0 -0
  250. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/skills.py +0 -0
  251. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/standardise.py +0 -0
  252. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/templates.py +0 -0
  253. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/test.py +0 -0
  254. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/todo.py +0 -0
  255. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/tools.py +0 -0
  256. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/traces.py +0 -0
  257. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/tracker.py +0 -0
  258. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/train.py +0 -0
  259. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/ui.py +0 -0
  260. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/up.py +0 -0
  261. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/validate.py +0 -0
  262. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/version.py +0 -0
  263. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/commands/workflow.py +0 -0
  264. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/config_loader.py +0 -0
  265. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/configuration/__init__.py +0 -0
  266. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/configuration/config.schema.json +0 -0
  267. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/execution/__init__.py +0 -0
  268. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/fallback_schema.py +0 -0
  269. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/features/__init__.py +0 -0
  270. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/features/approval.py +0 -0
  271. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/features/bots_cli.py +0 -0
  272. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/features/gateway.py +0 -0
  273. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/features/onboard.py +0 -0
  274. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/features/serve.py +0 -0
  275. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/interactive/__init__.py +0 -0
  276. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/langfuse_client.py +0 -0
  277. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/main.py +0 -0
  278. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/output/__init__.py +0 -0
  279. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/schedule_cli.py +0 -0
  280. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/schema_provider.py +0 -0
  281. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/session/__init__.py +0 -0
  282. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/state/__init__.py +0 -0
  283. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/ui/__init__.py +0 -0
  284. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/unified_schema.py +0 -0
  285. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli/utils/__init__.py +0 -0
  286. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/cli_backends/__init__.py +0 -0
  287. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/__init__.py +0 -0
  288. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/agent_tools.py +0 -0
  289. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/diff/__init__.py +0 -0
  290. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/diff/diff_strategy.py +0 -0
  291. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/tools/__init__.py +0 -0
  292. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/tools/apply_diff.py +0 -0
  293. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/tools/execute_command.py +0 -0
  294. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/tools/list_files.py +0 -0
  295. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/tools/read_file.py +0 -0
  296. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/tools/search_replace.py +0 -0
  297. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/tools/write_file.py +0 -0
  298. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/utils/__init__.py +0 -0
  299. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/utils/file_utils.py +0 -0
  300. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/utils/ignore_utils.py +0 -0
  301. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/code/utils/text_utils.py +0 -0
  302. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/config/__init__.py +0 -0
  303. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/config/schema.py +0 -0
  304. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/config/validator.py +0 -0
  305. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/context/__init__.py +0 -0
  306. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/context/_storage_path.py +0 -0
  307. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/context/artifact_store.py +0 -0
  308. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/context/config.py +0 -0
  309. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/context/history_store.py +0 -0
  310. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/context/queue.py +0 -0
  311. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/context/setup.py +0 -0
  312. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/context/terminal_logger.py +0 -0
  313. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/daemon/__init__.py +0 -0
  314. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/daemon/launchd.py +0 -0
  315. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/daemon/systemd.py +0 -0
  316. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/daemon/windows.py +0 -0
  317. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/db/__init__.py +0 -0
  318. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/db/adapter.py +0 -0
  319. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/deploy/__init__.py +0 -0
  320. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/deploy/api.py +0 -0
  321. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/deploy/docker.py +0 -0
  322. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/deploy/doctor.py +0 -0
  323. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/deploy/main.py +0 -0
  324. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/deploy/models.py +0 -0
  325. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/deploy/providers/__init__.py +0 -0
  326. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/deploy/providers/_registry.py +0 -0
  327. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/deploy/providers/aws.py +0 -0
  328. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/deploy/providers/azure.py +0 -0
  329. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/deploy/providers/base.py +0 -0
  330. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/deploy/providers/gcp.py +0 -0
  331. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/deploy/schema.py +0 -0
  332. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/docs_runner/__init__.py +0 -0
  333. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/docs_runner/classifier.py +0 -0
  334. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/docs_runner/executor.py +0 -0
  335. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/docs_runner/extractor.py +0 -0
  336. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/docs_runner/reporter.py +0 -0
  337. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/docs_runner/runner.py +0 -0
  338. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/docs_runner/workspace.py +0 -0
  339. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/endpoints/__init__.py +0 -0
  340. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/endpoints/a2u_server.py +0 -0
  341. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/endpoints/discovery.py +0 -0
  342. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/endpoints/providers/__init__.py +0 -0
  343. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/endpoints/providers/a2a.py +0 -0
  344. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/endpoints/providers/a2u.py +0 -0
  345. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/endpoints/providers/agents_api.py +0 -0
  346. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/endpoints/providers/base.py +0 -0
  347. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/endpoints/providers/mcp.py +0 -0
  348. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/endpoints/providers/openai_compat.py +0 -0
  349. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/endpoints/providers/recipe.py +0 -0
  350. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/endpoints/providers/tools_mcp.py +0 -0
  351. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/endpoints/registry.py +0 -0
  352. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/endpoints/server.py +0 -0
  353. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/flow/__init__.py +0 -0
  354. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/flow/client.py +0 -0
  355. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
  356. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
  357. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/flow/components/__init__.py +0 -0
  358. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/flow/converter.py +0 -0
  359. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/flow/helpers.py +0 -0
  360. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/framework_adapters/__init__.py +0 -0
  361. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/framework_adapters/_config_builder.py +0 -0
  362. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/framework_adapters/base.py +0 -0
  363. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/framework_adapters/registry.py +0 -0
  364. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/framework_adapters/validators.py +0 -0
  365. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/framework_adapters/workflow_framework.py +0 -0
  366. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/__init__.py +0 -0
  367. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/auth.py +0 -0
  368. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/client.py +0 -0
  369. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/cookie_auth.py +0 -0
  370. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/exec_approval.py +0 -0
  371. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/forensics.py +0 -0
  372. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/gateway_approval.py +0 -0
  373. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/health_monitor.py +0 -0
  374. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/home_channels.py +0 -0
  375. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/kanban_dispatcher.py +0 -0
  376. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/magic_link.py +0 -0
  377. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/origin_check.py +0 -0
  378. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/pairing.py +0 -0
  379. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/pairing_routes.py +0 -0
  380. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/port_utils.py +0 -0
  381. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/push_channels.py +0 -0
  382. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/push_delivery.py +0 -0
  383. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/push_polling.py +0 -0
  384. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/push_presence.py +0 -0
  385. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/rate_limiter.py +0 -0
  386. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/redis_pubsub.py +0 -0
  387. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/server.py +0 -0
  388. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/supervisor.py +0 -0
  389. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/gateway/unicode_utils.py +0 -0
  390. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/inbuilt_tools/__init__.py +0 -0
  391. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  392. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/inc/__init__.py +0 -0
  393. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/inc/config.py +0 -0
  394. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/inc/models.py +0 -0
  395. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integration/__init__.py +0 -0
  396. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integration/bridges/__init__.py +0 -0
  397. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integration/bridges/approvals_bridge.py +0 -0
  398. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integration/bridges/hooks_query.py +0 -0
  399. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integration/bridges/kanban_bridge.py +0 -0
  400. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integration/bridges/schedules_runner.py +0 -0
  401. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integration/bridges/usage_bridge.py +0 -0
  402. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integration/bridges/workflows_service.py +0 -0
  403. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integration/context_files.py +0 -0
  404. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integration/gateway_host.py +0 -0
  405. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integration/host_app.py +0 -0
  406. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integration/pages/__init__.py +0 -0
  407. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integration/pages/bot_health.py +0 -0
  408. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integration/pages/workflow_runs.py +0 -0
  409. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/__init__.py +0 -0
  410. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/_session_info.py +0 -0
  411. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/_tool_aliases.py +0 -0
  412. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/_unified_registry.py +0 -0
  413. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/backend_registry.py +0 -0
  414. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/base.py +0 -0
  415. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/claude_code.py +0 -0
  416. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/codex_cli.py +0 -0
  417. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/compute/__init__.py +0 -0
  418. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/compute/daytona.py +0 -0
  419. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/compute/docker.py +0 -0
  420. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/compute/e2b.py +0 -0
  421. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/compute/flyio.py +0 -0
  422. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/compute/local.py +0 -0
  423. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/compute/modal_compute.py +0 -0
  424. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/cursor_cli.py +0 -0
  425. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/db_session_adapter.py +0 -0
  426. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/gemini_cli.py +0 -0
  427. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/hosted_agent.py +0 -0
  428. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/local_agent.py +0 -0
  429. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/managed_agents.py +0 -0
  430. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/managed_local.py +0 -0
  431. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/registry.py +0 -0
  432. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/integrations/sandboxed_agent.py +0 -0
  433. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/jobs/__init__.py +0 -0
  434. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/jobs/executor.py +0 -0
  435. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/jobs/models.py +0 -0
  436. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/jobs/path_validation.py +0 -0
  437. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/jobs/router.py +0 -0
  438. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/jobs/server.py +0 -0
  439. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/jobs/store.py +0 -0
  440. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/kanban/__init__.py +0 -0
  441. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/kanban/models.py +0 -0
  442. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/kanban/paths.py +0 -0
  443. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/kanban/sqlite_store.py +0 -0
  444. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/llm/__init__.py +0 -0
  445. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/llm/catalogue.py +0 -0
  446. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/llm/config.py +0 -0
  447. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/llm/credentials.py +0 -0
  448. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/llm/env.py +0 -0
  449. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/llm/gateways.py +0 -0
  450. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/llm/registry.py +0 -0
  451. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/__init__.py +0 -0
  452. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/adapters/__init__.py +0 -0
  453. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/adapters/agents.py +0 -0
  454. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/adapters/capabilities.py +0 -0
  455. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/adapters/cli_tools.py +0 -0
  456. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/adapters/extended_capabilities.py +0 -0
  457. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/adapters/knowledge.py +0 -0
  458. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/adapters/memory.py +0 -0
  459. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/adapters/prompts.py +0 -0
  460. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/adapters/resources.py +0 -0
  461. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/adapters/tools_bridge.py +0 -0
  462. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/auth/__init__.py +0 -0
  463. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/auth/api_key.py +0 -0
  464. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/auth/oauth.py +0 -0
  465. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/auth/oidc.py +0 -0
  466. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/auth/scopes.py +0 -0
  467. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/cli.py +0 -0
  468. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/elicitation.py +0 -0
  469. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/icons.py +0 -0
  470. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/recipe_adapter.py +0 -0
  471. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/recipe_cli.py +0 -0
  472. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/registry.py +0 -0
  473. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/sampling.py +0 -0
  474. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/server.py +0 -0
  475. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/tasks.py +0 -0
  476. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/tool_index.py +0 -0
  477. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/transports/__init__.py +0 -0
  478. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/transports/http_stream.py +0 -0
  479. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/mcp_server/transports/stdio.py +0 -0
  480. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/n8n/__init__.py +0 -0
  481. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/n8n/client.py +0 -0
  482. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/n8n/converter.py +0 -0
  483. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/n8n/preview.py +0 -0
  484. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/n8n/reverse_converter.py +0 -0
  485. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/observability/__init__.py +0 -0
  486. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/observability/hooks.py +0 -0
  487. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/observability/langextract.py +0 -0
  488. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/observability/langfuse.py +0 -0
  489. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/__init__.py +0 -0
  490. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/_valkey_client.py +0 -0
  491. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/config.py +0 -0
  492. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/__init__.py +0 -0
  493. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/_sql_base.py +0 -0
  494. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/_sqlite_base.py +0 -0
  495. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/async_mysql.py +0 -0
  496. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/async_postgres.py +0 -0
  497. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/async_sqlite.py +0 -0
  498. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/base.py +0 -0
  499. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/json_store.py +0 -0
  500. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/mysql.py +0 -0
  501. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/postgres.py +0 -0
  502. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/singlestore.py +0 -0
  503. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/sqlite.py +0 -0
  504. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/supabase.py +0 -0
  505. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/surrealdb.py +0 -0
  506. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
  507. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/conversation/turso.py +0 -0
  508. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/factory.py +0 -0
  509. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/hooks/__init__.py +0 -0
  510. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/hooks/agent_hooks.py +0 -0
  511. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/__init__.py +0 -0
  512. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/base.py +0 -0
  513. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/cassandra.py +0 -0
  514. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/chroma.py +0 -0
  515. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/clickhouse.py +0 -0
  516. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
  517. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/couchbase.py +0 -0
  518. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/lancedb.py +0 -0
  519. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
  520. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
  521. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
  522. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/milvus.py +0 -0
  523. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
  524. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/pgvector.py +0 -0
  525. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/pinecone.py +0 -0
  526. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/qdrant.py +0 -0
  527. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/redis_vector.py +0 -0
  528. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
  529. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
  530. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
  531. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
  532. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/knowledge/weaviate.py +0 -0
  533. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/migrations/__init__.py +0 -0
  534. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/migrations/manager.py +0 -0
  535. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/orchestrator.py +0 -0
  536. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/registry.py +0 -0
  537. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/state/__init__.py +0 -0
  538. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/state/async_mongodb.py +0 -0
  539. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/state/base.py +0 -0
  540. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/state/dynamodb.py +0 -0
  541. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/state/firestore.py +0 -0
  542. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/state/gcs.py +0 -0
  543. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/state/memory.py +0 -0
  544. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/state/mongodb.py +0 -0
  545. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/state/redis.py +0 -0
  546. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/state/upstash.py +0 -0
  547. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/state/valkey.py +0 -0
  548. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/tests/__init__.py +0 -0
  549. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/tests/test_all_backends.py +0 -0
  550. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/tests/test_registry_lazy.py +0 -0
  551. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/persistence/tests/test_valkey_backends.py +0 -0
  552. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/profiler.py +0 -0
  553. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/push/__init__.py +0 -0
  554. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/push/client.py +0 -0
  555. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/push/transports.py +0 -0
  556. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/recipe/__init__.py +0 -0
  557. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/recipe/bridge.py +0 -0
  558. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/recipe/core.py +0 -0
  559. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/recipe/exceptions.py +0 -0
  560. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/recipe/history.py +0 -0
  561. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/recipe/models.py +0 -0
  562. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/recipe/operations.py +0 -0
  563. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/recipe/policy.py +0 -0
  564. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/recipe/registry.py +0 -0
  565. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/recipe/runtime.py +0 -0
  566. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/recipe/security.py +0 -0
  567. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/recipe/serve.py +0 -0
  568. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/recipe/server.py +0 -0
  569. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/replay/__init__.py +0 -0
  570. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/replay/analyzer.py +0 -0
  571. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/replay/applier.py +0 -0
  572. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/replay/judge.py +0 -0
  573. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/replay/plan.py +0 -0
  574. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/replay/player.py +0 -0
  575. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/replay/reader.py +0 -0
  576. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/replay/storage.py +0 -0
  577. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/replay/writer.py +0 -0
  578. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/runtime/__init__.py +0 -0
  579. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/runtime/__main__.py +0 -0
  580. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/sandbox/__init__.py +0 -0
  581. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/sandbox/_compat.py +0 -0
  582. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/sandbox/_registry.py +0 -0
  583. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/sandbox/_shell.py +0 -0
  584. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/sandbox/daytona.py +0 -0
  585. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/sandbox/docker.py +0 -0
  586. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/sandbox/e2b.py +0 -0
  587. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/sandbox/modal.py +0 -0
  588. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/sandbox/sandlock.py +0 -0
  589. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/sandbox/ssh.py +0 -0
  590. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/sandbox/subprocess.py +0 -0
  591. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/__init__.py +0 -0
  592. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/_base_scheduler.py +0 -0
  593. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/_dispatch.py +0 -0
  594. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/agent_scheduler.py +0 -0
  595. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/async_agent_scheduler.py +0 -0
  596. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/base.py +0 -0
  597. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/blueprint_catalogue.py +0 -0
  598. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/condition_gate.py +0 -0
  599. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/daemon_manager.py +0 -0
  600. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/deployment.py +0 -0
  601. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/executor.py +0 -0
  602. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/run_policy.py +0 -0
  603. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/shared.py +0 -0
  604. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/state_manager.py +0 -0
  605. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/suggestion_engine.py +0 -0
  606. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/scheduler/yaml_loader.py +0 -0
  607. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/security/__init__.py +0 -0
  608. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/security/audit.py +0 -0
  609. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/security/injection.py +0 -0
  610. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/security/protected.py +0 -0
  611. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/setup/__init__.py +0 -0
  612. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/setup/build.py +0 -0
  613. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/setup/post_install.py +0 -0
  614. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/setup/setup_conda_env.py +0 -0
  615. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/setup.py +0 -0
  616. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/__init__.py +0 -0
  617. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/ai_generator.py +0 -0
  618. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/config.py +0 -0
  619. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/dedupe.py +0 -0
  620. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/discovery.py +0 -0
  621. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/drift.py +0 -0
  622. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/engine.py +0 -0
  623. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/enhanced_templates.py +0 -0
  624. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/example_verifier.py +0 -0
  625. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/manifest.py +0 -0
  626. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/models.py +0 -0
  627. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/reports.py +0 -0
  628. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/templates.py +0 -0
  629. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/undo_redo.py +0 -0
  630. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/standardise/validator.py +0 -0
  631. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/storage/__init__.py +0 -0
  632. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/storage/dynamodb_adapter.py +0 -0
  633. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/storage/mongodb_adapter.py +0 -0
  634. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/storage/postgresql_adapter.py +0 -0
  635. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/storage/redis_adapter.py +0 -0
  636. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/storage/valkey_adapter.py +0 -0
  637. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/suite_runner/__init__.py +0 -0
  638. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/suite_runner/batch_source.py +0 -0
  639. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/suite_runner/cli_docs_source.py +0 -0
  640. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/suite_runner/discovery.py +0 -0
  641. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/suite_runner/docs_source.py +0 -0
  642. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/suite_runner/examples_source.py +0 -0
  643. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/suite_runner/executor.py +0 -0
  644. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/suite_runner/models.py +0 -0
  645. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/suite_runner/report_viewer.py +0 -0
  646. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/suite_runner/reporter.py +0 -0
  647. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/suite_runner/runner.py +0 -0
  648. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/templates/__init__.py +0 -0
  649. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/templates/cache.py +0 -0
  650. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/templates/dependency_checker.py +0 -0
  651. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/templates/discovery.py +0 -0
  652. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/templates/loader.py +0 -0
  653. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/templates/registry.py +0 -0
  654. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/templates/resolver.py +0 -0
  655. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/templates/security.py +0 -0
  656. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/templates/tool_override.py +0 -0
  657. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/templates/tools_doctor.py +0 -0
  658. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/tool_registry.py +0 -0
  659. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/tool_resolver.py +0 -0
  660. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/tools/__init__.py +0 -0
  661. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/tools/audio.py +0 -0
  662. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/tools/glob_tool.py +0 -0
  663. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/tools/grep_tool.py +0 -0
  664. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/tools/kanban_tools.py +0 -0
  665. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/tools/multiedit.py +0 -0
  666. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/tools/skill_manage.py +0 -0
  667. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/train/__init__.py +0 -0
  668. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/train/_ollama.py +0 -0
  669. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/train/agents/__init__.py +0 -0
  670. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/train/agents/grader.py +0 -0
  671. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/train/agents/hook.py +0 -0
  672. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/train/agents/models.py +0 -0
  673. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/train/agents/orchestrator.py +0 -0
  674. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/train/agents/storage.py +0 -0
  675. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/train/llm/__init__.py +0 -0
  676. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/train/llm/trainer.py +0 -0
  677. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/train.py +0 -0
  678. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/train_vision.py +0 -0
  679. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui/_aiui_datastore.py +0 -0
  680. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui/_external_agents.py +0 -0
  681. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui/callbacks.py +0 -0
  682. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui/components/aicoder.py +0 -0
  683. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui/context.py +0 -0
  684. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui/database_config.py +0 -0
  685. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui_agents/__init__.py +0 -0
  686. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui_agents/default_app.py +0 -0
  687. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui_bot/__init__.py +0 -0
  688. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui_bot/default_app.py +0 -0
  689. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui_chat/__init__.py +0 -0
  690. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui_chat/default_app.py +0 -0
  691. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui_dashboard/default_app.py +0 -0
  692. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui_realtime/__init__.py +0 -0
  693. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/ui_realtime/default_app.py +0 -0
  694. {praisonai-4.6.108 → praisonai-4.6.111}/praisonai/upload_vision.py +0 -0
  695. {praisonai-4.6.108 → praisonai-4.6.111}/setup.cfg +0 -0
  696. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test.py +0 -0
  697. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test_agents_playbook.py +0 -0
  698. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test_approval_system.py +0 -0
  699. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test_basic.py +0 -0
  700. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test_cli_features.py +0 -0
  701. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test_custom_tools_fix.py +0 -0
  702. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test_double_api_fix.py +0 -0
  703. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test_n8n_agent_invoke.py +0 -0
  704. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test_n8n_cli_feature.py +0 -0
  705. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test_n8n_integration.py +0 -0
  706. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test_phase2_refactor.py +0 -0
  707. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test_recipe.py +0 -0
  708. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test_registry.py +0 -0
  709. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test_runner.py +0 -0
  710. {praisonai-4.6.108 → praisonai-4.6.111}/tests/test_sandboxed_agent_compatibility.py +0 -0
  711. {praisonai-4.6.108 → praisonai-4.6.111}/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.108
3
+ Version: 4.6.111
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,8 +11,8 @@ 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.108
15
- Requires-Dist: praisonai-code>=0.0.6
14
+ Requires-Dist: praisonaiagents>=1.6.111
15
+ Requires-Dist: praisonai-code>=0.0.9
16
16
  Requires-Dist: python-dotenv>=0.19.0
17
17
  Requires-Dist: litellm<2,>=1.83.14
18
18
  Requires-Dist: PyYAML>=6.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 4.6.108
3
+ Version: 4.6.111
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,8 +11,8 @@ 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.108
15
- Requires-Dist: praisonai-code>=0.0.6
14
+ Requires-Dist: praisonaiagents>=1.6.111
15
+ Requires-Dist: praisonai-code>=0.0.9
16
16
  Requires-Dist: python-dotenv>=0.19.0
17
17
  Requires-Dist: litellm<2,>=1.83.14
18
18
  Requires-Dist: PyYAML>=6.0
@@ -74,6 +74,7 @@ praisonai/bots/_dead_targets.py
74
74
  praisonai/bots/_debounce.py
75
75
  praisonai/bots/_defaults.py
76
76
  praisonai/bots/_delivery.py
77
+ praisonai/bots/_delivery_control_store.py
77
78
  praisonai/bots/_discord_approval.py
78
79
  praisonai/bots/_dlq.py
79
80
  praisonai/bots/_durable_adapter.py
@@ -1,8 +1,8 @@
1
1
  rich>=13.7
2
2
  markdown>=3.5
3
3
  pyparsing>=3.0.0
4
- praisonaiagents>=1.6.108
5
- praisonai-code>=0.0.6
4
+ praisonaiagents>=1.6.111
5
+ praisonai-code>=0.0.9
6
6
  python-dotenv>=0.19.0
7
7
  litellm<2,>=1.83.14
8
8
  PyYAML>=6.0
@@ -40,8 +40,13 @@ class Agent(CoreAgent):
40
40
  super().__init__(*args, cli_backend=cli_backend, **kwargs)
41
41
 
42
42
  def _is_protocol_instance(self, obj) -> bool:
43
- """Check if object appears to be a protocol instance (duck typing)."""
44
- return callable(obj) or hasattr(obj, 'process_turn')
43
+ """Check if object is a pre-resolved CliBackendProtocol instance (duck typing).
44
+
45
+ A CliBackendProtocol instance exposes both ``execute()`` and ``stream()``.
46
+ Factory callables are intentionally NOT treated as protocol instances here
47
+ so that wrapper-level normalization in ``resolve_cli_backend_config`` runs.
48
+ """
49
+ return hasattr(obj, "execute") and hasattr(obj, "stream")
45
50
 
46
51
 
47
52
  # Export the wrapper Agent as the default for import from praisonai
@@ -235,23 +235,26 @@ async def handle_media_stream(websocket: WebSocket):
235
235
  if openai_ws.open:
236
236
  await openai_ws.close()
237
237
 
238
- async def send_to_twilio():
239
- """Receive events from the OpenAI Realtime API, send audio back to Twilio."""
240
- nonlocal stream_sid
241
- try:
238
+ async def send_to_twilio():
239
+ """Receive events from the OpenAI Realtime API, send audio back to Twilio."""
240
+ nonlocal stream_sid
242
241
  async for openai_message in openai_ws:
243
- response = json.loads(openai_message)
244
- if response['type'] in LOG_EVENT_TYPES:
245
- print(f"Received event: {response['type']}", response)
246
- if response['type'] == 'session.updated':
247
- print("Session updated successfully:", response)
248
-
249
- if response['type'] == 'response.done':
250
- await handle_response_done(response, openai_ws)
251
-
252
- if response['type'] == 'response.audio.delta' and response.get('delta'):
253
- # Audio from OpenAI
254
- try:
242
+ # Isolate per-event failures: a malformed message or an
243
+ # error handling a single event must not escape into
244
+ # asyncio.gather() and cancel the sibling Twilio task,
245
+ # which would drop the live call. Log and keep streaming.
246
+ try:
247
+ response = json.loads(openai_message)
248
+ if response['type'] in LOG_EVENT_TYPES:
249
+ print(f"Received event: {response['type']}", response)
250
+ if response['type'] == 'session.updated':
251
+ print("Session updated successfully:", response)
252
+
253
+ if response['type'] == 'response.done':
254
+ await handle_response_done(response, openai_ws)
255
+
256
+ if response['type'] == 'response.audio.delta' and response.get('delta'):
257
+ # Audio from OpenAI
255
258
  audio_payload = base64.b64encode(base64.b64decode(response['delta'])).decode('utf-8')
256
259
  audio_delta = {
257
260
  "event": "media",
@@ -261,12 +264,10 @@ async def handle_media_stream(websocket: WebSocket):
261
264
  }
262
265
  }
263
266
  await websocket.send_json(audio_delta)
264
- except Exception as e:
265
- print(f"Error processing audio data: {e}")
266
- except Exception as e:
267
- print(f"Error in Sending to Phone: {e}")
267
+ except Exception:
268
+ logger.exception("Error processing OpenAI event; continuing stream")
268
269
 
269
- await asyncio.gather(receive_from_twilio(), send_to_twilio())
270
+ await asyncio.gather(receive_from_twilio(), send_to_twilio())
270
271
  finally:
271
272
  active_connections -= 1
272
273
 
@@ -31,6 +31,7 @@ if TYPE_CHECKING:
31
31
  from ._streaming import StreamingConfig, StreamingMode, DraftStreamer
32
32
  from ._outbox import OutboundQueue, OutboundEntry
33
33
  from ._approval_store import ApprovalStore
34
+ from ._delivery_control_store import DeliveryControlStore
34
35
  from ._delivery import DurableDelivery, deliver_with_retry
35
36
  from ._durable_adapter import DurableAdapterMixin
36
37
  from ._outbound_resilience import OutboundResilienceMixin
@@ -141,6 +142,9 @@ def __getattr__(name: str):
141
142
  if name == "ApprovalStore":
142
143
  from ._approval_store import ApprovalStore
143
144
  return ApprovalStore
145
+ if name == "DeliveryControlStore":
146
+ from ._delivery_control_store import DeliveryControlStore
147
+ return DeliveryControlStore
144
148
  if name == "DurableDelivery":
145
149
  from ._delivery import DurableDelivery
146
150
  return DurableDelivery
@@ -188,6 +192,7 @@ __all__ = [
188
192
  "InboundJournal", "JournalEntry",
189
193
  "OutboundQueue", "OutboundEntry",
190
194
  "ApprovalStore",
195
+ "DeliveryControlStore",
191
196
  "DurableDelivery", "deliver_with_retry", "deliver_chunked",
192
197
  "DurableAdapterMixin",
193
198
  "OutboundResilienceMixin",
@@ -11,7 +11,7 @@ This is an internal module — end users import the concrete classes.
11
11
  from __future__ import annotations
12
12
 
13
13
  import logging
14
- from typing import Set
14
+ from typing import Iterable, Optional, Set, Union
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
17
 
@@ -33,6 +33,51 @@ def classify_keyword(text: str) -> str | None:
33
33
  return None
34
34
 
35
35
 
36
+ def normalize_approvers(
37
+ allowed_approvers: Optional[Union[Iterable[str], str]],
38
+ ) -> Optional[Set[str]]:
39
+ """Normalise an allowed-approver allowlist to a ``set`` of ``str`` IDs.
40
+
41
+ Returns ``None`` when *allowed_approvers* is ``None`` (no restriction —
42
+ legacy behaviour). Otherwise returns a set of stringified IDs so
43
+ cross-platform user IDs (int Telegram ids, str Slack/Discord ids) compare
44
+ consistently.
45
+ """
46
+ if allowed_approvers is None:
47
+ return None
48
+ if isinstance(allowed_approvers, str):
49
+ allowed_approvers = allowed_approvers.split(",")
50
+ return {str(a).strip() for a in allowed_approvers if str(a).strip()}
51
+
52
+
53
+ def is_authorized_actor(
54
+ actor: Optional[str],
55
+ allowed_approvers: Optional[Set[str]],
56
+ ) -> bool:
57
+ """Return whether *actor* may resolve an approval.
58
+
59
+ This is the security boundary for chat-native (inline button / keyword
60
+ reply) approvals: when an allowlist is configured, only an actor in it may
61
+ approve or deny a gated tool, so an unauthorised group member's tap/reply
62
+ can never resolve the request.
63
+
64
+ Args:
65
+ actor: The resolving user's ID (may be ``None`` if the channel could
66
+ not determine it).
67
+ allowed_approvers: Normalised allowlist (see :func:`normalize_approvers`).
68
+ ``None`` means no restriction (any actor allowed — legacy
69
+ behaviour). An empty set denies everyone.
70
+
71
+ Returns:
72
+ ``True`` when there is no restriction, or *actor* is in the allowlist;
73
+ ``False`` otherwise (including when *actor* is ``None`` but an
74
+ allowlist is configured).
75
+ """
76
+ if allowed_approvers is None:
77
+ return True
78
+ return actor is not None and str(actor) in allowed_approvers
79
+
80
+
36
81
  async def classify_with_llm(
37
82
  text: str,
38
83
  tool_name: str,
@@ -362,6 +362,15 @@ class GatewayConfigSchema(BaseModel):
362
362
  # Routing and daemon config
363
363
  routing: Optional[RoutingConfigSchema] = None
364
364
  daemon: Optional[DaemonConfigSchema] = None
365
+
366
+ # Gateway server settings (host/port, drain_timeout, admission control,
367
+ # etc.) and inbound trigger hooks. These are read by
368
+ # ``gateway/server.py::load_gateway_config`` / ``_apply_hooks_from_config``
369
+ # rather than modelled field-by-field here; kept permissive so a real
370
+ # ``gateway.yaml`` with a top-level ``gateway:``/``hooks:`` block validates
371
+ # through this single schema instead of being rejected. See issue #2585.
372
+ gateway: Optional[Dict[str, Any]] = None
373
+ hooks: Optional[List[Dict[str, Any]]] = None
365
374
 
366
375
  @model_validator(mode="after")
367
376
  def normalize_and_validate(self):
@@ -390,8 +399,29 @@ class GatewayConfigSchema(BaseModel):
390
399
  "(telegram, discord, slack, whatsapp) to your config"
391
400
  )
392
401
 
393
- # Validate platform names
394
- valid_platforms = {"telegram", "discord", "slack", "whatsapp", "email", "agentmail", "linear"}
402
+ # Validate platform names against the platform registry (single source
403
+ # of truth). This includes built-in platforms, entry-point discovered
404
+ # channels (``praisonai.channels`` / ``praisonai.bots``), and any
405
+ # channel registered at runtime via ``register_platform()``.
406
+ try:
407
+ from ._registry import list_platforms
408
+ valid_platforms = set(list_platforms())
409
+ except Exception:
410
+ import logging
411
+ logging.getLogger(__name__).debug(
412
+ "Platform registry unavailable; falling back to built-in "
413
+ "platform list.", exc_info=True
414
+ )
415
+ # Fall back to the built-in set (single source of truth) if the
416
+ # registry is unavailable.
417
+ try:
418
+ from ._registry import _BUILTIN_PLATFORMS
419
+ valid_platforms = set(_BUILTIN_PLATFORMS)
420
+ except Exception:
421
+ valid_platforms = {
422
+ "telegram", "discord", "slack", "whatsapp",
423
+ "email", "agentmail", "linear",
424
+ }
395
425
  for name, channel in self.channels.items():
396
426
  platform = (channel.platform or name).lower()
397
427
  if platform not in valid_platforms:
@@ -43,7 +43,10 @@ import threading
43
43
  import time
44
44
  from dataclasses import dataclass
45
45
  from pathlib import Path
46
- from typing import Dict, List, Optional, Tuple
46
+ from typing import TYPE_CHECKING, Dict, List, Optional, Tuple
47
+
48
+ if TYPE_CHECKING:
49
+ from ._delivery_control_store import DeliveryControlStore
47
50
 
48
51
  logger = logging.getLogger(__name__)
49
52
 
@@ -100,17 +103,33 @@ class DeadTargetRegistry:
100
103
  max_size: int = _DEFAULT_MAX_SIZE,
101
104
  ttl_seconds: int = _DEFAULT_TTL_SECONDS,
102
105
  reprobe_seconds: int = _DEFAULT_REPROBE_SECONDS,
106
+ store: Optional["DeliveryControlStore"] = None,
103
107
  ) -> None:
104
108
  state_dir = Path.home() / ".praisonai" / "state"
105
- self._persist_path = Path(
106
- persist_path or (state_dir / "dead_targets.json")
107
- ).expanduser()
108
109
  self.max_size = int(max_size)
109
110
  self.ttl_seconds = int(ttl_seconds)
110
111
  self.reprobe_seconds = int(reprobe_seconds)
111
112
  self._lock = threading.Lock()
112
113
  # (platform, channel_id) -> DeadTarget
113
114
  self._dead: Dict[Tuple[str, str], DeadTarget] = {}
115
+ # Shared SQLite store: when provided, dead targets are stored as rows
116
+ # (atomic upsert) that survive restart and are correct across workers,
117
+ # instead of the per-process in-memory dict + whole-file JSON rewrite
118
+ # (issue #2579). Single-process gateways keep the JSON path (default).
119
+ self._store = store
120
+ if store is not None:
121
+ # The store's dead-target TTL/bound sweeps are table-wide, so every
122
+ # registry sharing one store must agree on ``ttl_seconds`` /
123
+ # ``max_size``. Register this registry's bounds; a later registry
124
+ # attaching to the same store with divergent settings fails loudly
125
+ # instead of silently pruning this registry's suppressions
126
+ # (Greptile P1, issue #2579).
127
+ store.register_dead_config(self.ttl_seconds, self.max_size)
128
+ self._persist_path = None
129
+ return
130
+ self._persist_path = Path(
131
+ persist_path or (state_dir / "dead_targets.json")
132
+ ).expanduser()
114
133
  self._load()
115
134
 
116
135
  # ── Helpers ─────────────────────────────────────────────────────
@@ -197,6 +216,14 @@ class DeadTargetRegistry:
197
216
  def is_dead(self, platform: str, channel_id: str) -> bool:
198
217
  """Return True if the target is currently suppressed as dead."""
199
218
  key = self._key(platform, channel_id)
219
+ if self._store is not None:
220
+ ts = self._store.dead_get_ts(key[0], key[1])
221
+ if ts is None:
222
+ return False
223
+ if self.ttl_seconds > 0 and ts < time.time() - self.ttl_seconds:
224
+ self._store.dead_clear(key[0], key[1])
225
+ return False
226
+ return True
200
227
  with self._lock:
201
228
  entry = self._dead.get(key)
202
229
  if entry is None:
@@ -221,6 +248,11 @@ class DeadTargetRegistry:
221
248
  if self.reprobe_seconds <= 0:
222
249
  return False
223
250
  key = self._key(platform, channel_id)
251
+ if self._store is not None:
252
+ ts = self._store.dead_get_ts(key[0], key[1])
253
+ if ts is None:
254
+ return False
255
+ return ts < time.time() - self.reprobe_seconds
224
256
  with self._lock:
225
257
  entry = self._dead.get(key)
226
258
  if entry is None:
@@ -230,6 +262,18 @@ class DeadTargetRegistry:
230
262
  def mark_dead(self, platform: str, channel_id: str, reason: str) -> None:
231
263
  """Record a confirmed-permanent failure, suppressing future sends."""
232
264
  key = self._key(platform, channel_id)
265
+ if self._store is not None:
266
+ already = self._store.dead_get_ts(key[0], key[1]) is not None
267
+ self._store.dead_mark(key[0], key[1], str(reason))
268
+ self._store.dead_enforce_bound(self.max_size)
269
+ if not already:
270
+ logger.warning(
271
+ "DeadTargetRegistry: suppressing dead target %s:%s (%s)",
272
+ key[0],
273
+ key[1],
274
+ reason,
275
+ )
276
+ return
233
277
  with self._lock:
234
278
  already = key in self._dead
235
279
  self._dead[key] = DeadTarget(
@@ -248,6 +292,16 @@ class DeadTargetRegistry:
248
292
  def clear(self, platform: str, channel_id: str) -> None:
249
293
  """Un-suppress a target. Called on every successful send (self-healing)."""
250
294
  key = self._key(platform, channel_id)
295
+ if self._store is not None:
296
+ if self._store.dead_get_ts(key[0], key[1]) is None:
297
+ return
298
+ self._store.dead_clear(key[0], key[1])
299
+ logger.info(
300
+ "DeadTargetRegistry: target %s:%s recovered — suppression cleared",
301
+ key[0],
302
+ key[1],
303
+ )
304
+ return
251
305
  with self._lock:
252
306
  if key not in self._dead:
253
307
  return
@@ -261,6 +315,13 @@ class DeadTargetRegistry:
261
315
 
262
316
  def list_dead(self) -> List[DeadTarget]:
263
317
  """Return a snapshot of currently-dead targets (expired ones pruned)."""
318
+ if self._store is not None:
319
+ if self.ttl_seconds > 0:
320
+ self._store.dead_expire(time.time() - self.ttl_seconds)
321
+ return [
322
+ DeadTarget(platform=p, channel_id=c, reason=r, ts=t)
323
+ for (p, c, r, t) in self._store.dead_list()
324
+ ]
264
325
  with self._lock:
265
326
  if self._evict_expired_locked():
266
327
  self._save_locked()
@@ -268,6 +329,10 @@ class DeadTargetRegistry:
268
329
 
269
330
  def size(self) -> int:
270
331
  """Number of currently-suppressed targets (expired ones pruned)."""
332
+ if self._store is not None:
333
+ if self.ttl_seconds > 0:
334
+ self._store.dead_expire(time.time() - self.ttl_seconds)
335
+ return self._store.dead_count()
271
336
  with self._lock:
272
337
  if self._evict_expired_locked():
273
338
  self._save_locked()