ite-agent 0.2.2__tar.gz → 0.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. {ite_agent-0.2.2 → ite_agent-0.2.4}/AGENTS.md +1 -1
  2. {ite_agent-0.2.2 → ite_agent-0.2.4}/PKG-INFO +1 -1
  3. ite_agent-0.2.4/_smoke_render.py +48 -0
  4. {ite_agent-0.2.2 → ite_agent-0.2.4}/pyproject.toml +1 -1
  5. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/__init__.py +1 -1
  6. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/client/llm_client.py +37 -0
  7. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/config/config.py +1 -0
  8. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/config/loader.py +5 -0
  9. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/_cloud.py +8 -0
  10. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/_composer.py +49 -3
  11. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/app.py +1 -0
  12. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/composer_views.py +16 -0
  13. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/modals.py +82 -1
  14. ite_agent-0.2.4/src/ite/ui/reup/model_labels.py +47 -0
  15. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/reup.tcss +38 -2
  16. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_dropped_attachments.py +8 -1
  17. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_reup_command_palette.py +40 -2
  18. ite_agent-0.2.2/src/ite/ui/reup/model_labels.py +0 -20
  19. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/SKILL.md +0 -0
  20. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/references/document-recipes.md +0 -0
  21. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/references/ooxml-notes.md +0 -0
  22. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/scripts/__init__.py +0 -0
  23. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/scripts/_docx_core.py +0 -0
  24. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/scripts/extract_docx.py +0 -0
  25. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/scripts/inspect_docx.py +0 -0
  26. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/scripts/pack_docx.py +0 -0
  27. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/scripts/render_docx.py +0 -0
  28. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/scripts/replace_text.py +0 -0
  29. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/scripts/unpack_docx.py +0 -0
  30. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/scripts/validate_docx.py +0 -0
  31. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/scripts/write_docx.py +0 -0
  32. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/templates/letter.md +0 -0
  33. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/docx/templates/memo.md +0 -0
  34. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/frontend-design/SKILL.md +0 -0
  35. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/frontend-design/agents/openai.yaml +0 -0
  36. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/frontend-design/references/color-and-contrast.md +0 -0
  37. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/frontend-design/references/interaction-design.md +0 -0
  38. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/frontend-design/references/motion-design.md +0 -0
  39. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/frontend-design/references/responsive-design.md +0 -0
  40. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/frontend-design/references/spatial-design.md +0 -0
  41. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/frontend-design/references/typography.md +0 -0
  42. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/frontend-design/references/ux-writing.md +0 -0
  43. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/notebooklm/SKILL.md +0 -0
  44. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/notebooklm/scripts/backfill_fulltext.py +0 -0
  45. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/notebooklm/scripts/imanneo-videos.json +0 -0
  46. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/notebooklm/scripts/import_sources.py +0 -0
  47. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/notebooklm/scripts/load_channel.py +0 -0
  48. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/notebooklm/scripts/resolve_citations.py +0 -0
  49. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/pdf/LICENSE.txt +0 -0
  50. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/pdf/SKILL.md +0 -0
  51. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/pdf/references/layout-review.md +0 -0
  52. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/pdf/scripts/__init__.py +0 -0
  53. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/pdf/scripts/_pdf_core.py +0 -0
  54. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/pdf/scripts/extract_pdf_text.py +0 -0
  55. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/pdf/scripts/inspect_pdf.py +0 -0
  56. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/pdf/scripts/render_pdf.py +0 -0
  57. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/pdf/scripts/validate_pdf.py +0 -0
  58. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/pdf/scripts/write_pdf.py +0 -0
  59. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/pdf/templates/report.txt +0 -0
  60. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/repo-audit/SKILL.md +0 -0
  61. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/repo-audit/agents/openai.yaml +0 -0
  62. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/repo-audit/references/common_bug_patterns.md +0 -0
  63. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/repo-audit/references/security_patterns.md +0 -0
  64. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/repo-audit/references/test_guidelines.md +0 -0
  65. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/repo-audit/scripts/audit_test_coverage.py +0 -0
  66. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/repo-audit/scripts/find_common_bugs.py +0 -0
  67. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/skill-creator/LICENSE.txt +0 -0
  68. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/skill-creator/SKILL.md +0 -0
  69. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/skill-creator/agents/openai.yaml +0 -0
  70. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/skill-creator/references/openai_yaml.md +0 -0
  71. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/skill-creator/scripts/generate_openai_yaml.py +0 -0
  72. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/skill-creator/scripts/init_skill.py +0 -0
  73. {ite_agent-0.2.2 → ite_agent-0.2.4}/.agents/skills/skill-creator/scripts/quick_validate.py +0 -0
  74. {ite_agent-0.2.2 → ite_agent-0.2.4}/.github/workflows/build-runtime.yml +0 -0
  75. {ite_agent-0.2.2 → ite_agent-0.2.4}/.gitignore +0 -0
  76. {ite_agent-0.2.2 → ite_agent-0.2.4}/DESIGN.md +0 -0
  77. {ite_agent-0.2.2 → ite_agent-0.2.4}/README.md +0 -0
  78. {ite_agent-0.2.2 → ite_agent-0.2.4}/_eval_optimizer.py +0 -0
  79. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/README.md +0 -0
  80. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/agents.md +0 -0
  81. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/commands.md +0 -0
  82. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/configuration.md +0 -0
  83. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/AGENTS_MD_TIER_SYSTEM.md +0 -0
  84. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/DRAFT-remote-mobile-docs.md +0 -0
  85. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/FRICTIONLESS_INSTALL_FIRST_RUN_PRD.md +0 -0
  86. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/SPEC-BRIEF.md +0 -0
  87. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/bachs-payments-agent-handoff.md +0 -0
  88. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/chat-feed-scroll-perf.md +0 -0
  89. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/flutter-dart-runtime-rewrite-plan.md +0 -0
  90. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/flutter-tui-ui-parity-plan.md +0 -0
  91. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/ite-admin-flutter-plan.md +0 -0
  92. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/ite-pro-pricing-launch-plan.md +0 -0
  93. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/ite-remote-runtime-connection.md +0 -0
  94. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/mobile-remote-implementation-log.md +0 -0
  95. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/mobile-remote-redesign.md +0 -0
  96. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/openrouter-bundled-phase1-hosted-e2e.md +0 -0
  97. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/openrouter-bundled-usage-phase1.md +0 -0
  98. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/design/openrouter-pkce-oauth-prd.md +0 -0
  99. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/index.md +0 -0
  100. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/initialization.md +0 -0
  101. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/installation.md +0 -0
  102. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/mcp.md +0 -0
  103. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/openrouter-oauth.md +0 -0
  104. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/openrouter.md +0 -0
  105. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/skills.md +0 -0
  106. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/subagents.md +0 -0
  107. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/tools.md +0 -0
  108. {ite_agent-0.2.2 → ite_agent-0.2.4}/docs/usage.md +0 -0
  109. {ite_agent-0.2.2 → ite_agent-0.2.4}/hooks/hook-fastmcp.py +0 -0
  110. {ite_agent-0.2.2 → ite_agent-0.2.4}/iTE_Overview.md +0 -0
  111. {ite_agent-0.2.2 → ite_agent-0.2.4}/install.ps1 +0 -0
  112. {ite_agent-0.2.2 → ite_agent-0.2.4}/install.sh +0 -0
  113. {ite_agent-0.2.2 → ite_agent-0.2.4}/scripts/build_runtime.py +0 -0
  114. {ite_agent-0.2.2 → ite_agent-0.2.4}/scripts/decon/check_handlers.py +0 -0
  115. {ite_agent-0.2.2 → ite_agent-0.2.4}/scripts/decon/gen_exports.py +0 -0
  116. {ite_agent-0.2.2 → ite_agent-0.2.4}/scripts/decon/parse_handlers.py +0 -0
  117. {ite_agent-0.2.2 → ite_agent-0.2.4}/scripts/github-release.sh +0 -0
  118. {ite_agent-0.2.2 → ite_agent-0.2.4}/scripts/guard_mixin_imports.py +0 -0
  119. {ite_agent-0.2.2 → ite_agent-0.2.4}/scripts/hook_logger.py +0 -0
  120. {ite_agent-0.2.2 → ite_agent-0.2.4}/scripts/interactive_prompt_demo.py +0 -0
  121. {ite_agent-0.2.2 → ite_agent-0.2.4}/scripts/pitfall_scan.py +0 -0
  122. {ite_agent-0.2.2 → ite_agent-0.2.4}/scripts/publish-release.sh +0 -0
  123. {ite_agent-0.2.2 → ite_agent-0.2.4}/scripts/scan_cross_mixin_attrs.py +0 -0
  124. {ite_agent-0.2.2 → ite_agent-0.2.4}/scripts/scan_orphan_attributes.py +0 -0
  125. {ite_agent-0.2.2 → ite_agent-0.2.4}/scripts/scan_tool_views_imports.py +0 -0
  126. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/agent/__init__.py +0 -0
  127. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/agent/agent.py +0 -0
  128. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/agent/change_history.py +0 -0
  129. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/agent/events.py +0 -0
  130. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/agent/session.py +0 -0
  131. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/agent/session_manager.py +0 -0
  132. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/agent/session_naming.py +0 -0
  133. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/agent/subagent_runtime.py +0 -0
  134. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/attachment_refs.py +0 -0
  135. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/attachments.py +0 -0
  136. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/auth/__init__.py +0 -0
  137. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/auth/openrouter_pkce.py +0 -0
  138. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/client/__init__.py +0 -0
  139. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/client/response.py +0 -0
  140. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/cloud/__init__.py +0 -0
  141. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/cloud/auth.py +0 -0
  142. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/cloud/services.py +0 -0
  143. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/__init__.py +0 -0
  144. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/aside.py +0 -0
  145. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/attach.py +0 -0
  146. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/branch.py +0 -0
  147. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/cloud.py +0 -0
  148. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/csv2json.py +0 -0
  149. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/flow.py +0 -0
  150. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/general.py +0 -0
  151. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/history.py +0 -0
  152. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/hooks.py +0 -0
  153. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/info.py +0 -0
  154. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/init.py +0 -0
  155. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/model.py +0 -0
  156. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/plan.py +0 -0
  157. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/publish.py +0 -0
  158. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/remind.py +0 -0
  159. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/remote.py +0 -0
  160. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/sandbox.py +0 -0
  161. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/session.py +0 -0
  162. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/skills.py +0 -0
  163. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/subagent.py +0 -0
  164. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/commands/todos.py +0 -0
  165. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/config/__init__.py +0 -0
  166. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/config/setup.py +0 -0
  167. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/context/__init__.py +0 -0
  168. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/context/compact_artifacts.py +0 -0
  169. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/context/compaction.py +0 -0
  170. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/context/loop_detector.py +0 -0
  171. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/context/manager.py +0 -0
  172. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/context/transcript.py +0 -0
  173. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/git/__init__.py +0 -0
  174. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/git/branches.py +0 -0
  175. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/git/remotes.py +0 -0
  176. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/git/working_tree.py +0 -0
  177. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/hooks/__init__.py +0 -0
  178. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/hooks/hook_system.py +0 -0
  179. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/main.py +0 -0
  180. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/memory/__init__.py +0 -0
  181. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/memory/intent.py +0 -0
  182. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/memory/manager.py +0 -0
  183. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/memory/response_intent.py +0 -0
  184. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/memory/session_memory.py +0 -0
  185. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/model_metadata.py +0 -0
  186. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/prompts/__init__.py +0 -0
  187. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/prompts/system.py +0 -0
  188. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/remote/__init__.py +0 -0
  189. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/remote/protocol.py +0 -0
  190. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/remote/security.py +0 -0
  191. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/remote/server.py +0 -0
  192. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/remote/uri.py +0 -0
  193. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/safety/__init__.py +0 -0
  194. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/safety/approval.py +0 -0
  195. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/safety/git_sandbox.py +0 -0
  196. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/safety/sandbox.py +0 -0
  197. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/skills/__init__.py +0 -0
  198. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/skills/installer.py +0 -0
  199. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/skills/manager.py +0 -0
  200. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/skills/rendering.py +0 -0
  201. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/skills/trust.py +0 -0
  202. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/telegram/__init__.py +0 -0
  203. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/telegram/_approval.py +0 -0
  204. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/telegram/_render.py +0 -0
  205. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/telegram/bot.py +0 -0
  206. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/__init__.py +0 -0
  207. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/base.py +0 -0
  208. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/__init__.py +0 -0
  209. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/apply_patch.py +0 -0
  210. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/archive_tools.py +0 -0
  211. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/config_tools.py +0 -0
  212. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/edit_file.py +0 -0
  213. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/git_tools.py +0 -0
  214. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/glob.py +0 -0
  215. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/grep.py +0 -0
  216. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/http_tools.py +0 -0
  217. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/json_tools.py +0 -0
  218. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/list_dir.py +0 -0
  219. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/media_tools.py +0 -0
  220. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/memory.py +0 -0
  221. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/plan_question.py +0 -0
  222. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/read_file.py +0 -0
  223. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/shell.py +0 -0
  224. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/skills.py +0 -0
  225. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/subagent_runtime_tools.py +0 -0
  226. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/todo.py +0 -0
  227. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/verification_tools.py +0 -0
  228. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/web_fetch.py +0 -0
  229. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/web_search.py +0 -0
  230. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/builtin/write_file.py +0 -0
  231. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/discovery.py +0 -0
  232. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/mcp/__init__.py +0 -0
  233. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/mcp/client.py +0 -0
  234. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/mcp/client_credentials.py +0 -0
  235. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/mcp/mcp_manager.py +0 -0
  236. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/mcp/mcp_tool.py +0 -0
  237. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/mcp/oauth.py +0 -0
  238. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/optimizer.py +0 -0
  239. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/policy.py +0 -0
  240. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/registry.py +0 -0
  241. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/subagent.py +0 -0
  242. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/tools/subagent_loader.py +0 -0
  243. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/__init__.py +0 -0
  244. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/assets/ite_image.png +0 -0
  245. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/__init__.py +0 -0
  246. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/_helpers.py +0 -0
  247. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/_panels.py +0 -0
  248. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/_streaming.py +0 -0
  249. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/_threads.py +0 -0
  250. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/_turn.py +0 -0
  251. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/adapters/__init__.py +0 -0
  252. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/adapters/registry.py +0 -0
  253. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/adapters/tui_adapter.py +0 -0
  254. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/change_tree.py +0 -0
  255. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/change_views.py +0 -0
  256. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/command_views.py +0 -0
  257. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/legacy/app.py.backup +0 -0
  258. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/legacy/app.py.original +0 -0
  259. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/legacy/app.py.patch +0 -0
  260. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/legacy/app_prestrip.py +0 -0
  261. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/legacy/app_refactored.py +0 -0
  262. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/markdown_widget.py +0 -0
  263. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/settings.py +0 -0
  264. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/tool_views.py +0 -0
  265. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/widgets/__init__.py +0 -0
  266. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/widgets/message_row.py +0 -0
  267. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/widgets/prompt_area.py +0 -0
  268. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/widgets/remote_bridge.py +0 -0
  269. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/widgets/side_panels.py +0 -0
  270. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/widgets/state.py +0 -0
  271. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/widgets/system_commands.py +0 -0
  272. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/widgets/thread_switcher.py +0 -0
  273. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/reup/widgets/tool_cards.py +0 -0
  274. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/ui/tool_narrative.py +0 -0
  275. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/update_check.py +0 -0
  276. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/utils/__init__.py +0 -0
  277. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/utils/errors.py +0 -0
  278. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/utils/paths.py +0 -0
  279. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/utils/text.py +0 -0
  280. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/voice/__init__.py +0 -0
  281. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/voice/cleanup.py +0 -0
  282. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/voice/config.py +0 -0
  283. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/voice/pipeline.py +0 -0
  284. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/voice/recorder.py +0 -0
  285. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/voice/transcription.py +0 -0
  286. {ite_agent-0.2.2 → ite_agent-0.2.4}/src/ite/voice/types.py +0 -0
  287. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_agent_continuation.py +0 -0
  288. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_agent_tool_recovery.py +0 -0
  289. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_agents_workspace_recommendation.py +0 -0
  290. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_aside_command.py +0 -0
  291. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_attachment_refs.py +0 -0
  292. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_attachments.py +0 -0
  293. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_build_runtime.py +0 -0
  294. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_bundled_docx_skill.py +0 -0
  295. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_bundled_pdf_skill.py +0 -0
  296. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_bundled_skill_creator.py +0 -0
  297. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_change_history.py +0 -0
  298. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_cli_modes.py +0 -0
  299. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_clipboard.py +0 -0
  300. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_cloud_auth.py +0 -0
  301. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_cloud_services.py +0 -0
  302. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_compaction.py +0 -0
  303. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_config_setup_requirements.py +0 -0
  304. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_config_tools.py +0 -0
  305. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_copy_detailed.py +0 -0
  306. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_execution_todo_progress.py +0 -0
  307. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_git_tools.py +0 -0
  308. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_hooks.py +0 -0
  309. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_http_archive_tools.py +0 -0
  310. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_info_commands.py +0 -0
  311. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_json_tools.py +0 -0
  312. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_llm_client.py +0 -0
  313. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_loop_detector.py +0 -0
  314. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_mcp.py +0 -0
  315. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_media_tools.py +0 -0
  316. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_memory_behavior.py +0 -0
  317. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_memory_eval_matrix.py +0 -0
  318. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_memory_lifecycle.py +0 -0
  319. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_memory_manager.py +0 -0
  320. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_openrouter_oauth_secret.py +0 -0
  321. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_openrouter_pkce.py +0 -0
  322. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_provider_error_formatting.py +0 -0
  323. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_publish_command.py +0 -0
  324. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_release_bump_skill.py +0 -0
  325. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_remote_protocol.py +0 -0
  326. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_remote_server.py +0 -0
  327. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_reup_change_review.py +0 -0
  328. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_reup_modals.py +0 -0
  329. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_reup_prompt_text_area.py +0 -0
  330. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_reup_startup.py +0 -0
  331. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_reup_theme_guards.py +0 -0
  332. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_reup_tool_views.py +0 -0
  333. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_saved_custom_provider.py +0 -0
  334. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_session_commands.py +0 -0
  335. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_session_manager.py +0 -0
  336. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_session_naming.py +0 -0
  337. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_setup_modal.py +0 -0
  338. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_shell_heartbeat.py +0 -0
  339. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_shell_web_capabilities.py +0 -0
  340. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_skills.py +0 -0
  341. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_subagent_runtime.py +0 -0
  342. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_system_prompt.py +0 -0
  343. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_text_utils.py +0 -0
  344. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_textual_app.py +0 -0
  345. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_todos_scoped.py +0 -0
  346. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_tool_narrative.py +0 -0
  347. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_tool_param_normalization.py +0 -0
  348. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_tool_schema.py +0 -0
  349. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_tooling_v01.py +0 -0
  350. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_update_check.py +0 -0
  351. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_verification_tools.py +0 -0
  352. {ite_agent-0.2.2 → ite_agent-0.2.4}/tests/test_voice.py +0 -0
  353. {ite_agent-0.2.2 → ite_agent-0.2.4}/uv.lock +0 -0
