PraisonAI 4.6.75__tar.gz → 4.6.77__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 (880) hide show
  1. {praisonai-4.6.75 → praisonai-4.6.77}/PKG-INFO +2 -2
  2. {praisonai-4.6.75 → praisonai-4.6.77}/PraisonAI.egg-info/PKG-INFO +2 -2
  3. {praisonai-4.6.75 → praisonai-4.6.77}/PraisonAI.egg-info/requires.txt +1 -1
  4. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_commands.py +104 -2
  5. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/discord.py +24 -1
  6. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/slack.py +32 -1
  7. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/telegram.py +27 -19
  8. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/skills.py +43 -0
  9. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/formatters.py +33 -11
  10. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/handler.py +1 -1
  11. praisonai-4.6.77/praisonai/version.py +1 -0
  12. {praisonai-4.6.75 → praisonai-4.6.77}/pyproject.toml +1 -1
  13. praisonai-4.6.75/praisonai/version.py +0 -1
  14. {praisonai-4.6.75 → praisonai-4.6.77}/PraisonAI.egg-info/SOURCES.txt +0 -0
  15. {praisonai-4.6.75 → praisonai-4.6.77}/PraisonAI.egg-info/dependency_links.txt +0 -0
  16. {praisonai-4.6.75 → praisonai-4.6.77}/PraisonAI.egg-info/entry_points.txt +0 -0
  17. {praisonai-4.6.75 → praisonai-4.6.77}/PraisonAI.egg-info/top_level.txt +0 -0
  18. {praisonai-4.6.75 → praisonai-4.6.77}/README.md +0 -0
  19. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/__init__.py +0 -0
  20. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/__main__.py +0 -0
  21. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_approval_spec.py +0 -0
  22. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_async_bridge.py +0 -0
  23. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_dev/__init__.py +0 -0
  24. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_dev/api_md.py +0 -0
  25. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_dev/parity/__init__.py +0 -0
  26. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_dev/parity/docs_extractor.py +0 -0
  27. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_dev/parity/docs_generator.py +0 -0
  28. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_dev/parity/generator.py +0 -0
  29. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_dev/parity/python_docs_extractor.py +0 -0
  30. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_dev/parity/python_extractor.py +0 -0
  31. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_dev/parity/rust_docs_extractor.py +0 -0
  32. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_dev/parity/rust_extractor.py +0 -0
  33. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_dev/parity/topic_normalizer.py +0 -0
  34. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_dev/parity/ts_docs_extractor.py +0 -0
  35. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_dev/parity/typescript_extractor.py +0 -0
  36. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_entrypoint.py +0 -0
  37. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_framework_availability.py +0 -0
  38. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_lazy_cache.py +0 -0
  39. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_lockmap.py +0 -0
  40. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_logging.py +0 -0
  41. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_registry.py +0 -0
  42. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/_safe_loader.py +0 -0
  43. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/acp/__init__.py +0 -0
  44. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/acp/config.py +0 -0
  45. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/acp/safe_edit.py +0 -0
  46. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/acp/server.py +0 -0
  47. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/acp/session.py +0 -0
  48. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/adapters/__init__.py +0 -0
  49. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/adapters/readers.py +0 -0
  50. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/adapters/rerankers.py +0 -0
  51. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/adapters/retrievers.py +0 -0
  52. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/adapters/vector_stores.py +0 -0
  53. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/agent.py +0 -0
  54. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/agent_scheduler.py +0 -0
  55. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/agents_generator.py +0 -0
  56. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/api/agent_invoke.py +0 -0
  57. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/api/call.py +0 -0
  58. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/app/__init__.py +0 -0
  59. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/app/agentos.py +0 -0
  60. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/async_agent_scheduler.py +0 -0
  61. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/audit/__init__.py +0 -0
  62. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/audit/agent_centric.py +0 -0
  63. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/auto.py +0 -0
  64. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/__init__.py +0 -0
  65. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_ack.py +0 -0
  66. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_approval.py +0 -0
  67. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_approval_base.py +0 -0
  68. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_auth.py +0 -0
  69. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_chunk.py +0 -0
  70. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_config_schema.py +0 -0
  71. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_debounce.py +0 -0
  72. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_defaults.py +0 -0
  73. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_delivery.py +0 -0
  74. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_discord_approval.py +0 -0
  75. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_dlq.py +0 -0
  76. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_durable_adapter.py +0 -0
  77. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_email_utils.py +0 -0
  78. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_http_approval.py +0 -0
  79. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_identity.py +0 -0
  80. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_ingress.py +0 -0
  81. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_mirror.py +0 -0
  82. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_outbox.py +0 -0
  83. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_pairing_ui.py +0 -0
  84. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_presentation_approval.py +0 -0
  85. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_presentation_renderer.py +0 -0
  86. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_protocol_mixin.py +0 -0
  87. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_rate_limit.py +0 -0
  88. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_registry.py +0 -0
  89. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_reset_policy.py +0 -0
  90. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_resilience.py +0 -0
  91. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_run_control.py +0 -0
  92. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_session.py +0 -0
  93. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_slack_approval.py +0 -0
  94. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_status.py +0 -0
  95. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_streaming.py +0 -0
  96. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_telegram_approval.py +0 -0
  97. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_typing.py +0 -0
  98. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_typing_indicator.py +0 -0
  99. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_unknown_user.py +0 -0
  100. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_webhook_approval.py +0 -0
  101. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/_whatsapp_web_adapter.py +0 -0
  102. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/agentmail.py +0 -0
  103. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/bot.py +0 -0
  104. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/botos.py +0 -0
  105. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/delivery.py +0 -0
  106. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/email.py +0 -0
  107. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/linear.py +0 -0
  108. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/media.py +0 -0
  109. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/webhook_security.py +0 -0
  110. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/bots/whatsapp.py +0 -0
  111. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/__init__.py +0 -0
  112. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/agent.py +0 -0
  113. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/benchmark.py +0 -0
  114. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/cdp_agent.py +0 -0
  115. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/cdp_utils.py +0 -0
  116. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/cli.py +0 -0
  117. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/diagnostics.py +0 -0
  118. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/launcher.py +0 -0
  119. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/playwright_agent.py +0 -0
  120. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/profiling.py +0 -0
  121. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/protocol.py +0 -0
  122. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/report.py +0 -0
  123. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/server.py +0 -0
  124. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/sessions.py +0 -0
  125. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/browser/video.py +0 -0
  126. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/__init__.py +0 -0
  127. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/a2a.py +0 -0
  128. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/assistants.py +0 -0
  129. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/audio.py +0 -0
  130. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/batches.py +0 -0
  131. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/completions.py +0 -0
  132. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/container_files.py +0 -0
  133. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/containers.py +0 -0
  134. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/embeddings.py +0 -0
  135. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/files.py +0 -0
  136. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/fine_tuning.py +0 -0
  137. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/guardrails.py +0 -0
  138. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/images.py +0 -0
  139. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/mcp.py +0 -0
  140. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/messages.py +0 -0
  141. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/moderations.py +0 -0
  142. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/ocr.py +0 -0
  143. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/passthrough.py +0 -0
  144. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/rag.py +0 -0
  145. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/realtime.py +0 -0
  146. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/rerank.py +0 -0
  147. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/responses.py +0 -0
  148. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/search.py +0 -0
  149. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/skills.py +0 -0
  150. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/vector_store_files.py +0 -0
  151. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/vector_stores.py +0 -0
  152. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/capabilities/videos.py +0 -0
  153. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/claw/__init__.py +0 -0
  154. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/claw/default_app.py +0 -0
  155. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/__init__.py +0 -0
  156. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/_paths.py +0 -0
  157. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/_warnings.py +0 -0
  158. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/app.py +0 -0
  159. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/approval_backend.py +0 -0
  160. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/branding.py +0 -0
  161. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/__init__.py +0 -0
  162. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/acp.py +0 -0
  163. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/agent.py +0 -0
  164. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/agents.py +0 -0
  165. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/app.py +0 -0
  166. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/audit.py +0 -0
  167. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/auth.py +0 -0
  168. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/batch.py +0 -0
  169. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/benchmark.py +0 -0
  170. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/bot.py +0 -0
  171. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/browser.py +0 -0
  172. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/call.py +0 -0
  173. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/chat.py +0 -0
  174. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/claw.py +0 -0
  175. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/code.py +0 -0
  176. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/command.py +0 -0
  177. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/commit.py +0 -0
  178. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/completion.py +0 -0
  179. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/config.py +0 -0
  180. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/context.py +0 -0
  181. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/dashboard.py +0 -0
  182. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/debug.py +0 -0
  183. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/deploy.py +0 -0
  184. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/diag.py +0 -0
  185. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/docs.py +0 -0
  186. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/doctor.py +0 -0
  187. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/endpoints.py +0 -0
  188. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/environment.py +0 -0
  189. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/eval.py +0 -0
  190. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/examples.py +0 -0
  191. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/flow.py +0 -0
  192. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/gateway.py +0 -0
  193. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/github.py +0 -0
  194. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/hooks.py +0 -0
  195. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/identity.py +0 -0
  196. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/init.py +0 -0
  197. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/kanban.py +0 -0
  198. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/knowledge.py +0 -0
  199. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/langextract.py +0 -0
  200. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/langfuse.py +0 -0
  201. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/loop.py +0 -0
  202. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/lsp.py +0 -0
  203. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/managed.py +0 -0
  204. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/mcp.py +0 -0
  205. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/memory.py +0 -0
  206. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/mint_link.py +0 -0
  207. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/models.py +0 -0
  208. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/n8n.py +0 -0
  209. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/obs.py +0 -0
  210. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/onboard.py +0 -0
  211. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/package.py +0 -0
  212. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/pairing.py +0 -0
  213. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/paths.py +0 -0
  214. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/permissions.py +0 -0
  215. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/plugins.py +0 -0
  216. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/port.py +0 -0
  217. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/profile.py +0 -0
  218. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/publish.py +0 -0
  219. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/rag.py +0 -0
  220. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/realtime.py +0 -0
  221. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/recipe.py +0 -0
  222. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/registry.py +0 -0
  223. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/replay.py +0 -0
  224. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/research.py +0 -0
  225. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/retrieval.py +0 -0
  226. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/rules.py +0 -0
  227. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/run.py +0 -0
  228. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/sandbox.py +0 -0
  229. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/schedule.py +0 -0
  230. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/serve.py +0 -0
  231. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/session.py +0 -0
  232. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/setup.py +0 -0
  233. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/standardise.py +0 -0
  234. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/templates.py +0 -0
  235. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/test.py +0 -0
  236. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/todo.py +0 -0
  237. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/tools.py +0 -0
  238. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/traces.py +0 -0
  239. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/tracker.py +0 -0
  240. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/train.py +0 -0
  241. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/ui.py +0 -0
  242. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/up.py +0 -0
  243. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/validate.py +0 -0
  244. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/version.py +0 -0
  245. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/commands/workflow.py +0 -0
  246. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/config_loader.py +0 -0
  247. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/configuration/__init__.py +0 -0
  248. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/configuration/config.schema.json +0 -0
  249. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/configuration/credentials.py +0 -0
  250. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/configuration/loader.py +0 -0
  251. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/configuration/paths.py +0 -0
  252. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/configuration/resolver.py +0 -0
  253. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/configuration/schema.py +0 -0
  254. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/execution/__init__.py +0 -0
  255. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/execution/core.py +0 -0
  256. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/execution/profiler.py +0 -0
  257. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/execution/request.py +0 -0
  258. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/execution/result.py +0 -0
  259. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/fallback_schema.py +0 -0
  260. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/__init__.py +0 -0
  261. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/_endpoint_registry.py +0 -0
  262. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/_search_registry.py +0 -0
  263. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/acp.py +0 -0
  264. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/action_orchestrator.py +0 -0
  265. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/agent_scheduler.py +0 -0
  266. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/agent_tools.py +0 -0
  267. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/agents.py +0 -0
  268. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/approval.py +0 -0
  269. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/at_mentions.py +0 -0
  270. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/audit_cli.py +0 -0
  271. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/auto_memory.py +0 -0
  272. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/auto_mode.py +0 -0
  273. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/autonomy_mode.py +0 -0
  274. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/background.py +0 -0
  275. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/base.py +0 -0
  276. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/benchmark.py +0 -0
  277. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/bots_cli.py +0 -0
  278. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/capabilities.py +0 -0
  279. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/checkpoints.py +0 -0
  280. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/cli_profiler.py +0 -0
  281. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/code_intelligence.py +0 -0
  282. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/compaction.py +0 -0
  283. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/compare.py +0 -0
  284. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/config_hierarchy.py +0 -0
  285. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/context_manager.py +0 -0
  286. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/cost_tracker.py +0 -0
  287. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/csv_test_runner.py +0 -0
  288. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/custom_definitions.py +0 -0
  289. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/debug.py +0 -0
  290. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/deploy.py +0 -0
  291. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/diag.py +0 -0
  292. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/display_jsonl.py +0 -0
  293. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/__init__.py +0 -0
  294. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/__init__.py +0 -0
  295. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/acp_checks.py +0 -0
  296. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/bot_checks.py +0 -0
  297. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/config_checks.py +0 -0
  298. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/db_checks.py +0 -0
  299. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/env_checks.py +0 -0
  300. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/gateway_checks.py +0 -0
  301. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/lsp_checks.py +0 -0
  302. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/mcp_checks.py +0 -0
  303. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/memory_checks.py +0 -0
  304. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/network_checks.py +0 -0
  305. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/obs_checks.py +0 -0
  306. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/packaging_checks.py +0 -0
  307. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/performance_checks.py +0 -0
  308. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/permissions_checks.py +0 -0
  309. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/runtime_checks.py +0 -0
  310. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/runtime_migration_checks.py +0 -0
  311. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/selftest_checks.py +0 -0
  312. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/serve_checks.py +0 -0
  313. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/skills_checks.py +0 -0
  314. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/checks/tools_checks.py +0 -0
  315. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/engine.py +0 -0
  316. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/models.py +0 -0
  317. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/doctor/registry.py +0 -0
  318. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/endpoints.py +0 -0
  319. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/eval.py +0 -0
  320. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/examples.py +0 -0
  321. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/external_agents.py +0 -0
  322. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/fast_context.py +0 -0
  323. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/file_history.py +0 -0
  324. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/flow_display.py +0 -0
  325. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/gateway.py +0 -0
  326. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/git_attribution.py +0 -0
  327. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/git_integration.py +0 -0
  328. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/guardrail.py +0 -0
  329. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/handoff.py +0 -0
  330. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/hooks.py +0 -0
  331. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/hybrid_workflow.py +0 -0
  332. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/image.py +0 -0
  333. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/interactive_core_headless.py +0 -0
  334. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/interactive_runtime.py +0 -0
  335. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/interactive_test_harness.py +0 -0
  336. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/interactive_tools.py +0 -0
  337. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/interactive_tui.py +0 -0
  338. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/job_workflow.py +0 -0
  339. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/jobs.py +0 -0
  340. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/knowledge.py +0 -0
  341. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/knowledge_cli.py +0 -0
  342. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/lite.py +0 -0
  343. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/logs.py +0 -0
  344. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/lsp_cli.py +0 -0
  345. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/lsp_diagnostics.py +0 -0
  346. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/mcp.py +0 -0
  347. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/message_queue.py +0 -0
  348. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/metrics.py +0 -0
  349. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/migrate.py +0 -0
  350. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/migration_flow.py +0 -0
  351. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/migration_spec.py +0 -0
  352. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/n8n.py +0 -0
  353. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/observability.py +0 -0
  354. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/ollama.py +0 -0
  355. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/onboard.py +0 -0
  356. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/output_modes.py +0 -0
  357. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/output_style.py +0 -0
  358. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/package.py +0 -0
  359. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/performance.py +0 -0
  360. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/persistence.py +0 -0
  361. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/plugin_cli.py +0 -0
  362. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/profile.py +0 -0
  363. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/profiler/__init__.py +0 -0
  364. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/profiler/core.py +0 -0
  365. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/profiler/optimizations.py +0 -0
  366. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/profiler/suite.py +0 -0
  367. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/profiling.py +0 -0
  368. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/queue/__init__.py +0 -0
  369. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/queue/manager.py +0 -0
  370. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/queue/models.py +0 -0
  371. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/queue/persistence.py +0 -0
  372. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/queue/scheduler.py +0 -0
  373. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/queue/worker.py +0 -0
  374. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/recipe.py +0 -0
  375. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/recipe_creator.py +0 -0
  376. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/recipe_optimizer.py +0 -0
  377. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/recipe_prompts.py +0 -0
  378. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/recipes.py +0 -0
  379. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/registry.py +0 -0
  380. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/repo_map.py +0 -0
  381. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/router.py +0 -0
  382. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/safe_shell.py +0 -0
  383. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/sandbox_cli.py +0 -0
  384. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/sandbox_executor.py +0 -0
  385. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/sdk_knowledge.py +0 -0
  386. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/serve.py +0 -0
  387. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/session.py +0 -0
  388. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/setup/__init__.py +0 -0
  389. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/setup/handler.py +0 -0
  390. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/setup/templates.py +0 -0
  391. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/skills.py +0 -0
  392. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/slash_commands.py +0 -0
  393. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/telemetry.py +0 -0
  394. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/templates.py +0 -0
  395. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/thinking.py +0 -0
  396. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/todo.py +0 -0
  397. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tools.py +0 -0
  398. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/__init__.py +0 -0
  399. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/app.py +0 -0
  400. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/cli.py +0 -0
  401. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/config.py +0 -0
  402. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/debug.py +0 -0
  403. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/events.py +0 -0
  404. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/mock_provider.py +0 -0
  405. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/orchestrator.py +0 -0
  406. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/screens/__init__.py +0 -0
  407. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/screens/help.py +0 -0
  408. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/screens/main.py +0 -0
  409. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/screens/queue.py +0 -0
  410. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/screens/session.py +0 -0
  411. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/screens/settings.py +0 -0
  412. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/session_store.py +0 -0
  413. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/widgets/__init__.py +0 -0
  414. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/widgets/chat.py +0 -0
  415. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/widgets/command_popup.py +0 -0
  416. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/widgets/composer.py +0 -0
  417. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/widgets/file_popup.py +0 -0
  418. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/widgets/queue_panel.py +0 -0
  419. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/widgets/status.py +0 -0
  420. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/tui/widgets/tool_panel.py +0 -0
  421. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/wizard.py +0 -0
  422. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/workflow.py +0 -0
  423. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/features/yaml_utils.py +0 -0
  424. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/interactive/__init__.py +0 -0
  425. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/interactive/async_tui.py +0 -0
  426. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/interactive/config.py +0 -0
  427. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/interactive/core.py +0 -0
  428. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/interactive/events.py +0 -0
  429. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/interactive/frontends/__init__.py +0 -0
  430. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/interactive/frontends/rich_frontend.py +0 -0
  431. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/interactive/frontends/textual_frontend.py +0 -0
  432. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/interactive/praison_io.py +0 -0
  433. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/interactive/repl.py +0 -0
  434. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/interactive/split_tui.py +0 -0
  435. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/interactive/tui_app.py +0 -0
  436. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/langfuse_client.py +0 -0
  437. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/main.py +0 -0
  438. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/output/__init__.py +0 -0
  439. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/output/console.py +0 -0
  440. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/output/event_bridge.py +0 -0
  441. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/schedule_cli.py +0 -0
  442. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/schema_provider.py +0 -0
  443. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/session/__init__.py +0 -0
  444. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/session/unified.py +0 -0
  445. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/state/__init__.py +0 -0
  446. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/state/identifiers.py +0 -0
  447. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/state/project_sessions.py +0 -0
  448. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/state/sessions.py +0 -0
  449. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/ui/__init__.py +0 -0
  450. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/ui/config.py +0 -0
  451. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/ui/events.py +0 -0
  452. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/ui/mg_backend.py +0 -0
  453. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/ui/plain.py +0 -0
  454. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/ui/rich_backend.py +0 -0
  455. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/unified_schema.py +0 -0
  456. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/utils/env_utils.py +0 -0
  457. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli/utils/project.py +0 -0
  458. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli_backends/__init__.py +0 -0
  459. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli_backends/claude.py +0 -0
  460. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/cli_backends/registry.py +0 -0
  461. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/__init__.py +0 -0
  462. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/agent_tools.py +0 -0
  463. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/diff/__init__.py +0 -0
  464. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/diff/diff_strategy.py +0 -0
  465. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/tools/__init__.py +0 -0
  466. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/tools/apply_diff.py +0 -0
  467. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/tools/execute_command.py +0 -0
  468. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/tools/list_files.py +0 -0
  469. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/tools/read_file.py +0 -0
  470. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/tools/search_replace.py +0 -0
  471. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/tools/write_file.py +0 -0
  472. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/utils/__init__.py +0 -0
  473. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/utils/file_utils.py +0 -0
  474. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/utils/ignore_utils.py +0 -0
  475. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/code/utils/text_utils.py +0 -0
  476. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/config/__init__.py +0 -0
  477. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/config/schema.py +0 -0
  478. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/config/validator.py +0 -0
  479. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/context/__init__.py +0 -0
  480. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/context/_storage_path.py +0 -0
  481. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/context/artifact_store.py +0 -0
  482. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/context/config.py +0 -0
  483. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/context/history_store.py +0 -0
  484. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/context/queue.py +0 -0
  485. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/context/setup.py +0 -0
  486. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/context/terminal_logger.py +0 -0
  487. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/daemon/__init__.py +0 -0
  488. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/daemon/launchd.py +0 -0
  489. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/daemon/systemd.py +0 -0
  490. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/daemon/windows.py +0 -0
  491. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/db/__init__.py +0 -0
  492. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/db/adapter.py +0 -0
  493. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/deploy/__init__.py +0 -0
  494. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/deploy/api.py +0 -0
  495. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/deploy/docker.py +0 -0
  496. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/deploy/doctor.py +0 -0
  497. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/deploy/main.py +0 -0
  498. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/deploy/models.py +0 -0
  499. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/deploy/providers/__init__.py +0 -0
  500. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/deploy/providers/_registry.py +0 -0
  501. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/deploy/providers/aws.py +0 -0
  502. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/deploy/providers/azure.py +0 -0
  503. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/deploy/providers/base.py +0 -0
  504. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/deploy/providers/gcp.py +0 -0
  505. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/deploy/schema.py +0 -0
  506. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/docs_runner/__init__.py +0 -0
  507. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/docs_runner/classifier.py +0 -0
  508. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/docs_runner/executor.py +0 -0
  509. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/docs_runner/extractor.py +0 -0
  510. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/docs_runner/reporter.py +0 -0
  511. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/docs_runner/runner.py +0 -0
  512. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/docs_runner/workspace.py +0 -0
  513. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/endpoints/__init__.py +0 -0
  514. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/endpoints/a2u_server.py +0 -0
  515. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/endpoints/discovery.py +0 -0
  516. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/endpoints/providers/__init__.py +0 -0
  517. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/endpoints/providers/a2a.py +0 -0
  518. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/endpoints/providers/a2u.py +0 -0
  519. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/endpoints/providers/agents_api.py +0 -0
  520. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/endpoints/providers/base.py +0 -0
  521. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/endpoints/providers/mcp.py +0 -0
  522. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/endpoints/providers/openai_compat.py +0 -0
  523. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/endpoints/providers/recipe.py +0 -0
  524. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/endpoints/providers/tools_mcp.py +0 -0
  525. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/endpoints/registry.py +0 -0
  526. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/endpoints/server.py +0 -0
  527. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/flow/__init__.py +0 -0
  528. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/flow/client.py +0 -0
  529. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/flow/components/PraisonAI/praisonai_agent.py +0 -0
  530. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/flow/components/PraisonAI/praisonai_agents.py +0 -0
  531. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/flow/components/__init__.py +0 -0
  532. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/flow/converter.py +0 -0
  533. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/flow/helpers.py +0 -0
  534. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/framework_adapters/__init__.py +0 -0
  535. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/framework_adapters/autogen_adapter.py +0 -0
  536. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/framework_adapters/base.py +0 -0
  537. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/framework_adapters/crewai_adapter.py +0 -0
  538. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/framework_adapters/praisonai_adapter.py +0 -0
  539. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/framework_adapters/registry.py +0 -0
  540. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/framework_adapters/validators.py +0 -0
  541. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/__init__.py +0 -0
  542. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/auth.py +0 -0
  543. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/client.py +0 -0
  544. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/cookie_auth.py +0 -0
  545. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/exec_approval.py +0 -0
  546. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/gateway_approval.py +0 -0
  547. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/health_monitor.py +0 -0
  548. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/home_channels.py +0 -0
  549. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/kanban_dispatcher.py +0 -0
  550. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/magic_link.py +0 -0
  551. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/origin_check.py +0 -0
  552. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/pairing.py +0 -0
  553. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/pairing_routes.py +0 -0
  554. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/port_utils.py +0 -0
  555. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/push_channels.py +0 -0
  556. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/push_delivery.py +0 -0
  557. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/push_polling.py +0 -0
  558. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/push_presence.py +0 -0
  559. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/rate_limiter.py +0 -0
  560. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/redis_pubsub.py +0 -0
  561. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/server.py +0 -0
  562. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/supervisor.py +0 -0
  563. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/gateway/unicode_utils.py +0 -0
  564. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/inbuilt_tools/__init__.py +0 -0
  565. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/inbuilt_tools/autogen_tools.py +0 -0
  566. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/inc/__init__.py +0 -0
  567. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/inc/config.py +0 -0
  568. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/inc/models.py +0 -0
  569. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integration/__init__.py +0 -0
  570. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integration/bridges/__init__.py +0 -0
  571. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integration/bridges/approvals_bridge.py +0 -0
  572. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integration/bridges/hooks_query.py +0 -0
  573. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integration/bridges/kanban_bridge.py +0 -0
  574. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integration/bridges/schedules_runner.py +0 -0
  575. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integration/bridges/usage_bridge.py +0 -0
  576. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integration/bridges/workflows_service.py +0 -0
  577. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integration/context_files.py +0 -0
  578. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integration/gateway_host.py +0 -0
  579. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integration/host_app.py +0 -0
  580. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integration/pages/__init__.py +0 -0
  581. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integration/pages/bot_health.py +0 -0
  582. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integration/pages/workflow_runs.py +0 -0
  583. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/__init__.py +0 -0
  584. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/_session_info.py +0 -0
  585. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/_tool_aliases.py +0 -0
  586. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/_unified_registry.py +0 -0
  587. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/base.py +0 -0
  588. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/claude_code.py +0 -0
  589. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/codex_cli.py +0 -0
  590. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/compute/__init__.py +0 -0
  591. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/compute/daytona.py +0 -0
  592. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/compute/docker.py +0 -0
  593. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/compute/e2b.py +0 -0
  594. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/compute/flyio.py +0 -0
  595. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/compute/local.py +0 -0
  596. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/compute/modal_compute.py +0 -0
  597. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/cursor_cli.py +0 -0
  598. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/db_session_adapter.py +0 -0
  599. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/gemini_cli.py +0 -0
  600. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/hosted_agent.py +0 -0
  601. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/local_agent.py +0 -0
  602. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/managed_agents.py +0 -0
  603. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/managed_local.py +0 -0
  604. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/registry.py +0 -0
  605. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/integrations/sandboxed_agent.py +0 -0
  606. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/jobs/__init__.py +0 -0
  607. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/jobs/executor.py +0 -0
  608. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/jobs/models.py +0 -0
  609. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/jobs/path_validation.py +0 -0
  610. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/jobs/router.py +0 -0
  611. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/jobs/server.py +0 -0
  612. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/jobs/store.py +0 -0
  613. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/kanban/__init__.py +0 -0
  614. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/kanban/models.py +0 -0
  615. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/kanban/paths.py +0 -0
  616. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/kanban/sqlite_store.py +0 -0
  617. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/llm/__init__.py +0 -0
  618. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/llm/catalogue.py +0 -0
  619. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/llm/credentials.py +0 -0
  620. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/llm/env.py +0 -0
  621. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/llm/gateways.py +0 -0
  622. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/llm/registry.py +0 -0
  623. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/__init__.py +0 -0
  624. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/adapters/__init__.py +0 -0
  625. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/adapters/agents.py +0 -0
  626. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/adapters/capabilities.py +0 -0
  627. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/adapters/cli_tools.py +0 -0
  628. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/adapters/extended_capabilities.py +0 -0
  629. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/adapters/knowledge.py +0 -0
  630. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/adapters/memory.py +0 -0
  631. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/adapters/prompts.py +0 -0
  632. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/adapters/resources.py +0 -0
  633. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/adapters/tools_bridge.py +0 -0
  634. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/auth/__init__.py +0 -0
  635. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/auth/api_key.py +0 -0
  636. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/auth/oauth.py +0 -0
  637. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/auth/oidc.py +0 -0
  638. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/auth/scopes.py +0 -0
  639. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/cli.py +0 -0
  640. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/elicitation.py +0 -0
  641. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/icons.py +0 -0
  642. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/recipe_adapter.py +0 -0
  643. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/recipe_cli.py +0 -0
  644. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/registry.py +0 -0
  645. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/sampling.py +0 -0
  646. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/server.py +0 -0
  647. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/tasks.py +0 -0
  648. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/tool_index.py +0 -0
  649. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/transports/__init__.py +0 -0
  650. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/transports/http_stream.py +0 -0
  651. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/mcp_server/transports/stdio.py +0 -0
  652. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/n8n/__init__.py +0 -0
  653. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/n8n/client.py +0 -0
  654. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/n8n/converter.py +0 -0
  655. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/n8n/preview.py +0 -0
  656. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/n8n/reverse_converter.py +0 -0
  657. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/observability/__init__.py +0 -0
  658. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/observability/hooks.py +0 -0
  659. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/observability/langextract.py +0 -0
  660. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/observability/langfuse.py +0 -0
  661. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/__init__.py +0 -0
  662. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/_valkey_client.py +0 -0
  663. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/config.py +0 -0
  664. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/__init__.py +0 -0
  665. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/_sql_base.py +0 -0
  666. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/async_mysql.py +0 -0
  667. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/async_postgres.py +0 -0
  668. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/async_sqlite.py +0 -0
  669. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/base.py +0 -0
  670. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/json_store.py +0 -0
  671. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/mysql.py +0 -0
  672. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/postgres.py +0 -0
  673. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/singlestore.py +0 -0
  674. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/sqlite.py +0 -0
  675. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/supabase.py +0 -0
  676. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/surrealdb.py +0 -0
  677. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/sync_sqlite.py +0 -0
  678. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/conversation/turso.py +0 -0
  679. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/factory.py +0 -0
  680. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/hooks/__init__.py +0 -0
  681. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/hooks/agent_hooks.py +0 -0
  682. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/__init__.py +0 -0
  683. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/base.py +0 -0
  684. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/cassandra.py +0 -0
  685. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/chroma.py +0 -0
  686. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/clickhouse.py +0 -0
  687. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/cosmosdb_vector.py +0 -0
  688. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/couchbase.py +0 -0
  689. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/lancedb.py +0 -0
  690. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/langchain_adapter.py +0 -0
  691. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/lightrag_adapter.py +0 -0
  692. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/llamaindex_adapter.py +0 -0
  693. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/milvus.py +0 -0
  694. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/mongodb_vector.py +0 -0
  695. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/pgvector.py +0 -0
  696. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/pinecone.py +0 -0
  697. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/qdrant.py +0 -0
  698. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/redis_vector.py +0 -0
  699. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/singlestore_vector.py +0 -0
  700. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/surrealdb_vector.py +0 -0
  701. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/upstash_vector.py +0 -0
  702. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/valkey_vector.py +0 -0
  703. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/knowledge/weaviate.py +0 -0
  704. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/migrations/__init__.py +0 -0
  705. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/migrations/manager.py +0 -0
  706. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/orchestrator.py +0 -0
  707. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/registry.py +0 -0
  708. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/state/__init__.py +0 -0
  709. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/state/async_mongodb.py +0 -0
  710. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/state/base.py +0 -0
  711. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/state/dynamodb.py +0 -0
  712. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/state/firestore.py +0 -0
  713. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/state/gcs.py +0 -0
  714. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/state/memory.py +0 -0
  715. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/state/mongodb.py +0 -0
  716. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/state/redis.py +0 -0
  717. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/state/upstash.py +0 -0
  718. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/state/valkey.py +0 -0
  719. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/tests/__init__.py +0 -0
  720. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/tests/test_all_backends.py +0 -0
  721. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/persistence/tests/test_valkey_backends.py +0 -0
  722. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/profiler.py +0 -0
  723. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/push/__init__.py +0 -0
  724. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/push/client.py +0 -0
  725. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/push/transports.py +0 -0
  726. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/recipe/__init__.py +0 -0
  727. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/recipe/bridge.py +0 -0
  728. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/recipe/core.py +0 -0
  729. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/recipe/exceptions.py +0 -0
  730. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/recipe/history.py +0 -0
  731. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/recipe/models.py +0 -0
  732. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/recipe/operations.py +0 -0
  733. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/recipe/policy.py +0 -0
  734. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/recipe/registry.py +0 -0
  735. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/recipe/runtime.py +0 -0
  736. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/recipe/security.py +0 -0
  737. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/recipe/serve.py +0 -0
  738. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/recipe/server.py +0 -0
  739. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/replay/__init__.py +0 -0
  740. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/replay/analyzer.py +0 -0
  741. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/replay/applier.py +0 -0
  742. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/replay/judge.py +0 -0
  743. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/replay/plan.py +0 -0
  744. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/replay/player.py +0 -0
  745. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/replay/reader.py +0 -0
  746. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/replay/storage.py +0 -0
  747. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/replay/writer.py +0 -0
  748. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/sandbox/__init__.py +0 -0
  749. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/sandbox/_compat.py +0 -0
  750. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/sandbox/_registry.py +0 -0
  751. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/sandbox/_shell.py +0 -0
  752. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/sandbox/daytona.py +0 -0
  753. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/sandbox/docker.py +0 -0
  754. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/sandbox/e2b.py +0 -0
  755. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/sandbox/modal.py +0 -0
  756. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/sandbox/sandlock.py +0 -0
  757. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/sandbox/ssh.py +0 -0
  758. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/sandbox/subprocess.py +0 -0
  759. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/__init__.py +0 -0
  760. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/_base_scheduler.py +0 -0
  761. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/_dispatch.py +0 -0
  762. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/agent_scheduler.py +0 -0
  763. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/async_agent_scheduler.py +0 -0
  764. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/base.py +0 -0
  765. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/blueprint_catalogue.py +0 -0
  766. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/condition_gate.py +0 -0
  767. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/daemon_manager.py +0 -0
  768. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/deployment.py +0 -0
  769. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/enhanced_executor.py +0 -0
  770. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/executor.py +0 -0
  771. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/run_policy.py +0 -0
  772. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/shared.py +0 -0
  773. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/state_manager.py +0 -0
  774. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/suggestion_engine.py +0 -0
  775. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/scheduler/yaml_loader.py +0 -0
  776. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/security/__init__.py +0 -0
  777. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/security/audit.py +0 -0
  778. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/security/injection.py +0 -0
  779. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/security/protected.py +0 -0
  780. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/setup/__init__.py +0 -0
  781. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/setup/build.py +0 -0
  782. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/setup/post_install.py +0 -0
  783. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/setup/setup_conda_env.py +0 -0
  784. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/setup.py +0 -0
  785. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/__init__.py +0 -0
  786. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/ai_generator.py +0 -0
  787. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/config.py +0 -0
  788. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/dedupe.py +0 -0
  789. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/discovery.py +0 -0
  790. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/drift.py +0 -0
  791. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/engine.py +0 -0
  792. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/enhanced_templates.py +0 -0
  793. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/example_verifier.py +0 -0
  794. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/manifest.py +0 -0
  795. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/models.py +0 -0
  796. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/reports.py +0 -0
  797. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/templates.py +0 -0
  798. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/undo_redo.py +0 -0
  799. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/standardise/validator.py +0 -0
  800. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/storage/__init__.py +0 -0
  801. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/storage/dynamodb_adapter.py +0 -0
  802. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/storage/mongodb_adapter.py +0 -0
  803. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/storage/postgresql_adapter.py +0 -0
  804. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/storage/redis_adapter.py +0 -0
  805. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/storage/valkey_adapter.py +0 -0
  806. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/suite_runner/__init__.py +0 -0
  807. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/suite_runner/batch_source.py +0 -0
  808. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/suite_runner/cli_docs_source.py +0 -0
  809. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/suite_runner/discovery.py +0 -0
  810. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/suite_runner/docs_source.py +0 -0
  811. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/suite_runner/examples_source.py +0 -0
  812. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/suite_runner/executor.py +0 -0
  813. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/suite_runner/models.py +0 -0
  814. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/suite_runner/report_viewer.py +0 -0
  815. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/suite_runner/reporter.py +0 -0
  816. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/suite_runner/runner.py +0 -0
  817. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/templates/__init__.py +0 -0
  818. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/templates/cache.py +0 -0
  819. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/templates/dependency_checker.py +0 -0
  820. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/templates/discovery.py +0 -0
  821. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/templates/loader.py +0 -0
  822. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/templates/registry.py +0 -0
  823. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/templates/resolver.py +0 -0
  824. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/templates/security.py +0 -0
  825. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/templates/tool_override.py +0 -0
  826. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/templates/tools_doctor.py +0 -0
  827. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/tool_registry.py +0 -0
  828. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/tool_resolver.py +0 -0
  829. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/tools/__init__.py +0 -0
  830. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/tools/audio.py +0 -0
  831. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/tools/glob_tool.py +0 -0
  832. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/tools/grep_tool.py +0 -0
  833. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/tools/kanban_tools.py +0 -0
  834. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/tools/multiedit.py +0 -0
  835. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/tools/skill_manage.py +0 -0
  836. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/train/__init__.py +0 -0
  837. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/train/_ollama.py +0 -0
  838. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/train/agents/__init__.py +0 -0
  839. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/train/agents/grader.py +0 -0
  840. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/train/agents/hook.py +0 -0
  841. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/train/agents/models.py +0 -0
  842. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/train/agents/orchestrator.py +0 -0
  843. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/train/agents/storage.py +0 -0
  844. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/train/llm/__init__.py +0 -0
  845. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/train/llm/trainer.py +0 -0
  846. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/train.py +0 -0
  847. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/train_vision.py +0 -0
  848. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui/_aiui_datastore.py +0 -0
  849. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui/_external_agents.py +0 -0
  850. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui/callbacks.py +0 -0
  851. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui/components/aicoder.py +0 -0
  852. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui/context.py +0 -0
  853. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui/database_config.py +0 -0
  854. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui_agents/__init__.py +0 -0
  855. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui_agents/default_app.py +0 -0
  856. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui_bot/__init__.py +0 -0
  857. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui_bot/default_app.py +0 -0
  858. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui_chat/__init__.py +0 -0
  859. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui_chat/default_app.py +0 -0
  860. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui_dashboard/default_app.py +0 -0
  861. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui_realtime/__init__.py +0 -0
  862. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/ui_realtime/default_app.py +0 -0
  863. {praisonai-4.6.75 → praisonai-4.6.77}/praisonai/upload_vision.py +0 -0
  864. {praisonai-4.6.75 → praisonai-4.6.77}/setup.cfg +0 -0
  865. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test.py +0 -0
  866. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test_agents_playbook.py +0 -0
  867. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test_approval_system.py +0 -0
  868. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test_basic.py +0 -0
  869. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test_cli_features.py +0 -0
  870. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test_custom_tools_fix.py +0 -0
  871. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test_double_api_fix.py +0 -0
  872. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test_n8n_agent_invoke.py +0 -0
  873. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test_n8n_cli_feature.py +0 -0
  874. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test_n8n_integration.py +0 -0
  875. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test_phase2_refactor.py +0 -0
  876. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test_recipe.py +0 -0
  877. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test_registry.py +0 -0
  878. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test_runner.py +0 -0
  879. {praisonai-4.6.75 → praisonai-4.6.77}/tests/test_sandboxed_agent_compatibility.py +0 -0
  880. {praisonai-4.6.75 → praisonai-4.6.77}/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.75
