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