@@ -4,7 +4,7 @@
4
4
 
5
5
  **iTE** — AI coding agent for the terminal. Users connect a model service, authenticate where needed, and work through the Reup Textual runtime.
6
6
 
7
- - **Package:** `ite-agent` (version 0.2.2)
7
+ - **Package:** `ite-agent` (version 0.2.4)
8
8
  - **Install:** `pipx install ite-agent` or `uv tool install ite-agent`
9
9
  - **Local editable install:** `uv pip install -e .` from the repo root, or `source .venv/bin/activate && python -m pip install -e .`
10
10
  - **Python:** ≥3.11
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ite-agent
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: Your AI coding agent for your terminal
5
5
  Author: Kiishi David
6
6
  License-Expression: MIT
@@ -0,0 +1,48 @@
1
+ import asyncio
2
+
3
+ from textual.app import App
4
+
5
+ from ite.ui.reup.modals import ApprovalPickerModal, ThinkingLevelModal
6
+
7
+
8
+ class TApp(App[None]):
9
+ CSS_PATH = "src/ite/ui/reup/reup.tcss"
10
+
11
+ def on_mount(self) -> None:
12
+ self.push_screen(ThinkingLevelModal("low", model_label="DeepSeek V4 Pro"))
13
+
14
+
15
+ class ApprovalApp(App[None]):
16
+ CSS_PATH = "src/ite/ui/reup/reup.tcss"
17
+
18
+ def on_mount(self) -> None:
19
+ self.push_screen(ApprovalPickerModal("auto"))
20
+
21
+
22
+ async def dump(app, name):
23
+ screen = app.screen
24
+ print(f"=== {name} ===")
25
+ btn = screen.query_one("#select")
26
+ s = btn.styles
27
+ print(" region:", btn.region)
28
+ print(" height:", s.height, "min_height:", s.min_height)
29
+ print(" border_top:", s.border_top, "border_bottom:", s.border_bottom)
30
+ actions = screen.query_one(".modal-actions")
31
+ print(" actions region:", actions.region, "height:", actions.styles.height)
32
+ modal = screen.query_one(".modal")
33
+ print(" modal region:", modal.region, "height:", modal.styles.height)
34
+
35
+
36
+ async def main() -> None:
37
+ app = TApp()
38
+ async with app.run_test(size=(100, 30)) as pilot:
39
+ await pilot.pause()
40
+ await dump(app, "ThinkingLevelModal")
41
+
42
+ app2 = ApprovalApp()
43
+ async with app2.run_test(size=(100, 30)) as pilot:
44
+ await pilot.pause()
45
+ await dump(app2, "ApprovalPickerModal")
46
+
47
+
48
+ asyncio.run(main())
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ite-agent"
7
- version = "0.2.2"
7
+ version = "0.2.4"
8
8
  description = "Your AI coding agent for your terminal"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.2.2"