3
+ Version: 4.6.77
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.6.75
14
+ Requires-Dist: praisonaiagents>=1.6.77
15
15
  Requires-Dist: python-dotenv>=0.19.0
16
16
  Requires-Dist: litellm<2,>=1.83.14
17
17
  Requires-Dist: PyYAML>=6.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PraisonAI
3
- Version: 4.6.75
3
+ Version: 4.6.77
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.6.75
14
+ Requires-Dist: praisonaiagents>=1.6.77
15
15
  Requires-Dist: python-dotenv>=0.19.0
16
16
  Requires-Dist: litellm<2,>=1.83.14
17
17
  Requires-Dist: PyYAML>=6.0
@@ -1,7 +1,7 @@
1
1
  rich>=13.7
2
2
  markdown>=3.5
3
3
  pyparsing>=3.0.0
4
- praisonaiagents>=1.6.75
4
+ praisonaiagents>=1.6.77
5
5
  python-dotenv>=0.19.0
6
6
  litellm<2,>=1.83.14
7
7
  PyYAML>=6.0
@@ -18,7 +18,14 @@ if TYPE_CHECKING:
18
18
  class CommandAccessPolicy:
19
19
  """Manages per-command access control for bot commands."""
20
20
 
21
- ALWAYS_ALLOWED = {"help", "whoami"}
21
+ ALWAYS_ALLOWED = frozenset({"help", "whoami"})
22
+
23
+ # Privileged, state-changing commands that default to admin-only whenever a
24
+ # policy is configured (admin_users and/or user_allowed_commands set). They
25
+ # remain available to everyone when no policy is configured, so this stays
26
+ # backward-compatible. /learn reads host sources and authors skills that
27
+ # alter future agent behaviour, so it belongs here.
28
+ PRIVILEGED_COMMANDS = frozenset({"learn"})
22
29
 
