tunacode-cli 0.1.100__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 (419) hide show
  1. tunacode_cli-0.2.0/.artifacts/execute/2026-03-26_16-20-32_models-loading-unification.md +101 -0
  2. tunacode_cli-0.2.0/.artifacts/execute/2026-03-28_12-18-53_pr-444-review-fixes.md +57 -0
  3. tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/PLAN.md +271 -0
  4. tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/INDEX.md +16 -0
  5. tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T001.md +37 -0
  6. tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T002.md +46 -0
  7. tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T003.md +35 -0
  8. tunacode_cli-0.2.0/.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/tickets/T004.md +70 -0
  9. tunacode_cli-0.2.0/.artifacts/plan/2026-03-27_13-59-15_pr-444-review-fixes/PLAN.md +202 -0
  10. tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/PLAN.md +251 -0
  11. tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/INDEX.md +16 -0
  12. tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T001.md +41 -0
  13. tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T002.md +53 -0
  14. tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T003.md +38 -0
  15. tunacode_cli-0.2.0/.artifacts/plan/2026-03-31_17-00-48_ui-api-passthrough-reduction/tickets/T004.md +76 -0
  16. tunacode_cli-0.2.0/.artifacts/research/2026-03-26_15-29-02_models-loading-conflict-map.md +212 -0
  17. tunacode_cli-0.2.0/.artifacts/research/2026-03-31_11-32-31_theme-switch-dim-background-crash.md +139 -0
  18. tunacode_cli-0.2.0/.artifacts/research/2026-03-31_16-51-07_ui-api.md +381 -0
  19. tunacode_cli-0.2.0/.artifacts/research/2026-04-01_23-32-20_session-save-tail-and-message-boundary.md +78 -0
  20. tunacode_cli-0.2.0/.artifacts/research/2026-04-01_tinyagent-boundary.md +62 -0
  21. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/workflows/dependency-map.yml +2 -2
  22. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/workflows/empty-dir-check.yml +1 -1
  23. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/workflows/lint.yml +4 -4
  24. tunacode_cli-0.2.0/.github/workflows/publish-release.yml +69 -0
  25. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/workflows/release.yml +2 -2
  26. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/workflows/tech-debt.yml +4 -4
  27. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/AGENTS.md +3 -2
  28. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/CHANGELOG.md +23 -0
  29. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/HARNESS.md +15 -2
  30. tunacode_cli-0.2.0/LOG.md +73 -0
  31. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/Makefile +6 -2
  32. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/PKG-INFO +7 -3
  33. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/README.md +6 -1
  34. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/codebase-map/structure/tree-structure.txt +7 -6
  35. tunacode_cli-0.2.0/docs/deployment.md +159 -0
  36. tunacode_cli-0.2.0/docs/modules/configuration/configuration.md +59 -0
  37. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/infrastructure/infrastructure.md +1 -1
  38. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/tools/tools.md +6 -4
  39. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/types/types.md +10 -3
  40. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/ui/commands.md +8 -4
  41. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/ui/ui.md +24 -4
  42. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/utils/utils.md +9 -3
  43. tunacode_cli-0.2.0/docs/skills/audit-harness/SKILL.md +95 -0
  44. tunacode_cli-0.2.0/plan.md +275 -0
  45. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/pyproject.toml +1 -2
  46. tunacode_cli-0.2.0/skills/pypi-release/SKILL.md +319 -0
  47. tunacode_cli-0.2.0/skills/pypi-release/references/common-issues.md +156 -0
  48. tunacode_cli-0.2.0/skills/pypi-release/references/workflow-structure.md +205 -0
  49. tunacode_cli-0.2.0/skills/pypi-release/scripts/bump_version.py +145 -0
  50. tunacode_cli-0.2.0/skills/pypi-release/scripts/local_publish.py +155 -0
  51. tunacode_cli-0.2.0/skills/pypi-release/scripts/release.py +229 -0
  52. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/defaults.py +4 -1
  53. tunacode_cli-0.2.0/src/tunacode/configuration/ignore_patterns.py +113 -0
  54. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/limits.py +6 -37
  55. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/models.py +63 -34
  56. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/pricing.py +14 -10
  57. tunacode_cli-0.2.0/src/tunacode/configuration/user_config.py +294 -0
  58. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/constants.py +1 -2
  59. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/agent_components/agent_config.py +3 -9
  60. tunacode_cli-0.2.0/src/tunacode/core/agents/agent_components/agent_session_config.py +97 -0
  61. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/main.py +17 -8
  62. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/controller.py +19 -16
  63. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/session/state.py +26 -21
  64. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/types/state.py +3 -1
  65. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/configuration.py +3 -3
  66. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/user_configuration.py +3 -3
  67. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/limits_settings.py +6 -6
  68. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/models_registry.py +6 -4
  69. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/file_filter.py +14 -6
  70. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/hashline_edit.py +7 -36
  71. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/ignore_manager.py +7 -22
  72. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/diagnostics.py +7 -12
  73. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/read_file.py +6 -34
  74. tunacode_cli-0.2.0/src/tunacode/tools/utils/file_errors.py +52 -0
  75. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/write_file.py +6 -35
  76. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/types/__init__.py +16 -2
  77. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/types/base.py +37 -2
  78. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/types/dataclasses.py +0 -10
  79. tunacode_cli-0.2.0/src/tunacode/types/models_registry.py +95 -0
  80. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/app.py +55 -19
  81. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/debug.py +7 -0
  82. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/help.py +1 -1
  83. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/model.py +7 -16
  84. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/theme.py +2 -2
  85. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/lifecycle.py +1 -1
  86. tunacode_cli-0.2.0/src/tunacode/ui/main.py +161 -0
  87. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/request_debug.py +100 -0
  88. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/api_key_entry.py +1 -6
  89. tunacode_cli-0.2.0/src/tunacode/utils/system/gitignore.py +79 -0
  90. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/conftest.py +5 -1
  91. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/integration/ui/test_submit_loading_lifecycle.py +0 -1
  92. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/system/cli/test_cli_default_command.py +1 -2
  93. tunacode_cli-0.2.0/tests/system/cli/test_startup.py +46 -0
  94. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/system/cli/test_tmux_tools.py +7 -25
  95. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/test_compaction.py +6 -0
  96. tunacode_cli-0.2.0/tests/unit/configuration/test_ignore_patterns.py +40 -0
  97. tunacode_cli-0.2.0/tests/unit/configuration/test_models_registry_loading_behavior.py +34 -0
  98. tunacode_cli-0.2.0/tests/unit/configuration/test_pricing_registry_loading.py +18 -0
  99. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/configuration/test_provider_api_key_env_fallback.py +11 -4
  100. tunacode_cli-0.2.0/tests/unit/configuration/test_user_config_loading.py +53 -0
  101. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_request_orchestrator_parallel_tools.py +27 -0
  102. tunacode_cli-0.2.0/tests/unit/core/test_session_state_model_registry_loading.py +22 -0
  103. tunacode_cli-0.2.0/tests/unit/infrastructure/test_file_filter.py +59 -0
  104. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/infrastructure/test_migrated_lru_cache_replacements.py +7 -2
  105. tunacode_cli-0.2.0/tests/unit/tools/test_ignore_manager.py +16 -0
  106. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/ui/test_request_debug.py +60 -1
  107. tunacode_cli-0.2.0/tests/unit/utils/test_gitignore.py +66 -0
  108. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/uv.lock +1 -22
  109. tunacode_cli-0.1.100/.github/workflows/publish-release.yml +0 -73
  110. tunacode_cli-0.1.100/agents-typed.md +0 -180
  111. tunacode_cli-0.1.100/autoresearch.checks.sh +0 -9
  112. tunacode_cli-0.1.100/autoresearch.ideas.md +0 -1
  113. tunacode_cli-0.1.100/autoresearch.jsonl +0 -60
  114. tunacode_cli-0.1.100/autoresearch.md +0 -56
  115. tunacode_cli-0.1.100/autoresearch.sh +0 -12
  116. tunacode_cli-0.1.100/docs/modules/configuration/configuration.md +0 -47
  117. tunacode_cli-0.1.100/src/tunacode/configuration/feature_flags.py +0 -48
  118. tunacode_cli-0.1.100/src/tunacode/configuration/ignore_patterns.py +0 -135
  119. tunacode_cli-0.1.100/src/tunacode/configuration/user_config.py +0 -152
  120. tunacode_cli-0.1.100/src/tunacode/core/agents/agent_components/agent_session_config.py +0 -152
  121. tunacode_cli-0.1.100/src/tunacode/ui/headless/__init__.py +0 -3
  122. tunacode_cli-0.1.100/src/tunacode/ui/headless/output.py +0 -74
  123. tunacode_cli-0.1.100/src/tunacode/ui/main.py +0 -263
  124. tunacode_cli-0.1.100/src/tunacode/utils/system/gitignore.py +0 -81
  125. tunacode_cli-0.1.100/tests/system/cli/test_startup.py +0 -278
  126. tunacode_cli-0.1.100/typed.md +0 -150
  127. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/README.md +0 -0
  128. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/debug_history/2026-03-25_tinyagent-1-2-27-gil-hotfix-validation.md +0 -0
  129. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/debug_history/REQUEST_CONTEXT_CUTOVER_LESSON.md +0 -0
  130. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/debug_history/postmortem-defensive-message-typing-2026-03-17.md +0 -0
  131. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/debug_history/postmortem-loading-indicator-submit-regression-2026-03-24.md +0 -0
  132. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/debug_history/slop_fixture.py +0 -0
  133. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/execute/2026-03-22_19-54-47_tinyagent-message-typing-cleanup.md +0 -0
  134. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/execute/2026-03-24_19-20-38_input-latency-threaded-request-execution.md +0 -0
  135. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/issue_analysis_report_2026-03-21.md +0 -0
  136. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-22_09-58-20_native-tinyagent-tool-contract.md +0 -0
  137. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-22_18-08-41_tinyagent-message-typing-cleanup.md +0 -0
  138. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-23_15-35-00_command-autocomplete-positioning.md +0 -0
  139. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/plan/2026-03-24_19-15-16_input-latency-threaded-request-execution.md +0 -0
  140. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/plans/consolidate-main-support-plan.md +0 -0
  141. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/plans/reduce-src-python-files-to-500-lines-plan.md +0 -0
  142. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/query_data_flow.md +0 -0
  143. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/release/model-registry-refresh-release-blocker-2026-03-21.md +0 -0
  144. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/release/release-v0.1.94-run.md +0 -0
  145. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/release/tmux-suite-validation-2026-03-21.md +0 -0
  146. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-17_13-01-09_replace_messages-cutover.md +0 -0
  147. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-17_14-04-53_mypy-main-py-errors-map.md +0 -0
  148. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-21_14-07-44_prompt-versioning-map.md +0 -0
  149. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-42-58_tools-implementation.md +0 -0
  150. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-43-01_tools-context-synthesis.md +0 -0
  151. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-43-03_codebase-locator_tool-system.md +0 -0
  152. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-45-29_tools-data-inputs-contracts.md +0 -0
  153. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-53-07_tool-result-adapter-runtime.md +0 -0
  154. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_09-53-52_minimax-tinyagent-contract-shape-vs-runtime.md +0 -0
  155. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-22_17-57-53_message-ingress-data-contract-map.md +0 -0
  156. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-23_15-30-00_command-autocomplete-positioning.md +0 -0
  157. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-24_16-58-32_tui-submit-latency.md +0 -0
  158. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-24_18-46-40_input-latency-ui-loop-coupling.md +0 -0
  159. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/research/2026-03-24_20-07-05_input-latency-regression-probe.md +0 -0
  160. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.artifacts/tunacode_action_audit.md +0 -0
  161. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.coderabbit.yaml +0 -0
  162. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  163. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  164. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  165. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  166. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/dependabot.yml +0 -0
  167. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.github/pull_request_template.md +0 -0
  168. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.gitignore +0 -0
  169. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.pre-commit-config.yaml +0 -0
  170. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/.test_reports/.gitkeep +0 -0
  171. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/LICENSE +0 -0
  172. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/MANIFEST.in +0 -0
  173. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/assets/hashline-edit.png +0 -0
  174. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/assets/home.png +0 -0
  175. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/CODE-STANDARDS.md +0 -0
  176. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/README.md +0 -0
  177. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/architecture/dependencies/DEPENDENCY_LAYERS.dot +0 -0
  178. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/architecture/dependencies/DEPENDENCY_LAYERS.md +0 -0
  179. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/architecture/dependencies/DEPENDENCY_LAYERS.png +0 -0
  180. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/architecture/patterns/agent-message-serialization.md +0 -0
  181. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/docs_audit.html +0 -0
  182. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/git/practices.md +0 -0
  183. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-home-catpu.png +0 -0
  184. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-home.png +0 -0
  185. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-lsp.png +0 -0
  186. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/images/dream-ui/tunacode-cli-response.png +0 -0
  187. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/images/tool-calls.png +0 -0
  188. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/images/tunacode.png +0 -0
  189. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/configuration/models-registry.md +0 -0
  190. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/core/core.md +0 -0
  191. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/index.md +0 -0
  192. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/skills/skills.md +0 -0
  193. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/tools/hashline-subsystem.md +0 -0
  194. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/modules/tools/tools-system.md +0 -0
  195. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/reviews/2026-03-24-input-latency-research-artifact.md +0 -0
  196. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/reviews/2026-03-25-provider-stream-stall-artifact.md +0 -0
  197. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/reviews/pr-429-coderabbit-review.md +0 -0
  198. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/docs/ui/css-architecture.md +0 -0
  199. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/pytest.ini +0 -0
  200. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/benchmarks/input_latency.py +0 -0
  201. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/benchmarks/input_paint_latency.py +0 -0
  202. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/benchmarks/input_tmux_latency.py +0 -0
  203. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/check-defensive-slop.py +0 -0
  204. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/check-file-length.sh +0 -0
  205. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/check-naming-conventions.py +0 -0
  206. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/check-unused-constants.py +0 -0
  207. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/check_agents_freshness.py +0 -0
  208. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/check_unused_modules.py +0 -0
  209. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/dev-setup.sh +0 -0
  210. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/download_ripgrep.py +0 -0
  211. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/generate-release-notes.sh +0 -0
  212. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/generate_structure_tree.py +0 -0
  213. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/grimp_layers_report.py +0 -0
  214. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/install_linux.sh +0 -0
  215. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/playwright_cache.py +0 -0
  216. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/preview_tool_panels.py +0 -0
  217. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/run-dead-imports.sh +0 -0
  218. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/run_gates.py +0 -0
  219. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/startup_timer.py +0 -0
  220. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/todo_baseline.json +0 -0
  221. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/todo_scanner.py +0 -0
  222. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/ui_import_timer.py +0 -0
  223. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/uninstall.sh +0 -0
  224. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/update_models_registry.sh +0 -0
  225. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/utils/check_empty_dirs.py +0 -0
  226. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/scripts/utils/vulture_whitelist.py +0 -0
  227. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/__init__.py +0 -0
  228. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/__init__.py +0 -0
  229. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/models_registry.json +0 -0
  230. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/paths.py +0 -0
  231. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/configuration/settings.py +0 -0
  232. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/__init__.py +0 -0
  233. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/__init__.py +0 -0
  234. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/agent_components/__init__.py +0 -0
  235. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/agent_components/agent_helpers.py +0 -0
  236. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/helpers.py +0 -0
  237. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/resume/__init__.py +0 -0
  238. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/resume/sanitize.py +0 -0
  239. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/agents/resume/sanitize_debug.py +0 -0
  240. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/__init__.py +0 -0
  241. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/prompts.py +0 -0
  242. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/summarizer.py +0 -0
  243. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/compaction/types.py +0 -0
  244. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/debug/__init__.py +0 -0
  245. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/debug/usage_trace.py +0 -0
  246. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/logging/__init__.py +0 -0
  247. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/logging/handlers.py +0 -0
  248. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/logging/levels.py +0 -0
  249. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/logging/manager.py +0 -0
  250. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/logging/records.py +0 -0
  251. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/session/__init__.py +0 -0
  252. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/types/__init__.py +0 -0
  253. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/types/agent_state.py +0 -0
  254. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/types/state_structures.py +0 -0
  255. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/types/tool_registry.py +0 -0
  256. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/__init__.py +0 -0
  257. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/constants.py +0 -0
  258. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/file_filter.py +0 -0
  259. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/formatting.py +0 -0
  260. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/lsp_status.py +0 -0
  261. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/messaging.py +0 -0
  262. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/shared_types.py +0 -0
  263. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/core/ui_api/system_paths.py +0 -0
  264. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/exceptions.py +0 -0
  265. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/__init__.py +0 -0
  266. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/__init__.py +0 -0
  267. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/__init__.py +0 -0
  268. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/agents.py +0 -0
  269. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/skills.py +0 -0
  270. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/caches/tunacode_context.py +0 -0
  271. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/manager.py +0 -0
  272. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/metadata.py +0 -0
  273. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/infrastructure/cache/strategies.py +0 -0
  274. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/prompts/system_prompt.md +0 -0
  275. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/py.typed +0 -0
  276. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/__init__.py +0 -0
  277. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/discovery.py +0 -0
  278. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/loader.py +0 -0
  279. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/models.py +0 -0
  280. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/prompting.py +0 -0
  281. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/registry.py +0 -0
  282. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/search.py +0 -0
  283. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/skills/selection.py +0 -0
  284. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/__init__.py +0 -0
  285. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/bash.py +0 -0
  286. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/cache_accessors/__init__.py +0 -0
  287. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/cache_accessors/ignore_manager_cache.py +0 -0
  288. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/cache_accessors/ripgrep_cache.py +0 -0
  289. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/discover.py +0 -0
  290. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/hashline.py +0 -0
  291. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/ignore.py +0 -0
  292. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/line_cache.py +0 -0
  293. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/__init__.py +0 -0
  294. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/client.py +0 -0
  295. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/lsp/servers.py +0 -0
  296. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/__init__.py +0 -0
  297. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/discover_pipeline.py +0 -0
  298. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/discover_terms.py +0 -0
  299. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/discover_types.py +0 -0
  300. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/formatting.py +0 -0
  301. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/utils/ripgrep.py +0 -0
  302. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/tools/web_fetch.py +0 -0
  303. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/types/callbacks.py +0 -0
  304. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/types/canonical.py +0 -0
  305. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/__init__.py +0 -0
  306. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/assets/logo.ansi +0 -0
  307. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/clipboard.py +0 -0
  308. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/command_registry.py +0 -0
  309. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/__init__.py +0 -0
  310. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/base.py +0 -0
  311. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/cancel.py +0 -0
  312. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/clear.py +0 -0
  313. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/compact.py +0 -0
  314. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/exit.py +0 -0
  315. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/resume.py +0 -0
  316. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/skills.py +0 -0
  317. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/thoughts.py +0 -0
  318. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/commands/update.py +0 -0
  319. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/context_panel.py +0 -0
  320. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/esc/__init__.py +0 -0
  321. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/esc/handler.py +0 -0
  322. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/esc/types.py +0 -0
  323. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/logo_assets.py +0 -0
  324. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/model_display.py +0 -0
  325. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/__init__.py +0 -0
  326. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/agent_response.py +0 -0
  327. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/errors.py +0 -0
  328. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/panel_widths.py +0 -0
  329. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/panels.py +0 -0
  330. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/search.py +0 -0
  331. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/thinking.py +0 -0
  332. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/__init__.py +0 -0
  333. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/base.py +0 -0
  334. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/bash.py +0 -0
  335. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/diagnostics.py +0 -0
  336. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/discover.py +0 -0
  337. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/hashline_edit.py +0 -0
  338. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/read_file.py +0 -0
  339. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/syntax_utils.py +0 -0
  340. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/web_fetch.py +0 -0
  341. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/renderers/tools/write_file.py +0 -0
  342. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/repl_support.py +0 -0
  343. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/request_bridge.py +0 -0
  344. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/__init__.py +0 -0
  345. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/model_picker.py +0 -0
  346. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/session_picker.py +0 -0
  347. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/setup.py +0 -0
  348. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/theme_picker.py +0 -0
  349. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/screens/update_confirm.py +0 -0
  350. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/shell_runner.py +0 -0
  351. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/slopgotchi/__init__.py +0 -0
  352. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/slopgotchi/panel.py +0 -0
  353. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/streaming.py +0 -0
  354. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/layout.tcss +0 -0
  355. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/modals.tcss +0 -0
  356. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/panels.tcss +0 -0
  357. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/styles/widgets.tcss +0 -0
  358. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/styles.py +0 -0
  359. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/thinking_state.py +0 -0
  360. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/welcome.py +0 -0
  361. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/__init__.py +0 -0
  362. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/chat.py +0 -0
  363. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/command_autocomplete.py +0 -0
  364. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/editor.py +0 -0
  365. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/file_autocomplete.py +0 -0
  366. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/messages.py +0 -0
  367. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/resource_bar.py +0 -0
  368. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/ui/widgets/skills_autocomplete.py +0 -0
  369. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/utils/__init__.py +0 -0
  370. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/utils/messaging/__init__.py +0 -0
  371. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/utils/messaging/adapter.py +0 -0
  372. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/utils/messaging/token_counter.py +0 -0
  373. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/src/tunacode/utils/system/__init__.py +0 -0
  374. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/__init__.py +0 -0
  375. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/architecture/__init__.py +0 -0
  376. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/architecture/test_import_order.py +0 -0
  377. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/architecture/test_imports_in_init.py +0 -0
  378. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/architecture/test_init_bloat.py +0 -0
  379. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/architecture/test_layer_dependencies.py +0 -0
  380. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/integration/core/test_minimax_execution_path.py +0 -0
  381. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/integration/core/test_mtime_caches_end_to_end.py +0 -0
  382. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/integration/core/test_tinyagent_alchemy_usage_contract_live.py +0 -0
  383. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/system/cli/test_repl_support.py +0 -0
  384. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/test_dependency_layers.py +0 -0
  385. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/configuration/test_default_config_minimax_keys.py +0 -0
  386. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/configuration/test_default_config_stream_agent_text.py +0 -0
  387. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/configuration/test_models_registry_minimax_contract.py +0 -0
  388. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_cache_abort.py +0 -0
  389. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_helpers.py +0 -0
  390. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_init_debug.py +0 -0
  391. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_skills_prompt_injection.py +0 -0
  392. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_agent_stream_provider_debug.py +0 -0
  393. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_compaction_controller_outcomes.py +0 -0
  394. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_compaction_summarizer.py +0 -0
  395. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_context_overflow_detection.py +0 -0
  396. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_exceptions.py +0 -0
  397. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_logging.py +0 -0
  398. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_openrouter_usage_metrics.py +0 -0
  399. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_provider_error_surfacing.py +0 -0
  400. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_session_state_defaults.py +0 -0
  401. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_session_usage_schema.py +0 -0
  402. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_stream_phase_debug.py +0 -0
  403. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_thinking_stream_routing.py +0 -0
  404. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_tinyagent_openrouter_model_config.py +0 -0
  405. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_tool_concurrency_limit.py +0 -0
  406. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/core/test_usage_trace_debug.py +0 -0
  407. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/infrastructure/test_cache_infrastructure.py +0 -0
  408. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/infrastructure/test_typed_cache_accessors.py +0 -0
  409. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/skills/test_registry.py +0 -0
  410. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/skills/test_selection.py +0 -0
  411. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/test_sanitize_canonicalization.py +0 -0
  412. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/types/test_adapter.py +0 -0
  413. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/types/test_canonical.py +0 -0
  414. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/types/test_tool_registry.py +0 -0
  415. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/ui/test_app_loading_indicator.py +0 -0
  416. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/ui/test_request_threading.py +0 -0
  417. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/ui/test_thinking_state.py +0 -0
  418. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/utils/test_shell_command_escape.py +0 -0
  419. {tunacode_cli-0.1.100 → tunacode_cli-0.2.0}/tests/unit/utils/test_token_counter.py +0 -0