3
+ __version__ = "0.2.4"
@@ -102,6 +102,34 @@ class LLMClient:
102
102
  base_url = str(getattr(self.config, "base_url", "") or "").strip().lower()
103
103
  return "minimax" in model_name or "minimax" in base_url
104
104
 
105
+ def _reasoning_effort_value(self) -> str:
106
+ """Normalize the configured DeepSeek reasoning effort to a wire value.
107
+
108
+ DeepSeek accepts `none` (disables thinking), `low`, `high`, and `max`.
109
+ `minimal` maps to `low`; `medium`/`xhigh` map to `high`.
110
+ """
111
+ effort = str(
112
+ getattr(self.config.model, "reasoning_effort", None) or ""
113
+ ).strip().lower()
114
+ if effort in {"none", "low", "max"}:
115
+ return effort
116
+ if effort == "minimal":
117
+ return "low"
118
+ return "low"
119
+
120
+ def _deepseek_reasoning_extra_body(self) -> dict[str, Any] | None:
121
+ """Build DeepSeek reasoning params for BYOK requests.
122
+
123
+ `reasoning_effort` controls both the thinking-mode toggle and the
124
+ effort level: `none` disables thinking; `low`/`high`/`max` enable it.
125
+ Returns None when the active model/provider doesn't support them.
126
+ """
127
+ model_name = str(self.config.model_name or "").strip().lower()
128
+ base_url = str(self.config.base_url or "").strip().lower()
129
+ if "deepseek-v4" not in model_name and "api.deepseek.com" not in base_url:
130
+ return None
131
+ return {"reasoning_effort": self._reasoning_effort_value()}
132
+
105
133
  def _current_model_has_saved_profile(self) -> bool:
