praisonai-code 0.0.28__tar.gz → 0.0.30__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/PKG-INFO +21 -6
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/README.md +20 -5
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/__init__.py +1 -1
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/chat.py +1 -1
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/code.py +1 -1
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/run.py +74 -1
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/setup.py +12 -22
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/tools.py +46 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/setup/handler.py +206 -55
- praisonai_code-0.0.30/praisonai_code/cli/utils/stdin.py +165 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code.egg-info/PKG-INFO +21 -6
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/pyproject.toml +1 -1
- praisonai_code-0.0.28/praisonai_code/cli/utils/stdin.py +0 -90
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/__main__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/_bot_bridge.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/_framework_availability.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/_logging.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/_registry.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/_safe_loader.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/_version.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/_wrapper_bridge.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/_forward_shim.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/_paths.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/_warnings.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/_wrapper_reexport.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/app.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/approval_backend.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/branding.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/acp.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/agent.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/agents.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/attach.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/auth.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/benchmark.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/browser.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/call.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/checkpoint.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/command.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/commit.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/completion.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/config.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/daemon.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/debug.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/deploy.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/diag.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/doctor.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/endpoints.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/environment.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/eval.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/github.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/hooks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/init.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/loop.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/lsp.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/memory.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/models.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/obs.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/package.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/paths.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/permissions.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/plugins.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/port.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/publish.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/registry.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/research.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/retrieval.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/rules.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/sandbox.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/serve.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/session.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/skills.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/templates.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/test.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/todo.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/traces.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/tracker.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/ui.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/up.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/version.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/commands/workflow.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/config_loader.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/config.schema.json +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/credentials.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/loader.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/model_resolver.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/oauth.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/paths.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/resolver.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/configuration/schema.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/execution/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/execution/core.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/execution/profiler.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/execution/request.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/execution/result.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/fallback_schema.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/_approval_bridge.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/_endpoint_registry.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/_search_registry.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/action_orchestrator.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/agents.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/at_mentions.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/audit_cli.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/auto_memory.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/auto_mode.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/autonomy_mode.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/base.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/benchmark.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/capabilities.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/checkpoints.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/cli_profiler.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/code_intelligence.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/compaction.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/compare.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/config_hierarchy.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/context_manager.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/cost_tracker.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/csv_test_runner.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/custom_definitions.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/debug.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/diag.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/display_jsonl.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/_wrapper_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/acp_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/bot_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/config_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/db_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/env_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/gateway_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/lsp_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/mcp_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/memory_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/network_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/obs_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/packaging_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/performance_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/permissions_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/runtime_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/runtime_migration_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/selftest_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/serve_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/skills_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/checks/tools_checks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/engine.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/formatters.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/handler.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/models.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/doctor/registry.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/examples.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/external_agents.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/fast_context.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/file_history.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/flow_display.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/git_attribution.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/git_integration.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/guardrail.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/handoff.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/hooks.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/hybrid_workflow.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/image.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/interactive_core_headless.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/interactive_runtime.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/interactive_test_harness.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/interactive_tools.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/interactive_tui.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/job_workflow.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/jobs.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/knowledge.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/knowledge_cli.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/lite.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/logs.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/lsp_cli.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/lsp_diagnostics.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/mcp.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/message_queue.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/metrics.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/migrate.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/migration_flow.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/migration_spec.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/n8n.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/observability.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/output_modes.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/output_style.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/package.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/performance.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/profiler/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/profiler/core.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/profiler/optimizations.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/profiler/suite.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/queue/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/queue/manager.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/queue/models.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/queue/persistence.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/queue/scheduler.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/queue/worker.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/recipe_creator.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/recipe_prompts.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/repo_map.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/router.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/safe_shell.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/sandbox_executor.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/sdk_knowledge.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/session.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/session_checkpoints.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/setup/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/setup/templates.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/skills.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/slash_commands.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/telemetry.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/thinking.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/todo.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tools.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/cli.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/config.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/debug.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/events.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/mock_provider.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/orchestrator.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/screens/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/screens/help.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/screens/main.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/screens/queue.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/screens/session.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/screens/settings.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/session_store.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/chat.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/command_popup.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/composer.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/file_popup.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/queue_panel.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/status.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/tui/widgets/tool_panel.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/wizard.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/workflow.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/features/yaml_utils.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/async_tui.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/config.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/core.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/events.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/frontends/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/frontends/rich_frontend.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/frontends/textual_frontend.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/praison_io.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/repl.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/split_tui.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/interactive/tui_app.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/legacy/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/legacy/env_security.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/legacy/praison_ai.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/legacy/prompt_dispatch.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/main.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/output/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/output/console.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/output/event_bridge.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/schedule_cli.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/schema_provider.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/session/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/session/resume.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/session/unified.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/state/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/state/identifiers.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/state/project_sessions.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/state/sessions.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/ui/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/ui/config.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/ui/events.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/ui/mg_backend.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/ui/plain.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/ui/rich_backend.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/unified_schema.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/utils/env_utils.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli/utils/project.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli_backends/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli_backends/claude.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/cli_backends/registry.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/llm/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/llm/catalogue.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/llm/config.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/llm/credentials.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/llm/env.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/runtime/__init__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/runtime/__main__.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/runtime/client.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/runtime/descriptor.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/runtime/server.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/tool_registry.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code/tool_resolver.py +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code.egg-info/SOURCES.txt +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code.egg-info/dependency_links.txt +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code.egg-info/entry_points.txt +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code.egg-info/requires.txt +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/praisonai_code.egg-info/top_level.txt +0 -0
- {praisonai_code-0.0.28 → praisonai_code-0.0.30}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: praisonai-code
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.30
|
|
4
4
|
Summary: Agentic terminal CLI for PraisonAI — the terminal-native agent (run, chat, code, runtime, cli backends) extracted from the praisonai wrapper.
|
|
5
5
|
Author: Mervin Praison
|
|
6
6
|
License: MIT
|
|
@@ -71,17 +71,32 @@ click, textual, PyYAML, python-dotenv, litellm, mcp, pydantic — see
|
|
|
71
71
|
|
|
72
72
|
### Standalone limits (`pip install praisonai-code` only)
|
|
73
73
|
|
|
74
|
+
The terminal-native commands (`run`, `chat`, `code`, `doctor`, `daemon`) live in
|
|
75
|
+
`praisonai_code.cli.commands.*` and resolve via `LazyCommandGroup` without
|
|
76
|
+
importing the wrapper. Only commands in `_WRAPPER_RESIDENT_COMMANDS` (see
|
|
77
|
+
`praisonai_code/cli/app.py`) require `pip install praisonai`.
|
|
78
|
+
|
|
74
79
|
| Command | Works standalone? | Notes |
|
|
75
80
|
|---------|-------------------|-------|
|
|
81
|
+
| `praisonai-code --version` | Yes | |
|
|
76
82
|
| `run --help`, `config`, `doctor` | Yes | |
|
|
77
|
-
| `run --output
|
|
78
|
-
| `run "…"` (default) |
|
|
79
|
-
| `
|
|
83
|
+
| `run --output verbose "…"` | Yes | In-process `Agent` (verified). `run` modes: `silent` (default), `actions`, `verbose`, `json`, `stream` |
|
|
84
|
+
| `run "…"` (default) | Yes | Resolves via `praisonai_code.cli.commands.run` |
|
|
85
|
+
| `run --output actions "…"` | Yes (intended) | Currently affected by an `auto_save` shadow-import bug — tracked separately |
|
|
86
|
+
| `chat --output plain "…"` | Yes | One-shot; interactive REPL also in code package. `chat` modes: `actions` (default), `plain`, `verbose`, `json`, `silent` |
|
|
87
|
+
| `code --help` | Yes | Full code assistant command registered |
|
|
80
88
|
| `daemon start` (foreground) | Yes | |
|
|
81
89
|
| `daemon start --background` | Yes | Spawns `python -m praisonai_code.runtime` |
|
|
90
|
+
| `batch`, `docs`, `langfuse`, `flow`, `n8n`, `train`, … | No | `_WRAPPER_RESIDENT_COMMANDS` — needs `pip install praisonai` |
|
|
91
|
+
| `bot`, `gateway`, `pairing`, … | No | Needs `praisonai` bot package |
|
|
92
|
+
|
|
93
|
+
**Known limitations:**
|
|
94
|
+
- `praisonai-code --help` may crash on Windows (cp1252) due to emoji in command
|
|
95
|
+
descriptions — tracked separately.
|
|
96
|
+
- Piped stdin (`file | run`) is not yet supported on Windows.
|
|
82
97
|
|
|
83
|
-
For
|
|
84
|
-
`pip install praisonai`.
|
|
98
|
+
For bots, gateway, batch, observability sinks, and the wrapper-resident commands
|
|
99
|
+
above, install the full wrapper: `pip install praisonai`.
|
|
85
100
|
|
|
86
101
|
Completed C7 steps:
|
|
87
102
|
- `praisonai_code._registry` — vendored plugin registry (no wrapper import)
|
|
@@ -49,17 +49,32 @@ click, textual, PyYAML, python-dotenv, litellm, mcp, pydantic — see
|
|
|
49
49
|
|
|
50
50
|
### Standalone limits (`pip install praisonai-code` only)
|
|
51
51
|
|
|
52
|
+
The terminal-native commands (`run`, `chat`, `code`, `doctor`, `daemon`) live in
|
|
53
|
+
`praisonai_code.cli.commands.*` and resolve via `LazyCommandGroup` without
|
|
54
|
+
importing the wrapper. Only commands in `_WRAPPER_RESIDENT_COMMANDS` (see
|
|
55
|
+
`praisonai_code/cli/app.py`) require `pip install praisonai`.
|
|
56
|
+
|
|
52
57
|
| Command | Works standalone? | Notes |
|
|
53
58
|
|---------|-------------------|-------|
|
|
59
|
+
| `praisonai-code --version` | Yes | |
|
|
54
60
|
| `run --help`, `config`, `doctor` | Yes | |
|
|
55
|
-
| `run --output
|
|
56
|
-
| `run "…"` (default) |
|
|
57
|
-
| `
|
|
61
|
+
| `run --output verbose "…"` | Yes | In-process `Agent` (verified). `run` modes: `silent` (default), `actions`, `verbose`, `json`, `stream` |
|
|
62
|
+
| `run "…"` (default) | Yes | Resolves via `praisonai_code.cli.commands.run` |
|
|
63
|
+
| `run --output actions "…"` | Yes (intended) | Currently affected by an `auto_save` shadow-import bug — tracked separately |
|
|
64
|
+
| `chat --output plain "…"` | Yes | One-shot; interactive REPL also in code package. `chat` modes: `actions` (default), `plain`, `verbose`, `json`, `silent` |
|
|
65
|
+
| `code --help` | Yes | Full code assistant command registered |
|
|
58
66
|
| `daemon start` (foreground) | Yes | |
|
|
59
67
|
| `daemon start --background` | Yes | Spawns `python -m praisonai_code.runtime` |
|
|
68
|
+
| `batch`, `docs`, `langfuse`, `flow`, `n8n`, `train`, … | No | `_WRAPPER_RESIDENT_COMMANDS` — needs `pip install praisonai` |
|
|
69
|
+
| `bot`, `gateway`, `pairing`, … | No | Needs `praisonai` bot package |
|
|
70
|
+
|
|
71
|
+
**Known limitations:**
|
|
72
|
+
- `praisonai-code --help` may crash on Windows (cp1252) due to emoji in command
|
|
73
|
+
descriptions — tracked separately.
|
|
74
|
+
- Piped stdin (`file | run`) is not yet supported on Windows.
|
|
60
75
|
|
|
61
|
-
For
|
|
62
|
-
`pip install praisonai`.
|
|
76
|
+
For bots, gateway, batch, observability sinks, and the wrapper-resident commands
|
|
77
|
+
above, install the full wrapper: `pip install praisonai`.
|
|
63
78
|
|
|
64
79
|
Completed C7 steps:
|
|
65
80
|
- `praisonai_code._registry` — vendored plugin registry (no wrapper import)
|
|
@@ -60,7 +60,7 @@ def chat_main(
|
|
|
60
60
|
flag_value="true",
|
|
61
61
|
),
|
|
62
62
|
no_memory: bool = typer.Option(False, "--no-memory", help="Disable memory"),
|
|
63
|
-
tools: Optional[str] = typer.Option(None, "--tools", "-t", help="
|
|
63
|
+
tools: Optional[str] = typer.Option(None, "--tools", "-t", help="Comma-separated tool names (e.g. web_search,github) or a tools.py file path"),
|
|
64
64
|
toolset: Optional[str] = typer.Option(None, "--toolset", help="Named toolset groups (comma-separated, e.g., web,files)"),
|
|
65
65
|
user_id: Optional[str] = typer.Option(None, "--user-id", help="User ID for memory isolation"),
|
|
66
66
|
session_id: Optional[str] = typer.Option(None, "--session", "-s", help="Session ID to resume"),
|
|
@@ -18,7 +18,7 @@ def code_main(
|
|
|
18
18
|
prompt: Optional[str] = typer.Argument(None, help="Code task or question"),
|
|
19
19
|
model: Optional[str] = typer.Option(None, "--model", "-m", help="LLM model to use"),
|
|
20
20
|
verbose: bool = typer.Option(False, "--verbose", "-v", help="Verbose output"),
|
|
21
|
-
tools: Optional[str] = typer.Option(None, "--tools", "-t", help="
|
|
21
|
+
tools: Optional[str] = typer.Option(None, "--tools", "-t", help="Comma-separated tool names (e.g. web_search,github) or a tools.py file path"),
|
|
22
22
|
workspace: Optional[str] = typer.Option(None, "--workspace", "-w", help="Workspace directory"),
|
|
23
23
|
file: Optional[List[str]] = typer.Option(None, "--file", "-f", help="Attach file(s) to context"),
|
|
24
24
|
no_acp: bool = typer.Option(False, "--no-acp", help="Disable ACP tools (file operations)"),
|
|
@@ -252,6 +252,68 @@ def _build_mcp_tools(
|
|
|
252
252
|
return tools
|
|
253
253
|
|
|
254
254
|
|
|
255
|
+
def _resolve_tools_arg(value: Optional[str], verbose: bool = False) -> list:
|
|
256
|
+
"""Resolve a ``--tools`` value into a list of tool callables.
|
|
257
|
+
|
|
258
|
+
``value`` may be a comma-separated list of tool *names* (resolved by name
|
|
259
|
+
through :class:`ToolResolver`, so CLI == YAML == Python), a path to a
|
|
260
|
+
``tools.py`` file, or a mix of both. Items ending in ``.py`` or that exist
|
|
261
|
+
on disk are loaded as files; everything else is resolved by name.
|
|
262
|
+
|
|
263
|
+
Returns an empty list when ``value`` is falsy so callers can unconditionally
|
|
264
|
+
extend an agent's tool list.
|
|
265
|
+
"""
|
|
266
|
+
import os as _os
|
|
267
|
+
|
|
268
|
+
if not value:
|
|
269
|
+
return []
|
|
270
|
+
|
|
271
|
+
from praisonai_code.tool_resolver import ToolResolver
|
|
272
|
+
resolver = ToolResolver()
|
|
273
|
+
resolved: list = []
|
|
274
|
+
for item in (v.strip() for v in value.split(",")):
|
|
275
|
+
if not item:
|
|
276
|
+
continue
|
|
277
|
+
if item.endswith(".py") or _os.path.exists(item):
|
|
278
|
+
module_fns = resolver.load_functions_from_module(item)
|
|
279
|
+
if module_fns:
|
|
280
|
+
resolved.extend(module_fns.values())
|
|
281
|
+
elif not _os.path.exists(item):
|
|
282
|
+
# A .py name that isn't on disk: fall through to name resolution.
|
|
283
|
+
# Strip the .py suffix so "internet_search.py" resolves as the
|
|
284
|
+
# named tool "internet_search" instead of missing outright.
|
|
285
|
+
name_only = item[:-3] if item.endswith(".py") else item
|
|
286
|
+
tool = resolver.resolve(name_only, instantiate=True)
|
|
287
|
+
if tool is not None:
|
|
288
|
+
resolved.append(tool)
|
|
289
|
+
else:
|
|
290
|
+
from ..output import get_output_controller
|
|
291
|
+
get_output_controller().print_info(
|
|
292
|
+
f"Unknown tool '{item}'. Run 'praisonai tools list' to see available tools."
|
|
293
|
+
)
|
|
294
|
+
else:
|
|
295
|
+
# tools.py present on disk but produced no callables.
|
|
296
|
+
from ..output import get_output_controller
|
|
297
|
+
if not _os.environ.get("PRAISONAI_ALLOW_LOCAL_TOOLS"):
|
|
298
|
+
get_output_controller().print_info(
|
|
299
|
+
f"Skipped '{item}': set PRAISONAI_ALLOW_LOCAL_TOOLS=true to load local tools."
|
|
300
|
+
)
|
|
301
|
+
else:
|
|
302
|
+
get_output_controller().print_info(
|
|
303
|
+
f"No callable tools found in '{item}'."
|
|
304
|
+
)
|
|
305
|
+
else:
|
|
306
|
+
tool = resolver.resolve(item, instantiate=True)
|
|
307
|
+
if tool is not None:
|
|
308
|
+
resolved.append(tool)
|
|
309
|
+
else:
|
|
310
|
+
from ..output import get_output_controller
|
|
311
|
+
get_output_controller().print_info(
|
|
312
|
+
f"Unknown tool '{item}'. Run 'praisonai tools list' to see available tools."
|
|
313
|
+
)
|
|
314
|
+
return resolved
|
|
315
|
+
|
|
316
|
+
|
|
255
317
|
def _permissions_from_config(config) -> Optional[dict]:
|
|
256
318
|
"""Convert a resolved ``permissions`` config section to a pattern->action dict.
|
|
257
319
|
|
|
@@ -510,7 +572,7 @@ def run_main(
|
|
|
510
572
|
stream: bool = typer.Option(False, "--stream/--no-stream", help="Stream output (default: off for production use)"),
|
|
511
573
|
trace: bool = typer.Option(False, "--trace", help="Enable tracing"),
|
|
512
574
|
memory: bool = typer.Option(False, "--memory", help="Enable memory"),
|
|
513
|
-
tools: Optional[str] = typer.Option(None, "--tools", "-t", help="
|
|
575
|
+
tools: Optional[str] = typer.Option(None, "--tools", "-t", help="Comma-separated tool names (e.g. web_search,github) or a tools.py file path"),
|
|
514
576
|
toolset: Optional[str] = typer.Option(None, "--toolset", help="Named toolset groups (comma-separated, e.g., web,files)"),
|
|
515
577
|
max_tokens: int = typer.Option(16000, "--max-tokens", help="Maximum output tokens"),
|
|
516
578
|
profile: bool = typer.Option(False, "--profile", help="Enable CLI profiling (timing breakdown)"),
|
|
@@ -1143,6 +1205,17 @@ def _run_prompt(
|
|
|
1143
1205
|
if mcp_tools:
|
|
1144
1206
|
agent_config["tools"] = list(agent_config.get("tools", [])) + mcp_tools
|
|
1145
1207
|
|
|
1208
|
+
# Wire --tools (names or file) and --toolset so actions mode reaches
|
|
1209
|
+
# parity with the default/YAML/Python surfaces (previously dropped).
|
|
1210
|
+
selected_tools = _resolve_tools_arg(tools, verbose=verbose)
|
|
1211
|
+
if toolset:
|
|
1212
|
+
from praisonai_code.tool_resolver import resolve_toolsets as _resolve_toolsets
|
|
1213
|
+
toolset_names = [t.strip() for t in toolset.split(",") if t.strip()]
|
|
1214
|
+
if toolset_names:
|
|
1215
|
+
selected_tools.extend(_resolve_toolsets(toolset_names))
|
|
1216
|
+
if selected_tools:
|
|
1217
|
+
agent_config["tools"] = list(agent_config.get("tools", [])) + selected_tools
|
|
1218
|
+
|
|
1146
1219
|
agent = Agent(**agent_config)
|
|
1147
1220
|
# Reasoning effort applied via the property setter (not a
|
|
1148
1221
|
# constructor kwarg) so defaults are unchanged when omitted.
|
|
@@ -14,9 +14,6 @@ from ..output.console import get_output_controller
|
|
|
14
14
|
|
|
15
15
|
app = typer.Typer(help="Interactive onboarding / configuration wizard")
|
|
16
16
|
|
|
17
|
-
# Source the OpenAI default from the single source of truth so setup never
|
|
18
|
-
# re-declares the terminal fallback literal.
|
|
19
|
-
from praisonai_code.llm.env import DEFAULT_FALLBACK_MODEL as _OPENAI_DEFAULT_MODEL
|
|
20
17
|
|
|
21
18
|
# Default PRAISON_HOME directory
|
|
22
19
|
def get_praison_home() -> Path:
|
|
@@ -29,22 +26,9 @@ def get_praison_home() -> Path:
|
|
|
29
26
|
PRAISON_HOME = get_praison_home()
|
|
30
27
|
ENV_FILE = PRAISON_HOME / ".env"
|
|
31
28
|
|
|
32
|
-
# Provider configurations
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
"2": ("anthropic", "ANTHROPIC_API_KEY", "claude-3-5-sonnet-latest"),
|
|
36
|
-
"3": ("google", "GEMINI_API_KEY", "gemini-2.0-flash"),
|
|
37
|
-
"4": ("ollama", None, "llama3.2"),
|
|
38
|
-
"5": ("custom", None, None),
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
PROVIDER_NAMES = {
|
|
42
|
-
"openai": ("OpenAI", "OPENAI_API_KEY", _OPENAI_DEFAULT_MODEL),
|
|
43
|
-
"anthropic": ("Anthropic", "ANTHROPIC_API_KEY", "claude-3-5-sonnet-latest"),
|
|
44
|
-
"google": ("Google", "GEMINI_API_KEY", "gemini-2.0-flash"),
|
|
45
|
-
"ollama": ("Ollama", None, "llama3.2"),
|
|
46
|
-
"custom": ("Custom", None, None),
|
|
47
|
-
}
|
|
29
|
+
# Provider configurations (names, env-vars, and refreshed default models) live
|
|
30
|
+
# in a single source of truth: SetupHandler._provider_defaults(). Do not
|
|
31
|
+
# re-declare them here.
|
|
48
32
|
|
|
49
33
|
|
|
50
34
|
def _run_setup(
|
|
@@ -52,6 +36,7 @@ def _run_setup(
|
|
|
52
36
|
provider: Optional[str] = None,
|
|
53
37
|
api_key: Optional[str] = None,
|
|
54
38
|
model: Optional[str] = None,
|
|
39
|
+
verify: bool = True,
|
|
55
40
|
) -> int:
|
|
56
41
|
"""Run the setup wizard."""
|
|
57
42
|
try:
|
|
@@ -61,7 +46,8 @@ def _run_setup(
|
|
|
61
46
|
non_interactive=non_interactive,
|
|
62
47
|
provider=provider,
|
|
63
48
|
api_key=api_key,
|
|
64
|
-
model=model
|
|
49
|
+
model=model,
|
|
50
|
+
verify=verify,
|
|
65
51
|
)
|
|
66
52
|
except ImportError as e:
|
|
67
53
|
output = get_output_controller()
|
|
@@ -80,6 +66,7 @@ def setup_callback(
|
|
|
80
66
|
provider: Optional[str] = typer.Option(None, "--provider", help="LLM provider (openai, anthropic, google, ollama, custom)"),
|
|
81
67
|
api_key: Optional[str] = typer.Option(None, "--api-key", help="API key for the provider"),
|
|
82
68
|
model: Optional[str] = typer.Option(None, "--model", help="Default model to use"),
|
|
69
|
+
no_verify: bool = typer.Option(False, "--no-verify", help="Skip the post-setup smoke test (offline/CI)"),
|
|
83
70
|
):
|
|
84
71
|
"""Run the onboarding wizard (idempotent — safe to re-run)."""
|
|
85
72
|
if ctx.invoked_subcommand:
|
|
@@ -89,7 +76,8 @@ def setup_callback(
|
|
|
89
76
|
non_interactive=non_interactive,
|
|
90
77
|
provider=provider,
|
|
91
78
|
api_key=api_key,
|
|
92
|
-
model=model
|
|
79
|
+
model=model,
|
|
80
|
+
verify=not no_verify,
|
|
93
81
|
)
|
|
94
82
|
raise typer.Exit(exit_code)
|
|
95
83
|
|
|
@@ -99,13 +87,15 @@ def setup_wizard(
|
|
|
99
87
|
provider: Optional[str] = typer.Option(None, "--provider", help="LLM provider"),
|
|
100
88
|
api_key: Optional[str] = typer.Option(None, "--api-key", help="API key"),
|
|
101
89
|
model: Optional[str] = typer.Option(None, "--model", help="Default model"),
|
|
90
|
+
no_verify: bool = typer.Option(False, "--no-verify", help="Skip the post-setup smoke test (offline/CI)"),
|
|
102
91
|
):
|
|
103
92
|
"""Run the interactive setup wizard."""
|
|
104
93
|
exit_code = _run_setup(
|
|
105
94
|
non_interactive=False,
|
|
106
95
|
provider=provider,
|
|
107
96
|
api_key=api_key,
|
|
108
|
-
model=model
|
|
97
|
+
model=model,
|
|
98
|
+
verify=not no_verify,
|
|
109
99
|
)
|
|
110
100
|
raise typer.Exit(exit_code)
|
|
111
101
|
|
|
@@ -11,6 +11,7 @@ from typing import Optional
|
|
|
11
11
|
|
|
12
12
|
import typer
|
|
13
13
|
from rich.console import Console
|
|
14
|
+
from rich.markup import escape
|
|
14
15
|
from rich.table import Table
|
|
15
16
|
|
|
16
17
|
app = typer.Typer(help="Tool management and discovery")
|
|
@@ -92,6 +93,51 @@ def tools_list(
|
|
|
92
93
|
console.print(f"[dim] Built-in: {len(builtin_tools)} | Local: {len(local_tools)} | External: {len(external_tools)} | Registered: {len(registered_tools)}[/dim]")
|
|
93
94
|
|
|
94
95
|
|
|
96
|
+
@app.command("search")
|
|
97
|
+
def tools_search(
|
|
98
|
+
query: str = typer.Argument(..., help="Substring to search tool names for"),
|
|
99
|
+
verbose: bool = typer.Option(False, "--verbose", "-v", help="Show detailed info"),
|
|
100
|
+
):
|
|
101
|
+
"""Search available tools by name substring (case-insensitive).
|
|
102
|
+
|
|
103
|
+
Enumerates the same catalogue as 'tools list' (built-in, local, external,
|
|
104
|
+
registered/entry-point) and filters to names containing the query.
|
|
105
|
+
"""
|
|
106
|
+
from praisonai_code.tool_resolver import ToolResolver
|
|
107
|
+
|
|
108
|
+
resolver = ToolResolver()
|
|
109
|
+
available = resolver.list_available()
|
|
110
|
+
sources = resolver.list_available_sources()
|
|
111
|
+
|
|
112
|
+
needle = query.strip().lower()
|
|
113
|
+
matches = {
|
|
114
|
+
name: desc for name, desc in available.items() if needle in name.lower()
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
safe_query = escape(query)
|
|
118
|
+
if not matches:
|
|
119
|
+
console.print(f"[yellow]No tools matching '{safe_query}'.[/yellow]")
|
|
120
|
+
console.print("[dim]Run 'praisonai tools list' to see all available tools.[/dim]")
|
|
121
|
+
return
|
|
122
|
+
|
|
123
|
+
table = Table(title=f"Tools matching '{safe_query}'", show_header=True, header_style="bold cyan")
|
|
124
|
+
table.add_column("Tool Name", style="green")
|
|
125
|
+
table.add_column("Source", style="blue")
|
|
126
|
+
if verbose:
|
|
127
|
+
table.add_column("Description", style="dim")
|
|
128
|
+
|
|
129
|
+
for name in sorted(matches.keys()):
|
|
130
|
+
desc = matches[name]
|
|
131
|
+
src = sources.get(name, "builtin")
|
|
132
|
+
if verbose:
|
|
133
|
+
table.add_row(name, src, desc[:60] + "..." if len(desc) > 60 else desc)
|
|
134
|
+
else:
|
|
135
|
+
table.add_row(name, src)
|
|
136
|
+
|
|
137
|
+
console.print(table)
|
|
138
|
+
console.print(f"\n[dim]Total: {len(matches)} match(es)[/dim]")
|
|
139
|
+
|
|
140
|
+
|
|
95
141
|
@app.command("validate")
|
|
96
142
|
def tools_validate(
|
|
97
143
|
yaml_file: str = typer.Argument("agents.yaml", help="YAML file to validate"),
|