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.
- praisonai_code/__init__.py +17 -0
- praisonai_code/cli/__init__.py +12 -0
- praisonai_code/cli/_forward_shim.py +10 -0
- praisonai_code/cli/_paths.py +88 -0
- praisonai_code/cli/_warnings.py +58 -0
- praisonai_code/cli/app.py +757 -0
- praisonai_code/cli/approval_backend.py +272 -0
- praisonai_code/cli/branding.py +94 -0
- praisonai_code/cli/commands/__init__.py +114 -0
- praisonai_code/cli/commands/acp.py +80 -0
- praisonai_code/cli/commands/agent.py +116 -0
- praisonai_code/cli/commands/agents.py +80 -0
- praisonai_code/cli/commands/app.py +139 -0
- praisonai_code/cli/commands/attach.py +95 -0
- praisonai_code/cli/commands/audit.py +102 -0
- praisonai_code/cli/commands/auth.py +508 -0
- praisonai_code/cli/commands/batch.py +848 -0
- praisonai_code/cli/commands/benchmark.py +286 -0
- praisonai_code/cli/commands/browser.py +299 -0
- praisonai_code/cli/commands/call.py +45 -0
- praisonai_code/cli/commands/chat.py +332 -0
- praisonai_code/cli/commands/checkpoint.py +170 -0
- praisonai_code/cli/commands/code.py +276 -0
- praisonai_code/cli/commands/command.py +114 -0
- praisonai_code/cli/commands/commit.py +47 -0
- praisonai_code/cli/commands/completion.py +333 -0
- praisonai_code/cli/commands/config.py +681 -0
- praisonai_code/cli/commands/context.py +414 -0
- praisonai_code/cli/commands/daemon.py +203 -0
- praisonai_code/cli/commands/debug.py +142 -0
- praisonai_code/cli/commands/deploy.py +71 -0
- praisonai_code/cli/commands/diag.py +55 -0
- praisonai_code/cli/commands/docs.py +1575 -0
- praisonai_code/cli/commands/doctor.py +332 -0
- praisonai_code/cli/commands/endpoints.py +51 -0
- praisonai_code/cli/commands/environment.py +179 -0
- praisonai_code/cli/commands/eval.py +131 -0
- praisonai_code/cli/commands/examples.py +953 -0
- praisonai_code/cli/commands/flow.py +436 -0
- praisonai_code/cli/commands/github.py +752 -0
- praisonai_code/cli/commands/hooks.py +74 -0
- praisonai_code/cli/commands/init.py +174 -0
- praisonai_code/cli/commands/knowledge.py +440 -0
- praisonai_code/cli/commands/langextract.py +120 -0
- praisonai_code/cli/commands/langfuse.py +984 -0
- praisonai_code/cli/commands/loop.py +211 -0
- praisonai_code/cli/commands/lsp.py +112 -0
- praisonai_code/cli/commands/managed.py +659 -0
- praisonai_code/cli/commands/mcp.py +763 -0
- praisonai_code/cli/commands/memory.py +298 -0
- praisonai_code/cli/commands/models.py +264 -0
- praisonai_code/cli/commands/n8n.py +326 -0
- praisonai_code/cli/commands/obs.py +19 -0
- praisonai_code/cli/commands/package.py +76 -0
- praisonai_code/cli/commands/paths.py +106 -0
- praisonai_code/cli/commands/permissions.py +272 -0
- praisonai_code/cli/commands/plugins.py +609 -0
- praisonai_code/cli/commands/port.py +530 -0
- praisonai_code/cli/commands/profile.py +466 -0
- praisonai_code/cli/commands/publish.py +193 -0
- praisonai_code/cli/commands/rag.py +913 -0
- praisonai_code/cli/commands/realtime.py +52 -0
- praisonai_code/cli/commands/recipe.py +684 -0
- praisonai_code/cli/commands/registry.py +59 -0
- praisonai_code/cli/commands/replay.py +830 -0
- praisonai_code/cli/commands/research.py +49 -0
- praisonai_code/cli/commands/retrieval.py +377 -0
- praisonai_code/cli/commands/rules.py +71 -0
- praisonai_code/cli/commands/run.py +1573 -0
- praisonai_code/cli/commands/sandbox.py +371 -0
- praisonai_code/cli/commands/schedule.py +529 -0
- praisonai_code/cli/commands/serve.py +690 -0
- praisonai_code/cli/commands/session.py +450 -0
- praisonai_code/cli/commands/setup.py +174 -0
- praisonai_code/cli/commands/skills.py +545 -0
- praisonai_code/cli/commands/standardise.py +711 -0
- praisonai_code/cli/commands/templates.py +54 -0
- praisonai_code/cli/commands/test.py +558 -0
- praisonai_code/cli/commands/todo.py +74 -0
- praisonai_code/cli/commands/tools.py +205 -0
- praisonai_code/cli/commands/traces.py +145 -0
- praisonai_code/cli/commands/tracker.py +852 -0
- praisonai_code/cli/commands/train.py +613 -0
- praisonai_code/cli/commands/ui.py +172 -0
- praisonai_code/cli/commands/up.py +354 -0
- praisonai_code/cli/commands/validate.py +291 -0
- praisonai_code/cli/commands/version.py +101 -0
- praisonai_code/cli/commands/workflow.py +97 -0
- praisonai_code/cli/config_loader.py +437 -0
- praisonai_code/cli/configuration/__init__.py +27 -0
- praisonai_code/cli/configuration/config.schema.json +57 -0
- praisonai_code/cli/configuration/credentials.py +446 -0
- praisonai_code/cli/configuration/loader.py +364 -0
- praisonai_code/cli/configuration/model_resolver.py +161 -0
- praisonai_code/cli/configuration/oauth.py +389 -0
- praisonai_code/cli/configuration/paths.py +224 -0
- praisonai_code/cli/configuration/resolver.py +687 -0
- praisonai_code/cli/configuration/schema.py +317 -0
- praisonai_code/cli/execution/__init__.py +99 -0
- praisonai_code/cli/execution/core.py +208 -0
- praisonai_code/cli/execution/profiler.py +898 -0
- praisonai_code/cli/execution/request.py +85 -0
- praisonai_code/cli/execution/result.py +74 -0
- praisonai_code/cli/fallback_schema.py +416 -0
- praisonai_code/cli/features/__init__.py +278 -0
- praisonai_code/cli/features/_endpoint_registry.py +64 -0
- praisonai_code/cli/features/_search_registry.py +43 -0
- praisonai_code/cli/features/acp.py +236 -0
- praisonai_code/cli/features/action_orchestrator.py +576 -0
- praisonai_code/cli/features/agent_scheduler.py +773 -0
- praisonai_code/cli/features/agent_tools.py +603 -0
- praisonai_code/cli/features/agents.py +397 -0
- praisonai_code/cli/features/at_mentions.py +471 -0
- praisonai_code/cli/features/audit_cli.py +270 -0
- praisonai_code/cli/features/auto_memory.py +182 -0
- praisonai_code/cli/features/auto_mode.py +552 -0
- praisonai_code/cli/features/autonomy_mode.py +546 -0
- praisonai_code/cli/features/background.py +356 -0
- praisonai_code/cli/features/base.py +168 -0
- praisonai_code/cli/features/benchmark.py +1462 -0
- praisonai_code/cli/features/capabilities.py +1326 -0
- praisonai_code/cli/features/checkpoints.py +345 -0
- praisonai_code/cli/features/cli_profiler.py +335 -0
- praisonai_code/cli/features/code_intelligence.py +666 -0
- praisonai_code/cli/features/compaction.py +294 -0
- praisonai_code/cli/features/compare.py +534 -0
- praisonai_code/cli/features/config_hierarchy.py +366 -0
- praisonai_code/cli/features/context_manager.py +597 -0
- praisonai_code/cli/features/cost_tracker.py +514 -0
- praisonai_code/cli/features/csv_test_runner.py +736 -0
- praisonai_code/cli/features/custom_definitions.py +790 -0
- praisonai_code/cli/features/debug.py +810 -0
- praisonai_code/cli/features/deploy.py +605 -0
- praisonai_code/cli/features/diag.py +289 -0
- praisonai_code/cli/features/display_jsonl.py +173 -0
- praisonai_code/cli/features/doctor/__init__.py +63 -0
- praisonai_code/cli/features/doctor/checks/__init__.py +29 -0
- praisonai_code/cli/features/doctor/checks/acp_checks.py +220 -0
- praisonai_code/cli/features/doctor/checks/bot_checks.py +340 -0
- praisonai_code/cli/features/doctor/checks/config_checks.py +373 -0
- praisonai_code/cli/features/doctor/checks/db_checks.py +366 -0
- praisonai_code/cli/features/doctor/checks/env_checks.py +637 -0
- praisonai_code/cli/features/doctor/checks/gateway_checks.py +387 -0
- praisonai_code/cli/features/doctor/checks/lsp_checks.py +231 -0
- praisonai_code/cli/features/doctor/checks/mcp_checks.py +367 -0
- praisonai_code/cli/features/doctor/checks/memory_checks.py +268 -0
- praisonai_code/cli/features/doctor/checks/network_checks.py +251 -0
- praisonai_code/cli/features/doctor/checks/obs_checks.py +328 -0
- praisonai_code/cli/features/doctor/checks/packaging_checks.py +422 -0
- praisonai_code/cli/features/doctor/checks/performance_checks.py +235 -0
- praisonai_code/cli/features/doctor/checks/permissions_checks.py +259 -0
- praisonai_code/cli/features/doctor/checks/runtime_checks.py +650 -0
- praisonai_code/cli/features/doctor/checks/runtime_migration_checks.py +220 -0
- praisonai_code/cli/features/doctor/checks/selftest_checks.py +322 -0
- praisonai_code/cli/features/doctor/checks/serve_checks.py +426 -0
- praisonai_code/cli/features/doctor/checks/skills_checks.py +327 -0
- praisonai_code/cli/features/doctor/checks/tools_checks.py +371 -0
- praisonai_code/cli/features/doctor/engine.py +266 -0
- praisonai_code/cli/features/doctor/formatters.py +377 -0
- praisonai_code/cli/features/doctor/handler.py +564 -0
- praisonai_code/cli/features/doctor/models.py +276 -0
- praisonai_code/cli/features/doctor/registry.py +239 -0
- praisonai_code/cli/features/endpoints.py +1016 -0
- praisonai_code/cli/features/eval.py +559 -0
- praisonai_code/cli/features/examples.py +707 -0
- praisonai_code/cli/features/external_agents.py +231 -0
- praisonai_code/cli/features/fast_context.py +410 -0
- praisonai_code/cli/features/file_history.py +320 -0
- praisonai_code/cli/features/flow_display.py +566 -0
- praisonai_code/cli/features/git_attribution.py +159 -0
- praisonai_code/cli/features/git_integration.py +651 -0
- praisonai_code/cli/features/guardrail.py +171 -0
- praisonai_code/cli/features/handoff.py +252 -0
- praisonai_code/cli/features/hooks.py +583 -0
- praisonai_code/cli/features/hybrid_workflow.py +391 -0
- praisonai_code/cli/features/image.py +384 -0
- praisonai_code/cli/features/interactive_core_headless.py +450 -0
- praisonai_code/cli/features/interactive_runtime.py +600 -0
- praisonai_code/cli/features/interactive_test_harness.py +537 -0
- praisonai_code/cli/features/interactive_tools.py +428 -0
- praisonai_code/cli/features/interactive_tui.py +603 -0
- praisonai_code/cli/features/job_workflow.py +906 -0
- praisonai_code/cli/features/jobs.py +632 -0
- praisonai_code/cli/features/knowledge.py +531 -0
- praisonai_code/cli/features/knowledge_cli.py +438 -0
- praisonai_code/cli/features/lite.py +244 -0
- praisonai_code/cli/features/logs.py +200 -0
- praisonai_code/cli/features/lsp_cli.py +225 -0
- praisonai_code/cli/features/lsp_diagnostics.py +185 -0
- praisonai_code/cli/features/mcp.py +344 -0
- praisonai_code/cli/features/message_queue.py +587 -0
- praisonai_code/cli/features/metrics.py +210 -0
- praisonai_code/cli/features/migrate.py +1329 -0
- praisonai_code/cli/features/migration_flow.py +463 -0
- praisonai_code/cli/features/migration_spec.py +276 -0
- praisonai_code/cli/features/n8n.py +703 -0
- praisonai_code/cli/features/observability.py +293 -0
- praisonai_code/cli/features/ollama.py +361 -0
- praisonai_code/cli/features/output_modes.py +155 -0
- praisonai_code/cli/features/output_style.py +273 -0
- praisonai_code/cli/features/package.py +631 -0
- praisonai_code/cli/features/performance.py +308 -0
- praisonai_code/cli/features/persistence.py +636 -0
- praisonai_code/cli/features/profiler/__init__.py +81 -0
- praisonai_code/cli/features/profiler/core.py +558 -0
- praisonai_code/cli/features/profiler/optimizations.py +652 -0
- praisonai_code/cli/features/profiler/suite.py +386 -0
- praisonai_code/cli/features/queue/__init__.py +73 -0
- praisonai_code/cli/features/queue/manager.py +435 -0
- praisonai_code/cli/features/queue/models.py +289 -0
- praisonai_code/cli/features/queue/persistence.py +564 -0
- praisonai_code/cli/features/queue/scheduler.py +529 -0
- praisonai_code/cli/features/queue/worker.py +400 -0
- praisonai_code/cli/features/recipe.py +2187 -0
- praisonai_code/cli/features/recipe_creator.py +996 -0
- praisonai_code/cli/features/recipe_optimizer.py +1364 -0
- praisonai_code/cli/features/recipe_prompts.py +226 -0
- praisonai_code/cli/features/registry.py +229 -0
- praisonai_code/cli/features/repo_map.py +860 -0
- praisonai_code/cli/features/router.py +466 -0
- praisonai_code/cli/features/safe_shell.py +427 -0
- praisonai_code/cli/features/sandbox_cli.py +283 -0
- praisonai_code/cli/features/sandbox_executor.py +536 -0
- praisonai_code/cli/features/sdk_knowledge.py +500 -0
- praisonai_code/cli/features/session.py +222 -0
- praisonai_code/cli/features/session_checkpoints.py +208 -0
- praisonai_code/cli/features/setup/__init__.py +9 -0
- praisonai_code/cli/features/setup/handler.py +355 -0
- praisonai_code/cli/features/setup/templates.py +62 -0
- praisonai_code/cli/features/skills.py +940 -0
- praisonai_code/cli/features/slash_commands.py +692 -0
- praisonai_code/cli/features/telemetry.py +179 -0
- praisonai_code/cli/features/templates.py +1390 -0
- praisonai_code/cli/features/thinking.py +343 -0
- praisonai_code/cli/features/todo.py +334 -0
- praisonai_code/cli/features/tools.py +680 -0
- praisonai_code/cli/features/tui/__init__.py +83 -0
- praisonai_code/cli/features/tui/app.py +871 -0
- praisonai_code/cli/features/tui/cli.py +580 -0
- praisonai_code/cli/features/tui/config.py +150 -0
- praisonai_code/cli/features/tui/debug.py +526 -0
- praisonai_code/cli/features/tui/events.py +99 -0
- praisonai_code/cli/features/tui/mock_provider.py +328 -0
- praisonai_code/cli/features/tui/orchestrator.py +652 -0
- praisonai_code/cli/features/tui/screens/__init__.py +50 -0
- praisonai_code/cli/features/tui/screens/help.py +157 -0
- praisonai_code/cli/features/tui/screens/main.py +568 -0
- praisonai_code/cli/features/tui/screens/queue.py +174 -0
- praisonai_code/cli/features/tui/screens/session.py +124 -0
- praisonai_code/cli/features/tui/screens/settings.py +148 -0
- praisonai_code/cli/features/tui/session_store.py +198 -0
- praisonai_code/cli/features/tui/widgets/__init__.py +56 -0
- praisonai_code/cli/features/tui/widgets/chat.py +263 -0
- praisonai_code/cli/features/tui/widgets/command_popup.py +258 -0
- praisonai_code/cli/features/tui/widgets/composer.py +292 -0
- praisonai_code/cli/features/tui/widgets/file_popup.py +207 -0
- praisonai_code/cli/features/tui/widgets/queue_panel.py +223 -0
- praisonai_code/cli/features/tui/widgets/status.py +181 -0
- praisonai_code/cli/features/tui/widgets/tool_panel.py +307 -0
- praisonai_code/cli/features/wizard.py +289 -0
- praisonai_code/cli/features/workflow.py +802 -0
- praisonai_code/cli/features/yaml_utils.py +321 -0
- praisonai_code/cli/interactive/__init__.py +48 -0
- praisonai_code/cli/interactive/async_tui.py +1218 -0
- praisonai_code/cli/interactive/config.py +139 -0
- praisonai_code/cli/interactive/core.py +618 -0
- praisonai_code/cli/interactive/events.py +131 -0
- praisonai_code/cli/interactive/frontends/__init__.py +31 -0
- praisonai_code/cli/interactive/frontends/rich_frontend.py +462 -0
- praisonai_code/cli/interactive/frontends/textual_frontend.py +157 -0
- praisonai_code/cli/interactive/praison_io.py +502 -0
- praisonai_code/cli/interactive/repl.py +297 -0
- praisonai_code/cli/interactive/split_tui.py +456 -0
- praisonai_code/cli/interactive/tui_app.py +457 -0
- praisonai_code/cli/langfuse_client.py +360 -0
- praisonai_code/cli/main.py +7421 -0
- praisonai_code/cli/output/__init__.py +25 -0
- praisonai_code/cli/output/console.py +456 -0
- praisonai_code/cli/output/event_bridge.py +191 -0
- praisonai_code/cli/schedule_cli.py +54 -0
- praisonai_code/cli/schema_provider.py +23 -0
- praisonai_code/cli/session/__init__.py +16 -0
- praisonai_code/cli/session/resume.py +148 -0
- praisonai_code/cli/session/unified.py +548 -0
- praisonai_code/cli/state/__init__.py +31 -0
- praisonai_code/cli/state/identifiers.py +161 -0
- praisonai_code/cli/state/project_sessions.py +383 -0
- praisonai_code/cli/state/sessions.py +390 -0
- praisonai_code/cli/ui/__init__.py +160 -0
- praisonai_code/cli/ui/config.py +46 -0
- praisonai_code/cli/ui/events.py +61 -0
- praisonai_code/cli/ui/mg_backend.py +342 -0
- praisonai_code/cli/ui/plain.py +133 -0
- praisonai_code/cli/ui/rich_backend.py +162 -0
- praisonai_code/cli/unified_schema.py +655 -0
- praisonai_code/cli/utils/env_utils.py +126 -0
- praisonai_code/cli/utils/project.py +131 -0
- praisonai_code/cli_backends/__init__.py +73 -0
- praisonai_code/cli_backends/claude.py +373 -0
- praisonai_code/cli_backends/registry.py +113 -0
- praisonai_code/runtime/__init__.py +36 -0
- praisonai_code/runtime/__main__.py +81 -0
- praisonai_code/runtime/client.py +131 -0
- praisonai_code/runtime/descriptor.py +209 -0
- praisonai_code/runtime/server.py +356 -0
- praisonai_code-0.0.1.dist-info/METADATA +80 -0
- praisonai_code-0.0.1.dist-info/RECORD +309 -0
- praisonai_code-0.0.1.dist-info/WHEEL +5 -0
- 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
|
+
)
|