@@ -0,0 +1,101 @@
1
+ ---
2
+ title: "models-loading-unification execution log"
3
+ link: "models-loading-unification-execute"
4
+ type: debug_history
5
+ ontological_relations:
6
+ - relates_to: [[models-loading-unification-plan]]
7
+ tags: [execute, models-loading-unification]
8
+ uuid: "7128467b-456e-4511-ae33-ed0d0149f041"
9
+ created_at: "2026-03-26T16:20:32-05:00"
10
+ owner: "fabian"
11
+ plan_path: ".artifacts/plan/2026-03-26_15-34-01_models-loading-unification/PLAN.md"
12
+ start_commit: "3dc47ef3"
13
+ end_commit: "7773201e"
14
+ env: {target: "local", notes: "Gate remediation completed via user-directed make check; all hooks now pass."}
15
+ ---
16
+
17
+ ## Pre-Flight Checks
18
+ - Branch: qa
19
+ - Rollback commit: c9345dda
20
+ - DoR satisfied: yes
21
+ - Access/secrets: present
22
+ - Fixtures/data: ready
23
+
24
+ ## Task Execution
25
+
26
+ ### T001 – Add a single internal registry accessor for read paths
27
+ - Status: completed
28
+ - Commit: 0bccb8dd
29
+ - Files: (no additional file delta; validated rollback baseline implementation)
30
+ - Commands: `uv run pytest tests/unit/infrastructure/test_migrated_lru_cache_replacements.py::test_models_registry_cache_clears_via_clear_all -q` → pass
31
+ - Tests: pass
32
+ - Coverage delta: n/a
33
+ - Notes: Typed registry schema/cache signatures and cache-clear semantics were already present in baseline commit c9345dda.
34
+
35
+ ### T002 – Refactor registry-dependent metadata and pricing lookups to the unified loader
36
+ - Status: completed
37
+ - Commit: be89474e
38
+ - Files:
39
+ - src/tunacode/configuration/models.py
40
+ - src/tunacode/configuration/pricing.py
41
+ - tests/unit/configuration/test_models_registry_loading_behavior.py
42
+ - Commands: `uv run pytest tests/unit/configuration/test_models_registry_minimax_contract.py tests/unit/configuration/test_models_registry_loading_behavior.py -q` → pass
43
+ - Tests: pass
44
+ - Coverage delta: n/a
45
+ - Notes: Normal metadata/pricing reads now load via `_get_registry_for_read()` on cold cache while preserving explicit fallback behavior.
46
+
47
+ ### T003 – Remove redundant preload coupling from runtime call sites
48
+ - Status: completed
49
+ - Commit: 8176c005
50
+ - Files:
51
+ - src/tunacode/core/agents/agent_components/agent_config.py
52
+ - src/tunacode/core/compaction/controller.py
53
+ - src/tunacode/ui/commands/model.py
54
+ - Commands: `uv run pytest tests/unit/core/test_tinyagent_openrouter_model_config.py -q` → pass
55
+ - Tests: pass
56
+ - Coverage delta: n/a
57
+ - Notes: Removed explicit `load_models_registry()` correctness preloads from listed call sites and retained warmup in `get_or_create_agent()`.
58
+
59
+ ### T004 – Add targeted cold-cache regression coverage for session and pricing paths
60
+ - Status: completed
61
+ - Commit: 7773201e
62
+ - Files:
63
+ - tests/unit/core/test_session_state_model_registry_loading.py
64
+ - tests/unit/configuration/test_pricing_registry_loading.py
65
+ - Commands: `uv run pytest tests/unit/core/test_session_state_model_registry_loading.py tests/unit/configuration/test_pricing_registry_loading.py -q` → pass
66
+ - Tests: pass
67
+ - Coverage delta: n/a
68
+ - Notes: Added HOME-isolated StateManager cold-cache test and cold-cache pricing regression test with explicit cache clearing before/after.
69
+
70
+ ## Gate Results
71
+ - Tests: `uv run pytest` → pass (305 passed, 3 skipped)
72
+ - Coverage: not run (repository gate path is `make check`; no standalone coverage command in that gate)
73
+ - Type checks: `uv run mypy src/` (from earlier Gate C run) and `make check` pre-push mypy hook → pass
74
+ - Security: `make check` (`bandit`, security audit) → pass
75
+ - Linters: `make check` (`ruff`, `ruff format`, naming/length/defensive checks) → pass
76
+ - Freshness: `uv run python scripts/check_agents_freshness.py` → pass
77
+
78
+ ## Deployment (if applicable)
79
+ - Staging: n/a
80
+ - Prod: n/a
81
+ - Timestamps: n/a
82
+
83
+ ## Issues & Resolutions
84
+ - Initial Gate C command (`uv run black --check src/`) failed because `black` is not available in this repo environment.
85
+ - User directed fallback to repository canonical gate: `make check`.
86
+ - `make check` initially failed on:
87
+ - `tests/unit/configuration/test_ignore_patterns.py:17` E501 (line too long)
88
+ - `src/tunacode/constants.py` unused constant `MAX_FILES_IN_DIR`
89
+ - Resolved by:
90
+ - wrapping the long line in `tests/unit/configuration/test_ignore_patterns.py`
91
+ - removing `MAX_FILES_IN_DIR` from `src/tunacode/constants.py`
92
+ - rerunning `make check` to green
93
+
94
+ ## Success Criteria
95
+ - [x] All planned gates passed
96
+ - [x] Rollout completed or rolled back
97
+ - [ ] KPIs/SLOs within thresholds
98
+ - [x] Execution log saved
99
+
100
+ ## Next Steps
101
+ - Proceed to QA-from-execute using this execution log.
@@ -0,0 +1,57 @@
1
+ ---
2
+ title: "pr-444 review fixes execution log"
3
+ link: "pr-444-review-fixes-execute"
4
+ type: debug_history
5
+ ontological_relations:
6
+ - relates_to: [[pr-444-review-fixes-plan]]
7
+ tags: [execute, pr-444, review-fixes]
8
+ uuid: "ee9ac1f4-0a60-4f82-9f9e-303986d60222"
9
+ created_at: "2026-03-28T12:18:53-05:00"
10
+ owner: "fabian"
11
+ plan_path: ".artifacts/plan/2026-03-27_13-59-15_pr-444-review-fixes/PLAN.md"
12
+ start_commit: "bf6ee510"
13
+ env: {target: "local", notes: "Executing compatibility-only review fixes for PR #444 on branch qa."}
14
+ ---
15
+
16
+ ## Pre-Flight Checks
17
+ - Branch: qa
18
+ - Rollback commit: pending
19
+ - DoR satisfied: yes
20
+ - Access/secrets: present
21
+ - Fixtures/data: ready
22
+
23
+ ## Task Execution
24
+
25
+ ### T001 – Restore shared ignore-file fallback behavior
26
+ - Status: pending
27
+
28
+ ### T002 – Add ignore fault-tolerance regression tests
29
+ - Status: pending
30
+
31
+ ### T003 – Restore `tunacode.types` compatibility exports
32
+ - Status: pending
33
+
34
+ ### T004 – Add compatibility regression coverage and targeted validation
35
+ - Status: pending
36
+
37
+ ## Gate Results
38
+ - Tests: pending
39
+ - Coverage: not run
40
+ - Type checks: not run
41
+ - Security: not run
42
+ - Linters: not run
43
+ - Freshness: pending
44
+
45
+ ## Deployment (if applicable)
46
+ - Staging: n/a
47
+ - Prod: n/a
48
+ - Timestamps: n/a
49
+
50
+ ## Issues & Resolutions
51
+ - None yet.
52
+
53
+ ## Success Criteria
54
+ - [ ] All planned gates passed
55
+ - [ ] Rollout completed or rolled back
56
+ - [ ] KPIs/SLOs within thresholds
57
+ - [x] Execution log saved
@@ -0,0 +1,271 @@
1
+ ---
2
+ title: "models-loading-unification implementation plan"
3
+ link: "models-loading-unification-plan"
4
+ type: implementation_plan
5
+ ontological_relations:
6
+ - relates_to: [[models-loading-conflict-map-research]]
7
+ tags: [plan, models-loading-unification, coding]
8
+ uuid: "b6aa9eea-3a21-4a1f-a083-2c14e0c1ccdc"
9
+ created_at: "2026-03-26T20:34:05.921350+00:00"
10
+ parent_research: ".artifacts/research/2026-03-26_15-29-02_models-loading-conflict-map.md"
11
+ git_commit_at_plan: "3dc47ef3"
12
+ ---
13
+
14
+ ## Goal
15
+
16
+ Unify model-registry loading so all metadata lookups (env var, base URL, alchemy API, pricing, context window) behave consistently on cold cache without requiring call-site preloads.
17
+
18
+ Out of scope: deployment workflow changes, provider contract redesign, broad refactors outside model-registry access paths, or multi-provider feature additions.
19
+
20
+ ## Scope & Assumptions
21
+
22
+ - IN scope:
23
+ - Add a single internal loading mechanism for registry-backed reads.
24
+ - Define a typed schema for the bundled `models_registry.json` document and use it for registry loader/cache signatures.
25
+ - Refactor cache-only accessors to use the unified mechanism.
26
+ - Remove redundant explicit `load_models_registry()` preloads where no longer needed.
27
+ - Add focused regression tests for cold-cache behavior.
28
+ - OUT of scope:
29
+ - Changing bundled registry source generation logic in `scripts/update_models_registry.sh`.
30
+ - UI redesign or command UX changes.
31
+ - Performance benchmarking beyond existing unit-level assertions.
32
+ - Assumptions:
33
+ - `models_registry.json` remains bundled and valid JSON dict.
34
+ - Existing cache manager semantics (`clear_all`) remain authoritative.
35
+ - Normal metadata reads should lazy-load registry data on demand.
36
+ - `get_cached_models_registry()` remains cache-only and must not trigger a load.
37
+ - `DEFAULT_CONTEXT_WINDOW` remains the fallback only for invalid model strings/missing model metadata.
38
+
39
+ ## Deliverables
40
+
41
+ - Typed registry schema in the `types` layer for `models_registry.json`.
42
+ - Unified registry-read path in configuration modules.
43
+ - Updated runtime call sites aligned with unified loading semantics.
44
+ - Regression tests proving cold-cache consistency.
45
+ - Minimal developer-facing notes inline in code comments/docstrings where behavior changes.
46
+
47
+ ## Implementation Contract
48
+
49
+ - Registry shape must be typed:
50
+ - add a dedicated registry schema type for the bundled JSON document
51
+ - use typed registry return values for loader/cache/facade functions instead of `dict[str, Any]`
52
+ - do not add new ad-hoc `Any`-based wrappers around registry payloads
53
+ - Normal read paths must auto-load:
54
+ - `get_provider_env_var`
55
+ - `get_provider_base_url`
56
+ - `get_provider_alchemy_api`
57
+ - `get_model_context_window`
58
+ - `get_model_pricing`
59
+ - Cache inspection stays cache-only:
60
+ - `get_cached_models_registry()` must not load the registry.
61
+ - Preserve fallback behavior:
62
+ - unknown provider env var -> derive `PROVIDER_API_KEY` from provider id
63
+ - missing provider base URL -> `None`
64
+ - missing provider alchemy API -> `None`
65
+ - invalid model string or missing context limit -> `DEFAULT_CONTEXT_WINDOW`
66
+ - missing pricing data -> `None`
67
+ - Explicit preload cleanup decision:
68
+ - remove correctness preloads from `agent_config._resolve_base_url`
69
+ - remove correctness preloads from `CompactionController._resolve_base_url`
70
+ - remove correctness preloads from `CompactionController._resolve_api_key`
71
+ - remove correctness preloads from `ModelCommand._handle_direct_model_selection`
72
+ - keep `load_models_registry()` in `agent_config.get_or_create_agent()` for now; it remains an intentional init warmup/logging hook and is not part of this cleanup
73
+
74
+ ## Readiness
75
+
76
+ - Preconditions:
77
+ - Research artifact exists: `.artifacts/research/2026-03-26_15-29-02_models-loading-conflict-map.md`.
78
+ - Bundled registry file exists: `src/tunacode/configuration/models_registry.json`.
79
+ - Unit test suite runnable via `uv run pytest`.
80
+ - Must exist before start:
81
+ - Current cache API in `src/tunacode/infrastructure/cache/caches/models_registry.py`.
82
+ - Current accessors in `src/tunacode/configuration/models.py` and `src/tunacode/configuration/pricing.py`.
83
+
84
+ ## Milestones
85
+
86
+ - M1: Keep a single unified registry access helper for normal read paths, add typed registry schema, and preserve cache semantics.
87
+ - M2: Migrate metadata/pricing/context accessors to unified helper.
88
+ - M3: Align runtime call sites and remove redundant preload coupling.
89
+ - M4: Add regression tests for cold-cache correctness and integration touchpoints.
90
+
91
+ ## Ticket Index
92
+
93
+ <!-- TICKET_INDEX:START -->
94
+
95
+ | Task | Title | Ticket |
96
+ |---|---|---|
97
+ | T001 | Add a single internal registry accessor for read paths | [tickets/T001.md](tickets/T001.md) |
98
+ | T002 | Refactor registry-dependent metadata and pricing lookups to the unified loader | [tickets/T002.md](tickets/T002.md) |
99
+ | T003 | Remove redundant preload coupling from runtime call sites | [tickets/T003.md](tickets/T003.md) |
100
+ | T004 | Add targeted cold-cache regression coverage for session and pricing paths | [tickets/T004.md](tickets/T004.md) |
101
+
102
+ <!-- TICKET_INDEX:END -->
103
+
104
+ ## Work Breakdown (Tasks)
105
+
106
+ ### T001: Add a single internal registry accessor for read paths
107
+
108
+ **Summary**: Use the private helper in `models.py` as the only internal load-backed registry accessor for normal read operations, and formalize the registry JSON shape with typed schema definitions.
109
+
110
+ **Owner**: backend
111
+
112
+ **Estimate**: 1.5h
113
+
114
+ **Dependencies**: none
115
+
116
+ **Target milestone**: M1
117
+
118
+ **Acceptance test**: `uv run pytest tests/unit/infrastructure/test_migrated_lru_cache_replacements.py::test_models_registry_cache_clears_via_clear_all -q`
119
+
120
+ **Files/modules touched**:
121
+ - src/tunacode/configuration/models.py
122
+ - src/tunacode/infrastructure/cache/caches/models_registry.py
123
+ - src/tunacode/types/models_registry.py
124
+ - src/tunacode/types/__init__.py
125
+ - src/tunacode/types/dataclasses.py
126
+
127
+ **Steps**:
128
+ 1. Use the existing private helper `_get_registry_for_read()` in `models.py` as the single internal load-backed entry point for normal registry reads. Do not add a second helper.
129
+ 2. Add a dedicated typed schema for the bundled registry document in the `types` layer. The schema should represent the real JSON structure used by provider and model entries, including `models`, `env`, `api`, `alchemy_api`, `limit`, and `cost`.
130
+ 3. Update registry cache and loader signatures to return the typed registry document instead of `dict[str, Any]`.
131
+ 4. Remove the stale unused `ModelRegistry` alias that does not describe the real bundled JSON document.
132
+ 5. Keep `get_cached_models_registry()` behavior unchanged for explicit cache-only callers.
133
+ 6. Keep cache clearing semantics unchanged: `clear_all()` must still empty the models registry cache.
134
+
135
+ ### T002: Refactor registry-dependent metadata and pricing lookups to the unified loader
136
+
137
+ **Summary**: Migrate cache-dependent accessors so cold-cache reads return registry-backed values instead of fallback-only values when registry data exists.
138
+
139
+ **Owner**: backend
140
+
141
+ **Estimate**: 2h
142
+
143
+ **Dependencies**: T001
144
+
145
+ **Target milestone**: M2
146
+
147
+ **Acceptance test**: `uv run pytest tests/unit/configuration/test_models_registry_minimax_contract.py tests/unit/configuration/test_models_registry_loading_behavior.py -q`
148
+
149
+ **Files/modules touched**:
150
+ - src/tunacode/configuration/models.py
151
+ - src/tunacode/configuration/pricing.py
152
+ - src/tunacode/core/ui_api/configuration.py
153
+ - tests/unit/configuration/test_provider_api_key_env_fallback.py
154
+ - tests/unit/configuration/test_models_registry_minimax_contract.py
155
+ - tests/unit/configuration/test_models_registry_loading_behavior.py
156
+
157
+ **Steps**:
158
+ 1. Refactor `get_provider_env_var`, `get_provider_base_url`, `get_provider_alchemy_api`, and `get_model_context_window` to use `_get_registry_for_read()`.
159
+ 2. Refactor `get_model_pricing` in `pricing.py` to use the same load-backed contract. Do not add a second registry-loading implementation.
160
+ 3. Use the typed registry schema in these accessors instead of raw `dict[str, Any]` access where practical. Helper functions for looking up provider/model entries are acceptable if they keep the code smaller and clearer.
161
+ 4. Preserve fallback behavior exactly:
162
+ - unknown provider env var still derives from provider id
163
+ - missing base URL or alchemy API still returns `None`
164
+ - invalid model string or missing context limit still returns `DEFAULT_CONTEXT_WINDOW`
165
+ - missing pricing still returns `None`
166
+ 5. Create `tests/unit/configuration/test_models_registry_loading_behavior.py` and add explicit cold-cache assertions:
167
+ - `get_provider_env_var("minimax-coding-plan") == "MINIMAX_API_KEY"`
168
+ - `get_provider_alchemy_api("minimax-coding-plan") == "minimax-completions"`
169
+ - `get_model_context_window("minimax-coding-plan:MiniMax-M2.1") == 204800`
170
+ - `get_model_pricing("openrouter:openai/gpt-4.1")` returns `input=2`, `cached_input=0.5`, `output=8`
171
+ 6. Keep `tests/unit/configuration/test_models_registry_minimax_contract.py` as the normalized-contract test and use the new file for cold-cache behavior.
172
+
173
+ ### T003: Remove redundant preload coupling from runtime call sites
174
+
175
+ **Summary**: Simplify runtime paths by removing explicit preload calls that were previously required for correctness, while keeping behavior stable.
176
+
177
+ **Owner**: backend
178
+
179
+ **Estimate**: 1.5h
180
+
181
+ **Dependencies**: T002
182
+
183
+ **Target milestone**: M3
184
+
185
+ **Acceptance test**: `uv run pytest tests/unit/core/test_tinyagent_openrouter_model_config.py -q`
186
+
187
+ **Files/modules touched**:
188
+ - src/tunacode/core/agents/agent_components/agent_config.py
189
+ - src/tunacode/core/compaction/controller.py
190
+ - src/tunacode/ui/commands/model.py
191
+
192
+ **Steps**:
193
+ 1. Remove `load_models_registry()` from `agent_config._resolve_base_url()`.
194
+ 2. Remove `load_models_registry()` from `CompactionController._resolve_base_url()` and `CompactionController._resolve_api_key()`.
195
+ 3. Remove `load_models_registry()` from `ModelCommand._handle_direct_model_selection()`.
196
+ 4. Keep `load_models_registry()` in `agent_config.get_or_create_agent()` for now. It remains an intentional init warmup/logging hook and is not part of this cleanup.
197
+ 5. Do not add any new preload to `StateManager`; first-read correctness there must come from load-backed accessors, not caller preloading.
198
+ 6. Update any affected inline comments to describe the lazy-load contract.
199
+
200
+ ### T004: Add targeted cold-cache regression coverage for session and pricing paths
201
+
202
+ **Summary**: Add focused tests proving that first-read behavior is correct without manual preload in state initialization and pricing lookup.
203
+
204
+ **Owner**: backend
205
+
206
+ **Estimate**: 2h
207
+
208
+ **Dependencies**: T002,T003
209
+
210
+ **Target milestone**: M4
211
+
212
+ **Acceptance test**: `uv run pytest tests/unit/core/test_session_state_model_registry_loading.py tests/unit/configuration/test_pricing_registry_loading.py -q`
213
+
214
+ **Files/modules touched**:
215
+ - tests/unit/core/test_session_state_model_registry_loading.py
216
+ - tests/unit/configuration/test_pricing_registry_loading.py
217
+
218
+ **Steps**:
219
+ 1. Create `tests/unit/core/test_session_state_model_registry_loading.py`.
220
+ 2. In the session test, isolate user config by patching `HOME` to a temp directory before constructing `StateManager()`. `Path.home() / ".config"` is the config source used by `ApplicationSettings`, so patching `XDG_DATA_HOME` alone is not sufficient.
221
+ 3. In the session test, call `clear_all()` before construction and assert:
222
+ - `state_manager.session.current_model == "openrouter:openai/gpt-4.1"`
223
+ - `state_manager.session.conversation.max_tokens == 1047576`
224
+ 4. Create `tests/unit/configuration/test_pricing_registry_loading.py`.
225
+ 5. In the pricing test, call `clear_all()` and assert `get_model_pricing("openrouter:openai/gpt-4.1")` succeeds on cold cache with `input=2`, `cached_input=0.5`, `output=8`.
226
+ 6. Keep both tests isolated with explicit cache clearing before and after to avoid order-dependent behavior.
227
+ 7. Do not modify source files in this ticket unless a failing test proves an unresolved T002/T003 bug.
228
+
229
+ ## Risks & Mitigations
230
+
231
+ - Risk: eager loading in new paths could mask invalid registry file errors at different call timing.
232
+ - Mitigation: keep failure mode explicit via existing `TypeError`/JSON loading behavior and test first-read paths.
233
+ - Risk: typed schema drifts from the real bundled JSON shape.
234
+ - Mitigation: define the schema from the actual `models_registry.json` fields used in production code and keep it scoped to the fields TunaCode actually reads.
235
+ - Risk: hidden callers may rely on previous fallback strings/`None` values when cache is empty.
236
+ - Mitigation: constrain change to the accessors listed in the implementation contract and keep fallback behavior explicit in tests.
237
+ - Risk: cache lifecycle regressions after refactor.
238
+ - Mitigation: keep `clear_all` regression test as gate and avoid cache-manager API changes.
239
+ - Risk: junior implementer removes the wrong preload.
240
+ - Mitigation: T003 now names each preload call to remove and the one preload to keep.
241
+ - Risk: session-state test reads the real user config.
242
+ - Mitigation: T004 requires patching `HOME` to a temp directory before constructing `StateManager()`.
243
+
244
+ ## Test Strategy
245
+
246
+ - One primary validation per task (as listed in each ticket acceptance test).
247
+ - Add at most one new focused test file per subsystem touched (configuration, core/session).
248
+ - Prioritize cold-cache first-read behavior and deterministic results for known MiniMax/openrouter fixtures.
249
+ - Use exact assertion values for MiniMax env/alchemy/context and OpenRouter pricing/context so the tests do not depend on vague “truthy” checks.
250
+ - After touching `src/`, run `uv run python scripts/check_agents_freshness.py`.
251
+
252
+ ## References
253
+
254
+ - `.artifacts/research/2026-03-26_15-29-02_models-loading-conflict-map.md`
255
+ - `src/tunacode/configuration/models.py` (`load_models_registry`, `_get_registry_for_read`, provider/context accessors)
256
+ - `src/tunacode/configuration/pricing.py` (`get_model_pricing`)
257
+ - `src/tunacode/types/models_registry.py` (typed registry document schema)
258
+ - `src/tunacode/core/session/state.py` (`_load_user_configuration`, `load_session`)
259
+ - `src/tunacode/core/agents/agent_components/agent_config.py` (`_resolve_base_url`, `get_or_create_agent`)
260
+ - `src/tunacode/core/compaction/controller.py` (`_resolve_base_url`, `_resolve_api_key`)
261
+ - `src/tunacode/ui/commands/model.py` (`_handle_direct_model_selection`)
262
+ - `src/tunacode/configuration/settings.py` (`ApplicationSettings.paths.config_file`)
263
+
264
+ ## Final Gate
265
+
266
+ - **Output summary**: `.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/`, milestones=4, tickets=4
267
+ - **Required checks before handoff**:
268
+ - `uv run pytest tests/unit/infrastructure/test_migrated_lru_cache_replacements.py::test_models_registry_cache_clears_via_clear_all -q`
269
+ - task acceptance tests listed in each ticket
270
+ - `uv run python scripts/check_agents_freshness.py`
271
+ - **Next step**: proceed to execute-phase with `.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/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-26T20:35:15Z"
6
+ tags: [ticket, plan]
7
+ ---
8
+
9
+ # Ticket Index
10
+
11
+ | Task | Title | Ticket |
12
+ |---|---|---|
13
+ | T001 | Add a single internal registry accessor for read paths | [T001](./T001.md) |
14
+ | T002 | Refactor registry-dependent metadata and pricing lookups to the unified loader | [T002](./T002.md) |
15
+ | T003 | Remove redundant preload coupling from runtime call sites | [T003](./T003.md) |
16
+ | T004 | Add targeted cold-cache regression coverage for session and pricing paths | [T004](./T004.md) |
@@ -0,0 +1,37 @@
1
+ ---
2
+ title: "T001: Add a single internal registry accessor for read paths"
3
+ type: plan_ticket
4
+ task_id: "T001"
5
+ parent_plan: "../PLAN.md"
6
+ created_at: "2026-03-26T20:35:15Z"
7
+ tags: [ticket, plan]
8
+ ---
9
+
10
+ # T001: Add a single internal registry accessor for read paths
11
+
12
+ **Summary**: Use the private helper in `models.py` as the single internal load-backed registry accessor for normal read operations, and formalize the registry JSON shape with typed schema definitions.
13
+
14
+ **Owner**: backend
15
+
16
+ **Estimate**: 1.5h
17
+
18
+ **Dependencies**: none
19
+
20
+ **Target milestone**: M1
21
+
22
+ **Acceptance test**: `uv run pytest tests/unit/infrastructure/test_migrated_lru_cache_replacements.py::test_models_registry_cache_clears_via_clear_all -q`
23
+
24
+ **Files/modules touched**:
25
+ - src/tunacode/configuration/models.py
26
+ - src/tunacode/infrastructure/cache/caches/models_registry.py
27
+ - src/tunacode/types/models_registry.py
28
+ - src/tunacode/types/__init__.py
29
+ - src/tunacode/types/dataclasses.py
30
+
31
+ **Steps**:
32
+ 1. Use the existing private helper `_get_registry_for_read()` in `models.py` as the single internal load-backed entry point for normal registry reads. Do not add a second helper.
33
+ 2. Add a dedicated typed schema for the bundled registry document in the `types` layer. The schema should represent the real JSON structure used by provider and model entries, including `models`, `env`, `api`, `alchemy_api`, `limit`, and `cost`.
34
+ 3. Update registry cache and loader signatures to return the typed registry document instead of `dict[str, Any]`.
35
+ 4. Remove the stale unused `ModelRegistry` alias that does not describe the real bundled JSON document.
36
+ 5. Keep `get_cached_models_registry()` behavior unchanged for explicit cache-only callers.
37
+ 6. Keep cache clearing semantics unchanged: `clear_all()` must still empty the models registry cache.
@@ -0,0 +1,46 @@
1
+ ---
2
+ title: "T002: Refactor registry-dependent metadata and pricing lookups to the unified loader"
3
+ type: plan_ticket
4
+ task_id: "T002"
5
+ parent_plan: "../PLAN.md"
6
+ created_at: "2026-03-26T20:35:15Z"
7
+ tags: [ticket, plan]
8
+ ---
9
+
10
+ # T002: Refactor registry-dependent metadata and pricing lookups to the unified loader
11
+
12
+ **Summary**: Migrate cache-dependent accessors so cold-cache reads return registry-backed values instead of fallback-only values when registry data exists.
13
+
14
+ **Owner**: backend
15
+
16
+ **Estimate**: 2h
17
+
18
+ **Dependencies**: T001
19
+
20
+ **Target milestone**: M2
21
+
22
+ **Acceptance test**: `uv run pytest tests/unit/configuration/test_models_registry_minimax_contract.py tests/unit/configuration/test_models_registry_loading_behavior.py -q`
23
+
24
+ **Files/modules touched**:
25
+ - src/tunacode/configuration/models.py
26
+ - src/tunacode/configuration/pricing.py
27
+ - src/tunacode/core/ui_api/configuration.py
28
+ - tests/unit/configuration/test_provider_api_key_env_fallback.py
29
+ - tests/unit/configuration/test_models_registry_minimax_contract.py
30
+ - tests/unit/configuration/test_models_registry_loading_behavior.py
31
+
32
+ **Steps**:
33
+ 1. Refactor `get_provider_env_var`, `get_provider_base_url`, `get_provider_alchemy_api`, and `get_model_context_window` to use `_get_registry_for_read()`.
34
+ 2. Refactor `get_model_pricing` in `pricing.py` to use the same load-backed contract. Do not add a second registry-loading implementation.
35
+ 3. Use the typed registry schema in these accessors instead of raw `dict[str, Any]` access where practical. Helper functions for looking up provider/model entries are acceptable if they keep the code smaller and clearer.
36
+ 4. Preserve fallback behavior exactly:
37
+ - unknown provider env var still derives from provider id
38
+ - missing base URL or alchemy API still returns `None`
39
+ - invalid model string or missing context limit still returns `DEFAULT_CONTEXT_WINDOW`
40
+ - missing pricing still returns `None`
41
+ 5. Create `tests/unit/configuration/test_models_registry_loading_behavior.py` and add explicit cold-cache assertions:
42
+ - `get_provider_env_var("minimax-coding-plan") == "MINIMAX_API_KEY"`
43
+ - `get_provider_alchemy_api("minimax-coding-plan") == "minimax-completions"`
44
+ - `get_model_context_window("minimax-coding-plan:MiniMax-M2.1") == 204800`
45
+ - `get_model_pricing("openrouter:openai/gpt-4.1")` returns `input=2`, `cached_input=0.5`, `output=8`
46
+ 6. Keep `tests/unit/configuration/test_models_registry_minimax_contract.py` as the normalized-contract test and use the new file for cold-cache behavior.
@@ -0,0 +1,35 @@
1
+ ---
2
+ title: "T003: Remove redundant preload coupling from runtime call sites"
3
+ type: plan_ticket
4
+ task_id: "T003"
5
+ parent_plan: "../PLAN.md"
6
+ created_at: "2026-03-26T20:35:15Z"
7
+ tags: [ticket, plan]
8
+ ---
9
+
10
+ # T003: Remove redundant preload coupling from runtime call sites
11
+
12
+ **Summary**: Simplify runtime paths by removing explicit preload calls that were previously required for correctness, while keeping behavior stable.
13
+
14
+ **Owner**: backend
15
+
16
+ **Estimate**: 1.5h
17
+
18
+ **Dependencies**: T002
19
+
20
+ **Target milestone**: M3
21
+
22
+ **Acceptance test**: `uv run pytest tests/unit/core/test_tinyagent_openrouter_model_config.py -q`
23
+
24
+ **Files/modules touched**:
25
+ - src/tunacode/core/agents/agent_components/agent_config.py
26
+ - src/tunacode/core/compaction/controller.py
27
+ - src/tunacode/ui/commands/model.py
28
+
29
+ **Steps**:
30
+ 1. Remove `load_models_registry()` from `agent_config._resolve_base_url()`.
31
+ 2. Remove `load_models_registry()` from `CompactionController._resolve_base_url()` and `CompactionController._resolve_api_key()`.
32
+ 3. Remove `load_models_registry()` from `ModelCommand._handle_direct_model_selection()`.
33
+ 4. Keep `load_models_registry()` in `agent_config.get_or_create_agent()` for now. It remains an intentional init warmup/logging hook and is not part of this cleanup.
34
+ 5. Do not add any new preload to `StateManager`; first-read correctness there must come from load-backed accessors, not caller preloading.
35
+ 6. Update any affected inline comments to describe the lazy-load contract.
@@ -0,0 +1,70 @@
1
+ ---
2
+ title: "T004: Add targeted cold-cache regression coverage for session and pricing paths"
3
+ type: plan_ticket
4
+ task_id: "T004"
5
+ parent_plan: "../PLAN.md"
6
+ created_at: "2026-03-26T20:35:15Z"
7
+ tags: [ticket, plan]
8
+ ---
9
+
10
+ # T004: Add targeted cold-cache regression coverage for session and pricing paths
11
+
12
+ **Summary**: Add focused tests proving that first-read behavior is correct without manual preload in state initialization and pricing lookup.
13
+
14
+ **Owner**: backend
15
+
16
+ **Estimate**: 2h
17
+
18
+ **Dependencies**: T002,T003
19
+
20
+ **Target milestone**: M4
21
+
22
+ **Acceptance test**: `uv run pytest tests/unit/core/test_session_state_model_registry_loading.py tests/unit/configuration/test_pricing_registry_loading.py -q`
23
+
24
+ **Files/modules touched**:
25
+ - tests/unit/core/test_session_state_model_registry_loading.py
26
+ - tests/unit/configuration/test_pricing_registry_loading.py
27
+
28
+ **Steps**:
29
+ 1. Create `tests/unit/core/test_session_state_model_registry_loading.py`.
30
+ 2. In the session test, isolate user config by patching `HOME` to a temp directory before constructing `StateManager()`. `Path.home() / ".config"` is the config source used by `ApplicationSettings`, so patching `XDG_DATA_HOME` alone is not sufficient.
31
+ 3. In the session test, call `clear_all()` before construction and assert:
32
+ - `state_manager.session.current_model == "openrouter:openai/gpt-4.1"`
33
+ - `state_manager.session.conversation.max_tokens == 1047576`
34
+ 4. Create `tests/unit/configuration/test_pricing_registry_loading.py`.
35
+ 5. In the pricing test, call `clear_all()` and assert `get_model_pricing("openrouter:openai/gpt-4.1")` succeeds on cold cache with `input=2`, `cached_input=0.5`, `output=8`.
36
+ 6. Keep both tests isolated with explicit cache clearing before and after to avoid order-dependent behavior.
37
+ 7. Do not modify source files in this ticket unless a failing test proves an unresolved T002/T003 bug.
38
+
39
+ ## Risks & Mitigations
40
+
41
+ - Risk: eager loading in new paths could mask invalid registry file errors at different call timing.
42
+ - Mitigation: keep failure mode explicit via existing `TypeError`/JSON loading behavior and test first-read paths.
43
+ - Risk: hidden callers may rely on previous fallback strings/`None` values when cache is empty.
44
+ - Mitigation: constrain change to the accessors listed in the plan contract and keep fallback behavior explicit in tests.
45
+ - Risk: cache lifecycle regressions after refactor.
46
+ - Mitigation: keep `clear_all` regression test as gate and avoid cache-manager API changes.
47
+ - Risk: session-state test reads the real user config.
48
+ - Mitigation: patch `HOME` to a temp directory before constructing `StateManager()`.
49
+
50
+ ## Test Strategy
51
+
52
+ - One primary validation per task (as listed in each ticket acceptance test).
53
+ - Add at most one new focused test file per subsystem touched (configuration, core/session).
54
+ - Prioritize cold-cache first-read behavior and deterministic results for known MiniMax/openrouter fixtures.
55
+ - Use exact assertion values rather than truthy/non-`None` checks.
56
+
57
+ ## References
58
+
59
+ - `.artifacts/research/2026-03-26_15-29-02_models-loading-conflict-map.md`
60
+ - `src/tunacode/configuration/models.py`
61
+ - `src/tunacode/configuration/pricing.py`
62
+ - `src/tunacode/core/session/state.py`
63
+ - `src/tunacode/core/agents/agent_components/agent_config.py`
64
+ - `src/tunacode/core/compaction/controller.py`
65
+ - `src/tunacode/configuration/settings.py`
66
+
67
+ ## Final Gate
68
+
69
+ - **Output summary**: `.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/`, milestones=4, tickets=4
70
+ - **Next step**: proceed to execute-phase with `.artifacts/plan/2026-03-26_15-34-01_models-loading-unification/PLAN.md`