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,278 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CLI Features Module for PraisonAI (agentic terminal product).
|
|
3
|
+
|
|
4
|
+
This module contains modular CLI feature handlers that extend the base CLI
|
|
5
|
+
functionality. Each feature is implemented as a separate module for
|
|
6
|
+
maintainability and testability.
|
|
7
|
+
|
|
8
|
+
Migrated to ``praisonai_code`` as part of the C0–C6 extraction (issue #2512).
|
|
9
|
+
Public paths under ``praisonai.cli.features.*`` continue to work via a shim in
|
|
10
|
+
the main ``praisonai`` package.
|
|
11
|
+
|
|
12
|
+
Features:
|
|
13
|
+
- guardrail: Output validation using LLM guardrails
|
|
14
|
+
- metrics: Token usage and cost tracking
|
|
15
|
+
- image: Image processing with ImageAgent
|
|
16
|
+
- telemetry: Usage monitoring and analytics
|
|
17
|
+
- mcp: Model Context Protocol server integration
|
|
18
|
+
- fast_context: Codebase search capability
|
|
19
|
+
- knowledge: RAG/vector store management
|
|
20
|
+
- session: Session management for multi-turn conversations
|
|
21
|
+
- tools: Tool registry management
|
|
22
|
+
- handoff: Agent-to-agent delegation
|
|
23
|
+
- auto_memory: Automatic memory extraction
|
|
24
|
+
- todo: Todo list management
|
|
25
|
+
- router: Smart model selection
|
|
26
|
+
- flow_display: Visual workflow tracking
|
|
27
|
+
- workflow: YAML workflow management
|
|
28
|
+
- n8n: Export workflows to n8n visual editor
|
|
29
|
+
- external_agents: External AI CLI tool integrations (Claude, Gemini, Codex, Cursor)
|
|
30
|
+
- slash_commands: Interactive slash commands (/help, /cost, /plan, etc.)
|
|
31
|
+
- autonomy_mode: Autonomy levels (suggest, auto-edit, full-auto)
|
|
32
|
+
- cost_tracker: Real-time cost and token tracking
|
|
33
|
+
- message_queue: Message queuing while agent is processing
|
|
34
|
+
- at_mentions: @ mention autocomplete for files and directories
|
|
35
|
+
- compare: CLI command comparison feature
|
|
36
|
+
- eval: Agent evaluation framework (accuracy, performance, reliability, criteria)
|
|
37
|
+
- hooks: Hook system for intercepting and modifying agent behavior
|
|
38
|
+
- checkpoints: Shadow git checkpointing for file-level undo/restore
|
|
39
|
+
- background: Background agent task execution and management
|
|
40
|
+
- thinking: Thinking budget management
|
|
41
|
+
- compaction: Context compaction settings
|
|
42
|
+
- output_style: Output style configuration
|
|
43
|
+
- ollama: Ollama provider and Weak-Model-Proof execution
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
# Type hints available for IDE support
|
|
47
|
+
|
|
48
|
+
# Lazy imports to avoid performance impact
|
|
49
|
+
__all__ = [
|
|
50
|
+
'GuardrailHandler',
|
|
51
|
+
'MetricsHandler',
|
|
52
|
+
'ImageHandler',
|
|
53
|
+
'TelemetryHandler',
|
|
54
|
+
'MCPHandler',
|
|
55
|
+
'FastContextHandler',
|
|
56
|
+
'KnowledgeHandler',
|
|
57
|
+
'SessionHandler',
|
|
58
|
+
'ToolsHandler',
|
|
59
|
+
'HandoffHandler',
|
|
60
|
+
'AutoMemoryHandler',
|
|
61
|
+
'TodoHandler',
|
|
62
|
+
'RouterHandler',
|
|
63
|
+
'FlowDisplayHandler',
|
|
64
|
+
'WorkflowHandler',
|
|
65
|
+
'N8nHandler',
|
|
66
|
+
'ExternalAgentsHandler',
|
|
67
|
+
# New CLI enhancement features
|
|
68
|
+
'SlashCommandHandler',
|
|
69
|
+
'AutonomyModeHandler',
|
|
70
|
+
'CostTrackerHandler',
|
|
71
|
+
'RepoMapHandler',
|
|
72
|
+
'InteractiveTUIHandler',
|
|
73
|
+
'GitIntegrationHandler',
|
|
74
|
+
'SandboxExecutorHandler',
|
|
75
|
+
'MessageQueueHandler',
|
|
76
|
+
# @ mention autocomplete
|
|
77
|
+
'AtMentionCompleter',
|
|
78
|
+
'CombinedCompleter',
|
|
79
|
+
'FileSearchService',
|
|
80
|
+
# Evaluation
|
|
81
|
+
'EvalHandler',
|
|
82
|
+
# Compare feature
|
|
83
|
+
'CompareHandler',
|
|
84
|
+
# Agent Skills
|
|
85
|
+
'SkillsHandler',
|
|
86
|
+
# Hooks
|
|
87
|
+
'HooksHandler',
|
|
88
|
+
# Checkpoints
|
|
89
|
+
'CheckpointsHandler',
|
|
90
|
+
# Background
|
|
91
|
+
'BackgroundHandler',
|
|
92
|
+
# Thinking, Compaction, Output Style
|
|
93
|
+
'ThinkingHandler',
|
|
94
|
+
'CompactionHandler',
|
|
95
|
+
'OutputStyleHandler',
|
|
96
|
+
# Ollama + WMP
|
|
97
|
+
'OllamaHandler',
|
|
98
|
+
# Capabilities (LiteLLM endpoint parity)
|
|
99
|
+
'CapabilitiesHandler',
|
|
100
|
+
# Performance benchmarking
|
|
101
|
+
'PerformanceHandler',
|
|
102
|
+
# Comprehensive benchmarking
|
|
103
|
+
'BenchmarkHandler',
|
|
104
|
+
# Lite agent (BYO-LLM)
|
|
105
|
+
'LiteHandler',
|
|
106
|
+
# Agent-centric tools (LSP/ACP powered)
|
|
107
|
+
'create_agent_centric_tools',
|
|
108
|
+
'InteractiveRuntime',
|
|
109
|
+
'RuntimeConfig',
|
|
110
|
+
'CodeIntelligenceRouter',
|
|
111
|
+
'ActionOrchestrator',
|
|
112
|
+
# Interactive tools provider (canonical source)
|
|
113
|
+
'get_interactive_tools',
|
|
114
|
+
'resolve_tool_groups',
|
|
115
|
+
'ToolConfig',
|
|
116
|
+
'TOOL_GROUPS',
|
|
117
|
+
]
|
|
118
|
+
|
|
119
|
+
def __getattr__(name):
|
|
120
|
+
"""Lazy load handlers to minimize import overhead."""
|
|
121
|
+
if name == 'GuardrailHandler':
|
|
122
|
+
from .guardrail import GuardrailHandler
|
|
123
|
+
return GuardrailHandler
|
|
124
|
+
elif name == 'MetricsHandler':
|
|
125
|
+
from .metrics import MetricsHandler
|
|
126
|
+
return MetricsHandler
|
|
127
|
+
elif name == 'ImageHandler':
|
|
128
|
+
from .image import ImageHandler
|
|
129
|
+
return ImageHandler
|
|
130
|
+
elif name == 'TelemetryHandler':
|
|
131
|
+
from .telemetry import TelemetryHandler
|
|
132
|
+
return TelemetryHandler
|
|
133
|
+
elif name == 'MCPHandler':
|
|
134
|
+
from .mcp import MCPHandler
|
|
135
|
+
return MCPHandler
|
|
136
|
+
elif name == 'FastContextHandler':
|
|
137
|
+
from .fast_context import FastContextHandler
|
|
138
|
+
return FastContextHandler
|
|
139
|
+
elif name == 'KnowledgeHandler':
|
|
140
|
+
from .knowledge import KnowledgeHandler
|
|
141
|
+
return KnowledgeHandler
|
|
142
|
+
elif name == 'SessionHandler':
|
|
143
|
+
from .session import SessionHandler
|
|
144
|
+
return SessionHandler
|
|
145
|
+
elif name == 'ToolsHandler':
|
|
146
|
+
from .tools import ToolsHandler
|
|
147
|
+
return ToolsHandler
|
|
148
|
+
elif name == 'HandoffHandler':
|
|
149
|
+
from .handoff import HandoffHandler
|
|
150
|
+
return HandoffHandler
|
|
151
|
+
elif name == 'AutoMemoryHandler':
|
|
152
|
+
from .auto_memory import AutoMemoryHandler
|
|
153
|
+
return AutoMemoryHandler
|
|
154
|
+
elif name == 'TodoHandler':
|
|
155
|
+
from .todo import TodoHandler
|
|
156
|
+
return TodoHandler
|
|
157
|
+
elif name == 'RouterHandler':
|
|
158
|
+
from .router import RouterHandler
|
|
159
|
+
return RouterHandler
|
|
160
|
+
elif name == 'FlowDisplayHandler':
|
|
161
|
+
from .flow_display import FlowDisplayHandler
|
|
162
|
+
return FlowDisplayHandler
|
|
163
|
+
elif name == 'WorkflowHandler':
|
|
164
|
+
from .workflow import WorkflowHandler
|
|
165
|
+
return WorkflowHandler
|
|
166
|
+
elif name == 'N8nHandler':
|
|
167
|
+
from .n8n import N8nHandler
|
|
168
|
+
return N8nHandler
|
|
169
|
+
elif name == 'ExternalAgentsHandler':
|
|
170
|
+
from .external_agents import ExternalAgentsHandler
|
|
171
|
+
return ExternalAgentsHandler
|
|
172
|
+
# New CLI enhancement features
|
|
173
|
+
elif name == 'SlashCommandHandler':
|
|
174
|
+
from .slash_commands import SlashCommandHandler
|
|
175
|
+
return SlashCommandHandler
|
|
176
|
+
elif name == 'AutonomyModeHandler':
|
|
177
|
+
from .autonomy_mode import AutonomyModeHandler
|
|
178
|
+
return AutonomyModeHandler
|
|
179
|
+
elif name == 'CostTrackerHandler':
|
|
180
|
+
from .cost_tracker import CostTrackerHandler
|
|
181
|
+
return CostTrackerHandler
|
|
182
|
+
elif name == 'RepoMapHandler':
|
|
183
|
+
from .repo_map import RepoMapHandler
|
|
184
|
+
return RepoMapHandler
|
|
185
|
+
elif name == 'InteractiveTUIHandler':
|
|
186
|
+
from .interactive_tui import InteractiveTUIHandler
|
|
187
|
+
return InteractiveTUIHandler
|
|
188
|
+
elif name == 'GitIntegrationHandler':
|
|
189
|
+
from .git_integration import GitIntegrationHandler
|
|
190
|
+
return GitIntegrationHandler
|
|
191
|
+
elif name == 'SandboxExecutorHandler':
|
|
192
|
+
from .sandbox_executor import SandboxExecutorHandler
|
|
193
|
+
return SandboxExecutorHandler
|
|
194
|
+
elif name == 'MessageQueueHandler':
|
|
195
|
+
from .message_queue import MessageQueueHandler
|
|
196
|
+
return MessageQueueHandler
|
|
197
|
+
# @ mention autocomplete
|
|
198
|
+
elif name == 'AtMentionCompleter':
|
|
199
|
+
from .at_mentions import AtMentionCompleter
|
|
200
|
+
return AtMentionCompleter
|
|
201
|
+
elif name == 'CombinedCompleter':
|
|
202
|
+
from .at_mentions import CombinedCompleter
|
|
203
|
+
return CombinedCompleter
|
|
204
|
+
elif name == 'FileSearchService':
|
|
205
|
+
from .at_mentions import FileSearchService
|
|
206
|
+
return FileSearchService
|
|
207
|
+
elif name == 'CompareHandler':
|
|
208
|
+
from .compare import CompareHandler
|
|
209
|
+
return CompareHandler
|
|
210
|
+
elif name == 'EvalHandler':
|
|
211
|
+
from .eval import EvalHandler
|
|
212
|
+
return EvalHandler
|
|
213
|
+
elif name == 'SkillsHandler':
|
|
214
|
+
from .skills import SkillsHandler
|
|
215
|
+
return SkillsHandler
|
|
216
|
+
elif name == 'HooksHandler':
|
|
217
|
+
from .hooks import HooksHandler
|
|
218
|
+
return HooksHandler
|
|
219
|
+
elif name == 'CheckpointsHandler':
|
|
220
|
+
from .checkpoints import CheckpointsHandler
|
|
221
|
+
return CheckpointsHandler
|
|
222
|
+
elif name == 'BackgroundHandler':
|
|
223
|
+
from .background import BackgroundHandler
|
|
224
|
+
return BackgroundHandler
|
|
225
|
+
elif name == 'ThinkingHandler':
|
|
226
|
+
from .thinking import ThinkingHandler
|
|
227
|
+
return ThinkingHandler
|
|
228
|
+
elif name == 'CompactionHandler':
|
|
229
|
+
from .compaction import CompactionHandler
|
|
230
|
+
return CompactionHandler
|
|
231
|
+
elif name == 'OutputStyleHandler':
|
|
232
|
+
from .output_style import OutputStyleHandler
|
|
233
|
+
return OutputStyleHandler
|
|
234
|
+
elif name == 'OllamaHandler':
|
|
235
|
+
from .ollama import OllamaHandler
|
|
236
|
+
return OllamaHandler
|
|
237
|
+
elif name == 'CapabilitiesHandler':
|
|
238
|
+
from .capabilities import CapabilitiesHandler
|
|
239
|
+
return CapabilitiesHandler
|
|
240
|
+
elif name == 'PerformanceHandler':
|
|
241
|
+
from .performance import PerformanceHandler
|
|
242
|
+
return PerformanceHandler
|
|
243
|
+
elif name == 'BenchmarkHandler':
|
|
244
|
+
from .benchmark import BenchmarkHandler
|
|
245
|
+
return BenchmarkHandler
|
|
246
|
+
elif name == 'LiteHandler':
|
|
247
|
+
from .lite import LiteHandler
|
|
248
|
+
return LiteHandler
|
|
249
|
+
# Agent-centric tools (LSP/ACP powered)
|
|
250
|
+
elif name == 'create_agent_centric_tools':
|
|
251
|
+
from .agent_tools import create_agent_centric_tools
|
|
252
|
+
return create_agent_centric_tools
|
|
253
|
+
elif name == 'InteractiveRuntime':
|
|
254
|
+
from .interactive_runtime import InteractiveRuntime
|
|
255
|
+
return InteractiveRuntime
|
|
256
|
+
elif name == 'RuntimeConfig':
|
|
257
|
+
from .interactive_runtime import RuntimeConfig
|
|
258
|
+
return RuntimeConfig
|
|
259
|
+
elif name == 'CodeIntelligenceRouter':
|
|
260
|
+
from .code_intelligence import CodeIntelligenceRouter
|
|
261
|
+
return CodeIntelligenceRouter
|
|
262
|
+
elif name == 'ActionOrchestrator':
|
|
263
|
+
from .action_orchestrator import ActionOrchestrator
|
|
264
|
+
return ActionOrchestrator
|
|
265
|
+
# Interactive tools provider (canonical source)
|
|
266
|
+
elif name == 'get_interactive_tools':
|
|
267
|
+
from .interactive_tools import get_interactive_tools
|
|
268
|
+
return get_interactive_tools
|
|
269
|
+
elif name == 'resolve_tool_groups':
|
|
270
|
+
from .interactive_tools import resolve_tool_groups
|
|
271
|
+
return resolve_tool_groups
|
|
272
|
+
elif name == 'ToolConfig':
|
|
273
|
+
from .interactive_tools import ToolConfig
|
|
274
|
+
return ToolConfig
|
|
275
|
+
elif name == 'TOOL_GROUPS':
|
|
276
|
+
from .interactive_tools import TOOL_GROUPS
|
|
277
|
+
return TOOL_GROUPS
|
|
278
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Registry for endpoint provider types.
|
|
3
|
+
|
|
4
|
+
Maps endpoint types to their invocation methods (lazy-loaded).
|
|
5
|
+
Extensible: third-party endpoint types can register via entry points.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import Callable, Any
|
|
11
|
+
|
|
12
|
+
from ..._registry import PluginRegistry
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Built-in endpoint types - return callables that will be bound to the class instance
|
|
16
|
+
def _recipe_loader():
|
|
17
|
+
def invoke_recipe(self, endpoint_name: str, input_data: Any, config: dict, parsed: dict):
|
|
18
|
+
return self._invoke_recipe(endpoint_name, input_data, config, parsed)
|
|
19
|
+
return invoke_recipe
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _agents_api_loader():
|
|
23
|
+
def invoke_agents_api(self, endpoint_name: str, input_data: Any, config: dict, parsed: dict):
|
|
24
|
+
return self._invoke_agents_api(endpoint_name, input_data, config, parsed)
|
|
25
|
+
return invoke_agents_api
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _mcp_loader():
|
|
29
|
+
def invoke_mcp(self, endpoint_name: str, input_data: Any, config: dict, parsed: dict):
|
|
30
|
+
return self._invoke_mcp(endpoint_name, input_data, config, parsed)
|
|
31
|
+
return invoke_mcp
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _a2a_loader():
|
|
35
|
+
def invoke_a2a(self, endpoint_name: str, input_data: Any, config: dict, parsed: dict):
|
|
36
|
+
return self._invoke_a2a(endpoint_name, input_data, config, parsed)
|
|
37
|
+
return invoke_a2a
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _a2u_loader():
|
|
41
|
+
def invoke_a2u(self, endpoint_name: str, input_data: Any, config: dict, parsed: dict):
|
|
42
|
+
return self._invoke_a2u(endpoint_name, input_data, config, parsed)
|
|
43
|
+
return invoke_a2u
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
# Built-in endpoint types with lazy loading
|
|
47
|
+
_BUILTIN_ENDPOINTS = {
|
|
48
|
+
"recipe": _recipe_loader,
|
|
49
|
+
"agents-api": _agents_api_loader,
|
|
50
|
+
"mcp": _mcp_loader,
|
|
51
|
+
"tools-mcp": _mcp_loader, # Alias for mcp
|
|
52
|
+
"a2a": _a2a_loader,
|
|
53
|
+
"a2u": _a2u_loader,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class EndpointProviderRegistry(PluginRegistry):
|
|
58
|
+
"""Registry for endpoint provider types."""
|
|
59
|
+
|
|
60
|
+
def __init__(self):
|
|
61
|
+
super().__init__(
|
|
62
|
+
entry_point_group="praisonai.endpoints.providers",
|
|
63
|
+
builtins=_BUILTIN_ENDPOINTS
|
|
64
|
+
)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Registry for web search providers.
|
|
3
|
+
|
|
4
|
+
Maps search provider names to their tool classes (lazy-loaded).
|
|
5
|
+
Extensible: third-party search providers can register via entry points.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from ..._registry import PluginRegistry
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _duckduckgo_loader():
|
|
14
|
+
from praisonai_tools import DuckDuckGoTool
|
|
15
|
+
return DuckDuckGoTool
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _tavily_loader():
|
|
19
|
+
from praisonai_tools import TavilyTool
|
|
20
|
+
return TavilyTool
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _serper_loader():
|
|
24
|
+
from praisonai_tools import SerperTool
|
|
25
|
+
return SerperTool
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# Built-in search providers with lazy loading
|
|
29
|
+
_BUILTIN_SEARCH = {
|
|
30
|
+
"duckduckgo": _duckduckgo_loader,
|
|
31
|
+
"tavily": _tavily_loader,
|
|
32
|
+
"serper": _serper_loader,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class SearchProviderRegistry(PluginRegistry):
|
|
37
|
+
"""Registry for web search providers."""
|
|
38
|
+
|
|
39
|
+
def __init__(self):
|
|
40
|
+
super().__init__(
|
|
41
|
+
entry_point_group="praisonai.tools.search",
|
|
42
|
+
builtins=_BUILTIN_SEARCH
|
|
43
|
+
)
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ACP CLI handler for PraisonAI.
|
|
3
|
+
|
|
4
|
+
Provides the `praisonai acp` command for IDE/editor integration.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import argparse
|
|
8
|
+
import logging
|
|
9
|
+
import sys
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ACPHandler:
|
|
16
|
+
"""Handler for ACP CLI commands."""
|
|
17
|
+
|
|
18
|
+
@staticmethod
|
|
19
|
+
def add_arguments(parser: argparse.ArgumentParser) -> None:
|
|
20
|
+
"""Add ACP-specific arguments to parser."""
|
|
21
|
+
parser.add_argument(
|
|
22
|
+
"-w", "--workspace",
|
|
23
|
+
type=str,
|
|
24
|
+
default=".",
|
|
25
|
+
help="Workspace root directory (default: current directory)"
|
|
26
|
+
)
|
|
27
|
+
parser.add_argument(
|
|
28
|
+
"-a", "--agent",
|
|
29
|
+
type=str,
|
|
30
|
+
default="default",
|
|
31
|
+
help="Agent name or configuration file"
|
|
32
|
+
)
|
|
33
|
+
parser.add_argument(
|
|
34
|
+
"--agents",
|
|
35
|
+
type=str,
|
|
36
|
+
help="Multi-agent configuration YAML file"
|
|
37
|
+
)
|
|
38
|
+
parser.add_argument(
|
|
39
|
+
"--router",
|
|
40
|
+
action="store_true",
|
|
41
|
+
help="Enable router agent for task delegation"
|
|
42
|
+
)
|
|
43
|
+
parser.add_argument(
|
|
44
|
+
"-m", "--model",
|
|
45
|
+
type=str,
|
|
46
|
+
help="LLM model to use"
|
|
47
|
+
)
|
|
48
|
+
parser.add_argument(
|
|
49
|
+
"-r", "--resume",
|
|
50
|
+
type=str,
|
|
51
|
+
nargs="?",
|
|
52
|
+
const="__last__",
|
|
53
|
+
help="Resume session by ID (or --resume --last for most recent)"
|
|
54
|
+
)
|
|
55
|
+
parser.add_argument(
|
|
56
|
+
"--last",
|
|
57
|
+
action="store_true",
|
|
58
|
+
help="Resume the last session (use with --resume)"
|
|
59
|
+
)
|
|
60
|
+
parser.add_argument(
|
|
61
|
+
"--approve",
|
|
62
|
+
type=str,
|
|
63
|
+
choices=["manual", "auto", "scoped"],
|
|
64
|
+
default="manual",
|
|
65
|
+
help="Approval mode for actions (default: manual)"
|
|
66
|
+
)
|
|
67
|
+
parser.add_argument(
|
|
68
|
+
"--read-only",
|
|
69
|
+
action="store_true",
|
|
70
|
+
default=True,
|
|
71
|
+
help="Read-only mode (default: enabled)"
|
|
72
|
+
)
|
|
73
|
+
parser.add_argument(
|
|
74
|
+
"--allow-write",
|
|
75
|
+
action="store_true",
|
|
76
|
+
help="Allow file write operations"
|
|
77
|
+
)
|
|
78
|
+
parser.add_argument(
|
|
79
|
+
"--allow-shell",
|
|
80
|
+
action="store_true",
|
|
81
|
+
help="Allow shell command execution"
|
|
82
|
+
)
|
|
83
|
+
parser.add_argument(
|
|
84
|
+
"--allow-network",
|
|
85
|
+
action="store_true",
|
|
86
|
+
help="Allow network requests"
|
|
87
|
+
)
|
|
88
|
+
parser.add_argument(
|
|
89
|
+
"--debug",
|
|
90
|
+
action="store_true",
|
|
91
|
+
help="Enable debug logging to stderr"
|
|
92
|
+
)
|
|
93
|
+
parser.add_argument(
|
|
94
|
+
"--profile",
|
|
95
|
+
type=str,
|
|
96
|
+
help="Use named profile from config"
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
@staticmethod
|
|
100
|
+
def handle(args: argparse.Namespace) -> int:
|
|
101
|
+
"""
|
|
102
|
+
Handle ACP command execution.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Exit code (0 for success, non-zero for error)
|
|
106
|
+
"""
|
|
107
|
+
# Check if ACP SDK is available
|
|
108
|
+
try:
|
|
109
|
+
import importlib.util
|
|
110
|
+
if importlib.util.find_spec("acp") is None:
|
|
111
|
+
print(
|
|
112
|
+
"Error: agent-client-protocol package not installed.\n"
|
|
113
|
+
"Install with: pip install praisonai[acp]\n"
|
|
114
|
+
"Or: pip install agent-client-protocol",
|
|
115
|
+
file=sys.stderr
|
|
116
|
+
)
|
|
117
|
+
return 1
|
|
118
|
+
except Exception as e:
|
|
119
|
+
print(f"Error checking ACP availability: {e}", file=sys.stderr)
|
|
120
|
+
return 1
|
|
121
|
+
|
|
122
|
+
# Import ACP module
|
|
123
|
+
try:
|
|
124
|
+
from praisonai.acp import serve
|
|
125
|
+
except ImportError as e:
|
|
126
|
+
print(f"Error importing ACP module: {e}", file=sys.stderr)
|
|
127
|
+
return 1
|
|
128
|
+
|
|
129
|
+
# Determine resume session
|
|
130
|
+
resume_session: Optional[str] = None
|
|
131
|
+
resume_last = False
|
|
132
|
+
|
|
133
|
+
if args.resume:
|
|
134
|
+
if args.resume == "__last__" or args.last:
|
|
135
|
+
resume_last = True
|
|
136
|
+
else:
|
|
137
|
+
resume_session = args.resume
|
|
138
|
+
elif args.last:
|
|
139
|
+
resume_last = True
|
|
140
|
+
|
|
141
|
+
# Determine read-only mode
|
|
142
|
+
read_only = args.read_only and not args.allow_write
|
|
143
|
+
|
|
144
|
+
try:
|
|
145
|
+
# Start ACP server
|
|
146
|
+
serve(
|
|
147
|
+
workspace=args.workspace,
|
|
148
|
+
agent=args.agent,
|
|
149
|
+
model=args.model,
|
|
150
|
+
resume=resume_session,
|
|
151
|
+
resume_last=resume_last,
|
|
152
|
+
debug=args.debug,
|
|
153
|
+
read_only=read_only,
|
|
154
|
+
allow_write=args.allow_write,
|
|
155
|
+
allow_shell=args.allow_shell,
|
|
156
|
+
approval_mode=args.approve,
|
|
157
|
+
)
|
|
158
|
+
return 0
|
|
159
|
+
except KeyboardInterrupt:
|
|
160
|
+
logger.info("ACP server stopped by user")
|
|
161
|
+
return 0
|
|
162
|
+
except Exception as e:
|
|
163
|
+
logger.exception(f"ACP server error: {e}")
|
|
164
|
+
print(f"Error: {e}", file=sys.stderr)
|
|
165
|
+
return 1
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def setup_acp_subparser(subparsers) -> None:
|
|
169
|
+
"""Set up the ACP subcommand parser."""
|
|
170
|
+
acp_parser = subparsers.add_parser(
|
|
171
|
+
"acp",
|
|
172
|
+
help="Start ACP server for IDE/editor integration",
|
|
173
|
+
description=(
|
|
174
|
+
"Start the Agent Client Protocol (ACP) server.\n\n"
|
|
175
|
+
"This allows IDEs and editors (Zed, JetBrains, VSCode, Toad) "
|
|
176
|
+
"to connect to PraisonAI agents via JSON-RPC over stdio."
|
|
177
|
+
),
|
|
178
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
179
|
+
epilog="""
|
|
180
|
+
Examples:
|
|
181
|
+
praisonai acp # Start with defaults
|
|
182
|
+
praisonai acp --debug # Enable debug logging
|
|
183
|
+
praisonai acp --resume --last # Resume last session
|
|
184
|
+
praisonai acp --allow-write # Enable file writes
|
|
185
|
+
praisonai acp -m gpt-4o # Use specific model
|
|
186
|
+
|
|
187
|
+
Editor Configuration:
|
|
188
|
+
|
|
189
|
+
Zed (~/.config/zed/settings.json):
|
|
190
|
+
{
|
|
191
|
+
"agent_servers": {
|
|
192
|
+
"PraisonAI": {
|
|
193
|
+
"command": "praisonai",
|
|
194
|
+
"args": ["acp"],
|
|
195
|
+
"env": {}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
JetBrains (~/.jetbrains/acp.json):
|
|
201
|
+
{
|
|
202
|
+
"agent_servers": {
|
|
203
|
+
"PraisonAI": {
|
|
204
|
+
"command": "praisonai",
|
|
205
|
+
"args": ["acp"],
|
|
206
|
+
"env": {}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
Toad:
|
|
212
|
+
toad acp "praisonai acp"
|
|
213
|
+
"""
|
|
214
|
+
)
|
|
215
|
+
ACPHandler.add_arguments(acp_parser)
|
|
216
|
+
acp_parser.set_defaults(func=lambda args: ACPHandler.handle(args))
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def run_acp_command(args: Optional[list] = None) -> int:
|
|
220
|
+
"""
|
|
221
|
+
Run ACP command directly.
|
|
222
|
+
|
|
223
|
+
This can be called from the main CLI or as a standalone entry point.
|
|
224
|
+
"""
|
|
225
|
+
parser = argparse.ArgumentParser(
|
|
226
|
+
prog="praisonai acp",
|
|
227
|
+
description="Start ACP server for IDE/editor integration"
|
|
228
|
+
)
|
|
229
|
+
ACPHandler.add_arguments(parser)
|
|
230
|
+
|
|
231
|
+
parsed_args = parser.parse_args(args)
|
|
232
|
+
return ACPHandler.handle(parsed_args)
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
if __name__ == "__main__":
|
|
236
|
+
sys.exit(run_acp_command())
|