106
134
  source_kind = str(getattr(self.config.model, "source_kind", "") or "").strip().lower()
107
135
  if source_kind == "bundled":
@@ -991,6 +1019,12 @@ class LLMClient:
991
1019
  kwargs["extra_body"] = {}
992
1020
  kwargs["extra_body"]["reasoning_split"] = True
993
1021
 
1022
+ deepseek_extra = self._deepseek_reasoning_extra_body()
1023
+ if deepseek_extra:
1024
+ if "extra_body" not in kwargs:
1025
+ kwargs["extra_body"] = {}
1026
+ kwargs["extra_body"].update(deepseek_extra)
1027
+
994
1028
  for attempt in range(self._max_retries + 1):
995
1029
  try:
996
1030
  if stream:
@@ -1181,6 +1215,9 @@ class LLMClient:
1181
1215
  request_payload["top_p"] = 0.95
1182
1216
  request_payload["top_k"] = 64
1183
1217
 
1218
+ if "deepseek-v4" in model_name:
1219
+ request_payload["reasoningEffort"] = self._reasoning_effort_value()
1220
+
1184
1221
  if visual_budget:
1185
1222
  request_payload["visual_token_budget"] = visual_budget
1186
1223
 
@@ -32,6 +32,7 @@ class ModelConfig(BaseModel):
32
32
  context_window_source: str | None = None
33
33
  source_kind: str | None = None
34
34
  supports_vision: bool = True
35
+ reasoning_effort: str | None = None
35
36
 
36
37
 
37
38
  class ShellEnvironmentPolicy(BaseModel):
