praisonai-code 0.0.1__py3-none-any.whl

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 (309) hide show
  1. praisonai_code/__init__.py +17 -0
  2. praisonai_code/cli/__init__.py +12 -0
  3. praisonai_code/cli/_forward_shim.py +10 -0
  4. praisonai_code/cli/_paths.py +88 -0
  5. praisonai_code/cli/_warnings.py +58 -0
  6. praisonai_code/cli/app.py +757 -0
  7. praisonai_code/cli/approval_backend.py +272 -0
  8. praisonai_code/cli/branding.py +94 -0
  9. praisonai_code/cli/commands/__init__.py +114 -0
  10. praisonai_code/cli/commands/acp.py +80 -0
  11. praisonai_code/cli/commands/agent.py +116 -0
  12. praisonai_code/cli/commands/agents.py +80 -0
  13. praisonai_code/cli/commands/app.py +139 -0
  14. praisonai_code/cli/commands/attach.py +95 -0
  15. praisonai_code/cli/commands/audit.py +102 -0
  16. praisonai_code/cli/commands/auth.py +508 -0
  17. praisonai_code/cli/commands/batch.py +848 -0
  18. praisonai_code/cli/commands/benchmark.py +286 -0
  19. praisonai_code/cli/commands/browser.py +299 -0
  20. praisonai_code/cli/commands/call.py +45 -0
  21. praisonai_code/cli/commands/chat.py +332 -0
  22. praisonai_code/cli/commands/checkpoint.py +170 -0
  23. praisonai_code/cli/commands/code.py +276 -0
  24. praisonai_code/cli/commands/command.py +114 -0
  25. praisonai_code/cli/commands/commit.py +47 -0
  26. praisonai_code/cli/commands/completion.py +333 -0
  27. praisonai_code/cli/commands/config.py +681 -0
  28. praisonai_code/cli/commands/context.py +414 -0
  29. praisonai_code/cli/commands/daemon.py +203 -0
  30. praisonai_code/cli/commands/debug.py +142 -0
  31. praisonai_code/cli/commands/deploy.py +71 -0
  32. praisonai_code/cli/commands/diag.py +55 -0
  33. praisonai_code/cli/commands/docs.py +1575 -0
  34. praisonai_code/cli/commands/doctor.py +332 -0
  35. praisonai_code/cli/commands/endpoints.py +51 -0
  36. praisonai_code/cli/commands/environment.py +179 -0
  37. praisonai_code/cli/commands/eval.py +131 -0
  38. praisonai_code/cli/commands/examples.py +953 -0
  39. praisonai_code/cli/commands/flow.py +436 -0
  40. praisonai_code/cli/commands/github.py +752 -0
  41. praisonai_code/cli/commands/hooks.py +74 -0
  42. praisonai_code/cli/commands/init.py +174 -0
  43. praisonai_code/cli/commands/knowledge.py +440 -0
  44. praisonai_code/cli/commands/langextract.py +120 -0
  45. praisonai_code/cli/commands/langfuse.py +984 -0
  46. praisonai_code/cli/commands/loop.py +211 -0
  47. praisonai_code/cli/commands/lsp.py +112 -0
  48. praisonai_code/cli/commands/managed.py +659 -0
  49. praisonai_code/cli/commands/mcp.py +763 -0
  50. praisonai_code/cli/commands/memory.py +298 -0
  51. praisonai_code/cli/commands/models.py +264 -0
  52. praisonai_code/cli/commands/n8n.py +326 -0
  53. praisonai_code/cli/commands/obs.py +19 -0
  54. praisonai_code/cli/commands/package.py +76 -0
  55. praisonai_code/cli/commands/paths.py +106 -0
  56. praisonai_code/cli/commands/permissions.py +272 -0
  57. praisonai_code/cli/commands/plugins.py +609 -0
  58. praisonai_code/cli/commands/port.py +530 -0
  59. praisonai_code/cli/commands/profile.py +466 -0
  60. praisonai_code/cli/commands/publish.py +193 -0
  61. praisonai_code/cli/commands/rag.py +913 -0
  62. praisonai_code/cli/commands/realtime.py +52 -0
  63. praisonai_code/cli/commands/recipe.py +684 -0
  64. praisonai_code/cli/commands/registry.py +59 -0
  65. praisonai_code/cli/commands/replay.py +830 -0
  66. praisonai_code/cli/commands/research.py +49 -0
  67. praisonai_code/cli/commands/retrieval.py +377 -0
  68. praisonai_code/cli/commands/rules.py +71 -0
  69. praisonai_code/cli/commands/run.py +1573 -0
  70. praisonai_code/cli/commands/sandbox.py +371 -0
  71. praisonai_code/cli/commands/schedule.py +529 -0
  72. praisonai_code/cli/commands/serve.py +690 -0
  73. praisonai_code/cli/commands/session.py +450 -0
  74. praisonai_code/cli/commands/setup.py +174 -0
  75. praisonai_code/cli/commands/skills.py +545 -0
  76. praisonai_code/cli/commands/standardise.py +711 -0
  77. praisonai_code/cli/commands/templates.py +54 -0
  78. praisonai_code/cli/commands/test.py +558 -0
  79. praisonai_code/cli/commands/todo.py +74 -0
  80. praisonai_code/cli/commands/tools.py +205 -0
  81. praisonai_code/cli/commands/traces.py +145 -0
  82. praisonai_code/cli/commands/tracker.py +852 -0
  83. praisonai_code/cli/commands/train.py +613 -0
  84. praisonai_code/cli/commands/ui.py +172 -0
  85. praisonai_code/cli/commands/up.py +354 -0
  86. praisonai_code/cli/commands/validate.py +291 -0
  87. praisonai_code/cli/commands/version.py +101 -0
  88. praisonai_code/cli/commands/workflow.py +97 -0
  89. praisonai_code/cli/config_loader.py +437 -0
  90. praisonai_code/cli/configuration/__init__.py +27 -0
  91. praisonai_code/cli/configuration/config.schema.json +57 -0
  92. praisonai_code/cli/configuration/credentials.py +446 -0
  93. praisonai_code/cli/configuration/loader.py +364 -0
  94. praisonai_code/cli/configuration/model_resolver.py +161 -0
  95. praisonai_code/cli/configuration/oauth.py +389 -0
  96. praisonai_code/cli/configuration/paths.py +224 -0
  97. praisonai_code/cli/configuration/resolver.py +687 -0
  98. praisonai_code/cli/configuration/schema.py +317 -0
  99. praisonai_code/cli/execution/__init__.py +99 -0
  100. praisonai_code/cli/execution/core.py +208 -0
  101. praisonai_code/cli/execution/profiler.py +898 -0
  102. praisonai_code/cli/execution/request.py +85 -0
  103. praisonai_code/cli/execution/result.py +74 -0
  104. praisonai_code/cli/fallback_schema.py +416 -0
  105. praisonai_code/cli/features/__init__.py +278 -0
  106. praisonai_code/cli/features/_endpoint_registry.py +64 -0
  107. praisonai_code/cli/features/_search_registry.py +43 -0
  108. praisonai_code/cli/features/acp.py +236 -0
  109. praisonai_code/cli/features/action_orchestrator.py +576 -0
  110. praisonai_code/cli/features/agent_scheduler.py +773 -0
  111. praisonai_code/cli/features/agent_tools.py +603 -0
  112. praisonai_code/cli/features/agents.py +397 -0
  113. praisonai_code/cli/features/at_mentions.py +471 -0
  114. praisonai_code/cli/features/audit_cli.py +270 -0
  115. praisonai_code/cli/features/auto_memory.py +182 -0
  116. praisonai_code/cli/features/auto_mode.py +552 -0
  117. praisonai_code/cli/features/autonomy_mode.py +546 -0
  118. praisonai_code/cli/features/background.py +356 -0
  119. praisonai_code/cli/features/base.py +168 -0
  120. praisonai_code/cli/features/benchmark.py +1462 -0
  121. praisonai_code/cli/features/capabilities.py +1326 -0
  122. praisonai_code/cli/features/checkpoints.py +345 -0
  123. praisonai_code/cli/features/cli_profiler.py +335 -0
  124. praisonai_code/cli/features/code_intelligence.py +666 -0
  125. praisonai_code/cli/features/compaction.py +294 -0
  126. praisonai_code/cli/features/compare.py +534 -0
  127. praisonai_code/cli/features/config_hierarchy.py +366 -0
  128. praisonai_code/cli/features/context_manager.py +597 -0
  129. praisonai_code/cli/features/cost_tracker.py +514 -0
  130. praisonai_code/cli/features/csv_test_runner.py +736 -0
  131. praisonai_code/cli/features/custom_definitions.py +790 -0
  132. praisonai_code/cli/features/debug.py +810 -0
  133. praisonai_code/cli/features/deploy.py +605 -0
  134. praisonai_code/cli/features/diag.py +289 -0
  135. praisonai_code/cli/features/display_jsonl.py +173 -0
  136. praisonai_code/cli/features/doctor/__init__.py +63 -0
  137. praisonai_code/cli/features/doctor/checks/__init__.py +29 -0
  138. praisonai_code/cli/features/doctor/checks/acp_checks.py +220 -0
  139. praisonai_code/cli/features/doctor/checks/bot_checks.py +340 -0
  140. praisonai_code/cli/features/doctor/checks/config_checks.py +373 -0
  141. praisonai_code/cli/features/doctor/checks/db_checks.py +366 -0
  142. praisonai_code/cli/features/doctor/checks/env_checks.py +637 -0
  143. praisonai_code/cli/features/doctor/checks/gateway_checks.py +387 -0
  144. praisonai_code/cli/features/doctor/checks/lsp_checks.py +231 -0
  145. praisonai_code/cli/features/doctor/checks/mcp_checks.py +367 -0
  146. praisonai_code/cli/features/doctor/checks/memory_checks.py +268 -0
  147. praisonai_code/cli/features/doctor/checks/network_checks.py +251 -0
  148. praisonai_code/cli/features/doctor/checks/obs_checks.py +328 -0
  149. praisonai_code/cli/features/doctor/checks/packaging_checks.py +422 -0
  150. praisonai_code/cli/features/doctor/checks/performance_checks.py +235 -0
  151. praisonai_code/cli/features/doctor/checks/permissions_checks.py +259 -0
  152. praisonai_code/cli/features/doctor/checks/runtime_checks.py +650 -0
  153. praisonai_code/cli/features/doctor/checks/runtime_migration_checks.py +220 -0
  154. praisonai_code/cli/features/doctor/checks/selftest_checks.py +322 -0
  155. praisonai_code/cli/features/doctor/checks/serve_checks.py +426 -0
  156. praisonai_code/cli/features/doctor/checks/skills_checks.py +327 -0
  157. praisonai_code/cli/features/doctor/checks/tools_checks.py +371 -0
  158. praisonai_code/cli/features/doctor/engine.py +266 -0
  159. praisonai_code/cli/features/doctor/formatters.py +377 -0
  160. praisonai_code/cli/features/doctor/handler.py +564 -0
  161. praisonai_code/cli/features/doctor/models.py +276 -0
  162. praisonai_code/cli/features/doctor/registry.py +239 -0
  163. praisonai_code/cli/features/endpoints.py +1016 -0
  164. praisonai_code/cli/features/eval.py +559 -0
  165. praisonai_code/cli/features/examples.py +707 -0
  166. praisonai_code/cli/features/external_agents.py +231 -0
  167. praisonai_code/cli/features/fast_context.py +410 -0
  168. praisonai_code/cli/features/file_history.py +320 -0
  169. praisonai_code/cli/features/flow_display.py +566 -0
  170. praisonai_code/cli/features/git_attribution.py +159 -0
  171. praisonai_code/cli/features/git_integration.py +651 -0
  172. praisonai_code/cli/features/guardrail.py +171 -0
  173. praisonai_code/cli/features/handoff.py +252 -0
  174. praisonai_code/cli/features/hooks.py +583 -0
  175. praisonai_code/cli/features/hybrid_workflow.py +391 -0
  176. praisonai_code/cli/features/image.py +384 -0
  177. praisonai_code/cli/features/interactive_core_headless.py +450 -0
  178. praisonai_code/cli/features/interactive_runtime.py +600 -0
  179. praisonai_code/cli/features/interactive_test_harness.py +537 -0
  180. praisonai_code/cli/features/interactive_tools.py +428 -0
  181. praisonai_code/cli/features/interactive_tui.py +603 -0
  182. praisonai_code/cli/features/job_workflow.py +906 -0
  183. praisonai_code/cli/features/jobs.py +632 -0
  184. praisonai_code/cli/features/knowledge.py +531 -0
  185. praisonai_code/cli/features/knowledge_cli.py +438 -0
  186. praisonai_code/cli/features/lite.py +244 -0
  187. praisonai_code/cli/features/logs.py +200 -0
  188. praisonai_code/cli/features/lsp_cli.py +225 -0
  189. praisonai_code/cli/features/lsp_diagnostics.py +185 -0
  190. praisonai_code/cli/features/mcp.py +344 -0
  191. praisonai_code/cli/features/message_queue.py +587 -0
  192. praisonai_code/cli/features/metrics.py +210 -0
  193. praisonai_code/cli/features/migrate.py +1329 -0
  194. praisonai_code/cli/features/migration_flow.py +463 -0
  195. praisonai_code/cli/features/migration_spec.py +276 -0
  196. praisonai_code/cli/features/n8n.py +703 -0
  197. praisonai_code/cli/features/observability.py +293 -0
  198. praisonai_code/cli/features/ollama.py +361 -0
  199. praisonai_code/cli/features/output_modes.py +155 -0
  200. praisonai_code/cli/features/output_style.py +273 -0
  201. praisonai_code/cli/features/package.py +631 -0
  202. praisonai_code/cli/features/performance.py +308 -0
  203. praisonai_code/cli/features/persistence.py +636 -0
  204. praisonai_code/cli/features/profiler/__init__.py +81 -0
  205. praisonai_code/cli/features/profiler/core.py +558 -0
  206. praisonai_code/cli/features/profiler/optimizations.py +652 -0
  207. praisonai_code/cli/features/profiler/suite.py +386 -0
  208. praisonai_code/cli/features/queue/__init__.py +73 -0
  209. praisonai_code/cli/features/queue/manager.py +435 -0
  210. praisonai_code/cli/features/queue/models.py +289 -0
  211. praisonai_code/cli/features/queue/persistence.py +564 -0
  212. praisonai_code/cli/features/queue/scheduler.py +529 -0
  213. praisonai_code/cli/features/queue/worker.py +400 -0
  214. praisonai_code/cli/features/recipe.py +2187 -0
  215. praisonai_code/cli/features/recipe_creator.py +996 -0
  216. praisonai_code/cli/features/recipe_optimizer.py +1364 -0
  217. praisonai_code/cli/features/recipe_prompts.py +226 -0
  218. praisonai_code/cli/features/registry.py +229 -0
  219. praisonai_code/cli/features/repo_map.py +860 -0
  220. praisonai_code/cli/features/router.py +466 -0
  221. praisonai_code/cli/features/safe_shell.py +427 -0
  222. praisonai_code/cli/features/sandbox_cli.py +283 -0
  223. praisonai_code/cli/features/sandbox_executor.py +536 -0
  224. praisonai_code/cli/features/sdk_knowledge.py +500 -0
  225. praisonai_code/cli/features/session.py +222 -0
  226. praisonai_code/cli/features/session_checkpoints.py +208 -0
  227. praisonai_code/cli/features/setup/__init__.py +9 -0
  228. praisonai_code/cli/features/setup/handler.py +355 -0
  229. praisonai_code/cli/features/setup/templates.py +62 -0
  230. praisonai_code/cli/features/skills.py +940 -0
  231. praisonai_code/cli/features/slash_commands.py +692 -0
  232. praisonai_code/cli/features/telemetry.py +179 -0
  233. praisonai_code/cli/features/templates.py +1390 -0
  234. praisonai_code/cli/features/thinking.py +343 -0
  235. praisonai_code/cli/features/todo.py +334 -0
  236. praisonai_code/cli/features/tools.py +680 -0
  237. praisonai_code/cli/features/tui/__init__.py +83 -0
  238. praisonai_code/cli/features/tui/app.py +871 -0
  239. praisonai_code/cli/features/tui/cli.py +580 -0
  240. praisonai_code/cli/features/tui/config.py +150 -0
  241. praisonai_code/cli/features/tui/debug.py +526 -0
  242. praisonai_code/cli/features/tui/events.py +99 -0
  243. praisonai_code/cli/features/tui/mock_provider.py +328 -0
  244. praisonai_code/cli/features/tui/orchestrator.py +652 -0
  245. praisonai_code/cli/features/tui/screens/__init__.py +50 -0
  246. praisonai_code/cli/features/tui/screens/help.py +157 -0
  247. praisonai_code/cli/features/tui/screens/main.py +568 -0
  248. praisonai_code/cli/features/tui/screens/queue.py +174 -0
  249. praisonai_code/cli/features/tui/screens/session.py +124 -0
  250. praisonai_code/cli/features/tui/screens/settings.py +148 -0
  251. praisonai_code/cli/features/tui/session_store.py +198 -0
  252. praisonai_code/cli/features/tui/widgets/__init__.py +56 -0
  253. praisonai_code/cli/features/tui/widgets/chat.py +263 -0
  254. praisonai_code/cli/features/tui/widgets/command_popup.py +258 -0
  255. praisonai_code/cli/features/tui/widgets/composer.py +292 -0
  256. praisonai_code/cli/features/tui/widgets/file_popup.py +207 -0
  257. praisonai_code/cli/features/tui/widgets/queue_panel.py +223 -0
  258. praisonai_code/cli/features/tui/widgets/status.py +181 -0
  259. praisonai_code/cli/features/tui/widgets/tool_panel.py +307 -0
  260. praisonai_code/cli/features/wizard.py +289 -0
  261. praisonai_code/cli/features/workflow.py +802 -0
  262. praisonai_code/cli/features/yaml_utils.py +321 -0
  263. praisonai_code/cli/interactive/__init__.py +48 -0
  264. praisonai_code/cli/interactive/async_tui.py +1218 -0
  265. praisonai_code/cli/interactive/config.py +139 -0
  266. praisonai_code/cli/interactive/core.py +618 -0
  267. praisonai_code/cli/interactive/events.py +131 -0
  268. praisonai_code/cli/interactive/frontends/__init__.py +31 -0
  269. praisonai_code/cli/interactive/frontends/rich_frontend.py +462 -0
  270. praisonai_code/cli/interactive/frontends/textual_frontend.py +157 -0
  271. praisonai_code/cli/interactive/praison_io.py +502 -0
  272. praisonai_code/cli/interactive/repl.py +297 -0
  273. praisonai_code/cli/interactive/split_tui.py +456 -0
  274. praisonai_code/cli/interactive/tui_app.py +457 -0
  275. praisonai_code/cli/langfuse_client.py +360 -0
  276. praisonai_code/cli/main.py +7421 -0
  277. praisonai_code/cli/output/__init__.py +25 -0
  278. praisonai_code/cli/output/console.py +456 -0
  279. praisonai_code/cli/output/event_bridge.py +191 -0
  280. praisonai_code/cli/schedule_cli.py +54 -0
  281. praisonai_code/cli/schema_provider.py +23 -0
  282. praisonai_code/cli/session/__init__.py +16 -0
  283. praisonai_code/cli/session/resume.py +148 -0
  284. praisonai_code/cli/session/unified.py +548 -0
  285. praisonai_code/cli/state/__init__.py +31 -0
  286. praisonai_code/cli/state/identifiers.py +161 -0
  287. praisonai_code/cli/state/project_sessions.py +383 -0
  288. praisonai_code/cli/state/sessions.py +390 -0
  289. praisonai_code/cli/ui/__init__.py +160 -0
  290. praisonai_code/cli/ui/config.py +46 -0
  291. praisonai_code/cli/ui/events.py +61 -0
  292. praisonai_code/cli/ui/mg_backend.py +342 -0
  293. praisonai_code/cli/ui/plain.py +133 -0
  294. praisonai_code/cli/ui/rich_backend.py +162 -0
  295. praisonai_code/cli/unified_schema.py +655 -0
  296. praisonai_code/cli/utils/env_utils.py +126 -0
  297. praisonai_code/cli/utils/project.py +131 -0
  298. praisonai_code/cli_backends/__init__.py +73 -0
  299. praisonai_code/cli_backends/claude.py +373 -0
  300. praisonai_code/cli_backends/registry.py +113 -0
  301. praisonai_code/runtime/__init__.py +36 -0
  302. praisonai_code/runtime/__main__.py +81 -0
  303. praisonai_code/runtime/client.py +131 -0
  304. praisonai_code/runtime/descriptor.py +209 -0
  305. praisonai_code/runtime/server.py +356 -0
  306. praisonai_code-0.0.1.dist-info/METADATA +80 -0
  307. praisonai_code-0.0.1.dist-info/RECORD +309 -0
  308. praisonai_code-0.0.1.dist-info/WHEEL +5 -0
  309. praisonai_code-0.0.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,211 @@
