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.
Files changed (212) hide show
  1. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/PKG-INFO +2 -2
  2. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/README.md +1 -1
  3. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/__init__.py +1 -1
  4. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/cli_l3_user_ui_queue.py +23 -39
  5. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/permission_response_builder.py +4 -1
  6. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/cli.py +8 -4
  7. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/message_list.py +63 -16
  8. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/spinner.py +67 -2
  9. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/task_panel.py +48 -4
  10. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/PKG-INFO +2 -2
  11. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/pyproject.toml +1 -1
  12. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/LICENSE +0 -0
  13. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/__main__.py +0 -0
  14. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/app.py +0 -0
  15. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/auto_mode_config.py +0 -0
  16. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bootstrap.py +0 -0
  17. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/__init__.py +0 -0
  18. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/auto_mode_config_apply.py +0 -0
  19. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/auto_mode_messages.py +0 -0
  20. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/auto_mode_sink.py +0 -0
  21. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/auto_mode_status.py +0 -0
  22. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/boundary_inspector.py +0 -0
  23. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/deny_override.py +0 -0
  24. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/hook_constants.py +0 -0
  25. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/hook_payload.py +0 -0
  26. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/permission_mode_apply.py +0 -0
  27. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/permission_user_ui.py +0 -0
  28. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/bridge/session_bridge.py +0 -0
  29. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/__init__.py +0 -0
  30. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/__init__.py +0 -0
  31. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/auto_mode.py +0 -0
  32. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/clear.py +0 -0
  33. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/compact.py +0 -0
  34. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/doctor.py +0 -0
  35. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/grant.py +0 -0
  36. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/grants.py +0 -0
  37. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/help.py +0 -0
  38. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/model.py +0 -0
  39. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/permissions.py +0 -0
  40. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/quit.py +0 -0
  41. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/revoke.py +0 -0
  42. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/roots.py +0 -0
  43. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/builtin/theme.py +0 -0
  44. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/parser.py +0 -0
  45. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/providers/__init__.py +0 -0
  46. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/providers/sdk_commands.py +0 -0
  47. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/commands/registry.py +0 -0
  48. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/completion/__init__.py +0 -0
  49. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/completion/base.py +0 -0
  50. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/completion/command_source.py +0 -0
  51. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/completion/history_source.py +0 -0
  52. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/config.py +0 -0
  53. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/health_report.py +0 -0
  54. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/history/__init__.py +0 -0
  55. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/history/store.py +0 -0
  56. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/keybindings/__init__.py +0 -0
  57. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/keybindings/bindings.py +0 -0
  58. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/launch_config_validator.py +0 -0
  59. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/llm_config.py +0 -0
  60. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/__init__.py +0 -0
  61. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/audit_subscriber.py +0 -0
  62. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/config.py +0 -0
  63. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/failure_counts.py +0 -0
  64. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/failure_observation.py +0 -0
  65. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/log_rotator.py +0 -0
  66. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/observer.py +0 -0
  67. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/observation/session_context.py +0 -0
  68. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/permissions/__init__.py +0 -0
  69. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/permissions/factory.py +0 -0
  70. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/permissions/mode.py +0 -0
  71. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/permissions/policy.py +0 -0
  72. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/permissions/session_mode.py +0 -0
  73. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/prompts/__init__.py +0 -0
  74. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/prompts/assembler.py +0 -0
  75. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/prompts/sections.py +0 -0
  76. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/prompts/system_prompt.py +0 -0
  77. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/screens/__init__.py +0 -0
  78. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/screens/repl.py +0 -0
  79. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/session_factory.py +0 -0
  80. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/session_headless.py +0 -0
  81. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/session_options.py +0 -0
  82. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/state/__init__.py +0 -0
  83. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/state/task_store.py +0 -0
  84. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/__init__.py +0 -0
  85. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/colors.py +0 -0
  86. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/detection.py +0 -0
  87. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/manager.py +0 -0
  88. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/settings.py +0 -0
  89. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/system_theme.py +0 -0
  90. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/themes.py +0 -0
  91. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/theme/watcher.py +0 -0
  92. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tools/__init__.py +0 -0
  93. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tools/registry.py +0 -0
  94. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/__init__.py +0 -0
  95. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/bootstrap.py +0 -0
  96. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/clipboard.py +0 -0
  97. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/memory_paths.py +0 -0
  98. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/message_selection.py +0 -0
  99. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/__init__.py +0 -0
  100. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/cache.py +0 -0
  101. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/component_manager.py +0 -0
  102. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/config.py +0 -0
  103. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/consumer.py +0 -0
  104. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/dialog.py +0 -0
  105. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/models.py +0 -0
  106. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/persistent_rules.py +0 -0
  107. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/presenters/__init__.py +0 -0
  108. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/presenters/base.py +0 -0
  109. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/presenters/bash.py +0 -0
  110. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/presenters/fallback.py +0 -0
  111. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/presenters/file.py +0 -0
  112. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/queue.py +0 -0
  113. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/__init__.py +0 -0
  114. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/auto_mode_deny.py +0 -0
  115. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/base.py +0 -0
  116. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/boundary/__init__.py +0 -0
  117. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/boundary/extract.py +0 -0
  118. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/boundary/request.py +0 -0
  119. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/fallback/__init__.py +0 -0
  120. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/fallback/request.py +0 -0
  121. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/__init__.py +0 -0
  122. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/_base.py +0 -0
  123. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/diff.py +0 -0
  124. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/edit/__init__.py +0 -0
  125. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/edit/request.py +0 -0
  126. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/filesystem/__init__.py +0 -0
  127. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/filesystem/request.py +0 -0
  128. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/paths.py +0 -0
  129. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/write/__init__.py +0 -0
  130. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/file/write/request.py +0 -0
  131. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/plan_mode/__init__.py +0 -0
  132. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/plan_mode/request.py +0 -0
  133. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/shell/__init__.py +0 -0
  134. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/shell/bash/__init__.py +0 -0
  135. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/shell/bash/request.py +0 -0
  136. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/shell/extract.py +0 -0
  137. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/shell/helpers.py +0 -0
  138. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/skill/__init__.py +0 -0
  139. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/skill/request.py +0 -0
  140. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/webfetch/__init__.py +0 -0
  141. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/requests/webfetch/request.py +0 -0
  142. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/permissions/router.py +0 -0
  143. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/safe_screen.py +0 -0
  144. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/widgets/health_view.py +0 -0
  145. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/tui/workspace_trust.py +0 -0
  146. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/welcome.py +0 -0
  147. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/__init__.py +0 -0
  148. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/compact_progress.py +0 -0
  149. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/completion_overlay.py +0 -0
  150. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/footer.py +0 -0
  151. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/input_area.py +0 -0
  152. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/message_events.py +0 -0
  153. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/__init__.py +0 -0
  154. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/assistant_message.py +0 -0
  155. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/auto_mode_chip.py +0 -0
  156. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/error_message.py +0 -0
  157. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/hook_message.py +0 -0
  158. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/rendering.py +0 -0
  159. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/stop_hook_summary.py +0 -0
  160. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/thinking_message.py +0 -0
  161. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/messages/tool_result.py +0 -0
  162. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/pending_permission.py +0 -0
  163. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/permission_inline.py +0 -0
  164. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/permission_keybindings.py +0 -0
  165. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/presentation/__init__.py +0 -0
  166. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/presentation/expand_hint.py +0 -0
  167. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/presentation/full_output.py +0 -0
  168. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/presentation/message_layout.py +0 -0
  169. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/presentation/shell_output.py +0 -0
  170. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/presentation/view_mode.py +0 -0
  171. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/status_bar.py +0 -0
  172. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tool_result/__init__.py +0 -0
  173. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tool_result/base.py +0 -0
  174. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tool_result/blocked_view.py +0 -0
  175. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tool_result/error_view.py +0 -0
  176. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tool_result/success_view.py +0 -0
  177. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/__init__.py +0 -0
  178. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/agent/__init__.py +0 -0
  179. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/agent/widget.py +0 -0
  180. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/ask_user_question/__init__.py +0 -0
  181. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/ask_user_question/widget.py +0 -0
  182. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/base.py +0 -0
  183. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/bash/__init__.py +0 -0
  184. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/bash/widget.py +0 -0
  185. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/batch_edit/__init__.py +0 -0
  186. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/batch_edit/widget.py +0 -0
  187. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/edit/__init__.py +0 -0
  188. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/edit/widget.py +0 -0
  189. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/glob/__init__.py +0 -0
  190. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/glob/widget.py +0 -0
  191. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/grep/__init__.py +0 -0
  192. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/grep/widget.py +0 -0
  193. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/helpers.py +0 -0
  194. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/read/__init__.py +0 -0
  195. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/read/widget.py +0 -0
  196. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/skill/__init__.py +0 -0
  197. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/skill/widget.py +0 -0
  198. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/user_message/__init__.py +0 -0
  199. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/user_message/widget.py +0 -0
  200. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/webfetch/__init__.py +0 -0
  201. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/webfetch/widget.py +0 -0
  202. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/websearch/__init__.py +0 -0
  203. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/websearch/widget.py +0 -0
  204. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/write/__init__.py +0 -0
  205. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli/widgets/tools/write/widget.py +0 -0
  206. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/SOURCES.txt +0 -0
  207. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/dependency_links.txt +0 -0
  208. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/entry_points.txt +0 -0
  209. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/not-zip-safe +0 -0
  210. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/requires.txt +0 -0
  211. {langchain-agentx-cli-0.4.2 → langchain-agentx-cli-0.4.5}/langchain_agentx_cli.egg-info/top_level.txt +0 -0
  212. {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.2
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 -p # Skip permission prompts
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 -p # Skip permission prompts
39
+ agentx-code --dangerously-skip-permissions # Skip permission prompts (CC-aligned)
40
40
  agentx-code --show-config # Print merged config
41
41
  ```
42
42
 
@@ -1,3 +1,3 @@
1
1
  """langchain_agentx_cli:依托 langchain_agentx_python SDK 的终端 CLI/TUI(CC Ink 迁移)。"""
2
2
 
3
- __version__ = "0.4.2"
3
+ __version__ = "0.4.5"
@@ -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
- self._apply_session_allow(request, decision)
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 _apply_session_allow(
80
- self, request: PromptRequest, decision: PermissionDecision
81
- ) -> None:
82
- del decision
83
- bridge = self._app.bridge
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
- pattern = perm_req.extract_pattern()
94
- cache.add(request.tool_name, pattern)
95
- if not pattern:
96
- return
97
- lc = self._app.launch_config
98
- storage = load_permission_rules(
99
- workspace_root=lc.workspace_root,
100
- agent_home=lc.agent_home,
101
- )
102
- storage.add(
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.ALLOW_AND_GRANT_DIRECTORY:
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 -p / --skip-permissions or "
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="跳过工具权限确认(对齐 CC --dangerously-skip-permissions)",
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
- # D09: 如果有 Task,挂载 TaskPanel
436
- if self._task_store.tasks:
437
- self._task_panel = TaskPanelWidget(self._task_store)
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 保留(D09)。"""
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
- # D09: TaskPanel 不移除,保留显示最终状态
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
- if self._turn_spinner is not None:
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:
@@ -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
- text = f"[bold]{frame}[/] {self._verb}{ELLIPSIS}"
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
@@ -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 color:
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 strikethrough")
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langchain-agentx-cli
3
- Version: 0.4.2
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 -p # Skip permission prompts
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.2"
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"