23
30
  def __init__(
24
31
  self,
@@ -34,6 +41,15 @@ class CommandAccessPolicy:
34
41
  """
35
42
  self.admin_users = admin_users or set()
36
43
  self.user_allowed_commands = user_allowed_commands
44
+
45
+ @property
46
+ def is_configured(self) -> bool:
47
+ """Whether any access restriction has been configured.
48
+
49
+ When False the policy is permissive (legacy behaviour); when True the
50
+ privileged-command guard applies.
51
+ """
52
+ return bool(self.admin_users) or self.user_allowed_commands is not None
37
53
 
38
54
  def can_run(self, user_id: str, command: str) -> bool:
39
55
  """Check if user can run a specific command.
@@ -52,6 +68,14 @@ class CommandAccessPolicy:
52
68
  # Always-allowed commands are available to everyone
53
69
  if command in self.ALWAYS_ALLOWED:
54
70
  return True
71
+
72
+ # Privileged commands are admin-only once any policy is configured.
73
+ # (Admins were already allowed above.) With no policy configured we
74
+ # fall through to the permissive default below for backward compat.
75
+ if command in self.PRIVILEGED_COMMANDS and self.is_configured:
76
+ if self.user_allowed_commands is not None:
77
+ return command in self.user_allowed_commands
78
+ return False
55
79
 
56
80
  # If no restrictions, all commands are allowed
57
81
  if self.user_allowed_commands is None:
@@ -74,7 +98,11 @@ class CommandAccessPolicy:
74
98
  return all_commands
75
99
 
76
100
  if self.user_allowed_commands is None:
77
- return all_commands
101
+ if not self.is_configured:
102
+ return all_commands
103
+ # admin_users configured but no per-user allow list: everything
104
+ # except privileged commands is available to regular users.
105
+ return all_commands - self.PRIVILEGED_COMMANDS
78
106
 
79
107
  return self.ALWAYS_ALLOWED | (self.user_allowed_commands & all_commands)
80
108
 
@@ -100,6 +128,8 @@ class CommandRegistry:
100
128
  self.register("usage", {"description": "Show token usage and estimated cost", "builtin": True})
101
129
  self.register("compress", {"description": "Compress conversation to free context window", "builtin": True})
102
130
  self.register("queue", {"description": "Queue a follow-up message", "builtin": True})
131
+ # Learn a grounded skill from sources (codebase, docs, PDFs, or this chat)
132
+ self.register("learn", {"description": "Learn a reusable skill from sources you describe (e.g. /learn deploy steps from this repo)", "builtin": True})
103
133
 
104
134
  def register(
105
135
  self,
@@ -250,6 +280,41 @@ def get_command_registry() -> CommandRegistry:
250
280
  return _global_registry
251
281
 
252
282
 
283
+ def build_command_access_policy(config: Any) -> CommandAccessPolicy:
284
+ """Build a :class:`CommandAccessPolicy` from a bot config.
285
+
286
+ Shared by all adapters (Telegram, Slack, Discord) so per-command
287
+ authorization is expressed consistently across channels. Reads the optional
288
+ ``admin_users`` and ``user_allowed_commands`` attributes (comma-separated
289
+ strings) from ``config``; when neither is set the policy is permissive,
290
+ preserving legacy behaviour.
291
+
292
+ Args:
293
+ config: Bot configuration object.
294
+
295
+ Returns:
296
+ A configured CommandAccessPolicy.
297
+ """
298
+ admin_users: Set[str] = set()
299
+ admin_raw = getattr(config, "admin_users", None)
300
+ if admin_raw:
301
+ admin_users = {u.strip() for u in str(admin_raw).split(",") if u.strip()}
302
+
303
+ user_allowed_commands: Optional[Set[str]] = None
304
+ allowed_raw = getattr(config, "user_allowed_commands", None)
305
+ if allowed_raw is not None:
306
+ # An explicitly empty string is a deliberate "allow no extra commands"
307
+ # allow-list (still configured), distinct from None (unset/permissive).
308
+ user_allowed_commands = {
309
+ c.strip() for c in str(allowed_raw).split(",") if c.strip()
310
+ }
311
+
312
+ return CommandAccessPolicy(
313
+ admin_users=admin_users,
314
+ user_allowed_commands=user_allowed_commands,
315
+ )
316
+
317
+
253
318
  def format_status(
254
319
  agent: Optional["Agent"],
255
320
  platform: str,
@@ -673,3 +738,40 @@ def handle_queue_command(
673
738
  if decision == RunDecision.STEERED:
674
739
  return "🧭 Injected into the running task as live guidance."
675
740
  return "⏳ Follow-up queued — it will run after the current task completes."
741
+
742
+
743
+ def handle_learn_command(
744
+ agent: Optional["Agent"],
745
+ request: Optional[str] = None,
746
+ ) -> str:
747
+ """Handle /learn command to author a grounded skill from sources.
748
+
749
+ Drives :meth:`Agent.learn_skill`, which gathers the named sources with the
750
+ agent's existing tools and authors one grounded SKILL.md via ``skill_manage``.
751
+
752
+ Args:
753
+ agent: The bot's agent (must support ``learn_skill``/``learn``).
754
+ request: Description of the sources to learn from and the skill to
755
+ produce, e.g. "deploy steps from this repo and the runbook PDF".
756
+
757
+ Returns:
758
+ Response message with the authored skill summary, or guidance.
759
+ """
760
+ if agent is None:
761
+ return "❌ Learn is not available (no agent configured)."
762
+
763
+ if not request or not request.strip():
764
+ return (
765
+ "ℹ️ Usage: /learn <sources and skill to make>\n"
766
+ "Example: /learn deploy steps from this repo and the runbook PDF"
767
+ )
768
+
769
+ learn_fn = getattr(agent, "learn_skill", None) or getattr(agent, "learn", None)
770
+ if not callable(learn_fn):
771
+ return "❌ This agent does not support learning skills from sources."
772
+
773
+ try:
774
+ result = learn_fn(request.strip())
775
+ return str(result) if result else "✅ Skill authored."
776
+ except Exception as e: # noqa: BLE001 - surface a friendly message
777
+ return f"❌ Could not learn skill: {e}"
@@ -32,7 +32,9 @@ from ._commands import (
32
32
  handle_model_command,
33
33
  handle_usage_command,
34
34
  handle_compress_command,
35
- handle_queue_command
35
+ handle_queue_command,
36
+ handle_learn_command,
37
+ build_command_access_policy,
36
38
  )
37
39
  from ._session import BotSessionManager
38
40
  from ._debounce import InboundDebouncer
@@ -97,6 +99,10 @@ class DiscordBot(ChatCommandMixin, MessageHookMixin):
97
99
  self._message_handlers: List[Callable] = []
98
100
  self._command_handlers: Dict[str, Callable] = {}
99
101
  self._started_at: Optional[float] = None
102
+
103
+ # Per-command authorization, shared with Telegram/Slack so privileged
104
+ # commands (e.g. /learn) can be restricted consistently across channels.
105
+ self._command_policy = build_command_access_policy(self.config)
100
106
  # Use helper to build session manager
101
107
  from ._session import build_session_manager
102
108
  self._session: BotSessionManager = build_session_manager(
@@ -236,6 +242,16 @@ class DiscordBot(ChatCommandMixin, MessageHookMixin):
236
242
 
237
243
  if bot_message.is_command:
238
244
  command = bot_message.command
245
+ # Per-command authorization: privileged commands (e.g. /learn)
246
+ # can be restricted to admins independent of the channel/pairing
247
+ # allow gate, consistent with Telegram and Slack.
248
+ if command and not self._command_policy.can_run(
249
+ str(message.author.id), command
250
+ ):
251
+ await message.reply(
252
+ f"⛔ You are not permitted to run /{command}"
253
+ )
254
+ return
239
255
  if command == "status":
240
256
  await message.reply(self._format_status())
241
257
  return
@@ -278,6 +294,13 @@ class DiscordBot(ChatCommandMixin, MessageHookMixin):
278
294
  response = handle_queue_command(self._session, user_id, message_text)
279
295
  await message.reply(response)
280
296
  return
297
+ elif command == "learn":
298
+ # Extract request text from command
299
+ parts = bot_message.text.split(maxsplit=1)
300
+ request = parts[1] if len(parts) > 1 else None
301
+ response = handle_learn_command(self._agent, request)
302
+ await message.reply(response)
303
+ return
281
304
  elif command and command in self._command_handlers:
282
305
  handler = self._command_handlers[command]
283
306
  try:
@@ -34,7 +34,9 @@ from ._commands import (
34
34
  handle_model_command,
35
35
  handle_usage_command,
36
36
  handle_compress_command,
37
- handle_queue_command
37
+ handle_queue_command,
38
+ handle_learn_command,
39
+ build_command_access_policy,
38
40
  )
39
41
  from ._session import BotSessionManager
40
42
  from ._debounce import InboundDebouncer
@@ -110,6 +112,10 @@ class SlackBot(ChatCommandMixin, MessageHookMixin):
110
112
  self._message_handlers: List[Callable] = []
111
113
  self._command_handlers: Dict[str, Callable] = {}
112
114
  self._started_at: Optional[float] = None
115
+
116
+ # Per-command authorization, shared with Telegram/Discord so privileged
117
+ # commands (e.g. /learn) can be restricted consistently across channels.
118
+ self._command_policy = build_command_access_policy(self.config)
113
119
 
114
120
  # Use helper to build session manager
115
121
  from ._session import build_session_manager
@@ -229,6 +235,18 @@ class SlackBot(ChatCommandMixin, MessageHookMixin):
229
235
  return
230
236
 
231
237
  text = event.get("text", "").strip()
238
+ # Per-command authorization: privileged commands (e.g. /learn) can be
239
+ # restricted to admins independent of the channel/pairing allow gate,
240
+ # consistent with Telegram and Discord.
241
+ if text.startswith("/"):
242
+ command_name = text[1:].split(maxsplit=1)[0].lower() if len(text) > 1 else ""
243
+ cmd_user_id = event.get("user", "unknown")
244
+ if command_name and not self._command_policy.can_run(cmd_user_id, command_name):
245
+ await say(
246
+ text=f"⛔ You are not permitted to run /{command_name}",
247
+ thread_ts=event.get("ts"),
248
+ )
249
+ return
232
250
  if text == "/status":
233
251
  await say(text=self._format_status(), thread_ts=event.get("ts"))
234
252
  return
@@ -269,6 +287,12 @@ class SlackBot(ChatCommandMixin, MessageHookMixin):
269
287
  response = handle_queue_command(self._session, user_id, message_text)
270
288
  await say(text=response, thread_ts=event.get("ts"))
271
289
  return
290
+ elif text.split(maxsplit=1)[:1] == ["/learn"]:
291
+ parts = text.split(maxsplit=1)
292
+ request = parts[1] if len(parts) > 1 else None
293
+ response = handle_learn_command(self._agent, request)
294
+ await say(text=response, thread_ts=event.get("ts"))
295
+ return
272
296
 
273
297
  for handler in self._message_handlers:
274
298
  try:
@@ -425,6 +449,13 @@ class SlackBot(ChatCommandMixin, MessageHookMixin):
425
449
  @self._app.command(f"/{command}")
426
450
  async def handle_command(ack, command_data, respond, cmd=command, hdlr=handler):
427
451
  await ack()
452
+ # Per-command authorization for registered slash commands, mirroring
453
+ # the message-event gate so privileged commands can't bypass policy.
454
+ if not self._command_policy.can_run(
455
+ command_data.get("user_id", ""), cmd
456
+ ):
457
+ await respond(f"⛔ You are not permitted to run /{cmd}")
458
+ return
428
459
  bot_message = BotMessage(
429
460
  message_id=command_data.get("trigger_id", ""),
430
461
  content=command_data.get("text", ""),
@@ -36,7 +36,8 @@ from ._commands import (
36
36
  handle_usage_command,
37
37
  handle_compress_command,
38
38
  handle_queue_command,
39
- CommandAccessPolicy,
39
+ handle_learn_command,
40
+ build_command_access_policy,
40
41
  get_command_registry
41
42
  )
42
43
  from ._session import BotSessionManager
@@ -211,23 +212,14 @@ class TelegramBot(ChatCommandMixin, MessageHookMixin):
211
212
  self._auto_tts = enabled
212
213
 
213
214
  def _init_command_access_policy(self):
214
- """Initialize command access policy from config."""
215
- # Parse admin users from config
216
- admin_users = set()
217
- if hasattr(self.config, 'admin_users') and self.config.admin_users:
218
- admin_users = set(user.strip() for user in self.config.admin_users.split(',') if user.strip())
219
-
220
- # Parse user allowed commands from config
221
- user_allowed_commands = None
222
- if hasattr(self.config, 'user_allowed_commands') and self.config.user_allowed_commands:
223
- user_allowed_commands = set(cmd.strip() for cmd in self.config.user_allowed_commands.split(',') if cmd.strip())
224
-
225
- # Create command access policy
226
- self._command_policy = CommandAccessPolicy(
227
- admin_users=admin_users,
228
- user_allowed_commands=user_allowed_commands
229
- )
230
-
215
+ """Initialize command access policy from config.
216
+
217
+ Uses the shared :func:`build_command_access_policy` builder so every
218
+ adapter (Telegram, Slack, Discord) parses ``admin_users`` /
219
+ ``user_allowed_commands`` identically and can't silently diverge.
220
+ """
221
+ self._command_policy = build_command_access_policy(self.config)
222
+
231
223
  # Get the global command registry
232
224
  self._command_registry = get_command_registry()
233
225
 
@@ -757,7 +749,22 @@ class TelegramBot(ChatCommandMixin, MessageHookMixin):
757
749
  message_text = parts[1] if len(parts) > 1 else None
758
750
  response = handle_queue_command(self._session, user_id, message_text)
759
751
  await update.message.reply_text(response)
760
-
752
+
753
+ async def handle_learn(update: Update, context: ContextTypes.DEFAULT_TYPE):
754
+ if not update.message or not update.message.text:
755
+ return
756
+ message = await process_inbound_telegram_message(update, self)
757
+ if not message:
758
+ return
759
+ user_id = message.sender.user_id if message.sender else "unknown"
760
+ if not self._command_policy.can_run(user_id, "learn"):
761
+ await update.message.reply_text("⛔ You are not permitted to run /learn")
762
+ return
763
+ parts = update.message.text.split(maxsplit=1)
764
+ request = parts[1] if len(parts) > 1 else None
765
+ response = handle_learn_command(self._agent, request)
766
+ await update.message.reply_text(response)
767
+
761
768
  self._application.add_handler(CommandHandler("status", handle_status))
762
769
  self._application.add_handler(CommandHandler("new", handle_new))
763
770
  self._application.add_handler(CommandHandler("help", handle_help))
@@ -767,6 +774,7 @@ class TelegramBot(ChatCommandMixin, MessageHookMixin):
767
774
  self._application.add_handler(CommandHandler("usage", handle_usage))
768
775
  self._application.add_handler(CommandHandler("compress", handle_compress))
769
776
  self._application.add_handler(CommandHandler("queue", handle_queue))
777
+ self._application.add_handler(CommandHandler("learn", handle_learn))
770
778
 
771
779
  for command in self._command_handlers:
772
780
  self._application.add_handler(CommandHandler(command, handle_command))
@@ -78,6 +78,49 @@ def skills_create(
78
78
  sys.argv = original_argv
79
79
 
80
80
 
81
+ @app.command("learn")
82
+ def skills_learn(
83
+ request: str = typer.Argument(
84
+ ...,
85
+ help="Sources to learn from and the skill to make, e.g. "
86
+ "\"deploy steps from ./repo and the runbook PDF\"",
87
+ ),
88
+ llm: str = typer.Option(None, "--llm", "-m", help="LLM model to use"),
89
+ ):
90
+ """Author a grounded, reusable skill from sources you describe.
91
+
92
+ Points an agent at the sources you name (code, docs, PDFs, configs) and
93
+ distils one grounded SKILL.md via the existing skill tools.
94
+
95
+ This is the **skill authoring** path — distinct from ``praisonai memory
96
+ learn`` (which captures a recall note) and the memory ``learn=`` param.
97
+
98
+ Example:
99
+ praisonai skills learn "deploy steps from ./repo and the runbook PDF"
100
+ """
101
+ try:
102
+ from praisonaiagents import Agent
103
+ except ImportError as e:
104
+ typer.echo(f"Error: praisonaiagents is required for 'skills learn': {e}", err=True)
105
+ raise typer.Exit(1)
106
+
107
+ agent_kwargs = {}
108
+ if llm:
109
+ agent_kwargs["llm"] = llm
110
+
111
+ agent = Agent(
112
+ instructions="You author grounded, reusable Agent Skills from real sources.",
113
+ **agent_kwargs,
114
+ )
115
+ try:
116
+ result = agent.learn_skill(request)
117
+ except Exception as e: # noqa: BLE001 - surface a friendly message
118
+ typer.echo(f"Error: {e}", err=True)
119
+ raise typer.Exit(1)
120
+ if result:
121
+ typer.echo(str(result))
122
+
123
+
81
124
  @app.command("install")
82
125
  def skills_install(
83
126
  source: str = typer.Argument(..., help="Skill source (local path or https:// git URL)"),
@@ -133,12 +133,27 @@ class BaseFormatter:
133
133
  """Format a single check result."""
134
134
  raise NotImplementedError
135
135
 
136
+ def _safe_write(self, output: TextIO, text: str) -> None:
137
+ """Write text, falling back to ASCII on legacy-console encoding errors.
138
+
139
+ On Windows consoles using a legacy code page (e.g. cp1252), writing
140
+ Unicode characters raises UnicodeEncodeError. When that happens we
141
+ retry with an ASCII-safe representation so the command never crashes.
142
+ """
143
+ try:
144
+ output.write(text)
145
+ except UnicodeEncodeError:
146
+ encoding = getattr(output, "encoding", None) or "ascii"
147
+ safe_text = text.encode(encoding, errors="replace").decode(encoding, errors="replace")
148
+ output.write(safe_text)
149
+
136
150
  def write(self, report: DoctorReport, output: Optional[TextIO] = None) -> None:
137
151
  """Write formatted report to output."""
138
152
  output = output or sys.stdout
139
- output.write(self.format_report(report))
140
- if not self.format_report(report).endswith("\n"):
141
- output.write("\n")
153
+ rendered = self.format_report(report)
154
+ if not rendered.endswith("\n"):
155
+ rendered += "\n"
156
+ self._safe_write(output, rendered)
142
157
 
143
158
 
144
159
  class TextFormatter(BaseFormatter):
@@ -193,11 +208,20 @@ class TextFormatter(BaseFormatter):
193
208
  CheckStatus.ERROR: "[X]",
194
209
  }
195
210
 
211
+ # Divider character with ASCII fallback for legacy (cp1252) consoles
212
+ DIVIDER_UNICODE = "━"
213
+ DIVIDER_ASCII = "-"
214
+
196
215
  def _color(self, text: str, color: str) -> str:
197
216
  """Apply color to text if colors are enabled."""
198
217
  if self.no_color:
199
218
  return text
200
219
  return f"{self.COLORS.get(color, '')}{text}{self.COLORS['reset']}"
220
+
221
+ def _divider(self, width: int = 70) -> str:
222
+ """Return a horizontal divider, using ASCII on non-Unicode consoles."""
223
+ char = self.DIVIDER_UNICODE if self._unicode_supported else self.DIVIDER_ASCII
224
+ return char * width
201
225
 
202
226
  def _can_encode_unicode(self) -> bool:
203
227
  """Check if stdout can encode Unicode symbols."""
@@ -210,7 +234,7 @@ class TextFormatter(BaseFormatter):
210
234
  return True
211
235
 
212
236
  # Test if we can encode our specific Unicode symbols
213
- test_symbols = ["✓", "⚠", "✗", "○"]
237
+ test_symbols = ["✓", "⚠", "✗", "○", self.DIVIDER_UNICODE]
214
238
  for symbol in test_symbols:
215
239
  try:
216
240
  symbol.encode(encoding, errors='strict')
@@ -276,7 +300,7 @@ class TextFormatter(BaseFormatter):
276
300
  if not self.quiet:
277
301
  header = f"PraisonAI Doctor v{report.version}"
278
302
  lines.append(self._color(header, "bold"))
279
- lines.append("━" * 70)
303
+ lines.append(self._divider())
280
304
 
281
305
  # Results
282
306
  for result in report.results:
@@ -284,7 +308,7 @@ class TextFormatter(BaseFormatter):
284
308
 
285
309
  # Summary
286
310
  if not self.quiet:
287
- lines.append("━" * 70)
311
+ lines.append(self._divider())
288
312
  lines.append(self.format_summary(report.summary))
289
313
 
290
314
  # Duration
@@ -313,11 +337,9 @@ class JsonFormatter(BaseFormatter):
313
337
  # Ensure deterministic ordering
314
338
  return json.dumps(data, indent=2, sort_keys=True)
315
339
 
316
- def write(self, report: DoctorReport, output: Optional[TextIO] = None) -> None:
317
- """Write formatted report to output."""
318
- output = output or sys.stdout
319
- output.write(self.format_report(report))
320
- output.write("\n")
340
+ # write() is inherited from BaseFormatter: it appends a trailing newline
341
+ # when absent (json.dumps never emits one) and routes through _safe_write,
342
+ # so the behaviour is identical and no override is needed.
321
343
 
322
344
 
323
345
  def get_formatter(
@@ -519,7 +519,7 @@ class DoctorHandler(CommandHandler):
519
519
 
520
520
  # Write output
521
521
  if config.output_path:
522
- with open(config.output_path, "w") as f:
522
+ with open(config.output_path, "w", encoding="utf-8") as f:
523
523
  formatter.write(report, f)
524
524
  if not config.quiet:
525
525
  print(f"Report written to: {config.output_path}")
@@ -0,0 +1 @@
1
+ __version__ = "4.6.77"
@@ -12,7 +12,7 @@ dependencies = [
12
12
  "rich>=13.7",
13
13
  "markdown>=3.5",
14
14
  "pyparsing>=3.0.0",
15
- "praisonaiagents>=1.6.75",
15
+ "praisonaiagents>=1.6.77",
16
16
  "python-dotenv>=0.19.0",
17
17
  "litellm>=1.83.14,<2",
18
18
  "PyYAML>=6.0",
@@ -1 +0,0 @@
1
- __version__ = "4.6.75"
File without changes