1
+ """
2
+ Loop command for autonomous agent execution.
3
+
4
+ Provides CLI interface for running agents in autonomous loops with:
5
+ - Completion promise detection
6
+ - Context clearing between iterations
7
+ - Iteration limits and timeouts
8
+ """
9
+
10
+ from typing import Optional
11
+
12
+ import typer
13
+
14
+ app = typer.Typer(
15
+ name="loop",
16
+ help="Run agents in autonomous execution loops",
17
+ no_args_is_help=False,
18
+ )
19
+
20
+
21
+ @app.callback(invoke_without_command=True)
22
+ def loop_main(
23
+ ctx: typer.Context,
24
+ prompt: Optional[str] = typer.Argument(None, help="Task prompt for the agent"),
25
+ max_iterations: int = typer.Option(10, "--max-iterations", "-n", help="Maximum iterations (default: 10)"),
26
+ completion_promise: Optional[str] = typer.Option(None, "--completion-promise", "-p", help="Promise text to signal completion"),
27
+ clear_context: bool = typer.Option(False, "--clear-context", "-c", help="Clear chat history between iterations"),
28
+ timeout: Optional[float] = typer.Option(None, "--timeout", "-t", help="Timeout in seconds"),
29
+ model: Optional[str] = typer.Option(None, "--model", "-m", help="LLM model to use"),
30
+ verbose: bool = typer.Option(False, "--verbose", "-v", help="Show verbose output"),
31
+ observe: bool = typer.Option(False, "--observe", "-o", help="Enable observability event logging"),
32
+ recovery: bool = typer.Option(True, "--recovery/--no-recovery", help="Enable graduated doom loop recovery (default: on)"),
33
+ level: Optional[str] = typer.Option(None, "--level", "-l", help="Autonomy level: suggest, auto_edit, full_auto"),
34
+ ):
35
+ """Run an agent in an autonomous loop.
36
+
37
+ The agent will execute the given PROMPT repeatedly until:
38
+ - It outputs <promise>TEXT</promise> matching --completion-promise
39
+ - It reaches --max-iterations
40
+ - It times out (if --timeout is set)
41
+ - It detects a doom loop (repeated actions)
42
+
43
+ Examples:
44
+
45
+ praisonai loop "Build a REST API" -n 5
46
+
47
+ praisonai loop "Refactor auth module" -p DONE
48
+
49
+ praisonai loop "Implement feature X" -p COMPLETE -c
50
+ """
51
+ if ctx.invoked_subcommand is not None:
52
+ return
53
+
54
+ if not prompt:
55
+ typer.echo(ctx.get_help())
56
+ return
57
+
58
+ _run_loop(
59
+ prompt=prompt,
60
+ max_iterations=max_iterations,
61
+ completion_promise=completion_promise,
62
+ clear_context=clear_context,
63
+ timeout=timeout,
64
+ model=model,
65
+ verbose=verbose,
66
+ observe=observe,
67
+ recovery=recovery,
68
+ level=level,
69
+ )
70
+
71
+
72
+ def _run_loop(
73
+ prompt: str,
74
+ max_iterations: int,
75
+ completion_promise: Optional[str],
76
+ clear_context: bool,
77
+ timeout: Optional[float],
78
+ model: Optional[str],
79
+ verbose: bool,
80
+ observe: bool = False,
81
+ recovery: bool = True,
82
+ level: Optional[str] = None,
83
+ ):
84
+ """Execute the autonomous loop."""
85
+ try:
86
+ from praisonaiagents import Agent
87
+ except ImportError:
88
+ typer.echo("Error: praisonaiagents not installed. Run: pip install praisonaiagents", err=True)
89
+ raise typer.Exit(1)
90
+
91
+ # Build autonomy config
92
+ autonomy_config = {
93
+ "max_iterations": max_iterations,
94
+ "completion_promise": completion_promise,
95
+ "clear_context": clear_context,
96
+ "observe": observe,
97
+ }
98
+ if level:
99
+ autonomy_config["level"] = level
100
+
101
+ # Create agent
102
+ agent_kwargs = {
103
+ "name": "loop_agent",
104
+ "instructions": "You are an autonomous agent. Complete the given task. "
105
+ "When you have fully completed the task, signal completion.",
106
+ "autonomy": autonomy_config,
107
+ }
108
+
109
+ if model:
110
+ agent_kwargs["llm"] = model
111
+
112
+ if not verbose:
113
+ agent_kwargs["output"] = "silent"
114
+
115
+ # Add completion promise instructions if provided
116
+ if completion_promise:
117
+ agent_kwargs["instructions"] += (
118
+ f"\n\nIMPORTANT: When you have completed the task, you MUST include "
119
+ f"<promise>{completion_promise}</promise> in your response to signal completion."
120
+ )
121
+
122
+ agent = Agent(**agent_kwargs)
123
+
124
+ # Show configuration
125
+ if verbose:
126
+ typer.echo("🔄 Starting autonomous loop")
127
+ typer.echo(f" Prompt: {prompt[:50]}{'...' if len(prompt) > 50 else ''}")
128
+ typer.echo(f" Max iterations: {max_iterations}")
129
+ if completion_promise:
130
+ typer.echo(f" Completion promise: <promise>{completion_promise}</promise>")
131
+ if clear_context:
132
+ typer.echo(" Context clearing: enabled")
133
+ if timeout:
134
+ typer.echo(f" Timeout: {timeout}s")
135
+ typer.echo("")
136
+
137
+ # Run autonomous loop using unified API
138
+ # agent.start() automatically uses run_autonomous() when autonomy=True
139
+ try:
140
+ result = agent.start(prompt, timeout=timeout)
141
+
142
+ # Display result
143
+ if result.success:
144
+ typer.echo("✅ Task completed successfully")
145
+ typer.echo(f" Reason: {result.completion_reason}")
146
+ typer.echo(f" Iterations: {result.iterations}")
147
+ typer.echo(f" Duration: {result.duration_seconds:.2f}s")
148
+ if result.started_at:
149
+ typer.echo(f" Started: {result.started_at}")
150
+ if verbose:
151
+ typer.echo(f"\n📝 Final output:\n{result.output}")
152
+ else:
153
+ typer.echo("❌ Task did not complete")
154
+ typer.echo(f" Reason: {result.completion_reason}")
155
+ typer.echo(f" Iterations: {result.iterations}")
156
+ typer.echo(f" Duration: {result.duration_seconds:.2f}s")
157
+ if result.started_at:
158
+ typer.echo(f" Started: {result.started_at}")
159
+ if result.error:
160
+ typer.echo(f" Error: {result.error}")
161
+ raise typer.Exit(1)
162
+
163
+ except KeyboardInterrupt:
164
+ typer.echo("\n⚠️ Loop cancelled by user")
165
+ raise typer.Exit(130)
166
+ except typer.Exit:
167
+ raise
168
+ except Exception as e:
169
+ typer.echo(f"❌ Error: {e}", err=True)
170
+ raise typer.Exit(1)
171
+
172
+
173
+ @app.command(name="help")
174
+ def loop_help():
175
+ """Show detailed help for the loop command."""
176
+ typer.echo("""
177
+ 🔄 Autonomous Loop Command
178
+
179
+ The loop command runs an agent in an autonomous execution loop,
180
+ similar to Ralph's self-referential development loop.
181
+
182
+ FEATURES:
183
+ • Completion Promise: Agent signals "done" with <promise>TEXT</promise>
184
+ • Context Clearing: Fresh memory each iteration (file-based state)
185
+ • Iteration Limits: Prevent runaway loops
186
+ • Doom Loop Detection: Stops on repeated actions
187
+
188
+ USAGE:
189
+ praisonai loop "Your task here" [OPTIONS]
190
+
191
+ OPTIONS:
192
+ -n, --max-iterations INT Maximum iterations (default: 10)
193
+ -p, --completion-promise STR Promise text to signal completion
194
+ -c, --clear-context Clear chat history between iterations
195
+ -t, --timeout FLOAT Timeout in seconds
196
+ -m, --model STR LLM model to use
197
+ -v, --verbose Show verbose output
198
+
199
+ EXAMPLES:
200
+ # Basic loop
201
+ praisonai loop "Build a calculator" -n 5
202
+
203
+ # With completion promise
204
+ praisonai loop "Refactor the auth module" -p DONE -v
205
+
206
+ # With context clearing (forces file-based state)
207
+ praisonai loop "Implement feature X" -p COMPLETE -c -n 20
208
+
209
+ # With timeout
210
+ praisonai loop "Debug the issue" -t 300 -v
211
+ """)
@@ -0,0 +1,112 @@
1
+ """
2
+ LSP command group for PraisonAI CLI.
3
+
4
+ Wraps existing LSP functionality from features/lsp_cli.py.
5
+ Provides LSP service lifecycle management.
6
+ """
7
+
8
+ from typing import Optional
9
+
10
+ import typer
11
+
12
+ from ..output.console import get_output_controller
13
+
14
+ app = typer.Typer(help="LSP service lifecycle management")
15
+
16
+
17
+ @app.command("start")
18
+ def lsp_start(
19
+ workspace: str = typer.Option(".", "--workspace", "-w", help="Workspace root directory"),
20
+ language: Optional[str] = typer.Option(None, "--language", "-l", help="Language to start"),
21
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
22
+ ):
23
+ """Start LSP server(s)."""
24
+ args = ["start", "--workspace", workspace]
25
+ if language:
26
+ args.extend(["--language", language])
27
+ if json_output:
28
+ args.append("--json")
29
+
30
+ try:
31
+ from praisonai.cli.features.lsp_cli import run_lsp_command
32
+ exit_code = run_lsp_command(args)
33
+ raise typer.Exit(exit_code)
34
+ except ImportError as e:
35
+ output = get_output_controller()
36
+ output.print_error(f"LSP module not available: {e}")
37
+ raise typer.Exit(4)
38
+
39
+
40
+ @app.command("stop")
41
+ def lsp_stop(
42
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
43
+ ):
44
+ """Stop LSP server(s)."""
45
+ args = ["stop"]
46
+ if json_output:
47
+ args.append("--json")
48
+
49
+ try:
50
+ from praisonai.cli.features.lsp_cli import run_lsp_command
51
+ exit_code = run_lsp_command(args)
52
+ raise typer.Exit(exit_code)
53
+ except ImportError as e:
54
+ output = get_output_controller()
55
+ output.print_error(f"LSP module not available: {e}")
56
+ raise typer.Exit(4)
57
+
58
+
59
+ @app.command("status")
60
+ def lsp_status(
61
+ workspace: str = typer.Option(".", "--workspace", "-w", help="Workspace root directory"),
62
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
63
+ ):
64
+ """Show LSP status."""
65
+ args = ["status", "--workspace", workspace]
66
+ if json_output:
67
+ args.append("--json")
68
+
69
+ try:
70
+ from praisonai.cli.features.lsp_cli import run_lsp_command
71
+ exit_code = run_lsp_command(args)
72
+ raise typer.Exit(exit_code)
73
+ except ImportError as e:
74
+ output = get_output_controller()
75
+ output.print_error(f"LSP module not available: {e}")
76
+ raise typer.Exit(4)
77
+
78
+
79
+ @app.command("logs")
80
+ def lsp_logs(
81
+ tail: int = typer.Option(50, "--tail", "-n", help="Number of lines to show"),
82
+ json_output: bool = typer.Option(False, "--json", help="Output JSON"),
83
+ ):
84
+ """Show recent LSP logs."""
85
+ args = ["logs", "--tail", str(tail)]
86
+ if json_output:
87
+ args.append("--json")
88
+
89
+ try:
90
+ from praisonai.cli.features.lsp_cli import run_lsp_command
91
+ exit_code = run_lsp_command(args)
92
+ raise typer.Exit(exit_code)
93
+ except ImportError as e:
94
+ output = get_output_controller()
95
+ output.print_error(f"LSP module not available: {e}")
96
+ raise typer.Exit(4)
97
+
98
+
99
+ @app.callback(invoke_without_command=True)
100
+ def lsp_callback(ctx: typer.Context):
101
+ """Show LSP help."""
102
+ if ctx.invoked_subcommand is None:
103
+ output = get_output_controller()
104
+ output.print_panel(
105
+ "LSP service lifecycle management.\n\n"
106
+ "Commands:\n"
107
+ " start Start LSP server(s)\n"
108
+ " stop Stop LSP server(s)\n"
109
+ " status Show LSP status\n"
110
+ " logs Show recent logs",
111
+ title="LSP Commands"
112
+ )