praisonai-code 0.1.2__tar.gz → 0.1.4__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 (341) hide show
  1. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/PKG-INFO +43 -1
  2. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/README.md +42 -0
  3. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/__init__.py +1 -1
  4. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/app.py +169 -65
  5. praisonai_code-0.1.4/praisonai_code/cli/commands/browser_tool.py +455 -0
  6. praisonai_code-0.1.4/praisonai_code/cli/commands/call.py +62 -0
  7. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/chat.py +112 -4
  8. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/code.py +204 -3
  9. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/config.py +55 -20
  10. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/eval.py +13 -3
  11. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/github.py +15 -1
  12. praisonai_code-0.1.4/praisonai_code/cli/commands/hooks.py +39 -0
  13. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/memory.py +34 -5
  14. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/plugins.py +24 -1
  15. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/retrieval.py +4 -3
  16. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/run.py +3 -2
  17. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/serve.py +88 -6
  18. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/session.py +84 -0
  19. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/todo.py +2 -2
  20. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/up.py +56 -29
  21. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/config_loader.py +4 -2
  22. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/configuration/__init__.py +10 -0
  23. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/configuration/paths.py +95 -0
  24. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/action_orchestrator.py +20 -0
  25. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/agent_tools.py +18 -16
  26. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/compaction.py +28 -5
  27. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/memory_checks.py +43 -8
  28. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/skills_checks.py +46 -11
  29. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/file_history.py +21 -2
  30. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/git_integration.py +13 -4
  31. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/interactive_tools.py +259 -6
  32. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/knowledge.py +13 -1
  33. praisonai_code-0.1.4/praisonai_code/cli/features/os_sandbox.py +281 -0
  34. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/output_style.py +28 -5
  35. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/queue/models.py +10 -2
  36. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/queue/persistence.py +23 -4
  37. praisonai_code-0.1.4/praisonai_code/cli/features/shell_exec.py +452 -0
  38. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/slash_commands.py +37 -5
  39. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/thinking.py +28 -5
  40. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/todo.py +44 -2
  41. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/interactive/async_tui.py +723 -54
  42. praisonai_code-0.1.4/praisonai_code/cli/interactive/attachments.py +47 -0
  43. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/interactive/command_registry.py +52 -1
  44. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/interactive/config.py +1 -1
  45. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/interactive/repl.py +18 -2
  46. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/legacy/praison_ai.py +34 -11
  47. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/unified_schema.py +5 -1
  48. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/utils/project.py +95 -10
  49. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/llm/local_detect.py +103 -31
  50. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/runtime/server.py +42 -0
  51. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code.egg-info/PKG-INFO +43 -1
  52. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code.egg-info/SOURCES.txt +3 -0
  53. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/pyproject.toml +1 -1
  54. praisonai_code-0.1.2/praisonai_code/cli/commands/browser_tool.py +0 -299
  55. praisonai_code-0.1.2/praisonai_code/cli/commands/call.py +0 -35
  56. praisonai_code-0.1.2/praisonai_code/cli/commands/hooks.py +0 -44
  57. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/__main__.py +0 -0
  58. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/_bot_bridge.py +0 -0
  59. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/_browser_bridge.py +0 -0
  60. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/_deploy_bridge.py +0 -0
  61. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/_framework_availability.py +0 -0
  62. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/_logging.py +0 -0
  63. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/_mcp_bridge.py +0 -0
  64. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/_registry.py +0 -0
  65. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/_safe_loader.py +0 -0
  66. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/_train_bridge.py +0 -0
  67. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/_version.py +0 -0
  68. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/_wrapper_bridge.py +0 -0
  69. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/__init__.py +0 -0
  70. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/_forward_shim.py +0 -0
  71. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/_paths.py +0 -0
  72. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/_warnings.py +0 -0
  73. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/_wrapper_reexport.py +0 -0
  74. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/approval_backend.py +0 -0
  75. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/branding.py +0 -0
  76. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/__init__.py +0 -0
  77. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/acp.py +0 -0
  78. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/agent.py +0 -0
  79. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/agents.py +0 -0
  80. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/attach.py +0 -0
  81. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/auth.py +0 -0
  82. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/backends.py +0 -0
  83. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/benchmark.py +0 -0
  84. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/checkpoint.py +0 -0
  85. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/command.py +0 -0
  86. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/commit.py +0 -0
  87. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/completion.py +0 -0
  88. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/daemon.py +0 -0
  89. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/debug.py +0 -0
  90. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/diag.py +0 -0
  91. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/doctor.py +0 -0
  92. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/endpoints.py +0 -0
  93. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/environment.py +0 -0
  94. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/init.py +0 -0
  95. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/init_team.py +0 -0
  96. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/loop.py +0 -0
  97. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/lsp.py +0 -0
  98. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/models.py +0 -0
  99. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/obs.py +0 -0
  100. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/package.py +0 -0
  101. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/paths.py +0 -0
  102. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/permissions.py +0 -0
  103. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/port.py +0 -0
  104. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/publish.py +0 -0
  105. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/registry.py +0 -0
  106. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/research.py +0 -0
  107. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/rules.py +0 -0
  108. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/sandbox.py +0 -0
  109. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/setup.py +0 -0
  110. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/skills.py +0 -0
  111. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/templates.py +0 -0
  112. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/test.py +0 -0
  113. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/tools.py +0 -0
  114. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/traces.py +0 -0
  115. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/tracker.py +0 -0
  116. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/ui.py +0 -0
  117. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/uninstall.py +0 -0
  118. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/upgrade.py +0 -0
  119. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/usage.py +0 -0
  120. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/version.py +0 -0
  121. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/commands/workflow.py +0 -0
  122. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/configuration/config.schema.json +0 -0
  123. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/configuration/credentials.py +0 -0
  124. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/configuration/loader.py +0 -0
  125. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/configuration/model_resolver.py +0 -0
  126. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/configuration/oauth.py +0 -0
  127. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/configuration/resolver.py +0 -0
  128. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/configuration/schema.py +0 -0
  129. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/execution/__init__.py +0 -0
  130. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/execution/core.py +0 -0
  131. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/execution/profiler.py +0 -0
  132. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/execution/request.py +0 -0
  133. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/execution/result.py +0 -0
  134. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/fallback_schema.py +0 -0
  135. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/__init__.py +0 -0
  136. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/_approval_bridge.py +0 -0
  137. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/_endpoint_registry.py +0 -0
  138. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/_search_registry.py +0 -0
  139. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/agent_scaffold.py +0 -0
  140. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/agents.py +0 -0
  141. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/at_mentions.py +0 -0
  142. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/audit_cli.py +0 -0
  143. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/auto_memory.py +0 -0
  144. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/auto_mode.py +0 -0
  145. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/autonomy_mode.py +0 -0
  146. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/background.py +0 -0
  147. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/base.py +0 -0
  148. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/benchmark.py +0 -0
  149. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/capabilities.py +0 -0
  150. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/checkpoints.py +0 -0
  151. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/cli_profiler.py +0 -0
  152. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/code_intelligence.py +0 -0
  153. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/compare.py +0 -0
  154. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/config_hierarchy.py +0 -0
  155. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/context_manager.py +0 -0
  156. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/cost_tracker.py +0 -0
  157. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/csv_test_runner.py +0 -0
  158. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/custom_definitions.py +0 -0
  159. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/debug.py +0 -0
  160. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/deploy.py +0 -0
  161. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/diag.py +0 -0
  162. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/display_jsonl.py +0 -0
  163. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/__init__.py +0 -0
  164. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/__init__.py +0 -0
  165. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/_wrapper_checks.py +0 -0
  166. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/acp_checks.py +0 -0
  167. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/bot_checks.py +0 -0
  168. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/config_checks.py +0 -0
  169. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/db_checks.py +0 -0
  170. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/env_checks.py +0 -0
  171. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/gateway_checks.py +0 -0
  172. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/lsp_checks.py +0 -0
  173. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/mcp_checks.py +0 -0
  174. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/network_checks.py +0 -0
  175. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/obs_checks.py +0 -0
  176. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/packaging_checks.py +0 -0
  177. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/performance_checks.py +0 -0
  178. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/permissions_checks.py +0 -0
  179. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/runtime_checks.py +0 -0
  180. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/runtime_migration_checks.py +0 -0
  181. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/selftest_checks.py +0 -0
  182. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/serve_checks.py +0 -0
  183. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/checks/tools_checks.py +0 -0
  184. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/engine.py +0 -0
  185. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/formatters.py +0 -0
  186. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/handler.py +0 -0
  187. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/models.py +0 -0
  188. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/doctor/registry.py +0 -0
  189. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/endpoints.py +0 -0
  190. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/eval.py +0 -0
  191. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/examples.py +0 -0
  192. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/external_agents.py +0 -0
  193. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/fast_context.py +0 -0
  194. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/flow_display.py +0 -0
  195. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/git_attribution.py +0 -0
  196. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/guardrail.py +0 -0
  197. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/handoff.py +0 -0
  198. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/hooks.py +0 -0
  199. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/hybrid_workflow.py +0 -0
  200. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/image.py +0 -0
  201. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/interactive_core_headless.py +0 -0
  202. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/interactive_runtime.py +0 -0
  203. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/interactive_test_harness.py +0 -0
  204. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/interactive_tui.py +0 -0
  205. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/job_workflow.py +0 -0
  206. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/jobs.py +0 -0
  207. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/knowledge_cli.py +0 -0
  208. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/lite.py +0 -0
  209. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/logs.py +0 -0
  210. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/lsp_cli.py +0 -0
  211. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/lsp_diagnostics.py +0 -0
  212. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/mcp.py +0 -0
  213. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/message_queue.py +0 -0
  214. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/metrics.py +0 -0
  215. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/migrate.py +0 -0
  216. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/migration_flow.py +0 -0
  217. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/migration_spec.py +0 -0
  218. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/n8n.py +0 -0
  219. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/observability.py +0 -0
  220. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/ollama.py +0 -0
  221. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/output_modes.py +0 -0
  222. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/package.py +0 -0
  223. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/performance.py +0 -0
  224. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/persistence.py +0 -0
  225. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/profiler/__init__.py +0 -0
  226. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/profiler/core.py +0 -0
  227. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/profiler/optimizations.py +0 -0
  228. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/profiler/suite.py +0 -0
  229. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/queue/__init__.py +0 -0
  230. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/queue/manager.py +0 -0
  231. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/queue/scheduler.py +0 -0
  232. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/queue/worker.py +0 -0
  233. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/recipe_creator.py +0 -0
  234. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/recipe_prompts.py +0 -0
  235. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/registry.py +0 -0
  236. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/repo_map.py +0 -0
  237. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/router.py +0 -0
  238. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/safe_shell.py +0 -0
  239. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/sandbox_executor.py +0 -0
  240. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/sdk_knowledge.py +0 -0
  241. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/self_manage.py +0 -0
  242. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/session.py +0 -0
  243. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/session_checkpoints.py +0 -0
  244. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/setup/__init__.py +0 -0
  245. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/setup/handler.py +0 -0
  246. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/setup/templates.py +0 -0
  247. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/skills.py +0 -0
  248. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/telemetry.py +0 -0
  249. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tools.py +0 -0
  250. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/__init__.py +0 -0
  251. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/cli.py +0 -0
  252. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/config.py +0 -0
  253. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/debug.py +0 -0
  254. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/events.py +0 -0
  255. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/mock_provider.py +0 -0
  256. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/orchestrator.py +0 -0
  257. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/screens/__init__.py +0 -0
  258. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/screens/help.py +0 -0
  259. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/screens/main.py +0 -0
  260. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/screens/queue.py +0 -0
  261. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/screens/session.py +0 -0
  262. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/screens/settings.py +0 -0
  263. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/session_store.py +0 -0
  264. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/widgets/__init__.py +0 -0
  265. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/widgets/chat.py +0 -0
  266. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/widgets/command_popup.py +0 -0
  267. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/widgets/composer.py +0 -0
  268. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/widgets/file_popup.py +0 -0
  269. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/widgets/queue_panel.py +0 -0
  270. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/widgets/status.py +0 -0
  271. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/tui/widgets/tool_panel.py +0 -0
  272. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/wizard.py +0 -0
  273. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/workflow.py +0 -0
  274. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/features/yaml_utils.py +0 -0
  275. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/help_categories.py +0 -0
  276. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/interactive/__init__.py +0 -0
  277. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/interactive/core.py +0 -0
  278. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/interactive/events.py +0 -0
  279. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/interactive/frontends/__init__.py +0 -0
  280. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/interactive/frontends/rich_frontend.py +0 -0
  281. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/interactive/frontends/textual_frontend.py +0 -0
  282. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/interactive/praison_io.py +0 -0
  283. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/interactive/split_tui.py +0 -0
  284. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/interactive/tui_app.py +0 -0
  285. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/legacy/__init__.py +0 -0
  286. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/legacy/env_security.py +0 -0
  287. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/legacy/prompt_dispatch.py +0 -0
  288. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/main.py +0 -0
  289. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/output/__init__.py +0 -0
  290. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/output/console.py +0 -0
  291. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/output/event_bridge.py +0 -0
  292. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/schedule_cli.py +0 -0
  293. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/schema_provider.py +0 -0
  294. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/session/__init__.py +0 -0
  295. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/session/resume.py +0 -0
  296. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/session/unified.py +0 -0
  297. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/state/__init__.py +0 -0
  298. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/state/identifiers.py +0 -0
  299. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/state/project_sessions.py +0 -0
  300. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/state/redact.py +0 -0
  301. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/state/session_resolver.py +0 -0
  302. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/state/sessions.py +0 -0
  303. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/ui/__init__.py +0 -0
  304. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/ui/config.py +0 -0
  305. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/ui/events.py +0 -0
  306. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/ui/mg_backend.py +0 -0
  307. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/ui/plain.py +0 -0
  308. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/ui/rich_backend.py +0 -0
  309. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/utils/append_prompt.py +0 -0
  310. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/utils/env_utils.py +0 -0
  311. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli/utils/stdin.py +0 -0
  312. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli_backends/__init__.py +0 -0
  313. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli_backends/_errors.py +0 -0
  314. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli_backends/claude.py +0 -0
  315. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli_backends/codex.py +0 -0
  316. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli_backends/gemini.py +0 -0
  317. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli_backends/grok.py +0 -0
  318. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/cli_backends/registry.py +0 -0
  319. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/data/__init__.py +0 -0
  320. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/data/fixtures/interactive/multi_agent.csv +0 -0
  321. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/data/fixtures/interactive/refactor.csv +0 -0
  322. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/data/fixtures/interactive/smoke.csv +0 -0
  323. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/data/fixtures/interactive/tools.csv +0 -0
  324. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/integration/__init__.py +0 -0
  325. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/integration/context_files.py +0 -0
  326. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/llm/__init__.py +0 -0
  327. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/llm/catalogue.py +0 -0
  328. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/llm/config.py +0 -0
  329. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/llm/credentials.py +0 -0
  330. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/llm/env.py +0 -0
  331. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/runtime/__init__.py +0 -0
  332. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/runtime/__main__.py +0 -0
  333. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/runtime/client.py +0 -0
  334. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/runtime/descriptor.py +0 -0
  335. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/tool_registry.py +0 -0
  336. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code/tool_resolver.py +0 -0
  337. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code.egg-info/dependency_links.txt +0 -0
  338. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code.egg-info/entry_points.txt +0 -0
  339. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code.egg-info/requires.txt +0 -0
  340. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/praisonai_code.egg-info/top_level.txt +0 -0
  341. {praisonai_code-0.1.2 → praisonai_code-0.1.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: praisonai-code
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: Agentic terminal CLI for PraisonAI — the terminal-native agent (run, chat, code, runtime, cli backends) extracted from the praisonai wrapper.
5
5
  Author: Mervin Praison
6
6
  License: MIT
@@ -139,3 +139,45 @@ python -c "import praisonai_code; print(praisonai_code.__version__)"
139
139
 
140
140
  **PyPI:** Published as `praisonai-code` after `praisonaiagents` in the
141
141
  three-package release order (see `pypi-release.yml`).
142
+
143
+ ## Shell execution (`PRAISON_SHELL`)
144
+
145
+ `execute_command` runs argv directly (`shell=False`) as a prompt-injection
146
+ defence. Shell operators — `&&`, `||`, `|`, `>`, `>>`, `;`, `` ` ``, `$(` — are
147
+ therefore **not** interpreted, and a command containing one is refused rather
148
+ than run with the operator silently dropped. (Dropping it and returning exit 0
149
+ gives the model nothing to correct on; a redirect that creates no file must not
150
+ report success.)
151
+
152
+ | `PRAISON_SHELL` | Behaviour |
153
+ |---|---|
154
+ | unset / `off` (default) | Shell syntax is refused with an explanation. Plain commands run as before. |
155
+ | `sandboxed` | A real `/bin/sh -c` runs inside OS-native containment — Seatbelt (`sandbox-exec`) on macOS, bubblewrap on Linux — restricted to the workspace plus the temp dir, network denied. |
156
+ | `unsafe` | A real `/bin/sh -c` with no containment. Opt-in only; never used as a fallback. |
157
+
158
+ `sandboxed` mode **measures** enforcement before trusting it: it runs a probe
159
+ child that tries to write outside the writable set, and refuses to run at all
160
+ if that write succeeds. It never degrades quietly to an uncontained shell.
161
+ Approval is unchanged — the real-shell path is gated by the same
162
+ `require_approval(risk_level="critical")` guard, under the same
163
+ `execute_command` tool identity.
164
+
165
+ ## Session commands
166
+
167
+ | Command | Does |
168
+ |---|---|
169
+ | `/compact [strategy]` | Compact the conversation context (frees tokens). Runs automatically at a turn boundary when the session nears the model's budget. |
170
+ | `/compact-display` (`/dense`) | Toggle compact *output* rendering — the old meaning of `/compact`. |
171
+ | `/map [path]` | Ranked repository map (tree-sitter symbol extraction). |
172
+ | `/git-status`, `/git-diff`, `/git-log [n]`, `/git-commit [msg]`, `/git-undo` | Git from inside the session. `/git-commit` generates a message from the staged diff when none is given. |
173
+
174
+ MCP servers declared under `mcp.servers` in project config are loaded into the
175
+ code session's tool set. Disable with `PRAISON_TOOLS_DISABLE=mcp`.
176
+
177
+ **Trust gate.** Project-declared **local (stdio)** MCP servers spawn a
178
+ subprocess on the host, so a cloned repository could run a repo-controlled
179
+ script the moment the session opens. They are therefore **not** started
180
+ automatically: set `PRAISONAI_MCP_TRUST=1` to allow the current workspace to
181
+ start its local MCP subprocesses. Remote (URL) servers spawn no local process
182
+ and are unaffected. Config is resolved from the selected `--workspace`, not the
183
+ process working directory.
@@ -117,3 +117,45 @@ python -c "import praisonai_code; print(praisonai_code.__version__)"
117
117
 
118
118
  **PyPI:** Published as `praisonai-code` after `praisonaiagents` in the
119
119
  three-package release order (see `pypi-release.yml`).
120
+
121
+ ## Shell execution (`PRAISON_SHELL`)
122
+
123
+ `execute_command` runs argv directly (`shell=False`) as a prompt-injection
124
+ defence. Shell operators — `&&`, `||`, `|`, `>`, `>>`, `;`, `` ` ``, `$(` — are
125
+ therefore **not** interpreted, and a command containing one is refused rather
126
+ than run with the operator silently dropped. (Dropping it and returning exit 0
127
+ gives the model nothing to correct on; a redirect that creates no file must not
128
+ report success.)
129
+
130
+ | `PRAISON_SHELL` | Behaviour |
131
+ |---|---|
132
+ | unset / `off` (default) | Shell syntax is refused with an explanation. Plain commands run as before. |
133
+ | `sandboxed` | A real `/bin/sh -c` runs inside OS-native containment — Seatbelt (`sandbox-exec`) on macOS, bubblewrap on Linux — restricted to the workspace plus the temp dir, network denied. |
134
+ | `unsafe` | A real `/bin/sh -c` with no containment. Opt-in only; never used as a fallback. |
135
+
136
+ `sandboxed` mode **measures** enforcement before trusting it: it runs a probe
137
+ child that tries to write outside the writable set, and refuses to run at all
138
+ if that write succeeds. It never degrades quietly to an uncontained shell.
139
+ Approval is unchanged — the real-shell path is gated by the same
140
+ `require_approval(risk_level="critical")` guard, under the same
141
+ `execute_command` tool identity.
142
+
143
+ ## Session commands
144
+
145
+ | Command | Does |
146
+ |---|---|
147
+ | `/compact [strategy]` | Compact the conversation context (frees tokens). Runs automatically at a turn boundary when the session nears the model's budget. |
148
+ | `/compact-display` (`/dense`) | Toggle compact *output* rendering — the old meaning of `/compact`. |
149
+ | `/map [path]` | Ranked repository map (tree-sitter symbol extraction). |
150
+ | `/git-status`, `/git-diff`, `/git-log [n]`, `/git-commit [msg]`, `/git-undo` | Git from inside the session. `/git-commit` generates a message from the staged diff when none is given. |
151
+
152
+ MCP servers declared under `mcp.servers` in project config are loaded into the
153
+ code session's tool set. Disable with `PRAISON_TOOLS_DISABLE=mcp`.
154
+
155
+ **Trust gate.** Project-declared **local (stdio)** MCP servers spawn a
156
+ subprocess on the host, so a cloned repository could run a repo-controlled
157
+ script the moment the session opens. They are therefore **not** started
158
+ automatically: set `PRAISONAI_MCP_TRUST=1` to allow the current workspace to
159
+ start its local MCP subprocesses. Remote (URL) servers spawn no local process
160
+ and are unaffected. Config is resolved from the selected `--workspace`, not the
161
+ process working directory.
@@ -12,6 +12,6 @@ the remaining terminal-agent modules, with PEP 562 shims left behind at the
12
12
  old ``praisonai.*`` paths for backward compatibility.
13
13
  """
14
14
 
15
- __version__ = "0.1.2"
15
+ __version__ = "0.1.4"
16
16
 
17
17
  __all__ = ["__version__"]
@@ -157,18 +157,18 @@ _LAZY_COMMANDS: Dict[str, Tuple[str, str, str]] = {
157
157
  "diag": (".commands.diag", "app", "Diagnostics export"),
158
158
  "doctor": (".commands.doctor", "app", "Health checks and diagnostics"),
159
159
  "setup": (".commands.setup", "app", "Interactive onboarding / configuration wizard"),
160
- "onboard": (".commands.onboard", "app", "Messaging bot onboarding wizard"),
160
+ "onboard": ("praisonai_bot.cli.commands.onboard", "app", "Messaging bot onboarding wizard"),
161
161
  "obs": (".commands.obs", "app", "Observability diagnostics and management"),
162
- "validate": (".commands.validate", "app", "Validate YAML configuration files"),
162
+ "validate": ("praisonai.cli.commands.validate", "app", "Validate YAML configuration files"),
163
163
  "acp": (".commands.acp", "app", "Agent Client Protocol server"),
164
- "mcp": (".commands.mcp", "app", "MCP server management"),
164
+ "mcp": ("praisonai_mcp.cli.commands.mcp", "app", "MCP server management"),
165
165
  "serve": (".commands.serve", "app", "API server management"),
166
166
  "daemon": (".commands.daemon", "app", "Warm local runtime (keeps MCP/provider clients hot)"),
167
167
  "attach": (".commands.attach", "app", "Attach to a live session on the warm runtime"),
168
- "schedule": (".commands.schedule", "app", "Scheduler management"),
168
+ "schedule": ("praisonai.cli.commands.schedule", "app", "Scheduler management"),
169
169
  "run": (".commands.run", "app", "Run agents"),
170
170
  "checkpoint": (".commands.checkpoint", "app", "File-level checkpoint management (save/restore/diff)"),
171
- "profile": (".commands.profile", "app", "Performance profiling and diagnostics"),
171
+ "profile": ("praisonai.cli.commands.profile", "app", "Performance profiling and diagnostics"),
172
172
  "benchmark": (".commands.benchmark", "app", "Comprehensive performance benchmarking"),
173
173
  "paths": (".commands.paths", "app", "Storage path inspection and migration"),
174
174
 
@@ -176,26 +176,26 @@ _LAZY_COMMANDS: Dict[str, Tuple[str, str, str]] = {
176
176
  "chat": (".commands.chat", "app", "Terminal-native interactive chat (REPL)"),
177
177
  "code": (".commands.code", "app", "Terminal-native code assistant"),
178
178
  "call": (".commands.call", "app", "Voice/call interaction mode"),
179
- "realtime": (".commands.realtime", "app", "Realtime interaction mode"),
180
- "train": (".commands.train", "app", "Model training and fine-tuning"),
179
+ "realtime": ("praisonai.cli.commands.realtime", "app", "Realtime interaction mode"),
180
+ "train": ("praisonai_train.cli.commands.train", "app", "Model training and fine-tuning"),
181
181
  "ui": (".commands.ui", "app", "Clean Chat UI (praisonaiui)"),
182
- "context": (".commands.context", "app", "Context management"),
182
+ "context": ("praisonai.cli.commands.context", "app", "Context management"),
183
183
  "research": (".commands.research", "app", "Research and analysis"),
184
184
  "memory": (".commands.memory", "app", "Memory management"),
185
185
  "workflow": (".commands.workflow", "app", "Workflow management"),
186
186
  "tools": (".commands.tools", "app", "Tool management"),
187
- "n8n": (".commands.n8n", "app", "n8n visual workflow editor integration"),
188
- "knowledge": (".commands.knowledge", "app", "Knowledge base management (legacy)"),
189
- "rag": (".commands.rag", "app", "RAG commands (legacy - use index/query instead)"),
187
+ "n8n": ("praisonai.cli.commands.n8n", "app", "n8n visual workflow editor integration"),
188
+ "knowledge": ("praisonai.cli.commands.knowledge", "app", "Knowledge base management (legacy)"),
189
+ "rag": ("praisonai.cli.commands.rag", "app", "RAG commands (legacy - use index/query instead)"),
190
190
  "agents": (".commands.agents", "app", "Agent management"),
191
191
  "agent": (".commands.agent", "app", "Custom agent definitions management"),
192
192
  "command": (".commands.command", "app", "Custom command definitions management"),
193
193
  "skills": (".commands.skills", "app", "Skill management"),
194
194
  "eval": (".commands.eval", "app", "Evaluation and testing"),
195
195
  "templates": (".commands.templates", "app", "Template management"),
196
- "recipe": (".commands.recipe", "app", "Recipe management"),
196
+ "recipe": ("praisonai.cli.commands.recipe", "app", "Recipe management"),
197
197
  "todo": (".commands.todo", "app", "Todo/task management"),
198
- "docs": (".commands.docs", "app", "Documentation management"),
198
+ "docs": ("praisonai.cli.commands.docs", "app", "Documentation management"),
199
199
  "commit": (".commands.commit", "app", "AI-assisted git commits"),
200
200
  "publish": (".commands.publish", "app", "Package publishing"),
201
201
  "hooks": (".commands.hooks", "app", "Hook management"),
@@ -205,44 +205,45 @@ _LAZY_COMMANDS: Dict[str, Tuple[str, str, str]] = {
205
205
  "package": (".commands.package", "app", "Package management"),
206
206
  "endpoints": (".commands.endpoints", "app", "API endpoint management"),
207
207
  "test": (".commands.test", "app", "Run test suite with tier and provider options"),
208
- "examples": (".commands.examples", "app", "Run and manage example files"),
209
- "batch": (".commands.batch", "app", "Run all PraisonAI scripts in current folder"),
210
- "replay": (".commands.replay", "app", "Context replay for debugging agent execution"),
208
+ "examples": ("praisonai.cli.commands.examples", "app", "Run and manage example files"),
209
+ "batch": ("praisonai.cli.commands.batch", "app", "Run all PraisonAI scripts in current folder"),
210
+ "replay": ("praisonai.cli.commands.replay", "app", "Context replay for debugging agent execution"),
211
211
  "loop": (".commands.loop", "app", "Autonomous agent execution loops"),
212
212
  "tracker": (".commands.tracker", "app", "Autonomous agent tracking with step-by-step analysis"),
213
213
  "github": (".commands.github", "app", "GitHub native context tracking and Issue triage"),
214
- "audit": (".commands.audit", "audit", "Compliance auditing"),
215
- "managed": (".commands.managed", "app", "Managed Agents (Anthropic cloud-hosted backend)"),
214
+ "audit": ("praisonai.cli.commands.audit", "audit", "Compliance auditing"),
215
+ "managed": ("praisonai.cli.commands.managed", "app", "Managed Agents (Anthropic cloud-hosted backend)"),
216
216
  "models": (".commands.models", "app", "List and describe available models"),
217
217
  "backends": (".commands.backends", "app", "List registered CLI backends"),
218
218
 
219
- # Wrapper-resident commands — see ``_WRAPPER_RESIDENT_COMMANDS`` below. These entries keep
220
- # relative ``.commands.*`` paths so they are advertised in ``--help``, but
221
- # ``get_command()`` re-routes them to the absolute ``praisonai.cli.commands.*``
222
- # path at invocation time (the modules live in the main wrapper).
223
- "bot": (".commands.bot", "app", "Messaging bots with full agent capabilities"),
224
- "gateway": (".commands.gateway", "app", "Multi-bot WebSocket gateway server"),
225
- "pairing": (".commands.pairing", "app", "Manage bot user pairing"),
226
- "identity": (".commands.identity", "app", "Manage cross-platform user identity links"),
227
- "kanban": (".commands.kanban", "app", "Kanban task management"),
228
- "claw": (".commands.claw", "app", "PraisonAI Dashboard (full UI)"),
229
- "mint_link": (".commands.mint_link", "app", "Generate gateway magic links"),
230
- "dashboard": (".commands.dashboard", "app", "Unified Dashboard (Flow + Claw + UI)"),
231
-
232
- "browser": (".commands.browser", "app", "Browser automation (extension bridge, CDP, Playwright)"),
219
+ # Resident commands — see ``_*_RESIDENT_COMMANDS`` below. Their implementation
220
+ # lives in a sibling package, so the entry carries that package's absolute
221
+ # module path (the dispatcher imports exactly what is written here). The
222
+ # entry itself is what advertises the command in ``--help``; the resident
223
+ # sets only decide whether it is shown/served when that package is missing.
224
+ "bot": ("praisonai_bot.cli.commands.bot", "app", "Messaging bots with full agent capabilities"),
225
+ "gateway": ("praisonai_bot.cli.commands.gateway", "app", "Multi-bot WebSocket gateway server"),
226
+ "pairing": ("praisonai_bot.cli.commands.pairing", "app", "Manage bot user pairing"),
227
+ "identity": ("praisonai_bot.cli.commands.identity", "app", "Manage cross-platform user identity links"),
228
+ "kanban": ("praisonai_bot.cli.commands.kanban", "app", "Kanban task management"),
229
+ "claw": ("praisonai_bot.cli.commands.claw", "app", "PraisonAI Dashboard (full UI)"),
230
+ "mint_link": ("praisonai_bot.cli.commands.mint_link", "app", "Generate gateway magic links"),
231
+ "dashboard": ("praisonai.cli.commands.dashboard", "app", "Unified Dashboard (Flow + Claw + UI)"),
232
+
233
+ "browser": ("praisonai_browser.cli.commands.browser", "app", "Browser automation (extension bridge, CDP, Playwright)"),
233
234
  "browser-tool": (".commands.browser_tool", "app", "praisonai-tools browser automation (snapshot/click/navigate)"),
234
235
  "plugins": (".commands.plugins", "app", "Plugin management and inspection"),
235
236
  "sandbox": (".commands.sandbox", "app", "Sandbox container management"),
236
- "flow": (".commands.flow", "app", "Visual workflow builder (Langflow)"),
237
- "langfuse": (".commands.langfuse", "app", "Langfuse observability platform"),
238
- "langextract": (".commands.langextract", "app", "Langextract visual trace layer"),
237
+ "flow": ("praisonai.cli.commands.flow", "app", "Visual workflow builder (Langflow)"),
238
+ "langfuse": ("praisonai.cli.commands.langfuse", "app", "Langfuse observability platform"),
239
+ "langextract": ("praisonai.cli.commands.langextract", "app", "Langextract visual trace layer"),
239
240
  "port": (".commands.port", "app", "Manage port usage and resolve conflicts"),
240
241
  "up": (".commands.up", "app", "Start unified PraisonAI stack (Langfuse + Langflow)"),
241
242
  }
242
243
 
243
244
  # C9: Bot/channel commands implemented in ``praisonai_bot.cli.commands.*``.
244
- # ``get_command()`` loads them via ``praisonai_bot.cli.commands.{name}`` when the
245
- # bot package is installed; standalone ``praisonai-code`` hides them from ``--help``.
245
+ # Their ``_LAZY_COMMANDS`` entries point there; ``get_command()`` serves them only
246
+ # when the bot package is installed; standalone ``praisonai-code`` hides them from ``--help``.
246
247
  _BOT_RESIDENT_COMMANDS = frozenset({
247
248
  "bot",
248
249
  "gateway",
@@ -288,8 +289,8 @@ _WRAPPER_RESIDENT_COMMANDS = frozenset({
288
289
  })
289
290
 
290
291
  # C10: Training commands implemented in ``praisonai_train.cli.commands.*``.
291
- # ``get_command()`` loads them via ``praisonai_train.cli.commands.{name}`` when the
292
- # train package is installed; standalone ``praisonai-code`` hides them from ``--help``.
292
+ # Their ``_LAZY_COMMANDS`` entries point there; ``get_command()`` serves them only
293
+ # when the train package is installed; standalone ``praisonai-code`` hides them from ``--help``.
293
294
  _TRAIN_RESIDENT_COMMANDS = frozenset({
294
295
  "train",
295
296
  })
@@ -300,8 +301,8 @@ _DEPLOY_RESIDENT_COMMANDS = frozenset({
300
301
  })
301
302
 
302
303
  # C11: Browser automation commands implemented in ``praisonai_browser.cli.commands.*``.
303
- # ``get_command()`` loads them via ``praisonai_browser.cli.commands.{name}`` when the
304
- # browser package is installed; standalone ``praisonai-code`` hides them from ``--help``.
304
+ # Their ``_LAZY_COMMANDS`` entries point there; ``get_command()`` serves them only
305
+ # when the browser package is installed; standalone ``praisonai-code`` hides them from ``--help``.
305
306
  _BROWSER_RESIDENT_COMMANDS = frozenset({
306
307
  "browser",
307
308
  })
@@ -418,29 +419,26 @@ class LazyCommandGroup(TyperGroup):
418
419
  # Check regular lazy commands
419
420
  if name in _LAZY_COMMANDS:
420
421
  module_path, attr_name, _ = _LAZY_COMMANDS[name]
422
+ # Resident commands are implemented in a sibling package. Hide them
423
+ # (return ``None``, matching ``list_commands``) when that package is
424
+ # not installed, so a standalone install never tries the import.
425
+ if name in _BOT_RESIDENT_COMMANDS and not bot_package_available():
426
+ return None
427
+ if name in _TRAIN_RESIDENT_COMMANDS and not train_package_available():
428
+ return None
429
+ if name in _BROWSER_RESIDENT_COMMANDS and not browser_package_available():
430
+ return None
431
+ if name in _MCP_RESIDENT_COMMANDS and not mcp_package_available():
432
+ return None
433
+ if name in _WRAPPER_RESIDENT_COMMANDS and not wrapper_available():
434
+ return None
421
435
  try:
422
- if name in _BOT_RESIDENT_COMMANDS:
423
- if not bot_package_available():
424
- return None
425
- module = importlib.import_module(f"praisonai_bot.cli.commands.{name}")
426
- elif name in _TRAIN_RESIDENT_COMMANDS:
427
- if not train_package_available():
428
- return None
429
- module = importlib.import_module(f"praisonai_train.cli.commands.{name}")
430
- elif name in _BROWSER_RESIDENT_COMMANDS:
431
- if not browser_package_available():
432
- return None
433
- module = importlib.import_module(f"praisonai_browser.cli.commands.{name}")
434
- elif name in _MCP_RESIDENT_COMMANDS:
435
- if not mcp_package_available():
436
- return None
437
- module = importlib.import_module(f"praisonai_mcp.cli.commands.{name}")
438
- elif name in _WRAPPER_RESIDENT_COMMANDS:
439
- if not wrapper_available():
440
- return None
441
- module = importlib.import_module(f"praisonai.cli.commands.{name}")
442
- else:
443
- module = importlib.import_module(module_path, __package__)
436
+ # The table is the single source of truth for where a command
437
+ # lives: resident entries carry an absolute path (``__package__``
438
+ # is ignored for those), local ones a relative ``.commands.*``.
439
+ # ``tests/unit/test_lazy_command_paths.py`` imports every entry
440
+ # this same way so a dangling path fails in CI, not at first use.
441
+ module = importlib.import_module(module_path, __package__)
444
442
  sub_app = getattr(module, attr_name)
445
443
  if isinstance(sub_app, click.Command):
446
444
  return sub_app
@@ -802,6 +800,23 @@ def main_callback(
802
800
  help="Enable observability (langfuse, langextract)",
803
801
  envvar="PRAISONAI_OBSERVE",
804
802
  ),
803
+ continue_session: bool = typer.Option(
804
+ False,
805
+ "--continue",
806
+ "-c",
807
+ help="Resume the most recent session in the interactive launch",
808
+ ),
809
+ session: Optional[str] = typer.Option(
810
+ None,
811
+ "--session",
812
+ "-s",
813
+ help="Resume a specific session ID in the interactive launch",
814
+ ),
815
+ fork: bool = typer.Option(
816
+ False,
817
+ "--fork",
818
+ help="Fork from the resumed session (requires --continue/--session)",
819
+ ),
805
820
  ):
806
821
  """
807
822
  PraisonAI - AI Agents Framework CLI.
@@ -895,6 +910,22 @@ def main_callback(
895
910
  from praisonai_code.llm.credentials import ensure_configured_or_onboard
896
911
  from praisonai_code._wrapper_bridge import wrapper_available
897
912
 
913
+ # Validate the continuity flags up-front (parity with `run`) so an
914
+ # invalid combination fails closed before any onboarding/model work
915
+ # (Issue #4910).
916
+ if fork and not (continue_session or session):
917
+ typer.echo(
918
+ "--fork requires --continue or --session to specify which "
919
+ "session to fork from",
920
+ err=True,
921
+ )
922
+ raise typer.Exit(1)
923
+ if continue_session and session:
924
+ typer.echo(
925
+ "Cannot use both --continue and --session together", err=True
926
+ )
927
+ raise typer.Exit(1)
928
+
898
929
  # The bare invocation only launches the wrapper-resident interactive
899
930
  # TUI. On a bare `pip install praisonai-code` the wrapper is absent and
900
931
  # the TUI path fails fast with its own install hint. Running the
@@ -907,9 +938,80 @@ def main_callback(
907
938
 
908
939
  from .interactive.async_tui import AsyncTUI, AsyncTUIConfig
909
940
 
941
+ # Resolve a session to resume when a continuity flag is present (Issue
942
+ # #4910), reusing the exact `run`/`chat` machinery so the bare
943
+ # interactive surface gains --continue/--session/--fork parity without
944
+ # duplicating persistence logic. No flag → resume_id stays None and the
945
+ # launch is byte-identical to before (fresh session).
946
+ resume_id: Optional[str] = None
947
+ restored_model: Optional[str] = None
948
+ if continue_session or session:
949
+ try:
950
+ from .state.project_sessions import (
951
+ find_last_session,
952
+ find_session_model,
953
+ session_exists_anywhere,
954
+ )
955
+
956
+ if session:
957
+ if session_exists_anywhere(session):
958
+ resume_id = session
959
+ else:
960
+ typer.echo(f"Session not found: {session}", err=True)
961
+ raise typer.Exit(1)
962
+ else:
963
+ resume_id = find_last_session()
964
+ if not resume_id:
965
+ typer.echo(
966
+ "No previous sessions found. Starting new session.",
967
+ err=True,
968
+ )
969
+
970
+ # Fork non-destructively so the resumed transcript is branched
971
+ # rather than mutated in place (parity with `run --fork`). An
972
+ # explicit --fork must fail closed: silently falling back to the
973
+ # source session would violate the non-destructive guarantee and
974
+ # let subsequent turns mutate the original (Issue #4910).
975
+ if fork and resume_id:
976
+ try:
977
+ from praisonaiagents.session.hierarchy import (
978
+ HierarchicalSessionStore,
979
+ )
980
+ from .utils.project import get_project_sessions_dir
981
+
982
+ hierarchical_store = HierarchicalSessionStore(
983
+ str(get_project_sessions_dir())
984
+ )
985
+ forked_id = hierarchical_store.fork_session(resume_id)
986
+ except typer.Exit:
987
+ raise
988
+ except Exception as exc:
989
+ typer.echo(f"Failed to fork session: {exc}", err=True)
990
+ raise typer.Exit(1)
991
+ if not forked_id:
992
+ typer.echo(
993
+ f"Failed to fork session: {resume_id}", err=True
994
+ )
995
+ raise typer.Exit(1)
996
+ resume_id = forked_id
997
+
998
+ # Restore the recorded session model so resume continues on the
999
+ # same provider instead of the current default (Issue #3685).
1000
+ if resume_id:
1001
+ try:
1002
+ restored_model = find_session_model(resume_id)
1003
+ except Exception:
1004
+ restored_model = None
1005
+ except typer.Exit:
1006
+ raise
1007
+ except Exception:
1008
+ # Continuity is opt-in and best-effort; never block launch.
1009
+ resume_id = None
1010
+
910
1011
  # Route the bare-TUI launch through the shared resolver so a user with
911
1012
  # only, say, ANTHROPIC_API_KEY set is defaulted to an appropriate model
912
- # rather than an OpenAI one — matching `run`, `chat`, and `init`.
1013
+ # rather than an OpenAI one — matching `run`, `chat`, and `init`. A
1014
+ # restored session model (when resuming) takes precedence.
913
1015
  try:
914
1016
  from .configuration.model_resolver import resolve_default_model
915
1017
  resolved_model = resolve_default_model(None)
@@ -917,9 +1019,11 @@ def main_callback(
917
1019
  resolved_model = _DEFAULT_MODEL
918
1020
 
919
1021
  tui_config = AsyncTUIConfig(
920
- model=resolved_model,
1022
+ model=restored_model or resolved_model,
921
1023
  show_logo=True,
922
1024
  show_status_bar=state.output_format != OutputFormat.json,
1025
+ session_id=resume_id,
1026
+ resume=bool(resume_id),
923
1027
  )
924
1028
 
925
1029
  tui = AsyncTUI(config=tui_config)