@@ -461,6 +461,7 @@ def save_system_config(
461
461
  context_window: int | None = None,
462
462
  context_window_source: str | None = None,
463
463
  source_kind: str | None = None,
464
+ reasoning_effort: str | None = None,
464
465
  cloud_auth_enabled: bool | None = None,
465
466
  cloud_api_url: str | None = None,
466
467
  cloud_client_id: str | None = None,
@@ -493,6 +494,10 @@ def save_system_config(
493
494
  model_config["source_kind"] = str(source_kind).strip()
494
495
  else:
495
496
  model_config.pop("source_kind", None)
497
+ if reasoning_effort:
498
+ model_config["reasoning_effort"] = str(reasoning_effort).strip()
499
+ else:
500
+ model_config.pop("reasoning_effort", None)
496
501
  existing["model"] = model_config
497
502
 
498
503
  if cloud_auth_enabled is not None:
@@ -277,6 +277,13 @@ class CloudMixin:
277
277
  return False
278
278
  return detect_vision_from_model_name(model_name)
279
279
 
280
+ def _is_deepseek_model(self) -> bool:
281
+ """Whether the active bundled model supports DeepSeek reasoning levels."""
282
+ if not self._is_bundled_model():
283
+ return False
284
+ model = str(self.config.model_name or "").strip().lower()
285
+ return "deepseek-v4" in model
286
+
280
287
 
281
288
  def _apply_cloud_auth_status(
282
289
  self,
@@ -1646,6 +1653,7 @@ class CloudMixin:
1646
1653
  )
1647
1654
  session_config.model.source_kind = self.config.model.source_kind
1648
1655
  session_config.model.supports_vision = self.config.model.supports_vision
1656
+ session_config.model.reasoning_effort = self.config.model.reasoning_effort
1649
1657
  if not getattr(self.agent.session, "client", None):
1650
1658
  return
1651
1659
  try:
@@ -68,8 +68,8 @@ from .widgets.remote_bridge import RemoteBridgeCard, RemoteBridgeField, UpdateCo
68
68
  from .widgets.system_commands import ReupSystemCommandsProvider
69
69
  from .adapters.tui_adapter import ReupTUIAdapter
70
70
  from .change_views import change_entry_label, build_change_card_body, build_change_card_payload
71
- from .model_labels import bundled_model_display_label
72
- from .modals import ApprovalPickerModal, AttachPickerModal, BranchPickerModal, CommitModal, ContextSummaryModal, ActivityModal, ModelPickerModal, ThemePickerModal, UsageSummaryModal, PushReviewModal, RemoteSetupModal, PlanQuestionModal, SessionResumeModal, VoiceSetupModal, ConfirmModal, SetupModal
71
+ from .model_labels import bundled_model_display_label, reasoning_effort_display_label
72
+ from .modals import ApprovalPickerModal, AttachPickerModal, BranchPickerModal, CommitModal, ContextSummaryModal, ActivityModal, ModelPickerModal, ThemePickerModal, ThinkingLevelModal, UsageSummaryModal, PushReviewModal, RemoteSetupModal, PlanQuestionModal, SessionResumeModal, VoiceSetupModal, ConfirmModal, SetupModal
73
73
 
74
74
  _VOICE_TRANSCRIPTION_MAX_RETRIES = 2
75
75
 
@@ -205,6 +205,7 @@ class ComposerMixin:
205
205
  text,
206
206
  attach_hitbox,
207
207
  model_hitbox,
208
+ reasoning_hitbox,
208
209
  branch_hitbox,
209
210
  plan_hitbox,
210
211
  usage_hitbox,
@@ -222,9 +223,15 @@ class ComposerMixin:
222
223
  show_usage=self._is_bundled_model(),
223
224
  show_context=model_display_name != "select model",
224
225
  available_width=available_width,
226
+ reasoning_label=(
227
+ reasoning_effort_display_label(self.config.model.reasoning_effort)
228
+ if self._is_deepseek_model()
229
+ else None
230
+ ),
225
231
  )
226
232
  self._composer_attach_hitbox = attach_hitbox
227
233
  self._composer_model_hitbox = model_hitbox
234
+ self._composer_reasoning_hitbox = reasoning_hitbox
228
235
  self._composer_branch_hitbox = branch_hitbox
229
236
  self._composer_plan_hitbox = plan_hitbox
230
237
  self._composer_usage_hitbox = usage_hitbox
@@ -651,12 +658,21 @@ class ComposerMixin:
651
658
  slash command. When the message is purely path-like, stage the files as
652
659
  attachments and return "@name" refs so the drop sends exactly like an
653
660
  @-mention attachment. Returns None to swallow the send when the payload
654
- is path-like but no file resolved (errors are posted as notes).
661
+ is path-like but no file resolved (errors are posted as notes), except
662
+ for "/"-prefixed payloads — those are treated as slash commands and
663
+ left untouched.
655
664
  """
656
665
  result = parse_dropped_file_paths(message)
657
666
  if result.path_like_count == 0 or result.prose_count > 0:
658
667
  return message
659
668
 
669
+ # A "/"-prefixed payload that resolves to no existing file is a slash
670
+ # command (e.g. "/plan"), not a dropped attachment. Leave it untouched
671
+ # so it dispatches to run_command instead of being swallowed as a
672
+ # broken drop.
673
+ if not result.paths and message.startswith("/"):
674
+ return message
675
+
660
676
  session = getattr(getattr(self, "agent", None), "session", None)
661
677
  if result.paths and session is not None:
662
678
  pending = list(session.pending_attachment_paths)
@@ -732,6 +748,7 @@ class ComposerMixin:
732
748
  def on_composer_meta_line_click(self, event: events.Click) -> None:
733
749
  attach_start, attach_end = self._composer_attach_hitbox
734
750
  model_start, model_end = self._composer_model_hitbox
751
+ reasoning_start, reasoning_end = self._composer_reasoning_hitbox
735
752
  branch_start, branch_end = self._composer_branch_hitbox
736
753
  usage_hitbox = self._composer_usage_hitbox
737
754
  usage_start = usage_hitbox[0] if usage_hitbox else -1
@@ -746,6 +763,10 @@ class ComposerMixin:
746
763
  self.run_worker(self._open_model_picker_from_meta(), exclusive=False)
747
764
  event.stop()
748
765
  return
766
+ if reasoning_start < reasoning_end and reasoning_start <= event.x < reasoning_end:
767
+ self.run_worker(self._open_thinking_level_modal_from_meta(), exclusive=False)
768
+ event.stop()
769
+ return
749
770
  if branch_start <= event.x < branch_end:
750
771
  self.run_worker(self._open_branch_picker_from_meta(), exclusive=False)
751
772
  event.stop()
@@ -818,6 +839,31 @@ class ComposerMixin:
818
839
  target = "off" if session.plan_mode_enabled else "on"
819
840
  await self._run_plan_command_native([target])
820
841
 
842
+ async def _open_thinking_level_modal_from_meta(self) -> None:
843
+ if not self._is_deepseek_model():
844
+ return
845
+ current = str(self.config.model.reasoning_effort or "").strip()
846
+ model_label = self._model_display_name()
847
+ modal = ThinkingLevelModal(current, model_label=model_label)
848
+ result = await self._open_modal(modal)
849
+ if result is None or result == current:
850
+ return
851
+ save_system_config(
852
+ api_key=self.config.api_key or "",
853
+ base_url=self.config.base_url or "",
854
+ model_name=self.config.model_name,
855
+ context_window=self.config.model.context_window,
856
+ context_window_source=self.config.model.context_window_source,
857
+ source_kind=self.config.model.source_kind,
858
+ reasoning_effort=result,
859
+ cloud_auth_enabled=self.config.cloud_auth_enabled,
860
+ cloud_api_url=self.config.cloud_api_url,
861
+ cloud_client_id=self.config.cloud_client_id,
862
+ )
863
+ self.config.model.reasoning_effort = result
864
+ self._update_composer_meta_line()
865
+ await self._reset_active_provider_client()
866
+
821
867
 
822
868
  def action_command_palette(self) -> None:
823
869
  """Open the command palette while preserving Reup system command order."""
@@ -509,6 +509,7 @@ class ReupApp(CloudMixin, PanelsMixin, ComposerMixin, ThreadsMixin, TurnMixin, S
509
509
  self._plan_question_recommended_index: int | None = None
510
510
  self._composer_attach_hitbox: tuple[int, int] = (0, 0)
511
511
  self._composer_model_hitbox: tuple[int, int] = (0, 0)
512
+ self._composer_reasoning_hitbox: tuple[int, int] = (0, 0)
512
513
  self._composer_plan_hitbox: tuple[int, int] = (0, 0)
513
514
  self._composer_branch_hitbox: tuple[int, int] = (0, 0)
514
515
  self._composer_usage_hitbox: tuple[int, int] | None = None
@@ -31,12 +31,14 @@ def composer_meta_text(
31
31
  show_usage: bool = True,
32
32
  show_context: bool = True,
33
33
  available_width: int | None = None,
34
+ reasoning_label: str | None = None,
34
35
  ) -> tuple[
35
36
  Text,
36
37
  tuple[int, int],
37
38
  tuple[int, int],
38
39
  tuple[int, int],
39
40
  tuple[int, int],
41
+ tuple[int, int],
40
42
  tuple[int, int] | None,
41
43
  tuple[int, int],
42
44
  tuple[int, int],
@@ -118,6 +120,7 @@ def composer_meta_text(
118
120
  tuple[int, int],
119
121
  tuple[int, int],
120
122
  tuple[int, int],
123
+ tuple[int, int],
121
124
  tuple[int, int] | None,
122
125
  tuple[int, int],
123
126
  tuple[int, int],
@@ -137,6 +140,17 @@ def composer_meta_text(
137
140
  "model",
138
141
  )
139
142
  )
143
+ if include_model and reasoning_label:
144
+ segments.append(
145
+ (
146
+ "reasoning",
147
+ [
148
+ (reasoning_label, f"bold {fg}"),
149
+ (" ▾", f"bold {muted}"),
150
+ ],
151
+ "reasoning",
152
+ )
153
+ )
140
154
  segments.append(
141
155
  (
142
156
  "plan",
@@ -196,6 +210,7 @@ def composer_meta_text(
196
210
  hitboxes: dict[str, tuple[int, int]] = {
197
211
  "attach": (0, 0),
198
212
  "model": (0, 0),
213
+ "reasoning": (0, 0),
199
214
  "branch": (0, 0),
200
215
  "plan": (0, 0),
201
216
  "context": (0, 0),
@@ -221,6 +236,7 @@ def composer_meta_text(
221
236
  text,
222
237
  hitboxes["attach"],
223
238
  hitboxes["model"],
239
+ hitboxes["reasoning"],
224
240
  hitboxes["branch"],
225
241
  hitboxes["plan"],
226
242
  usage_hitbox if show_usage and include_usage else None,
@@ -49,7 +49,12 @@ from ite.model_metadata import (
49
49
  format_context_window_label,
50
50
  parse_openrouter_model_metadata,
51
51
  )
52
- from ite.ui.reup.model_labels import bundled_model_display_label
52
+ from ite.ui.reup.model_labels import (
53
+ DEFAULT_REASONING_EFFORT,
54
+ REASONING_LEVELS,
55
+ bundled_model_display_label,
56
+ reasoning_effort_display_label,
57
+ )
53
58
 
54
59
  SETUP_PROVIDER_OLLAMA = "ollama"
55
60
  SETUP_PROVIDER_OPENROUTER = "openrouter"
@@ -1483,6 +1488,82 @@ class ThemePickerModal(ModalScreen[str | None]):
1483
1488
  self.dismiss(None)
1484
1489
 
1485
1490
 
1491
+ class ThinkingLevelModal(ModalScreen[str | None]):
1492
+ BINDINGS = [
1493
+ ("escape", "dismiss", "Dismiss"),
1494
+ ("up", "cursor_up", "Up"),
1495
+ ("down", "cursor_down", "Down"),
1496
+ ("enter", "select", "Select"),
1497
+ ]
1498
+
1499
+ def __init__(self, current: str, *, model_label: str) -> None:
1500
+ super().__init__()
1501
+ self._current = str(current or "").strip().lower() or DEFAULT_REASONING_EFFORT
1502
+ self._model_label = str(model_label or "Model").strip()
1503
+
1504
+ def compose(self) -> ComposeResult:
1505
+ with Container(classes="modal resume-modal thinking-level-modal"):
1506
+ yield Label(
1507
+ f"Thinking Level for {self._model_label}",
1508
+ classes="modal-title resume-title",
1509
+ )
1510
+ yield Static(
1511
+ "Choose how much the model reasons before responding.",
1512
+ classes="modal-body resume-body",
1513
+ id="thinking-level-help",
1514
+ )
1515
+ with Container(classes="modal-list resume-list"):
1516
+ yield DataTable(
1517
+ id="thinking-levels", classes="resume-table", cursor_type="row"
1518
+ )
1519
+ with Horizontal(classes="modal-actions resume-actions"):
1520
+ yield Button("Select", id="select", variant="primary")
1521
+ yield Button("Cancel", id="cancel", variant="default")
1522
+ async def on_mount(self) -> None:
1523
+ table = self.query_one("#thinking-levels", DataTable)
1524
+ table.add_columns("Level", "Description", "Current")
1525
+ initial_row = 0
1526
+ for index, (wire_value, label, description) in enumerate(REASONING_LEVELS):
1527
+ table.add_row(
1528
+ label,
1529
+ description,
1530
+ "✓" if wire_value == self._current else "",
1531
+ )
1532
+ if wire_value == self._current:
1533
+ initial_row = index
1534
+ if REASONING_LEVELS:
1535
+ table.move_cursor(row=initial_row, column=0)
1536
+
1537
+ def action_cursor_up(self) -> None:
1538
+ table = self.query_one("#thinking-levels", DataTable)
1539
+ table.action_cursor_up()
1540
+
1541
+ def action_cursor_down(self) -> None:
1542
+ table = self.query_one("#thinking-levels", DataTable)
1543
+ table.action_cursor_down()
1544
+
1545
+ def action_select(self) -> None:
1546
+ table = self.query_one("#thinking-levels", DataTable)
1547
+ self._dismiss_row(table.cursor_row)
1548
+
1549
+ def _dismiss_row(self, row: int) -> None:
1550
+ if 0 <= row < len(REASONING_LEVELS):
1551
+ self.dismiss(REASONING_LEVELS[row][0])
1552
+
1553
+ @on(DataTable.RowSelected, "#thinking-levels")
1554
+ def on_row_selected(self, event: DataTable.RowSelected) -> None:
1555
+ self._dismiss_row(event.cursor_row)
1556
+
1557
+ @on(Button.Pressed, "#select")
1558
+ def on_select_pressed(self, _event: Button.Pressed) -> None:
1559
+ table = self.query_one("#thinking-levels", DataTable)
1560
+ self._dismiss_row(table.cursor_row)
1561
+
1562
+ @on(Button.Pressed, "#cancel")
1563
+ def on_cancel_pressed(self, _event: Button.Pressed) -> None:
1564
+ self.dismiss(None)
1565
+
1566
+
1486
1567
  class UsageSummaryModal(ModalScreen[None]):
1487
1568
  BINDINGS = [("escape", "dismiss", "Dismiss")]
1488
1569
 
@@ -0,0 +1,47 @@
1
+ from __future__ import annotations
2
+
3
+ BUNDLED_MODEL_DISPLAY_NAMES_BY_MODEL: dict[str, str] = {
4
+ "deepseek-v4": "DeepSeek V4",
5
+ "deepseek-v4-pro": "DeepSeek V4 Pro",
6
+ "deepseek/deepseek-v4-pro": "DeepSeek V4 Pro",
7
+ "minimax-m3": "MiniMax M3",
8
+ "minimax/minimax-m3": "MiniMax M3",
9
+ "stealth-ox-alpha": "Stealth OX Alpha",
10
+ "stealth/ox-alpha": "Stealth OX Alpha",
11
+ }
12
+
13
+
14
+ def bundled_model_display_label(model_name: str, label: str | None = None) -> str:
15
+ """Return the public UI label for a bundled model without changing its id."""
16
+ normalized_model = str(model_name or "").strip()
17
+ public_name = BUNDLED_MODEL_DISPLAY_NAMES_BY_MODEL.get(normalized_model.lower())
18
+ if public_name:
19
+ return public_name
20
+ return str(label or normalized_model).strip()
21
+
22
+
23
+ # DeepSeek reasoning-effort levels, 1:1 with the upstream API. `none` disables
24
+ # thinking mode entirely; `low` / `high` / `max` enable it at increasing
25
+ # effort. The default effort is `high`. (For API compatibility `minimal` is
26
+ # accepted upstream and mapped to `low`; `medium`/`xhigh` map to `high`.)
27
+ REASONING_LEVELS: list[tuple[str, str, str]] = [
28
+ ("none", "Off", "No extended thinking"),
29
+ ("low", "Low", "Minimal reasoning"),
30
+ ("high", "High", "Deep reasoning"),
31
+ ("max", "Extra High", "Maximum reasoning"),
32
+ ]
33
+
34
+ DEFAULT_REASONING_EFFORT = "low"
35
+
36
+
37
+ def reasoning_effort_display_label(value: str | None) -> str:
38
+ """Return the human label for a reasoning-effort value (defaults to High)."""
39
+ normalized = str(value or "").strip().lower()
40
+ if normalized == "minimal":
41
+ normalized = "low"
42
+ if normalized in {"xhigh", "medium"}:
43
+ normalized = "high"
44
+ for wire_value, label, _description in REASONING_LEVELS:
45
+ if wire_value == normalized:
46
+ return label
47
+ return "Low"
@@ -2181,6 +2181,7 @@ BranchPickerModal,
2181
2181
  ModelPickerModal,
2182
2182
  ThemePickerModal,
2183
2183
  ApprovalPickerModal,
2184
+ ThinkingLevelModal,
2184
2185
  UsageSummaryModal,
2185
2186
  ContextSummaryModal,
2186
2187
  ActivityModal,
@@ -2680,6 +2681,22 @@ ApprovalPickerModal .approval-picker-modal {
2680
2681
  overflow: hidden;
2681
2682
  }
2682
2683
 
2684
+ ThinkingLevelModal .thinking-level-modal {
2685
+ width: 72;
2686
+ height: 22;
2687
+ max-height: 86%;
2688
+ min-height: 16;
2689
+ border: heavy $border;
2690
+ background: $surface;
2691
+ padding: 1 2;
2692
+ overflow: hidden;
2693
+ }
2694
+
2695
+ ThinkingLevelModal .modal-footer {
2696
+ margin-top: 1;
2697
+ color: $foreground-muted;
2698
+ }
2699
+
2683
2700
  UsageSummaryModal .modal {
2684
2701
  width: 108;
2685
2702
  height: 24;
@@ -2786,6 +2803,7 @@ BranchPickerModal .modal-list,
2786
2803
  ModelPickerModal .modal-list,
2787
2804
  ThemePickerModal .modal-list,
2788
2805
  ApprovalPickerModal .modal-list,
2806
+ ThinkingLevelModal .modal-list,
2789
2807
  ActivityModal .modal-list,
2790
2808
  AttachPickerModal .modal-list {
2791
2809
  height: 1fr;
@@ -2804,6 +2822,7 @@ BranchPickerModal .modal-title,
2804
2822
  ModelPickerModal .modal-title,
2805
2823
  ThemePickerModal .modal-title,
2806
2824
  ApprovalPickerModal .modal-title,
2825
+ ThinkingLevelModal .modal-title,
2807
2826
  UsageSummaryModal .modal-title,
2808
2827
  ContextSummaryModal .modal-title,
2809
2828
  ActivityModal .modal-title,
@@ -2824,6 +2843,7 @@ BranchPickerModal .modal-body,
2824
2843
  ModelPickerModal .modal-body,
2825
2844
  ThemePickerModal .modal-body,
2826
2845
  ApprovalPickerModal .modal-body,
2846
+ ThinkingLevelModal .modal-body,
2827
2847
  UsageSummaryModal .modal-body,
2828
2848
  ContextSummaryModal .modal-body,
2829
2849
  ActivityModal .modal-body,
@@ -2849,6 +2869,7 @@ BranchPickerModal .modal-actions,
2849
2869
  ModelPickerModal .modal-actions,
2850
2870
  ThemePickerModal .modal-actions,
2851
2871
  ApprovalPickerModal .modal-actions,
2872
+ ThinkingLevelModal .modal-actions,
2852
2873
  UsageSummaryModal .modal-actions,
2853
2874
  ContextSummaryModal .modal-actions,
2854
2875
  ActivityModal .modal-actions,
@@ -2866,6 +2887,10 @@ VoiceSetupModal .modal-actions {
2866
2887
  margin-bottom: 0;
2867
2888
  }
2868
2889
 
2890
+ ThinkingLevelModal .modal-actions {
2891
+ margin-top: 1;
2892
+ }
2893
+
2869
2894
  SessionResumeModal #resume {
2870
2895
  width: 14;
2871
2896
  min-width: 14;
@@ -2885,6 +2910,7 @@ BranchPickerModal #cancel,
2885
2910
  ModelPickerModal #cancel,
2886
2911
  ThemePickerModal #cancel,
2887
2912
  ApprovalPickerModal #cancel,
2913
+ ThinkingLevelModal #cancel,
2888
2914
  UsageSummaryModal #cancel,
2889
2915
  ContextSummaryModal #cancel,
2890
2916
  ActivityModal #cancel,
@@ -2907,6 +2933,7 @@ BranchPickerModal #cancel:hover,
2907
2933
  ModelPickerModal #cancel:hover,
2908
2934
  ThemePickerModal #cancel:hover,
2909
2935
  ApprovalPickerModal #cancel:hover,
2936
+ ThinkingLevelModal #cancel:hover,
2910
2937
  UsageSummaryModal #cancel:hover,
2911
2938
  ContextSummaryModal #cancel:hover,
2912
2939
  ActivityModal #cancel:hover,
@@ -3561,6 +3588,7 @@ SessionResumeModal .resume-table,
3561
3588
  BranchPickerModal .resume-table,
3562
3589
  ModelPickerModal .resume-table,
3563
3590
  ThemePickerModal .resume-table,
3591
+ ThinkingLevelModal .resume-table,
3564
3592
  AttachPickerModal .resume-table {
3565
3593
  height: 1fr;
3566
3594
  background: $surface-darken-1;
@@ -3572,6 +3600,7 @@ SessionResumeModal .resume-table > .datatable--header,
3572
3600
  BranchPickerModal .resume-table > .datatable--header,
3573
3601
  ModelPickerModal .resume-table > .datatable--header,
3574
3602
  ThemePickerModal .resume-table > .datatable--header,
3603
+ ThinkingLevelModal .resume-table > .datatable--header,
3575
3604
  AttachPickerModal .resume-table > .datatable--header {
3576
3605
  background: $panel;
3577
3606
  color: $foreground;
@@ -3581,6 +3610,7 @@ SessionResumeModal .resume-table > .datatable--even-row,
3581
3610
  BranchPickerModal .resume-table > .datatable--even-row,
3582
3611
  ModelPickerModal .resume-table > .datatable--even-row,
3583
3612
  ThemePickerModal .resume-table > .datatable--even-row,
3613
+ ThinkingLevelModal .resume-table > .datatable--even-row,
3584
3614
  AttachPickerModal .resume-table > .datatable--even-row {
3585
3615
  background: $surface;
3586
3616
  }
@@ -3589,6 +3619,7 @@ SessionResumeModal .resume-table > .datatable--odd-row,
3589
3619
  BranchPickerModal .resume-table > .datatable--odd-row,
3590
3620
  ModelPickerModal .resume-table > .datatable--odd-row,
3591
3621
  ThemePickerModal .resume-table > .datatable--odd-row,
3622
+ ThinkingLevelModal .resume-table > .datatable--odd-row,
3592
3623
  AttachPickerModal .resume-table > .datatable--odd-row {
3593
3624
  background: $surface-darken-1;
3594
3625
  }
@@ -3601,6 +3632,8 @@ ModelPickerModal .resume-table > .datatable--cursor,
3601
3632
  ModelPickerModal .resume-table:focus > .datatable--cursor,
3602
3633
  ThemePickerModal .resume-table > .datatable--cursor,
3603
3634
  ThemePickerModal .resume-table:focus > .datatable--cursor,
3635
+ ThinkingLevelModal .resume-table > .datatable--cursor,
3636
+ ThinkingLevelModal .resume-table:focus > .datatable--cursor,
3604
3637
  AttachPickerModal .resume-table > .datatable--cursor,
3605
3638
  AttachPickerModal .resume-table:focus > .datatable--cursor {
3606
3639
  background: $primary-muted;
@@ -3611,6 +3644,7 @@ SessionResumeModal .resume-table > .datatable--header-cursor,
3611
3644
  BranchPickerModal .resume-table > .datatable--header-cursor,
3612
3645
  ModelPickerModal .resume-table > .datatable--header-cursor,
3613
3646
  ThemePickerModal .resume-table > .datatable--header-cursor,
3647
+ ThinkingLevelModal .resume-table > .datatable--header-cursor,
3614
3648
  AttachPickerModal .resume-table > .datatable--header-cursor {
3615
3649
  background: $primary;
3616
3650
  color: $button-color-foreground;
@@ -3741,7 +3775,8 @@ ModelPickerModal #delete:hover {
3741
3775
  }
3742
3776
 
3743
3777
  ThemePickerModal #select,
3744
- ApprovalPickerModal #select {
3778
+ ApprovalPickerModal #select,
3779
+ ThinkingLevelModal #select {
3745
3780
  width: 14;
3746
3781
  min-width: 14;
3747
3782
  text-style: bold;
@@ -3751,7 +3786,8 @@ ApprovalPickerModal #select {
3751
3786
  }
3752
3787
 
3753
3788
  ThemePickerModal #select:hover,
3754
- ApprovalPickerModal #select:hover {
3789
+ ApprovalPickerModal #select:hover,
3790
+ ThinkingLevelModal #select:hover {
3755
3791
  background: $primary-lighten-1;
3756
3792
  color: $button-color-foreground;
3757
3793
  }