tunacode-cli 0.1.101__tar.gz → 0.2.0__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 (401) hide show
  1. tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/PLAN.md +251 -0
  2. tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/INDEX.md +16 -0
  3. tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T001.md +41 -0
  4. tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T002.md +53 -0
  5. tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T003.md +38 -0
  6. tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T004.md +76 -0
  7. tunacode_cli-0.2.0/.artifacts/research/2026-03-31_11-32-31_theme-switch-dim-background-crash.md +139 -0
  8. tunacode_cli-0.2.0/.artifacts/research/2026-03-31_16-51-07_ui-api.md +381 -0
  9. tunacode_cli-0.2.0/.artifacts/research/2026-04-01_23-32-20_session-save-tail-and-message-boundary.md +78 -0
  10. tunacode_cli-0.2.0/.artifacts/research/2026-04-01_tinyagent-boundary.md +62 -0
  11. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/workflows/dependency-map.yml +2 -2
  12. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/workflows/empty-dir-check.yml +1 -1
  13. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/workflows/lint.yml +4 -4
  14. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/workflows/publish-release.yml +2 -2
  15. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/workflows/release.yml +2 -2
  16. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/workflows/tech-debt.yml +4 -4
  17. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/AGENTS.md +2 -1
  18. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/CHANGELOG.md +7 -0
  19. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/HARNESS.md +15 -2
  20. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/Makefile +6 -2
  21. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/PKG-INFO +1 -1
  22. tunacode_cli-0.2.0/docs/deployment.md +159 -0
  23. tunacode_cli-0.2.0/docs/skills/audit-harness/SKILL.md +95 -0
  24. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/pyproject.toml +1 -1
  25. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/skills/pypi-release/scripts/bump_version.py +5 -8
  26. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/skills/pypi-release/scripts/local_publish.py +6 -11
  27. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/skills/pypi-release/scripts/release.py +41 -31
  28. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/constants.py +1 -1
  29. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/main.py +17 -8
  30. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/controller.py +14 -3
  31. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/session/state.py +22 -16
  32. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/app.py +54 -5
  33. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/debug.py +7 -0
  34. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/help.py +1 -1
  35. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/request_debug.py +100 -0
  36. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/test_compaction.py +6 -0
  37. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_request_orchestrator_parallel_tools.py +27 -0
  38. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/ui/test_request_debug.py +60 -1
  39. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/uv.lock +1 -1
  40. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/README.md +0 -0
  41. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/debug_history/2026-03-25_tinyagent-1-2-27-gil-hotfix-validation.md +0 -0
  42. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/debug_history/REQUEST_CONTEXT_CUTOVER_LESSON.md +0 -0
  43. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/debug_history/postmortem-defensive-message-typing-2026-03-17.md +0 -0
  44. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/debug_history/postmortem-loading-indicator-submit-regression-2026-03-24.md +0 -0
  45. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/debug_history/slop_fixture.py +0 -0
  46. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/execute/2026-03-22_19-54-47_tinyagent-message-typing-cleanup.md +0 -0
  47. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/execute/2026-03-24_19-20-38_input-latency-threaded-request-execution.md +0 -0
  48. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/execute/2026-03-26_16-20-32_models-loading-unification.md +0 -0
  49. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/execute/2026-03-28_12-18-53_pr-444-review-fixes.md +0 -0
  50. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/issue_analysis_report_2026-03-21.md +0 -0
  51. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-22_09-58-20_native-tinyagent-tool-contract.md +0 -0
  52. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-22_18-08-41_tinyagent-message-typing-cleanup.md +0 -0
  53. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-23_15-35-00_command-autocomplete-positioning.md +0 -0
  54. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-24_19-15-16_input-latency-threaded-request-execution.md +0 -0
  55. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/PLAN.md +0 -0
  56. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/INDEX.md +0 -0
  57. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T001.md +0 -0
  58. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T002.md +0 -0
  59. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T003.md +0 -0
  60. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T004.md +0 -0
  61. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-27_13-59-15_pr-444-review-fixes/PLAN.md +0 -0
  62. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plans/consolidate-main-support-plan.md +0 -0
  63. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/plans/reduce-src-python-files-to-500-lines-plan.md +0 -0
  64. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/query_data_flow.md +0 -0
  65. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/release/model-registry-refresh-release-blocker-2026-03-21.md +0 -0
  66. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/release/release-v0.1.94-run.md +0 -0
  67. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/release/tmux-suite-validation-2026-03-21.md +0 -0
  68. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-17_13-01-09_replace_messages-cutover.md +0 -0
  69. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-17_14-04-53_mypy-main-py-errors-map.md +0 -0
  70. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-21_14-07-44_prompt-versioning-map.md +0 -0
  71. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-42-58_tools-implementation.md +0 -0
  72. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-43-01_tools-context-synthesis.md +0 -0
  73. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-43-03_codebase-locator_tool-system.md +0 -0
  74. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-45-29_tools-data-inputs-contracts.md +0 -0
  75. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-53-07_tool-result-adapter-runtime.md +0 -0
  76. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-53-52_minimax-tinyagent-contract-shape-vs-runtime.md +0 -0
  77. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_17-57-53_message-ingress-data-contract-map.md +0 -0
  78. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-23_15-30-00_command-autocomplete-positioning.md +0 -0
  79. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-24_16-58-32_tui-submit-latency.md +0 -0
  80. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-24_18-46-40_input-latency-ui-loop-coupling.md +0 -0
  81. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-24_20-07-05_input-latency-regression-probe.md +0 -0
  82. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-26_15-29-02_models-loading-conflict-map.md +0 -0
  83. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.artifacts/tunacode_action_audit.md +0 -0
  84. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.coderabbit.yaml +0 -0
  85. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  86. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  87. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  88. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  89. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/dependabot.yml +0 -0
  90. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.github/pull_request_template.md +0 -0
  91. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.gitignore +0 -0
  92. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.pre-commit-config.yaml +0 -0
  93. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/.test_reports/.gitkeep +0 -0
  94. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/LICENSE +0 -0
  95. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/LOG.md +0 -0
  96. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/MANIFEST.in +0 -0
  97. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/README.md +0 -0
  98. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/assets/hashline-edit.png +0 -0
  99. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/assets/home.png +0 -0
  100. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/CODE-STANDARDS.md +0 -0
  101. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/README.md +0 -0
  102. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/architecture/dependencies/DEPENDENCY_LAYERS.dot +0 -0
  103. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/architecture/dependencies/DEPENDENCY_LAYERS.md +0 -0
  104. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/architecture/dependencies/DEPENDENCY_LAYERS.png +0 -0
  105. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/architecture/patterns/agent-message-serialization.md +0 -0
  106. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/codebase-map/structure/tree-structure.txt +0 -0
  107. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/docs_audit.html +0 -0
  108. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/git/practices.md +0 -0
  109. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-home-catpu.png +0 -0
  110. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-home.png +0 -0
  111. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-lsp.png +0 -0
  112. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-response.png +0 -0
  113. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/images/tool-calls.png +0 -0
  114. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/images/tunacode.png +0 -0
  115. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/configuration/configuration.md +0 -0
  116. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/configuration/models-registry.md +0 -0
  117. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/core/core.md +0 -0
  118. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/index.md +0 -0
  119. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/infrastructure/infrastructure.md +0 -0
  120. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/skills/skills.md +0 -0
  121. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/tools/hashline-subsystem.md +0 -0
  122. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/tools/tools-system.md +0 -0
  123. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/tools/tools.md +0 -0
  124. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/types/types.md +0 -0
  125. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/ui/commands.md +0 -0
  126. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/ui/ui.md +0 -0
  127. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/modules/utils/utils.md +0 -0
  128. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/reviews/2026-03-24-input-latency-research-artifact.md +0 -0
  129. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/reviews/2026-03-25-provider-stream-stall-artifact.md +0 -0
  130. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/reviews/pr-429-coderabbit-review.md +0 -0
  131. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/docs/ui/css-architecture.md +0 -0
  132. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/plan.md +0 -0
  133. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/pytest.ini +0 -0
  134. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/benchmarks/input_latency.py +0 -0
  135. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/benchmarks/input_paint_latency.py +0 -0
  136. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/benchmarks/input_tmux_latency.py +0 -0
  137. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/check-defensive-slop.py +0 -0
  138. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/check-file-length.sh +0 -0
  139. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/check-naming-conventions.py +0 -0
  140. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/check-unused-constants.py +0 -0
  141. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/check_agents_freshness.py +0 -0
  142. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/check_unused_modules.py +0 -0
  143. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/dev-setup.sh +0 -0
  144. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/download_ripgrep.py +0 -0
  145. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/generate-release-notes.sh +0 -0
  146. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/generate_structure_tree.py +0 -0
  147. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/grimp_layers_report.py +0 -0
  148. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/install_linux.sh +0 -0
  149. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/playwright_cache.py +0 -0
  150. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/preview_tool_panels.py +0 -0
  151. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/run-dead-imports.sh +0 -0
  152. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/run_gates.py +0 -0
  153. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/startup_timer.py +0 -0
  154. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/todo_baseline.json +0 -0
  155. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/todo_scanner.py +0 -0
  156. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/ui_import_timer.py +0 -0
  157. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/uninstall.sh +0 -0
  158. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/update_models_registry.sh +0 -0
  159. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/utils/check_empty_dirs.py +0 -0
  160. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/scripts/utils/vulture_whitelist.py +0 -0
  161. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/skills/pypi-release/SKILL.md +0 -0
  162. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/skills/pypi-release/references/common-issues.md +0 -0
  163. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/skills/pypi-release/references/workflow-structure.md +0 -0
  164. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/__init__.py +0 -0
  165. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/__init__.py +0 -0
  166. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/defaults.py +0 -0
  167. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/ignore_patterns.py +0 -0
  168. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/limits.py +0 -0
  169. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/models.py +0 -0
  170. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/models_registry.json +0 -0
  171. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/paths.py +0 -0
  172. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/pricing.py +0 -0
  173. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/settings.py +0 -0
  174. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/configuration/user_config.py +0 -0
  175. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/__init__.py +0 -0
  176. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/__init__.py +0 -0
  177. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/agent_components/__init__.py +0 -0
  178. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/agent_components/agent_config.py +0 -0
  179. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/agent_components/agent_helpers.py +0 -0
  180. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/agent_components/agent_session_config.py +0 -0
  181. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/helpers.py +0 -0
  182. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/resume/__init__.py +0 -0
  183. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/resume/sanitize.py +0 -0
  184. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/agents/resume/sanitize_debug.py +0 -0
  185. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/__init__.py +0 -0
  186. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/prompts.py +0 -0
  187. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/summarizer.py +0 -0
  188. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/types.py +0 -0
  189. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/debug/__init__.py +0 -0
  190. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/debug/usage_trace.py +0 -0
  191. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/logging/__init__.py +0 -0
  192. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/logging/handlers.py +0 -0
  193. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/logging/levels.py +0 -0
  194. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/logging/manager.py +0 -0
  195. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/logging/records.py +0 -0
  196. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/session/__init__.py +0 -0
  197. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/types/__init__.py +0 -0
  198. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/types/agent_state.py +0 -0
  199. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/types/state.py +0 -0
  200. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/types/state_structures.py +0 -0
  201. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/types/tool_registry.py +0 -0
  202. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/__init__.py +0 -0
  203. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/configuration.py +0 -0
  204. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/constants.py +0 -0
  205. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/file_filter.py +0 -0
  206. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/formatting.py +0 -0
  207. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/lsp_status.py +0 -0
  208. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/messaging.py +0 -0
  209. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/shared_types.py +0 -0
  210. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/system_paths.py +0 -0
  211. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/user_configuration.py +0 -0
  212. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/exceptions.py +0 -0
  213. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/__init__.py +0 -0
  214. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/__init__.py +0 -0
  215. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/__init__.py +0 -0
  216. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/agents.py +0 -0
  217. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/limits_settings.py +0 -0
  218. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/models_registry.py +0 -0
  219. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/skills.py +0 -0
  220. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/tunacode_context.py +0 -0
  221. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/manager.py +0 -0
  222. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/metadata.py +0 -0
  223. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/strategies.py +0 -0
  224. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/file_filter.py +0 -0
  225. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/prompts/system_prompt.md +0 -0
  226. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/py.typed +0 -0
  227. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/__init__.py +0 -0
  228. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/discovery.py +0 -0
  229. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/loader.py +0 -0
  230. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/models.py +0 -0
  231. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/prompting.py +0 -0
  232. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/registry.py +0 -0
  233. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/search.py +0 -0
  234. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/skills/selection.py +0 -0
  235. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/__init__.py +0 -0
  236. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/bash.py +0 -0
  237. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/cache_accessors/__init__.py +0 -0
  238. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/cache_accessors/ignore_manager_cache.py +0 -0
  239. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/cache_accessors/ripgrep_cache.py +0 -0
  240. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/discover.py +0 -0
  241. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/hashline.py +0 -0
  242. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/hashline_edit.py +0 -0
  243. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/ignore.py +0 -0
  244. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/ignore_manager.py +0 -0
  245. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/line_cache.py +0 -0
  246. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/__init__.py +0 -0
  247. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/client.py +0 -0
  248. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/diagnostics.py +0 -0
  249. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/servers.py +0 -0
  250. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/read_file.py +0 -0
  251. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/__init__.py +0 -0
  252. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/discover_pipeline.py +0 -0
  253. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/discover_terms.py +0 -0
  254. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/discover_types.py +0 -0
  255. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/file_errors.py +0 -0
  256. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/formatting.py +0 -0
  257. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/ripgrep.py +0 -0
  258. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/web_fetch.py +0 -0
  259. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/tools/write_file.py +0 -0
  260. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/types/__init__.py +0 -0
  261. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/types/base.py +0 -0
  262. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/types/callbacks.py +0 -0
  263. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/types/canonical.py +0 -0
  264. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/types/dataclasses.py +0 -0
  265. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/types/models_registry.py +0 -0
  266. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/__init__.py +0 -0
  267. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/assets/logo.ansi +0 -0
  268. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/clipboard.py +0 -0
  269. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/command_registry.py +0 -0
  270. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/__init__.py +0 -0
  271. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/base.py +0 -0
  272. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/cancel.py +0 -0
  273. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/clear.py +0 -0
  274. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/compact.py +0 -0
  275. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/exit.py +0 -0
  276. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/model.py +0 -0
  277. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/resume.py +0 -0
  278. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/skills.py +0 -0
  279. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/theme.py +0 -0
  280. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/thoughts.py +0 -0
  281. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/update.py +0 -0
  282. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/context_panel.py +0 -0
  283. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/esc/__init__.py +0 -0
  284. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/esc/handler.py +0 -0
  285. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/esc/types.py +0 -0
  286. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/lifecycle.py +0 -0
  287. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/logo_assets.py +0 -0
  288. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/main.py +0 -0
  289. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/model_display.py +0 -0
  290. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/__init__.py +0 -0
  291. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/agent_response.py +0 -0
  292. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/errors.py +0 -0
  293. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/panel_widths.py +0 -0
  294. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/panels.py +0 -0
  295. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/search.py +0 -0
  296. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/thinking.py +0 -0
  297. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/__init__.py +0 -0
  298. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/base.py +0 -0
  299. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/bash.py +0 -0
  300. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/diagnostics.py +0 -0
  301. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/discover.py +0 -0
  302. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/hashline_edit.py +0 -0
  303. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/read_file.py +0 -0
  304. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/syntax_utils.py +0 -0
  305. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/web_fetch.py +0 -0
  306. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/write_file.py +0 -0
  307. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/repl_support.py +0 -0
  308. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/request_bridge.py +0 -0
  309. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/__init__.py +0 -0
  310. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/api_key_entry.py +0 -0
  311. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/model_picker.py +0 -0
  312. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/session_picker.py +0 -0
  313. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/setup.py +0 -0
  314. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/theme_picker.py +0 -0
  315. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/update_confirm.py +0 -0
  316. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/shell_runner.py +0 -0
  317. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/slopgotchi/__init__.py +0 -0
  318. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/slopgotchi/panel.py +0 -0
  319. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/streaming.py +0 -0
  320. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/layout.tcss +0 -0
  321. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/modals.tcss +0 -0
  322. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/panels.tcss +0 -0
  323. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/widgets.tcss +0 -0
  324. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/styles.py +0 -0
  325. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/thinking_state.py +0 -0
  326. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/welcome.py +0 -0
  327. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/__init__.py +0 -0
  328. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/chat.py +0 -0
  329. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/command_autocomplete.py +0 -0
  330. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/editor.py +0 -0
  331. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/file_autocomplete.py +0 -0
  332. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/messages.py +0 -0
  333. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/resource_bar.py +0 -0
  334. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/skills_autocomplete.py +0 -0
  335. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/utils/__init__.py +0 -0
  336. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/utils/messaging/__init__.py +0 -0
  337. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/utils/messaging/adapter.py +0 -0
  338. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/utils/messaging/token_counter.py +0 -0
  339. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/utils/system/__init__.py +0 -0
  340. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/src/tunacode/utils/system/gitignore.py +0 -0
  341. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/__init__.py +0 -0
  342. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/architecture/__init__.py +0 -0
  343. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/architecture/test_import_order.py +0 -0
  344. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/architecture/test_imports_in_init.py +0 -0
  345. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/architecture/test_init_bloat.py +0 -0
  346. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/architecture/test_layer_dependencies.py +0 -0
  347. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/conftest.py +0 -0
  348. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/integration/core/test_minimax_execution_path.py +0 -0
  349. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/integration/core/test_mtime_caches_end_to_end.py +0 -0
  350. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/integration/core/test_tinyagent_alchemy_usage_contract_live.py +0 -0
  351. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/integration/ui/test_submit_loading_lifecycle.py +0 -0
  352. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/system/cli/test_cli_default_command.py +0 -0
  353. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/system/cli/test_repl_support.py +0 -0
  354. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/system/cli/test_startup.py +0 -0
  355. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/system/cli/test_tmux_tools.py +0 -0
  356. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/test_dependency_layers.py +0 -0
  357. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_default_config_minimax_keys.py +0 -0
  358. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_default_config_stream_agent_text.py +0 -0
  359. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_ignore_patterns.py +0 -0
  360. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_models_registry_loading_behavior.py +0 -0
  361. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_models_registry_minimax_contract.py +0 -0
  362. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_pricing_registry_loading.py +0 -0
  363. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_provider_api_key_env_fallback.py +0 -0
  364. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/configuration/test_user_config_loading.py +0 -0
  365. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_cache_abort.py +0 -0
  366. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_helpers.py +0 -0
  367. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_init_debug.py +0 -0
  368. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_skills_prompt_injection.py +0 -0
  369. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_stream_provider_debug.py +0 -0
  370. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_compaction_controller_outcomes.py +0 -0
  371. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_compaction_summarizer.py +0 -0
  372. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_context_overflow_detection.py +0 -0
  373. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_exceptions.py +0 -0
  374. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_logging.py +0 -0
  375. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_openrouter_usage_metrics.py +0 -0
  376. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_provider_error_surfacing.py +0 -0
  377. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_session_state_defaults.py +0 -0
  378. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_session_state_model_registry_loading.py +0 -0
  379. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_session_usage_schema.py +0 -0
  380. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_stream_phase_debug.py +0 -0
  381. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_thinking_stream_routing.py +0 -0
  382. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_tinyagent_openrouter_model_config.py +0 -0
  383. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_tool_concurrency_limit.py +0 -0
  384. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/core/test_usage_trace_debug.py +0 -0
  385. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/infrastructure/test_cache_infrastructure.py +0 -0
  386. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/infrastructure/test_file_filter.py +0 -0
  387. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/infrastructure/test_migrated_lru_cache_replacements.py +0 -0
  388. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/infrastructure/test_typed_cache_accessors.py +0 -0
  389. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/skills/test_registry.py +0 -0
  390. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/skills/test_selection.py +0 -0
  391. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/test_sanitize_canonicalization.py +0 -0
  392. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/tools/test_ignore_manager.py +0 -0
  393. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/types/test_adapter.py +0 -0
  394. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/types/test_canonical.py +0 -0
  395. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/types/test_tool_registry.py +0 -0
  396. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/ui/test_app_loading_indicator.py +0 -0
  397. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/ui/test_request_threading.py +0 -0
  398. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/ui/test_thinking_state.py +0 -0
  399. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/utils/test_gitignore.py +0 -0
  400. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/utils/test_shell_command_escape.py +0 -0
  401. {tunacode_cli-0.1.101 → tunacode_cli-0.2.0}/tests/unit/utils/test_token_counter.py +0 -0
