langchain-agentx-cli 0.4.2__tar.gz → 0.4.5__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.
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/PKG-INFO +2 -2
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/README.md +1 -1
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/__init__.py +1 -1
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/cli_l3_user_ui_queue.py +23 -39
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/permission_response_builder.py +4 -1
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/cli.py +8 -4
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/message_list.py +63 -16
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/spinner.py +67 -2
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/task_panel.py +48 -4
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/PKG-INFO +2 -2
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/pyproject.toml +1 -1
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/LICENSE +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/__main__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/app.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/auto_mode_config.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bootstrap.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/auto_mode_config_apply.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/auto_mode_messages.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/auto_mode_sink.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/auto_mode_status.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/boundary_inspector.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/deny_override.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/hook_constants.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/hook_payload.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/permission_mode_apply.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/permission_user_ui.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/session_bridge.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/auto_mode.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/clear.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/compact.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/doctor.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/grant.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/grants.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/help.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/model.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/permissions.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/quit.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/revoke.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/roots.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/theme.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/parser.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/providers/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/providers/sdk_commands.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/registry.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/completion/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/completion/base.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/completion/command_source.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/completion/history_source.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/config.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/health_report.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/history/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/history/store.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/keybindings/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/keybindings/bindings.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/launch_config_validator.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/llm_config.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/audit_subscriber.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/config.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/failure_counts.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/failure_observation.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/log_rotator.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/observer.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/session_context.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/permissions/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/permissions/factory.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/permissions/mode.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/permissions/policy.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/permissions/session_mode.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/prompts/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/prompts/assembler.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/prompts/sections.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/prompts/system_prompt.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/screens/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/screens/repl.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/session_factory.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/session_headless.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/session_options.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/state/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/state/task_store.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/colors.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/detection.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/manager.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/settings.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/system_theme.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/themes.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/watcher.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tools/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tools/registry.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/bootstrap.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/clipboard.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/memory_paths.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/message_selection.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/cache.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/component_manager.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/config.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/consumer.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/dialog.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/models.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/persistent_rules.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/presenters/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/presenters/base.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/presenters/bash.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/presenters/fallback.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/presenters/file.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/queue.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/auto_mode_deny.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/base.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/boundary/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/boundary/extract.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/boundary/request.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/fallback/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/fallback/request.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/_base.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/diff.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/edit/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/edit/request.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/filesystem/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/filesystem/request.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/paths.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/write/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/write/request.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/plan_mode/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/plan_mode/request.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/shell/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/shell/bash/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/shell/bash/request.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/shell/extract.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/shell/helpers.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/skill/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/skill/request.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/webfetch/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/webfetch/request.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/router.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/safe_screen.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/widgets/health_view.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/workspace_trust.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/welcome.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/compact_progress.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/completion_overlay.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/footer.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/input_area.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/message_events.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/assistant_message.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/auto_mode_chip.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/error_message.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/hook_message.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/rendering.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/stop_hook_summary.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/thinking_message.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/tool_result.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/pending_permission.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/permission_inline.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/permission_keybindings.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/presentation/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/presentation/expand_hint.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/presentation/full_output.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/presentation/message_layout.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/presentation/shell_output.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/presentation/view_mode.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/status_bar.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tool_result/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tool_result/base.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tool_result/blocked_view.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tool_result/error_view.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tool_result/success_view.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/agent/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/agent/widget.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/ask_user_question/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/ask_user_question/widget.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/base.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/bash/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/bash/widget.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/batch_edit/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/batch_edit/widget.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/edit/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/edit/widget.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/glob/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/glob/widget.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/grep/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/grep/widget.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/helpers.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/read/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/read/widget.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/skill/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/skill/widget.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/user_message/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/user_message/widget.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/webfetch/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/webfetch/widget.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/websearch/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/websearch/widget.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/write/__init__.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/write/widget.py +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/SOURCES.txt +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/dependency_links.txt +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/entry_points.txt +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/not-zip-safe +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/requires.txt +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/top_level.txt +0 -0
- {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: langchain-agentx-cli
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.5
|
|
4
4
|
Summary: Terminal CLI/TUI for AgentX: migrate Claude Code Ink UI, backed by langchain-agentx-python SDK.
|
|
5
5
|
Author: GoodMood2008
|
|
6
6
|
License: Apache-2.0
|
|
@@ -62,7 +62,7 @@ agentx-code # Start in current directory
|
|
|
62
62
|
agentx-code --workspace-root /path/to/project # Specify workspace
|
|
63
63
|
agentx-code --model claude-sonnet-4-20250514 # Specify model
|
|
64
64
|
agentx-code --provider claude | openai # Choose provider
|
|
65
|
-
agentx-code -
|
|
65
|
+
agentx-code --dangerously-skip-permissions # Skip permission prompts (CC-aligned)
|
|
66
66
|
agentx-code --show-config # Print merged config
|
|
67
67
|
```
|
|
68
68
|
|
|
@@ -36,7 +36,7 @@ agentx-code # Start in current directory
|
|
|
36
36
|
agentx-code --workspace-root /path/to/project # Specify workspace
|
|
37
37
|
agentx-code --model claude-sonnet-4-20250514 # Specify model
|
|
38
38
|
agentx-code --provider claude | openai # Choose provider
|
|
39
|
-
agentx-code -
|
|
39
|
+
agentx-code --dangerously-skip-permissions # Skip permission prompts (CC-aligned)
|
|
40
40
|
agentx-code --show-config # Print merged config
|
|
41
41
|
```
|
|
42
42
|
|
|
@@ -13,7 +13,6 @@ cli_l3_user_ui_queue.py — SDK L3 user_ui 与 CLI 内联权限 Widget 桥接。
|
|
|
13
13
|
|
|
14
14
|
from __future__ import annotations
|
|
15
15
|
|
|
16
|
-
from pathlib import Path
|
|
17
16
|
from typing import TYPE_CHECKING
|
|
18
17
|
|
|
19
18
|
from langchain_agentx.tool_runtime.prompt.types import (
|
|
@@ -28,13 +27,6 @@ from langchain_agentx_cli.bridge.permission_response_builder import (
|
|
|
28
27
|
PermissionResponseBuilder,
|
|
29
28
|
)
|
|
30
29
|
from langchain_agentx_cli.tui.permissions.models import PermissionDecision
|
|
31
|
-
from langchain_agentx_cli.tui.permissions.persistent_rules import (
|
|
32
|
-
PermissionBehavior,
|
|
33
|
-
PermissionDestination,
|
|
34
|
-
PermissionRule,
|
|
35
|
-
load_permission_rules,
|
|
36
|
-
save_permission_rules,
|
|
37
|
-
)
|
|
38
30
|
from langchain_agentx_cli.tui.permissions.router import permission_request_for_tool
|
|
39
31
|
|
|
40
32
|
if TYPE_CHECKING:
|
|
@@ -62,13 +54,20 @@ class CliL3UserUiQueue:
|
|
|
62
54
|
message=decision_reason.to_llm_message(request.tool_name),
|
|
63
55
|
)
|
|
64
56
|
|
|
57
|
+
tool_name, pattern = self._cache_key_for(request)
|
|
58
|
+
if self._cache_hit(bridge.permission_cache, tool_name, pattern):
|
|
59
|
+
return PromptResponse(
|
|
60
|
+
behavior="allow",
|
|
61
|
+
decision_source=PromptDecisionSource.USER_UI,
|
|
62
|
+
)
|
|
63
|
+
|
|
65
64
|
from langchain_agentx_cli.tui.permissions.dialog import DialogPermissionDecisionPort
|
|
66
65
|
|
|
67
66
|
port = DialogPermissionDecisionPort(self._app)
|
|
68
67
|
decision, grant_dir = await port.resolve_prompt(request, bridge.permission_cache)
|
|
69
68
|
|
|
70
69
|
if decision is PermissionDecision.ALLOW_SESSION:
|
|
71
|
-
|
|
70
|
+
bridge.permission_cache.add(tool_name, pattern)
|
|
72
71
|
|
|
73
72
|
return self._builder.build(
|
|
74
73
|
decision,
|
|
@@ -76,39 +75,24 @@ class CliL3UserUiQueue:
|
|
|
76
75
|
grant_directory=grant_dir,
|
|
77
76
|
)
|
|
78
77
|
|
|
79
|
-
def
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if bridge is None:
|
|
85
|
-
return
|
|
86
|
-
cache = bridge.permission_cache
|
|
78
|
+
def _cache_key_for(self, request: PromptRequest) -> tuple[str, str | None]:
|
|
79
|
+
"""统一构造 cache key,确保读写两侧 pattern 严格一致。
|
|
80
|
+
|
|
81
|
+
Why: 读写若各自构造 perm_req,参数漂移会导致 ALLOW_SESSION 写入后命中失败。
|
|
82
|
+
"""
|
|
87
83
|
perm_req = permission_request_for_tool(
|
|
88
84
|
request.tool_name,
|
|
89
85
|
request.ask_prompt or request.ask_decision.ask_prompt,
|
|
90
86
|
ask_decision=request.ask_decision,
|
|
91
87
|
workspace_root=str(self._app.workspace_root),
|
|
92
88
|
)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
PermissionRule(
|
|
104
|
-
tool_name=request.tool_name,
|
|
105
|
-
rule_content=pattern,
|
|
106
|
-
behavior=PermissionBehavior.ALLOW,
|
|
107
|
-
destination=PermissionDestination.LOCAL,
|
|
108
|
-
)
|
|
109
|
-
)
|
|
110
|
-
save_permission_rules(
|
|
111
|
-
storage,
|
|
112
|
-
workspace_root=lc.workspace_root,
|
|
113
|
-
agent_home=lc.agent_home,
|
|
114
|
-
)
|
|
89
|
+
return request.tool_name, perm_req.extract_pattern()
|
|
90
|
+
|
|
91
|
+
@staticmethod
|
|
92
|
+
def _cache_hit(cache, tool_name: str, pattern: str | None) -> bool:
|
|
93
|
+
"""两步命中(对齐 consumer._is_cached):精确 pattern → 工具级 wildcard。"""
|
|
94
|
+
if cache.check(tool_name, pattern):
|
|
95
|
+
return True
|
|
96
|
+
if pattern is not None and cache.check(tool_name):
|
|
97
|
+
return True
|
|
98
|
+
return False
|
|
@@ -55,7 +55,10 @@ class PermissionResponseBuilder:
|
|
|
55
55
|
)
|
|
56
56
|
|
|
57
57
|
updates: tuple[PermissionUpdate, ...] = ()
|
|
58
|
-
if decision is PermissionDecision.
|
|
58
|
+
if decision is PermissionDecision.ALLOW_SESSION:
|
|
59
|
+
# ALLOW_SESSION 应返回 request.suggestions(对齐 CC yes-apply-suggestions)
|
|
60
|
+
updates = request.suggestions or ()
|
|
61
|
+
elif decision is PermissionDecision.ALLOW_AND_GRANT_DIRECTORY:
|
|
59
62
|
if grant_directory is None:
|
|
60
63
|
raise ValueError("ALLOW_AND_GRANT_DIRECTORY requires grant_directory")
|
|
61
64
|
updates = (
|
|
@@ -114,8 +114,8 @@ class CliEntry:
|
|
|
114
114
|
if not skip_permissions and not _is_interactive_terminal():
|
|
115
115
|
EnvironmentChecker.emit_error(
|
|
116
116
|
"Error: agentx-code requires an interactive terminal (TTY).\n"
|
|
117
|
-
"For non-interactive use, pass
|
|
118
|
-
"--permission-mode bypassPermissions."
|
|
117
|
+
"For non-interactive use, pass --skip-permissions / "
|
|
118
|
+
"--dangerously-skip-permissions or --permission-mode bypassPermissions."
|
|
119
119
|
)
|
|
120
120
|
return 2
|
|
121
121
|
|
|
@@ -300,11 +300,15 @@ _CONFIG_PATH = user_config_path()
|
|
|
300
300
|
),
|
|
301
301
|
)
|
|
302
302
|
@click.option(
|
|
303
|
-
"-p",
|
|
304
303
|
"--skip-permissions",
|
|
304
|
+
"--dangerously-skip-permissions",
|
|
305
|
+
"skip_permissions",
|
|
305
306
|
is_flag=True,
|
|
306
307
|
default=False,
|
|
307
|
-
help=
|
|
308
|
+
help=(
|
|
309
|
+
"跳过工具权限确认(对齐 CC --dangerously-skip-permissions;"
|
|
310
|
+
"推荐使用 --dangerously-skip-permissions 长名以与 CC 完全一致)"
|
|
311
|
+
),
|
|
308
312
|
)
|
|
309
313
|
@click.option(
|
|
310
314
|
"--permission-mode",
|
|
@@ -242,6 +242,7 @@ class MessageListWidget(ScrollableContainer):
|
|
|
242
242
|
# D09: Task 状态管理(用于 TaskPanel)
|
|
243
243
|
self._task_store: TaskStore = TaskStore()
|
|
244
244
|
self._task_panel: TaskPanelWidget | None = None
|
|
245
|
+
self._show_tasks_panel: bool = True # 对齐 CC:默认显示任务列表
|
|
245
246
|
# D10: Compact 进度条 Widget
|
|
246
247
|
self._compact_widget: CompactProgressWidget | None = None
|
|
247
248
|
self._scroll_timer: object | None = None
|
|
@@ -278,6 +279,7 @@ class MessageListWidget(ScrollableContainer):
|
|
|
278
279
|
instance._display_mode = DisplayMode.NORMAL
|
|
279
280
|
instance._task_store = TaskStore()
|
|
280
281
|
instance._task_panel = None
|
|
282
|
+
instance._show_tasks_panel = True
|
|
281
283
|
instance._compact_widget = None
|
|
282
284
|
instance._scroll_timer = None
|
|
283
285
|
instance._workspace_cfg = getattr(config, "workspace_cfg", None)
|
|
@@ -430,18 +432,17 @@ class MessageListWidget(ScrollableContainer):
|
|
|
430
432
|
self._memory_summary_widget = None
|
|
431
433
|
self._collapsed_memory_tool_ids = set()
|
|
432
434
|
info("[ML] turn started, brief flag reset to False")
|
|
433
|
-
self._turn_spinner = SpinnerWidget()
|
|
435
|
+
self._turn_spinner = SpinnerWidget(task_store=self._task_store)
|
|
434
436
|
|
|
435
|
-
#
|
|
436
|
-
if self.
|
|
437
|
-
self._task_panel
|
|
438
|
-
self.mount(self._task_panel)
|
|
437
|
+
# Spinner 开始时移除 TaskPanel(对齐 CC:!showSpinner 时不显示任务)
|
|
438
|
+
if self._task_panel is not None and self._task_panel.is_attached:
|
|
439
|
+
self._task_panel.remove()
|
|
439
440
|
|
|
440
441
|
self.mount(self._turn_spinner)
|
|
441
442
|
self._scroll_to_end()
|
|
442
443
|
|
|
443
444
|
def finish_turn_spinner(self) -> None:
|
|
444
|
-
"""Turn 结束:移除 Spinner,插入完成行。TaskPanel
|
|
445
|
+
"""Turn 结束:移除 Spinner,插入完成行。TaskPanel 在 Spinner 后显示(D09)。"""
|
|
445
446
|
if self._turn_spinner is None:
|
|
446
447
|
return
|
|
447
448
|
completion = self._turn_spinner.create_completion_message()
|
|
@@ -450,7 +451,9 @@ class MessageListWidget(ScrollableContainer):
|
|
|
450
451
|
self.append_spinner_status(completion)
|
|
451
452
|
self._show_memory_ops_summary()
|
|
452
453
|
# Phase 3: 显示被抑制的文本(如果启用 verbose 模式)
|
|
453
|
-
|
|
454
|
+
|
|
455
|
+
# D09: Spinner 结束后显示 TaskPanel(对齐 CC)
|
|
456
|
+
self._ensure_task_panel()
|
|
454
457
|
|
|
455
458
|
def _show_memory_ops_summary(self) -> None:
|
|
456
459
|
if self._show_memory_tool_widgets():
|
|
@@ -537,12 +540,42 @@ class MessageListWidget(ScrollableContainer):
|
|
|
537
540
|
self.set_display_mode(DisplayMode.BRIEF_ONLY)
|
|
538
541
|
|
|
539
542
|
def on_key(self, event: events.Key) -> None:
|
|
540
|
-
"""Transcript 模式下 Esc 退回 Normal(对齐 CC screen!=='transcript' 守卫)。
|
|
543
|
+
"""Transcript 模式下 Esc 退回 Normal(对齐 CC screen!=='transcript' 守卫)。
|
|
544
|
+
|
|
545
|
+
键盘快捷键:
|
|
546
|
+
- Ctrl+T: 切换任务列表显示(对齐 CC app:toggleTodos)
|
|
547
|
+
- Esc: Transcript 模式下退回 Normal
|
|
548
|
+
"""
|
|
549
|
+
# Ctrl+T: 切换任务列表显示(对齐 CC)
|
|
550
|
+
if event.key == "ctrl+t":
|
|
551
|
+
event.stop()
|
|
552
|
+
self._toggle_tasks_panel()
|
|
553
|
+
return
|
|
554
|
+
|
|
555
|
+
# Esc: Transcript 模式下退回 Normal
|
|
541
556
|
if event.key == "escape" and self._display_mode == DisplayMode.TRANSCRIPT:
|
|
542
557
|
event.prevent_default()
|
|
543
558
|
event.stop()
|
|
544
559
|
self.set_display_mode(DisplayMode.NORMAL)
|
|
545
560
|
|
|
561
|
+
def _toggle_tasks_panel(self) -> None:
|
|
562
|
+
"""切换任务列表显示(对齐 CC Ctrl+T)。
|
|
563
|
+
|
|
564
|
+
行为:
|
|
565
|
+
- 切换 _show_tasks_panel 状态
|
|
566
|
+
- 移除或挂载 TaskPanel
|
|
567
|
+
- 刷新显示
|
|
568
|
+
"""
|
|
569
|
+
self._show_tasks_panel = not self._show_tasks_panel
|
|
570
|
+
|
|
571
|
+
if self._show_tasks_panel:
|
|
572
|
+
# 显示任务列表
|
|
573
|
+
self._ensure_task_panel()
|
|
574
|
+
else:
|
|
575
|
+
# 隐藏任务列表
|
|
576
|
+
if self._task_panel is not None and self._task_panel.is_attached:
|
|
577
|
+
self._task_panel.remove()
|
|
578
|
+
|
|
546
579
|
def append_spinner_status(self, content: str) -> None:
|
|
547
580
|
"""插入 dim 状态行(完成行或 thought for Ns)。"""
|
|
548
581
|
self.mount(_SpinnerStatusLine(content))
|
|
@@ -556,7 +589,7 @@ class MessageListWidget(ScrollableContainer):
|
|
|
556
589
|
则先创建 spinner。
|
|
557
590
|
"""
|
|
558
591
|
if self._turn_spinner is None:
|
|
559
|
-
self._turn_spinner = SpinnerWidget()
|
|
592
|
+
self._turn_spinner = SpinnerWidget(task_store=self._task_store)
|
|
560
593
|
self.mount(self._turn_spinner)
|
|
561
594
|
self._turn_spinner.enter_thinking_mode()
|
|
562
595
|
|
|
@@ -812,15 +845,29 @@ class MessageListWidget(ScrollableContainer):
|
|
|
812
845
|
self._scroll_to_end()
|
|
813
846
|
|
|
814
847
|
def _ensure_task_panel(self) -> None:
|
|
815
|
-
"""确保 TaskPanel 已挂载(D09)。
|
|
848
|
+
"""确保 TaskPanel 已挂载(D09)。
|
|
849
|
+
|
|
850
|
+
挂载逻辑:
|
|
851
|
+
- 只在非 spinner 状态时挂载(对齐 CC:!showSpinner 时显示任务)
|
|
852
|
+
- 只在 _show_tasks_panel 为 True 时挂载(对齐 CC Ctrl+T 切换)
|
|
853
|
+
- 挂载到容器末尾,确保显示在对话流下方
|
|
854
|
+
- 如果已有任务,更新显示
|
|
855
|
+
"""
|
|
856
|
+
# Spinner 运行时不挂载(对齐 CC)
|
|
857
|
+
if self._turn_spinner is not None:
|
|
858
|
+
return
|
|
859
|
+
|
|
860
|
+
# 用户通过 Ctrl+T 隐藏了任务列表
|
|
861
|
+
if not self._show_tasks_panel:
|
|
862
|
+
return
|
|
863
|
+
|
|
864
|
+
# 没有任务时不挂载
|
|
865
|
+
if not self._task_store.tasks:
|
|
866
|
+
return
|
|
867
|
+
|
|
816
868
|
if self._task_panel is None or not self._task_panel.is_attached:
|
|
817
869
|
self._task_panel = TaskPanelWidget(self._task_store)
|
|
818
|
-
|
|
819
|
-
self._turn_spinner.remove()
|
|
820
|
-
self.mount(self._task_panel)
|
|
821
|
-
self.mount(self._turn_spinner)
|
|
822
|
-
else:
|
|
823
|
-
self.mount(self._task_panel)
|
|
870
|
+
self.mount(self._task_panel)
|
|
824
871
|
self._scroll_to_end()
|
|
825
872
|
|
|
826
873
|
def handle_tool_completed(self, event: ToolUseCompleted) -> None:
|
{langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/spinner.py
RENAMED
|
@@ -3,6 +3,7 @@ widgets/spinner.py — Spinner 状态行(加载动画 + Turn 完成行)。
|
|
|
3
3
|
|
|
4
4
|
职责:
|
|
5
5
|
消息流底部的加载指示器;Turn 结束时生成 past-tense 完成文案。
|
|
6
|
+
显示正在进行的任务的 activeForm(对齐 CC)。
|
|
6
7
|
|
|
7
8
|
链路位置:
|
|
8
9
|
ReplScreen ← TurnInProgress / Thinking* Message ← SessionBridge;
|
|
@@ -16,9 +17,13 @@ from __future__ import annotations
|
|
|
16
17
|
|
|
17
18
|
import random
|
|
18
19
|
import time
|
|
20
|
+
from typing import TYPE_CHECKING
|
|
19
21
|
|
|
20
22
|
from textual.widgets import Static
|
|
21
23
|
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from langchain_agentx_cli.state.task_store import TaskStore
|
|
26
|
+
|
|
22
27
|
# Windows / Linux 帧序列(对齐 CC SpinnerGlyph DEFAULT_CHARACTERS + reverse)
|
|
23
28
|
_BASE_FRAMES = ["·", "✢", "*", "✶", "✻", "✽"]
|
|
24
29
|
SPINNER_FRAMES = _BASE_FRAMES + _BASE_FRAMES[::-1]
|
|
@@ -265,7 +270,12 @@ class SpinnerWidget(Static):
|
|
|
265
270
|
}
|
|
266
271
|
"""
|
|
267
272
|
|
|
268
|
-
def __init__(self) -> None:
|
|
273
|
+
def __init__(self, task_store: TaskStore | None = None) -> None:
|
|
274
|
+
"""初始化 Spinner。
|
|
275
|
+
|
|
276
|
+
Args:
|
|
277
|
+
task_store: TaskStore 实例,用于获取正在进行的任务的 activeForm
|
|
278
|
+
"""
|
|
269
279
|
super().__init__("", id="turn-spinner")
|
|
270
280
|
self._frame_index = 0
|
|
271
281
|
self._verb = random.choice(SPINNER_VERBS)
|
|
@@ -273,6 +283,8 @@ class SpinnerWidget(Static):
|
|
|
273
283
|
self._thinking_mode = False
|
|
274
284
|
self._thinking_start_time: float | None = None
|
|
275
285
|
self._start_time = 0.0
|
|
286
|
+
self._token_count = 0 # 对齐 CC:token 计数
|
|
287
|
+
self._task_store = task_store # 对齐 CC:用于获取任务 activeForm
|
|
276
288
|
|
|
277
289
|
def on_mount(self) -> None:
|
|
278
290
|
self._start_time = time.monotonic()
|
|
@@ -291,7 +303,32 @@ class SpinnerWidget(Static):
|
|
|
291
303
|
dot = "[bold white]●[/]" if blink else "[dim]●[/]"
|
|
292
304
|
text = f"{dot} [dim]thinking[/]"
|
|
293
305
|
else:
|
|
294
|
-
|
|
306
|
+
# 对齐 CC:spinner + 任务名称/verb + 状态信息
|
|
307
|
+
# 优先使用任务的 activeForm,否则使用随机动词
|
|
308
|
+
display_text = self._verb
|
|
309
|
+
if self._task_store:
|
|
310
|
+
# 获取正在进行的任务
|
|
311
|
+
for task in self._task_store.tasks.values():
|
|
312
|
+
if task.status == "in_progress" and task.active_form:
|
|
313
|
+
display_text = task.active_form
|
|
314
|
+
break
|
|
315
|
+
|
|
316
|
+
parts = [f"[bold]{frame}[/] {display_text}{ELLIPSIS}"]
|
|
317
|
+
status_parts = []
|
|
318
|
+
|
|
319
|
+
# 时间(对齐 CC)
|
|
320
|
+
elapsed = self.elapsed_ms()
|
|
321
|
+
if elapsed >= 1000: # 1秒后显示时间
|
|
322
|
+
status_parts.append(f"{self._format_duration_ms(elapsed)}")
|
|
323
|
+
|
|
324
|
+
# Token 计数(对齐 CC)
|
|
325
|
+
if self._token_count > 0:
|
|
326
|
+
status_parts.append(f"↓ {self._token_count} tokens")
|
|
327
|
+
|
|
328
|
+
if status_parts:
|
|
329
|
+
parts.append(f" ({' · '.join(status_parts)})")
|
|
330
|
+
|
|
331
|
+
text = "".join(parts)
|
|
295
332
|
self.update(text)
|
|
296
333
|
|
|
297
334
|
def elapsed_ms(self) -> int:
|
|
@@ -306,6 +343,34 @@ class SpinnerWidget(Static):
|
|
|
306
343
|
if not self._thinking_mode:
|
|
307
344
|
self._refresh_label()
|
|
308
345
|
|
|
346
|
+
def set_token_count(self, count: int) -> None:
|
|
347
|
+
"""更新 token 计数(对齐 CC)。
|
|
348
|
+
|
|
349
|
+
Args:
|
|
350
|
+
count: 累计 token 数量
|
|
351
|
+
"""
|
|
352
|
+
self._token_count = count
|
|
353
|
+
if not self._thinking_mode:
|
|
354
|
+
self._refresh_label()
|
|
355
|
+
|
|
356
|
+
def _format_duration_ms(self, ms: int) -> str:
|
|
357
|
+
"""格式化毫秒为可读时间(对齐 CC formatDuration)。
|
|
358
|
+
|
|
359
|
+
Args:
|
|
360
|
+
ms: 毫秒数
|
|
361
|
+
|
|
362
|
+
Returns:
|
|
363
|
+
格式化的时间字符串,如 "25s", "1m 30s"
|
|
364
|
+
"""
|
|
365
|
+
seconds = ms // 1000
|
|
366
|
+
if seconds < 60:
|
|
367
|
+
return f"{seconds}s"
|
|
368
|
+
minutes = seconds // 60
|
|
369
|
+
remaining_seconds = seconds % 60
|
|
370
|
+
if remaining_seconds > 0:
|
|
371
|
+
return f"{minutes}m {remaining_seconds}s"
|
|
372
|
+
return f"{minutes}m"
|
|
373
|
+
|
|
309
374
|
def enter_thinking_mode(self) -> None:
|
|
310
375
|
if self._thinking_mode:
|
|
311
376
|
return
|
{langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/task_panel.py
RENAMED
|
@@ -42,6 +42,7 @@ class TaskPanelWidget(Static):
|
|
|
42
42
|
- /root/cc0331/src/components/TaskListV2.tsx: getTaskIcon 图标映射(第 220-241 行)
|
|
43
43
|
- /root/cc0331/src/components/TaskListV2.tsx: 截断与隐藏摘要(第 136-186 行)
|
|
44
44
|
- /root/cc0331/src/components/TaskListV2.tsx: 30 秒过期定时器(第 68-85 行)
|
|
45
|
+
- /root/cc0331/src/components/TaskListV2.tsx: 统计行(第 192-208 行)
|
|
45
46
|
"""
|
|
46
47
|
|
|
47
48
|
# 图标定义(对齐 CC figures)
|
|
@@ -49,6 +50,9 @@ class TaskPanelWidget(Static):
|
|
|
49
50
|
ICON_IN_PROGRESS = "◼"
|
|
50
51
|
ICON_COMPLETED = "✓"
|
|
51
52
|
|
|
53
|
+
# 缩进(对齐 CC marginLeft={2})
|
|
54
|
+
INDENT = " "
|
|
55
|
+
|
|
52
56
|
# 终端列数(用于截断计算)
|
|
53
57
|
_terminal_columns: int = 80
|
|
54
58
|
|
|
@@ -165,6 +169,28 @@ class TaskPanelWidget(Static):
|
|
|
165
169
|
self._hidden_count = len(hidden)
|
|
166
170
|
return visible, hidden
|
|
167
171
|
|
|
172
|
+
def _format_stats_summary(self) -> Text:
|
|
173
|
+
"""格式化任务统计摘要(对齐 CC TaskListV2.tsx:192-208)。
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
Rich Text 对象,如 "5 tasks (2 done, 1 in progress, 2 open)"
|
|
177
|
+
"""
|
|
178
|
+
tasks = list(self._task_store.tasks.values())
|
|
179
|
+
if not tasks:
|
|
180
|
+
return Text()
|
|
181
|
+
|
|
182
|
+
completed = sum(1 for t in tasks if t.status == TaskStatus.COMPLETED.value)
|
|
183
|
+
in_progress = sum(1 for t in tasks if t.status == TaskStatus.IN_PROGRESS.value)
|
|
184
|
+
pending = sum(1 for t in tasks if t.status == TaskStatus.PENDING.value)
|
|
185
|
+
|
|
186
|
+
result = Text()
|
|
187
|
+
result.append(Text(f"{len(tasks)} tasks ", style="dim"))
|
|
188
|
+
result.append(Text(f"({completed} done, ", style="dim"))
|
|
189
|
+
result.append(Text(f"{in_progress} in progress", style="bold dim"))
|
|
190
|
+
result.append(Text(f", {pending} open)", style="dim"))
|
|
191
|
+
|
|
192
|
+
return result
|
|
193
|
+
|
|
168
194
|
def _format_hidden_summary(self, hidden: list[TaskEntry]) -> str:
|
|
169
195
|
"""格式化隐藏 Task 的摘要。
|
|
170
196
|
|
|
@@ -227,9 +253,14 @@ class TaskPanelWidget(Static):
|
|
|
227
253
|
# 构建 Rich Text
|
|
228
254
|
text = Text()
|
|
229
255
|
|
|
230
|
-
#
|
|
256
|
+
# 图标(对齐 CC:in_progress 图标闪烁)
|
|
231
257
|
icon_text = Text(f"{icon} ")
|
|
232
|
-
if
|
|
258
|
+
if task.status == TaskStatus.IN_PROGRESS.value:
|
|
259
|
+
# 正在进行的任务:闪烁效果(对齐 CC)
|
|
260
|
+
icon_text.stylize("bold blink")
|
|
261
|
+
if color:
|
|
262
|
+
icon_text.stylize(color)
|
|
263
|
+
elif color:
|
|
233
264
|
icon_text.stylize(color)
|
|
234
265
|
text.append(icon_text)
|
|
235
266
|
|
|
@@ -238,7 +269,9 @@ class TaskPanelWidget(Static):
|
|
|
238
269
|
if task.status == TaskStatus.IN_PROGRESS.value:
|
|
239
270
|
subject.stylize("bold")
|
|
240
271
|
if task.status == TaskStatus.COMPLETED.value:
|
|
241
|
-
subject.stylize("dim
|
|
272
|
+
subject.stylize("dim")
|
|
273
|
+
# 注意:strikethrough 在某些 Rich/Textual 版本中可能有兼容性问题
|
|
274
|
+
# 对齐 CC 主要通过 dim 颜色和勾号图标表示已完成状态
|
|
242
275
|
elif has_unresolved_blocker:
|
|
243
276
|
subject.stylize("dim")
|
|
244
277
|
text.append(subject)
|
|
@@ -279,13 +312,24 @@ class TaskPanelWidget(Static):
|
|
|
279
312
|
|
|
280
313
|
# 构建输出
|
|
281
314
|
result = Text()
|
|
315
|
+
|
|
316
|
+
# 统计行(对齐 CC isStandalone 模式)
|
|
317
|
+
stats = self._format_stats_summary()
|
|
318
|
+
if stats:
|
|
319
|
+
result.append(Text(self.INDENT)) # 缩进
|
|
320
|
+
result.append(stats)
|
|
321
|
+
result.append("\n")
|
|
322
|
+
|
|
323
|
+
# 任务列表(每行添加缩进)
|
|
282
324
|
for task in visible:
|
|
325
|
+
result.append(Text(self.INDENT)) # 缩进
|
|
283
326
|
result.append(self._format_task_line(task))
|
|
284
327
|
result.append("\n")
|
|
285
328
|
|
|
286
|
-
#
|
|
329
|
+
# 隐藏摘要(也需要缩进)
|
|
287
330
|
if hidden:
|
|
288
331
|
summary = self._format_hidden_summary(hidden)
|
|
332
|
+
result.append(Text(self.INDENT)) # 缩进
|
|
289
333
|
result.append(Text(summary, style="dim"))
|
|
290
334
|
|
|
291
335
|
return result
|
{langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: langchain-agentx-cli
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.5
|
|
4
4
|
Summary: Terminal CLI/TUI for AgentX: migrate Claude Code Ink UI, backed by langchain-agentx-python SDK.
|
|
5
5
|
Author: GoodMood2008
|
|
6
6
|
License: Apache-2.0
|
|
@@ -62,7 +62,7 @@ agentx-code # Start in current directory
|
|
|
62
62
|
agentx-code --workspace-root /path/to/project # Specify workspace
|
|
63
63
|
agentx-code --model claude-sonnet-4-20250514 # Specify model
|
|
64
64
|
agentx-code --provider claude | openai # Choose provider
|
|
65
|
-
agentx-code -
|
|
65
|
+
agentx-code --dangerously-skip-permissions # Skip permission prompts (CC-aligned)
|
|
66
66
|
agentx-code --show-config # Print merged config
|
|
67
67
|
```
|
|
68
68
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "langchain-agentx-cli"
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.5"
|
|
8
8
|
description = "Terminal CLI/TUI for AgentX: migrate Claude Code Ink UI, backed by langchain-agentx-python SDK."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/auto_mode_config.py
RENAMED
|
File without changes
|
|
File without changes
|
{langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/parser.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/registry.py
RENAMED
|
File without changes
|
|
File without changes
|
{langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/completion/base.py
RENAMED
|
File without changes
|
|
File without changes
|