@@ -0,0 +1,251 @@
1
+ ---
2
+ title: "ui_api passthrough reduction implementation plan"
3
+ link: "ui-api-passthrough-reduction-plan"
4
+ type: implementation_plan
5
+ ontological_relations:
6
+ - relates_to: [[core-ui-api-research]]
7
+ tags: [plan, ui-api, coding]
8
+ uuid: "beacadf7-d151-4cdc-88a5-209eeec2b7e4"
9
+ created_at: "2026-03-31T17:00:48Z"
10
+ parent_research: ".artifacts/research/2026-03-31_16-51-07_ui-api.md"
11
+ git_commit_at_plan: "a65e7bf1"
12
+ ---
13
+
14
+ ## Goal
15
+
16
+ - Reduce `src/tunacode/core/ui_api/` to only modules that add adapter behavior, by migrating UI callers off pure passthrough facades and deleting the dead facade modules.
17
+ - Keep runtime behavior, model/config workflows, and tool rendering behavior unchanged while simplifying import paths.
18
+ - Out of scope: redesigning the underlying configuration/types/utils APIs, changing request orchestration, or removing the non-trivial adapters (`file_filter.py`, `formatting.py`, `lsp_status.py`).
19
+
20
+ ## Scope & Assumptions
21
+
22
+ - IN scope:
23
+ - Replace UI imports of `core.ui_api` passthrough modules with direct imports from `tunacode.constants`, `tunacode.types`, `tunacode.configuration.*`, and `tunacode.utils.messaging`.
24
+ - Delete the pure passthrough modules once no in-repo source file imports them.
25
+ - Update package docs and architecture notes so the surviving `ui_api` surface matches the code.
26
+ - Add one architecture ratchet that locks the reduced `core/ui_api` file set.
27
+ - OUT of scope:
28
+ - Moving logic between lower layers.
29
+ - Reworking `FileFilter`, `LspServerInfo`, or diagnostic formatting behavior.
30
+ - Any changes to tool callbacks, message schemas, or pricing/model registry logic beyond import-path updates.
31
+ - Ops/deploy/release work.
32
+ - Assumptions:
33
+ - Direct UI imports from `configuration`, `types`, `constants`, and `utils` remain valid per `tests/test_dependency_layers.py:11-34` and `docs/modules/utils/utils.md:1-23`.
34
+ - The modules identified as passthrough-only in the research doc stay behaviorally identical to their underlying implementations during this refactor.
35
+ - Untracked planning artifacts present at plan time remain untouched: `.artifacts/research/2026-03-31_11-32-31_theme-switch-dim-background-crash.md`, `.artifacts/research/2026-03-31_16-51-07_ui-api.md`.
36
+
37
+ ## Deliverables
38
+
39
+ - UI source files importing lower-layer modules directly instead of the removable `core.ui_api` facades.
40
+ - A narrowed `src/tunacode/core/ui_api/` package containing only `__init__.py`, `file_filter.py`, `formatting.py`, and `lsp_status.py`.
41
+ - One architecture test that ratchets the reduced `ui_api` surface.
42
+ - Updated developer docs and repository map reflecting the reduced package.
43
+
44
+ ## Readiness
45
+
46
+ - Preconditions:
47
+ - Research artifact exists at `.artifacts/research/2026-03-31_16-51-07_ui-api.md`.
48
+ - Current git baseline captured at commit `a65e7bf1`.
49
+ - The following checks are available for post-change validation: `tests/test_dependency_layers.py`, `tests/architecture/test_layer_dependencies.py`, `tests/architecture/test_import_order.py`.
50
+ - Before starting execution:
51
+ - Keep the existing import order conventions in touched files.
52
+ - Do not delete the untracked research artifacts listed above.
53
+ - Preserve `src/tunacode/core/ui_api/file_filter.py`, `src/tunacode/core/ui_api/formatting.py`, and `src/tunacode/core/ui_api/lsp_status.py` unless a later approved plan explicitly targets them.
54
+
55
+ ## Milestones
56
+
57
+ - M1: Migrate startup/model-selection UI paths off passthrough facades.
58
+ - M2: Migrate runtime/rendering UI paths off passthrough facades.
59
+ - M3: Delete dead `core/ui_api` modules and narrow the package surface.
60
+ - M4: Refresh docs/generated maps and add a ratchet test for the reduced surface.
61
+
62
+ ## Ticket Index
63
+
64
+ <!-- TICKET_INDEX:START -->
65
+
66
+ | Task | Title | Ticket |
67
+ |---|---|---|
68
+ | T001 | Migrate startup and model-selection flows off passthrough facades | [tickets/T001.md](tickets/T001.md) |
69
+ | T002 | Migrate runtime and rendering flows off passthrough facades | [tickets/T002.md](tickets/T002.md) |
70
+ | T003 | Delete dead facade modules and narrow the `core/ui_api` package surface | [tickets/T003.md](tickets/T003.md) |
71
+ | T004 | Refresh docs and add a ratchet for the reduced `ui_api` surface | [tickets/T004.md](tickets/T004.md) |
72
+
73
+ <!-- TICKET_INDEX:END -->
74
+
75
+ ## Work Breakdown (Tasks)
76
+
77
+ ### T001: Migrate startup and model-selection flows off passthrough facades
78
+
79
+ **Summary**: Replace `core.ui_api` imports used by CLI startup, lifecycle, setup, model selection, theme switching, session deletion, and update flows with direct imports from the underlying `configuration`, `constants`, and `paths` modules.
80
+
81
+ **Owner**: ui-core
82
+
83
+ **Estimate**: 2.5h
84
+
85
+ **Dependencies**: none
86
+
87
+ **Target milestone**: M1
88
+
89
+ **Acceptance test**: `! rg -n "tunacode\.core\.ui_api\.(configuration|user_configuration|system_paths|constants)" src/tunacode/ui/main.py src/tunacode/ui/lifecycle.py src/tunacode/ui/screens/setup.py src/tunacode/ui/screens/model_picker.py src/tunacode/ui/screens/api_key_entry.py src/tunacode/ui/commands/model.py src/tunacode/ui/commands/theme.py src/tunacode/ui/commands/update.py src/tunacode/ui/commands/resume.py`
90
+
91
+ **Files/modules touched**:
92
+ - src/tunacode/ui/main.py
93
+ - src/tunacode/ui/lifecycle.py
94
+ - src/tunacode/ui/screens/setup.py
95
+ - src/tunacode/ui/screens/model_picker.py
96
+ - src/tunacode/ui/screens/api_key_entry.py
97
+ - src/tunacode/ui/commands/model.py
98
+ - src/tunacode/ui/commands/theme.py
99
+ - src/tunacode/ui/commands/update.py
100
+ - src/tunacode/ui/commands/resume.py
101
+
102
+ **Steps**:
103
+ 1. In each listed file, replace `tunacode.core.ui_api.configuration` imports with direct imports from the specific source modules: `tunacode.configuration.defaults`, `tunacode.configuration.models`, `tunacode.configuration.pricing`, and `tunacode.configuration.settings`.
104
+ 2. Replace `tunacode.core.ui_api.user_configuration` imports with direct imports from `tunacode.configuration.user_config`.
105
+ 3. Replace `tunacode.core.ui_api.system_paths` imports with direct imports from `tunacode.configuration.paths`.
106
+ 4. Replace `tunacode.core.ui_api.constants` imports in the listed files with direct imports from `tunacode.constants`.
107
+ 5. Preserve current behavior and call ordering; only change import sources and any now-unneeded alias names.
108
+ 6. Run the acceptance grep command and confirm the listed files no longer reference the four removable facade modules.
109
+
110
+ ### T002: Migrate runtime and rendering flows off passthrough facades
111
+
112
+ **Summary**: Replace `core.ui_api` imports used by the main app runtime, callbacks, compact command, session preview, widgets, styles, welcome message, and tool renderers with direct imports from `tunacode.constants`, `tunacode.types`, and `tunacode.utils.messaging`.
113
+
114
+ **Owner**: ui-core
115
+
116
+ **Estimate**: 3h
117
+
118
+ **Dependencies**: T001
119
+
120
+ **Target milestone**: M2
121
+
122
+ **Acceptance test**: `! rg -n "tunacode\.core\.ui_api\.(constants|shared_types|messaging)" src/tunacode/ui/app.py src/tunacode/ui/repl_support.py src/tunacode/ui/commands/clear.py src/tunacode/ui/commands/compact.py src/tunacode/ui/screens/session_picker.py src/tunacode/ui/widgets/messages.py src/tunacode/ui/widgets/resource_bar.py src/tunacode/ui/styles.py src/tunacode/ui/welcome.py src/tunacode/ui/renderers/agent_response.py src/tunacode/ui/renderers/panel_widths.py src/tunacode/ui/renderers/panels.py src/tunacode/ui/renderers/search.py src/tunacode/ui/renderers/tools/base.py src/tunacode/ui/renderers/tools/bash.py src/tunacode/ui/renderers/tools/diagnostics.py src/tunacode/ui/renderers/tools/discover.py src/tunacode/ui/renderers/tools/hashline_edit.py src/tunacode/ui/renderers/tools/read_file.py src/tunacode/ui/renderers/tools/web_fetch.py src/tunacode/ui/renderers/tools/write_file.py`
123
+
124
+ **Files/modules touched**:
125
+ - src/tunacode/ui/app.py
126
+ - src/tunacode/ui/repl_support.py
127
+ - src/tunacode/ui/commands/clear.py
128
+ - src/tunacode/ui/commands/compact.py
129
+ - src/tunacode/ui/screens/session_picker.py
130
+ - src/tunacode/ui/widgets/messages.py
131
+ - src/tunacode/ui/widgets/resource_bar.py
132
+ - src/tunacode/ui/styles.py
133
+ - src/tunacode/ui/welcome.py
134
+ - src/tunacode/ui/renderers/agent_response.py
135
+ - src/tunacode/ui/renderers/panel_widths.py
136
+ - src/tunacode/ui/renderers/panels.py
137
+ - src/tunacode/ui/renderers/search.py
138
+ - src/tunacode/ui/renderers/tools/base.py
139
+ - src/tunacode/ui/renderers/tools/bash.py
140
+ - src/tunacode/ui/renderers/tools/diagnostics.py
141
+ - src/tunacode/ui/renderers/tools/discover.py
142
+ - src/tunacode/ui/renderers/tools/hashline_edit.py
143
+ - src/tunacode/ui/renderers/tools/read_file.py
144
+ - src/tunacode/ui/renderers/tools/web_fetch.py
145
+ - src/tunacode/ui/renderers/tools/write_file.py
146
+
147
+ **Steps**:
148
+ 1. Replace `tunacode.core.ui_api.constants` imports with direct imports from `tunacode.constants` in every listed runtime/rendering file.
149
+ 2. Replace `tunacode.core.ui_api.shared_types` imports with direct imports from `tunacode.types` and `tunacode.types.canonical` as needed (`UsageMetrics` can come from `tunacode.types.canonical`; the callback/type aliases can come from `tunacode.types`).
150
+ 3. Replace `tunacode.core.ui_api.messaging` imports with direct imports from `tunacode.utils.messaging`.
151
+ 4. Keep `tunacode.core.ui_api.formatting` and `tunacode.core.ui_api.lsp_status` imports unchanged in this task because those modules still add adapter behavior.
152
+ 5. Clean up any redundant inline imports created solely for the removed facades while preserving lazy-import behavior where the current code relies on it.
153
+ 6. Run the acceptance grep command and confirm the listed files no longer reference the three removable runtime facade modules.
154
+
155
+ ### T003: Delete dead facade modules and narrow the `core/ui_api` package surface
156
+
157
+ **Summary**: Remove the passthrough modules after all in-repo call sites stop using them, and update the package docstring so `core/ui_api` describes the reduced adapter-only surface.
158
+
159
+ **Owner**: core
160
+
161
+ **Estimate**: 1.5h
162
+
163
+ **Dependencies**: T002
164
+
165
+ **Target milestone**: M3
166
+
167
+ **Acceptance test**: `test "$(find src/tunacode/core/ui_api -maxdepth 1 -type f | xargs -n1 basename | sort | tr '\n' ' ')" = "__init__.py file_filter.py formatting.py lsp_status.py "`
168
+
169
+ **Files/modules touched**:
170
+ - src/tunacode/core/ui_api/__init__.py
171
+ - src/tunacode/core/ui_api/configuration.py
172
+ - src/tunacode/core/ui_api/constants.py
173
+ - src/tunacode/core/ui_api/messaging.py
174
+ - src/tunacode/core/ui_api/shared_types.py
175
+ - src/tunacode/core/ui_api/system_paths.py
176
+ - src/tunacode/core/ui_api/user_configuration.py
177
+
178
+ **Steps**:
179
+ 1. Delete `configuration.py`, `constants.py`, `messaging.py`, `shared_types.py`, `system_paths.py`, and `user_configuration.py` from `src/tunacode/core/ui_api/`.
180
+ 2. Rewrite `src/tunacode/core/ui_api/__init__.py` so it describes the reduced package as a home only for UI-specific adapters that add behavior, defaults, or translation.
181
+ 3. Do not change `file_filter.py`, `formatting.py`, or `lsp_status.py` except for import cleanup if a deleted sibling module was referenced in comments or docstrings.
182
+ 4. Re-run a repository-wide grep for `tunacode.core.ui_api.` imports and confirm only `file_filter`, `formatting`, and `lsp_status` remain in tracked source files.
183
+ 5. Run the acceptance shell test and confirm the package file set matches the expected reduced surface exactly.
184
+
185
+ ### T004: Refresh docs and add a ratchet for the reduced `ui_api` surface
186
+
187
+ **Summary**: Update developer docs and generated structure artifacts to describe the reduced adapter-only package, and add one architecture test that fails if deleted passthrough modules are reintroduced.
188
+
189
+ **Owner**: architecture
190
+
191
+ **Estimate**: 2h
192
+
193
+ **Dependencies**: T003
194
+
195
+ **Target milestone**: M4
196
+
197
+ **Acceptance test**: `uv run pytest tests/architecture/test_ui_api_surface.py tests/test_dependency_layers.py tests/architecture/test_layer_dependencies.py tests/architecture/test_import_order.py -q`
198
+
199
+ **Files/modules touched**:
200
+ - tests/architecture/test_ui_api_surface.py
201
+ - docs/modules/core/core.md
202
+ - docs/modules/ui/ui.md
203
+ - docs/codebase-map/structure/tree-structure.txt
204
+ - AGENTS.md
205
+
206
+ **Steps**:
207
+ 1. Add `tests/architecture/test_ui_api_surface.py` that asserts the file set under `src/tunacode/core/ui_api/` matches the intended reduced surface from T003.
208
+ 2. Update `docs/modules/core/core.md` so the `ui_api/` entry describes the smaller adapter-only package instead of a broad bridge for configuration/constants/types.
209
+ 3. Update `docs/modules/ui/ui.md` anywhere the dependency narrative implies UI must route lower-layer imports through `core/ui_api`; keep the docs consistent with the new direct-import paths.
210
+ 4. Regenerate `docs/codebase-map/structure/tree-structure.txt` after the package shrink so the committed tree matches the source layout.
211
+ 5. Update `AGENTS.md` `Last Updated` date and any repository-orientation bullets that describe `core/ui_api/` as a broad bridge.
212
+ 6. Run the acceptance pytest command and confirm the reduced surface plus layer/import-order rules all pass together.
213
+
214
+ ## Risks & Mitigations
215
+
216
+ - Import churn across many UI files can create noisy diffs.
217
+ - Mitigation: keep the refactor import-only, grouped by task, and avoid unrelated formatting changes.
218
+ - Some files currently rely on lazy imports to reduce startup cost or avoid cycles.
219
+ - Mitigation: preserve lazy-import placement unless a direct top-level import is already used safely in a nearby file.
220
+ - Docs may drift if the generated structure tree is not refreshed after deleting modules.
221
+ - Mitigation: regenerate the tree in T004 and include it in the acceptance path.
222
+ - A deleted facade could still be referenced outside `src/tunacode/ui/`.
223
+ - Mitigation: repository-wide grep in T003 before deleting files permanently.
224
+
225
+ ## Test Strategy
226
+
227
+ - T001/T002 rely on grep-based proof that targeted files no longer import the removable facades.
228
+ - T003 relies on an exact filesystem assertion for the remaining `core/ui_api` file set.
229
+ - T004 adds one architecture ratchet test and reruns the existing dependency/import-order suite.
230
+ - Do not add more than one new test file; the only new test should be `tests/architecture/test_ui_api_surface.py`.
231
+
232
+ ## References
233
+
234
+ - Research doc: `.artifacts/research/2026-03-31_16-51-07_ui-api.md` — sections `Key Files`, `Data Ingress`, `Dependencies`, `Flow Maps`
235
+ - `src/tunacode/core/ui_api/configuration.py:1-101`
236
+ - `src/tunacode/core/ui_api/constants.py:1-47`
237
+ - `src/tunacode/core/ui_api/messaging.py:1-36`
238
+ - `src/tunacode/core/ui_api/shared_types.py:1-17`
239
+ - `src/tunacode/core/ui_api/system_paths.py:1-44`
240
+ - `src/tunacode/core/ui_api/user_configuration.py:1-51`
241
+ - `tests/test_dependency_layers.py:11-34`
242
+ - `docs/modules/utils/utils.md:1-23`
243
+ - `docs/modules/core/core.md:68-70`
244
+ - `src/tunacode/ui/main.py:10-12`
245
+ - `src/tunacode/ui/app.py:28-29,339,522,656,748`
246
+ - `src/tunacode/ui/commands/model.py:7,31,58-59,107-108,135`
247
+
248
+ ## Final Gate
249
+
250
+ - **Output summary**: `.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/`, 4 milestones, 4 tickets
251
+ - **Next step**: proceed to execute-phase with `.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/PLAN.md`
@@ -0,0 +1,16 @@
1
+ ---
2
+ title: "Ticket Index"
3
+ type: ticket_index
4
+ parent_plan: "../PLAN.md"
5
+ created_at: "2026-03-31T17:05:09Z"
6
+ tags: [ticket, plan]
7
+ ---
8
+
9
+ # Ticket Index
10
+
11
+ | Task | Title | Ticket |
12
+ |---|---|---|
13
+ | T001 | Migrate startup and model-selection flows off passthrough facades | [T001](./T001.md) |
14
+ | T002 | Migrate runtime and rendering flows off passthrough facades | [T002](./T002.md) |
15
+ | T003 | Delete dead facade modules and narrow the `core/ui_api` package surface | [T003](./T003.md) |
16
+ | T004 | Refresh docs and add a ratchet for the reduced `ui_api` surface | [T004](./T004.md) |
@@ -0,0 +1,41 @@
1
+ ---
2
+ title: "T001: Migrate startup and model-selection flows off passthrough facades"
3
+ type: plan_ticket
4
+ task_id: "T001"
5
+ parent_plan: "../PLAN.md"
6
+ created_at: "2026-03-31T17:05:09Z"
7
+ tags: [ticket, plan]
8
+ ---
9
+
10
+ # T001: Migrate startup and model-selection flows off passthrough facades
11
+
12
+ **Summary**: Replace `core.ui_api` imports used by CLI startup, lifecycle, setup, model selection, theme switching, session deletion, and update flows with direct imports from the underlying `configuration`, `constants`, and `paths` modules.
13
+
14
+ **Owner**: ui-core
15
+
16
+ **Estimate**: 2.5h
17
+
18
+ **Dependencies**: none
19
+
20
+ **Target milestone**: M1
21
+
22
+ **Acceptance test**: `! rg -n "tunacode\.core\.ui_api\.(configuration|user_configuration|system_paths|constants)" src/tunacode/ui/main.py src/tunacode/ui/lifecycle.py src/tunacode/ui/screens/setup.py src/tunacode/ui/screens/model_picker.py src/tunacode/ui/screens/api_key_entry.py src/tunacode/ui/commands/model.py src/tunacode/ui/commands/theme.py src/tunacode/ui/commands/update.py src/tunacode/ui/commands/resume.py`
23
+
24
+ **Files/modules touched**:
25
+ - src/tunacode/ui/main.py
26
+ - src/tunacode/ui/lifecycle.py
27
+ - src/tunacode/ui/screens/setup.py
28
+ - src/tunacode/ui/screens/model_picker.py
29
+ - src/tunacode/ui/screens/api_key_entry.py
30
+ - src/tunacode/ui/commands/model.py
31
+ - src/tunacode/ui/commands/theme.py
32
+ - src/tunacode/ui/commands/update.py
33
+ - src/tunacode/ui/commands/resume.py
34
+
35
+ **Steps**:
36
+ 1. In each listed file, replace `tunacode.core.ui_api.configuration` imports with direct imports from the specific source modules: `tunacode.configuration.defaults`, `tunacode.configuration.models`, `tunacode.configuration.pricing`, and `tunacode.configuration.settings`.
37
+ 2. Replace `tunacode.core.ui_api.user_configuration` imports with direct imports from `tunacode.configuration.user_config`.
38
+ 3. Replace `tunacode.core.ui_api.system_paths` imports with direct imports from `tunacode.configuration.paths`.
39
+ 4. Replace `tunacode.core.ui_api.constants` imports in the listed files with direct imports from `tunacode.constants`.
40
+ 5. Preserve current behavior and call ordering; only change import sources and any now-unneeded alias names.
41
+ 6. Run the acceptance grep command and confirm the listed files no longer reference the four removable facade modules.
@@ -0,0 +1,53 @@
1
+ ---
2
+ title: "T002: Migrate runtime and rendering flows off passthrough facades"
3
+ type: plan_ticket
4
+ task_id: "T002"
5
+ parent_plan: "../PLAN.md"
6
+ created_at: "2026-03-31T17:05:09Z"
7
+ tags: [ticket, plan]
8
+ ---
9
+
10
+ # T002: Migrate runtime and rendering flows off passthrough facades
11
+
12
+ **Summary**: Replace `core.ui_api` imports used by the main app runtime, callbacks, compact command, session preview, widgets, styles, welcome message, and tool renderers with direct imports from `tunacode.constants`, `tunacode.types`, and `tunacode.utils.messaging`.
13
+
14
+ **Owner**: ui-core
15
+
16
+ **Estimate**: 3h
17
+
18
+ **Dependencies**: T001
19
+
20
+ **Target milestone**: M2
21
+
22
+ **Acceptance test**: `! rg -n "tunacode\.core\.ui_api\.(constants|shared_types|messaging)" src/tunacode/ui/app.py src/tunacode/ui/repl_support.py src/tunacode/ui/commands/clear.py src/tunacode/ui/commands/compact.py src/tunacode/ui/screens/session_picker.py src/tunacode/ui/widgets/messages.py src/tunacode/ui/widgets/resource_bar.py src/tunacode/ui/styles.py src/tunacode/ui/welcome.py src/tunacode/ui/renderers/agent_response.py src/tunacode/ui/renderers/panel_widths.py src/tunacode/ui/renderers/panels.py src/tunacode/ui/renderers/search.py src/tunacode/ui/renderers/tools/base.py src/tunacode/ui/renderers/tools/bash.py src/tunacode/ui/renderers/tools/diagnostics.py src/tunacode/ui/renderers/tools/discover.py src/tunacode/ui/renderers/tools/hashline_edit.py src/tunacode/ui/renderers/tools/read_file.py src/tunacode/ui/renderers/tools/web_fetch.py src/tunacode/ui/renderers/tools/write_file.py`
23
+
24
+ **Files/modules touched**:
25
+ - src/tunacode/ui/app.py
26
+ - src/tunacode/ui/repl_support.py
27
+ - src/tunacode/ui/commands/clear.py
28
+ - src/tunacode/ui/commands/compact.py
29
+ - src/tunacode/ui/screens/session_picker.py
30
+ - src/tunacode/ui/widgets/messages.py
31
+ - src/tunacode/ui/widgets/resource_bar.py
32
+ - src/tunacode/ui/styles.py
33
+ - src/tunacode/ui/welcome.py
34
+ - src/tunacode/ui/renderers/agent_response.py
35
+ - src/tunacode/ui/renderers/panel_widths.py
36
+ - src/tunacode/ui/renderers/panels.py
37
+ - src/tunacode/ui/renderers/search.py
38
+ - src/tunacode/ui/renderers/tools/base.py
39
+ - src/tunacode/ui/renderers/tools/bash.py
40
+ - src/tunacode/ui/renderers/tools/diagnostics.py
41
+ - src/tunacode/ui/renderers/tools/discover.py
42
+ - src/tunacode/ui/renderers/tools/hashline_edit.py
43
+ - src/tunacode/ui/renderers/tools/read_file.py
44
+ - src/tunacode/ui/renderers/tools/web_fetch.py
45
+ - src/tunacode/ui/renderers/tools/write_file.py
46
+
47
+ **Steps**:
48
+ 1. Replace `tunacode.core.ui_api.constants` imports with direct imports from `tunacode.constants` in every listed runtime/rendering file.
49
+ 2. Replace `tunacode.core.ui_api.shared_types` imports with direct imports from `tunacode.types` and `tunacode.types.canonical` as needed (`UsageMetrics` can come from `tunacode.types.canonical`; the callback/type aliases can come from `tunacode.types`).
50
+ 3. Replace `tunacode.core.ui_api.messaging` imports with direct imports from `tunacode.utils.messaging`.
51
+ 4. Keep `tunacode.core.ui_api.formatting` and `tunacode.core.ui_api.lsp_status` imports unchanged in this task because those modules still add adapter behavior.
52
+ 5. Clean up any redundant inline imports created solely for the removed facades while preserving lazy-import behavior where the current code relies on it.
53
+ 6. Run the acceptance grep command and confirm the listed files no longer reference the three removable runtime facade modules.
@@ -0,0 +1,38 @@
1
+ ---
2
+ title: "T003: Delete dead facade modules and narrow the `core/ui_api` package surface"
3
+ type: plan_ticket
4
+ task_id: "T003"
5
+ parent_plan: "../PLAN.md"
6
+ created_at: "2026-03-31T17:05:09Z"
7
+ tags: [ticket, plan]
8
+ ---
9
+
10
+ # T003: Delete dead facade modules and narrow the `core/ui_api` package surface
11
+
12
+ **Summary**: Remove the passthrough modules after all in-repo call sites stop using them, and update the package docstring so `core/ui_api` describes the reduced adapter-only surface.
13
+
14
+ **Owner**: core
15
+
16
+ **Estimate**: 1.5h
17
+
18
+ **Dependencies**: T002
19
+
20
+ **Target milestone**: M3
21
+
22
+ **Acceptance test**: `test "$(find src/tunacode/core/ui_api -maxdepth 1 -type f | xargs -n1 basename | sort | tr '\n' ' ')" = "__init__.py file_filter.py formatting.py lsp_status.py "`
23
+
24
+ **Files/modules touched**:
25
+ - src/tunacode/core/ui_api/__init__.py
26
+ - src/tunacode/core/ui_api/configuration.py
27
+ - src/tunacode/core/ui_api/constants.py
28
+ - src/tunacode/core/ui_api/messaging.py
29
+ - src/tunacode/core/ui_api/shared_types.py
30
+ - src/tunacode/core/ui_api/system_paths.py
31
+ - src/tunacode/core/ui_api/user_configuration.py
32
+
33
+ **Steps**:
34
+ 1. Delete `configuration.py`, `constants.py`, `messaging.py`, `shared_types.py`, `system_paths.py`, and `user_configuration.py` from `src/tunacode/core/ui_api/`.
35
+ 2. Rewrite `src/tunacode/core/ui_api/__init__.py` so it describes the reduced package as a home only for UI-specific adapters that add behavior, defaults, or translation.
36
+ 3. Do not change `file_filter.py`, `formatting.py`, or `lsp_status.py` except for import cleanup if a deleted sibling module was referenced in comments or docstrings.
37
+ 4. Re-run a repository-wide grep for `tunacode.core.ui_api.` imports and confirm only `file_filter`, `formatting`, and `lsp_status` remain in tracked source files.
38
+ 5. Run the acceptance shell test and confirm the package file set matches the expected reduced surface exactly.
@@ -0,0 +1,76 @@
1
+ ---
2
+ title: "T004: Refresh docs and add a ratchet for the reduced `ui_api` surface"
3
+ type: plan_ticket
4
+ task_id: "T004"
5
+ parent_plan: "../PLAN.md"
6
+ created_at: "2026-03-31T17:05:09Z"
7
+ tags: [ticket, plan]
8
+ ---
9
+
10
+ # T004: Refresh docs and add a ratchet for the reduced `ui_api` surface
11
+
12
+ **Summary**: Update developer docs and generated structure artifacts to describe the reduced adapter-only package, and add one architecture test that fails if deleted passthrough modules are reintroduced.
13
+
14
+ **Owner**: architecture
15
+
16
+ **Estimate**: 2h
17
+
18
+ **Dependencies**: T003
19
+
20
+ **Target milestone**: M4
21
+
22
+ **Acceptance test**: `uv run pytest tests/architecture/test_ui_api_surface.py tests/test_dependency_layers.py tests/architecture/test_layer_dependencies.py tests/architecture/test_import_order.py -q`
23
+
24
+ **Files/modules touched**:
25
+ - tests/architecture/test_ui_api_surface.py
26
+ - docs/modules/core/core.md
27
+ - docs/modules/ui/ui.md
28
+ - docs/codebase-map/structure/tree-structure.txt
29
+ - AGENTS.md
30
+
31
+ **Steps**:
32
+ 1. Add `tests/architecture/test_ui_api_surface.py` that asserts the file set under `src/tunacode/core/ui_api/` matches the intended reduced surface from T003.
33
+ 2. Update `docs/modules/core/core.md` so the `ui_api/` entry describes the smaller adapter-only package instead of a broad bridge for configuration/constants/types.
34
+ 3. Update `docs/modules/ui/ui.md` anywhere the dependency narrative implies UI must route lower-layer imports through `core/ui_api`; keep the docs consistent with the new direct-import paths.
35
+ 4. Regenerate `docs/codebase-map/structure/tree-structure.txt` after the package shrink so the committed tree matches the source layout.
36
+ 5. Update `AGENTS.md` `Last Updated` date and any repository-orientation bullets that describe `core/ui_api/` as a broad bridge.
37
+ 6. Run the acceptance pytest command and confirm the reduced surface plus layer/import-order rules all pass together.
38
+
39
+ ## Risks & Mitigations
40
+
41
+ - Import churn across many UI files can create noisy diffs.
42
+ - Mitigation: keep the refactor import-only, grouped by task, and avoid unrelated formatting changes.
43
+ - Some files currently rely on lazy imports to reduce startup cost or avoid cycles.
44
+ - Mitigation: preserve lazy-import placement unless a direct top-level import is already used safely in a nearby file.
45
+ - Docs may drift if the generated structure tree is not refreshed after deleting modules.
46
+ - Mitigation: regenerate the tree in T004 and include it in the acceptance path.
47
+ - A deleted facade could still be referenced outside `src/tunacode/ui/`.
48
+ - Mitigation: repository-wide grep in T003 before deleting files permanently.
49
+
50
+ ## Test Strategy
51
+
52
+ - T001/T002 rely on grep-based proof that targeted files no longer import the removable facades.
53
+ - T003 relies on an exact filesystem assertion for the remaining `core/ui_api` file set.
54
+ - T004 adds one architecture ratchet test and reruns the existing dependency/import-order suite.
55
+ - Do not add more than one new test file; the only new test should be `tests/architecture/test_ui_api_surface.py`.
56
+
57
+ ## References
58
+
59
+ - Research doc: `.artifacts/research/2026-03-31_16-51-07_ui-api.md` — sections `Key Files`, `Data Ingress`, `Dependencies`, `Flow Maps`
60
+ - `src/tunacode/core/ui_api/configuration.py:1-101`
61
+ - `src/tunacode/core/ui_api/constants.py:1-47`
62
+ - `src/tunacode/core/ui_api/messaging.py:1-36`
63
+ - `src/tunacode/core/ui_api/shared_types.py:1-17`
64
+ - `src/tunacode/core/ui_api/system_paths.py:1-44`
65
+ - `src/tunacode/core/ui_api/user_configuration.py:1-51`
66
+ - `tests/test_dependency_layers.py:11-34`
67
+ - `docs/modules/utils/utils.md:1-23`
68
+ - `docs/modules/core/core.md:68-70`
69
+ - `src/tunacode/ui/main.py:10-12`
70
+ - `src/tunacode/ui/app.py:28-29,339,522,656,748`
71
+ - `src/tunacode/ui/commands/model.py:7,31,58-59,107-108,135`
72
+
73
+ ## Final Gate
74
+
75
+ - **Output summary**: `.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/`, 4 milestones, 4 tickets
76
+ - **Next step**: proceed to execute-phase with `.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/PLAN.md`
@@ -0,0 +1,139 @@
1
+ ---
2
+ title: "theme switch dim-background crash research findings"
3
+ link: "theme-switch-dim-background-crash-research"
4
+ type: research
5
+ ontological_relations:
6
+ - relates_to: [[docs/ui/css-architecture]]
7
+ tags: [research, ui, themes, textual]
8
+ uuid: "4b86b09f-08be-49b9-bda8-d4c0713aa48a"
9
+ created_at: "2026-03-31T11:32:31-05:00"
10
+ ---
11
+
12
+ ## Scope
13
+
14
+ Research target: the theme-switch crash reported from the installed CLI while a user was changing themes.
15
+
16
+ ## Input Evidence
17
+
18
+ User-supplied traceback references:
19
+ - `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/filter.py:255`
20
+ - `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/filter.py:142`
21
+
22
+ User-supplied traceback values:
23
+ - `style = Style(color=Color('default', ColorType.DEFAULT), bgcolor=Color('default', ColorType.DEFAULT), dim=True, meta={'offset': (0, 1)})`
24
+ - `background = Color('default', ColorType.DEFAULT)`
25
+ - `bgcolor = Color('#f7f7f7', ColorType.TRUECOLOR, triplet=ColorTriplet(red=247, green=247, blue=247))`
26
+ - `color = Color('#000000', ColorType.TRUECOLOR, triplet=ColorTriplet(red=0, green=0, blue=0))`
27
+ - exception site: `red1, green1, blue1 = background.triplet`
28
+
29
+ ## Theme Switching Structure
30
+
31
+ - `src/tunacode/ui/app.py:120-124` registers TunaCode, NeXTSTEP, and wrapped built-in themes, then sets `self.theme = THEME_NAME`.
32
+ - `src/tunacode/constants.py:113-114` defines the custom theme names `tunacode` and `nextstep`.
33
+ - `src/tunacode/constants.py:118-207` defines the built-in palette wrappers, including `catppuccin-latte`, `solarized-light`, `textual-light`, `textual-dark`, and `tokyo-night`.
34
+ - `src/tunacode/constants.py:217-220` defines `SUPPORTED_THEME_NAMES` as `tunacode`, `nextstep`, and all names from `BUILTIN_THEME_PALETTES`.
35
+ - `src/tunacode/ui/app.py:195-199` exposes `supported_themes` by filtering `available_themes` through `SUPPORTED_THEME_NAMES`.
36
+ - `src/tunacode/ui/commands/theme.py:23-32` applies a direct `/theme <name>` change via `app.theme = theme_name` and persists `settings.theme`.
37
+ - `src/tunacode/ui/commands/theme.py:37-49` opens `ThemePickerScreen` when `/theme` is invoked with no argument.
38
+ - `src/tunacode/ui/screens/theme_picker.py:74-80` sets the initial highlight and applies live preview on highlight changes via `self.app.theme = str(event.option.id)`.
39
+ - `src/tunacode/ui/screens/theme_picker.py:87-90` restores the original theme on cancel.
40
+ - `docs/ui/css-architecture.md:95` states that the theme picker has live preview and that ESC reverts to the original.
41
+
42
+ ## Theme Object Construction
43
+
44
+ - `src/tunacode/constants.py:87-100` defines the `NEXTSTEP_COLORS` palette with `background="#acacac"`, `surface="#c8c8c8"`, and `text="#000000"`.
45
+ - `src/tunacode/constants.py:293-318` rebuilds built-in Textual themes in `_wrap_builtin_theme` by copying properties from the original theme.
46
+ - `src/tunacode/constants.py:311-314` copies `foreground`, `background`, `surface`, and `panel` with `getattr(theme, ..., None)`.
47
+ - `src/tunacode/constants.py:323-332` wraps any built-in theme present in `available_themes` and returns the wrapped list.
48
+
49
+ ## Render Path Carrying `dim=True`
50
+
51
+ - `src/tunacode/ui/renderers/tools/base.py:112-115` builds the hook prefix and appends `HOOK_ARROW_PREFIX` with `style="dim"`.
52
+ - `src/tunacode/ui/renderers/tools/base.py:123` appends the relative path with `style="dim underline"`.
53
+ - Additional renderers in the UI use `dim` styles in rendered Rich content, including:
54
+ - `src/tunacode/ui/renderers/agent_response.py:58,84`
55
+ - `src/tunacode/ui/renderers/search.py:140,147,160,162-165`
56
+ - `src/tunacode/ui/renderers/tools/read_file.py:192,206,263`
57
+ - `src/tunacode/ui/renderers/tools/web_fetch.py:87,96-100,138,178`
58
+
59
+ ## Chat Widget / Selection Path
60
+
61
+ - `src/tunacode/ui/widgets/chat.py:29-40` defines `SelectableRichVisual`.
62
+ - `src/tunacode/ui/widgets/chat.py:40-132` re-renders Rich content into segments and injects `meta={"offset": (x, y)}` into segment styles.
63
+ - `src/tunacode/ui/widgets/chat.py:66-69` builds the replacement Rich style by adding only offset metadata to the existing segment style.
64
+ - `src/tunacode/ui/widgets/chat.py:184-202` defines `CopyOnSelectStatic._render()` and replaces `RichVisual` with `SelectableRichVisual`.
65
+ - `src/tunacode/ui/widgets/chat.py:268-283` shows `ChatContainer.write()` creating a `CopyOnSelectStatic` for chat content.
66
+
67
+ ## Textual Filter Path Reached by Theme Changes
68
+
69
+ Installed CLI environment paths below match the traceback path prefix `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/`.
70
+
71
+ - `app.py:536-539` defines `ansi_theme_dark = MONOKAI` and `ansi_theme_light = ALABASTER`.
72
+ - `app.py:583-584` installs `ANSIToTruecolor(ansi_theme, enabled=not ansi_color)` into `self._filters`.
73
+ - `app.py:1398-1405` returns `ansi_theme_dark` for dark themes and `ansi_theme_light` for light themes via `App.ansi_theme`.
74
+ - `app.py:1408-1417` replaces the `ANSIToTruecolor` filter when the app theme changes.
75
+ - `_styles_cache.py:125` retrieves `base_background, background = widget._opacity_background_colors`.
76
+ - `_styles_cache.py:250` applies each enabled filter with `strip = strip.apply_filter(filter, background)`.
77
+ - `_styles_cache.py:323-324` sets `inner = Style(background=(base_background + background))` and `outer = Style(background=base_background)` while rendering styled lines.
78
+ - `filter.py:220-255` defines `ANSIToTruecolor.truecolor_style()`.
79
+ - `filter.py:254-255` calls `color = dim_color(background, color)` when `style.dim` is true and `color` is not `None`.
80
+ - `filter.py:129-142` defines `dim_color()` and unpacks `background.triplet` at line 142.
81
+
82
+ ## ANSI Theme Values Matching the Traceback
83
+
84
+ - `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/_ansi_theme.py:47-49` defines `ALABASTER = TerminalTheme(rgb(247, 247, 247), rgb(0, 0, 0), ...)`.
85
+ - The user-supplied traceback values `bgcolor=#f7f7f7` and `color=#000000` match `ALABASTER`'s first two RGB values at `_ansi_theme.py:48-49`.
86
+ - `App.ansi_theme` switches to `ansi_theme_light` for any light theme at `app.py:1398-1405`.
87
+
88
+ ## Runtime Inspection Findings
89
+
90
+ Executed locally in the repo virtual environment (`uv run python`) and in the installed CLI tool environment.
91
+
92
+ ### Installed CLI tool environment
93
+
94
+ Command outcome:
95
+ - `/home/fabian/.local/share/uv/tools/tunacode-cli/bin/python - <<'PY' ... print(textual.__version__) ... PY`
96
+ - reported `textual==4.0.0`
97
+ - executable path reported `/home/fabian/.local/share/uv/tools/tunacode-cli/bin/python`
98
+
99
+ ### Repo virtual environment
100
+
101
+ Command outcome:
102
+ - `uv run python - <<'PY' ... print(textual.__version__) ... PY`
103
+ - reported `textual==4.0.0`
104
+
105
+ ### Theme object values from `TextualReplApp.supported_themes`
106
+
107
+ Local inspection showed:
108
+ - `nextstep`: `foreground=#000000`, `background=#acacac`, `surface=#c8c8c8`
109
+ - `textual-light`: `foreground=None`, `background=#E0E0E0`, `surface=#D8D8D8`, `panel=#D0D0D0`
110
+ - `textual-dark`: `foreground=#e0e0e0`, `background=None`, `surface=None`, `panel=None`
111
+ - `catppuccin-latte`: `foreground=#4C4F69`, `background=#EFF1F5`, `surface=#E6E9EF`
112
+ - `solarized-light`: `foreground=#586e75`, `background=#fdf6e3`, `surface=#eee8d5`
113
+
114
+ ## Reproduction Attempts
115
+
116
+ The following local scripted runs completed without raising the traceback exception:
117
+
118
+ 1. `TextualReplApp.run_test()` with a chat message containing `Text()` segments styled as `dim` and repeated `app.theme = ...` assignments through light themes (`nextstep`, `textual-light`, `catppuccin-latte`, `solarized-light`).
119
+ 2. `TextualReplApp.run_test()` with `ChatContainer.write()` content mounted as plain chat content, `user-message`, `tool-panel`, `agent-panel`, and `thinking-panel`, followed by repeated theme changes.
120
+ 3. `TextualReplApp.run_test()` opening `ThemePickerScreen` and sending repeated `down` keypresses to trigger live preview changes through the picker.
121
+ 4. A minimal standalone Textual `App` with a `Static(Text(..., style='dim'))` and repeated theme changes through light themes.
122
+
123
+ Observed result for all four runs: no exception was raised locally.
124
+
125
+ ## File Map
126
+
127
+ - `src/tunacode/ui/app.py:118-124` → theme registration during app construction
128
+ - `src/tunacode/constants.py:87-100` → NeXTSTEP palette values
129
+ - `src/tunacode/constants.py:118-220` → built-in theme wrapper palette list and supported names
130
+ - `src/tunacode/constants.py:293-318` → built-in theme re-wrapping logic
131
+ - `src/tunacode/ui/commands/theme.py:23-49` → direct theme changes and picker launch
132
+ - `src/tunacode/ui/screens/theme_picker.py:74-90` → live preview and cancel/revert path
133
+ - `src/tunacode/ui/widgets/chat.py:29-132` → selectable Rich visual and segment metadata injection
134
+ - `src/tunacode/ui/widgets/chat.py:184-202` → `CopyOnSelectStatic` Rich visual substitution
135
+ - `src/tunacode/ui/widgets/chat.py:268-283` → chat widget creation path
136
+ - `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/app.py:536-584,1398-1417` → ANSI theme selection and filter refresh
137
+ - `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/_styles_cache.py:125,250,323-324` → filter application inputs
138
+ - `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/filter.py:129-142,220-255` → failing `dim_color` path
139
+ - `/home/fabian/.local/share/uv/tools/tunacode-cli/lib/python3.13/site-packages/textual/_ansi_theme.py:47-49` → ALABASTER light ANSI theme values