mycode-cli 0.3.4__py3-none-any.whl → 0.4.2__py3-none-any.whl

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 (407) hide show
  1. mycode_cli/__init__.py +1 -0
  2. {mycode/core → mycode_cli}/config.py +36 -87
  3. {mycode/cli → mycode_cli}/main.py +87 -91
  4. {mycode/cli → mycode_cli}/runtime.py +56 -87
  5. {mycode → mycode_cli}/server/app.py +2 -2
  6. {mycode → mycode_cli}/server/deps.py +2 -2
  7. mycode_cli/server/routers/__init__.py +7 -0
  8. {mycode → mycode_cli}/server/routers/chat.py +50 -70
  9. {mycode → mycode_cli}/server/routers/sessions.py +3 -3
  10. {mycode → mycode_cli}/server/run_manager.py +7 -13
  11. {mycode/core → mycode_cli}/system_prompt.py +2 -1
  12. mycode_cli/tui/__init__.py +1 -0
  13. {mycode/cli → mycode_cli/tui}/chat.py +35 -43
  14. {mycode/cli → mycode_cli/tui}/render.py +2 -2
  15. {mycode_cli-0.3.4.dist-info → mycode_cli-0.4.2.dist-info}/METADATA +30 -12
  16. mycode_cli-0.4.2.dist-info/RECORD +388 -0
  17. mycode_cli-0.4.2.dist-info/entry_points.txt +2 -0
  18. mycode/__init__.py +0 -1
  19. mycode/cli/__init__.py +0 -1
  20. mycode/core/__init__.py +0 -30
  21. mycode/core/agent.py +0 -521
  22. mycode/core/messages.py +0 -182
  23. mycode/core/models.py +0 -125
  24. mycode/core/models_catalog.json +0 -2498
  25. mycode/core/providers/__init__.py +0 -86
  26. mycode/core/providers/anthropic_like.py +0 -381
  27. mycode/core/providers/base.py +0 -387
  28. mycode/core/providers/gemini.py +0 -316
  29. mycode/core/providers/openai_chat.py +0 -368
  30. mycode/core/providers/openai_responses.py +0 -372
  31. mycode/core/session.py +0 -538
  32. mycode/core/tools.py +0 -998
  33. mycode/core/utils.py +0 -38
  34. mycode/server/routers/__init__.py +0 -7
  35. mycode_cli-0.3.4.dist-info/RECORD +0 -402
  36. mycode_cli-0.3.4.dist-info/entry_points.txt +0 -2
  37. {mycode → mycode_cli}/server/__init__.py +0 -0
  38. {mycode → mycode_cli}/server/routers/workspaces.py +0 -0
  39. {mycode → mycode_cli}/server/schemas.py +0 -0
  40. {mycode → mycode_cli}/server/static/assets/EditDiff-BCA9aTUr.js +0 -0
  41. {mycode → mycode_cli}/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  42. {mycode → mycode_cli}/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  43. {mycode → mycode_cli}/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  44. {mycode → mycode_cli}/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  45. {mycode → mycode_cli}/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  46. {mycode → mycode_cli}/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  47. {mycode → mycode_cli}/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  48. {mycode → mycode_cli}/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  49. {mycode → mycode_cli}/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  50. {mycode → mycode_cli}/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  51. {mycode → mycode_cli}/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  52. {mycode → mycode_cli}/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  53. {mycode → mycode_cli}/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  54. {mycode → mycode_cli}/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  55. {mycode → mycode_cli}/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  56. {mycode → mycode_cli}/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  57. {mycode → mycode_cli}/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  58. {mycode → mycode_cli}/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  59. {mycode → mycode_cli}/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  60. {mycode → mycode_cli}/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  61. {mycode → mycode_cli}/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  62. {mycode → mycode_cli}/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  63. {mycode → mycode_cli}/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  64. {mycode → mycode_cli}/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  65. {mycode → mycode_cli}/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  66. {mycode → mycode_cli}/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  67. {mycode → mycode_cli}/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  68. {mycode → mycode_cli}/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  69. {mycode → mycode_cli}/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  70. {mycode → mycode_cli}/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  71. {mycode → mycode_cli}/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  72. {mycode → mycode_cli}/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  73. {mycode → mycode_cli}/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  74. {mycode → mycode_cli}/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  75. {mycode → mycode_cli}/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  76. {mycode → mycode_cli}/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  77. {mycode → mycode_cli}/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  78. {mycode → mycode_cli}/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  79. {mycode → mycode_cli}/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  80. {mycode → mycode_cli}/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  81. {mycode → mycode_cli}/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  82. {mycode → mycode_cli}/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  83. {mycode → mycode_cli}/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  84. {mycode → mycode_cli}/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  85. {mycode → mycode_cli}/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  86. {mycode → mycode_cli}/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  87. {mycode → mycode_cli}/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  88. {mycode → mycode_cli}/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  89. {mycode → mycode_cli}/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  90. {mycode → mycode_cli}/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  91. {mycode → mycode_cli}/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  92. {mycode → mycode_cli}/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  93. {mycode → mycode_cli}/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  94. {mycode → mycode_cli}/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  95. {mycode → mycode_cli}/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  96. {mycode → mycode_cli}/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  97. {mycode → mycode_cli}/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  98. {mycode → mycode_cli}/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  99. {mycode → mycode_cli}/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  100. {mycode → mycode_cli}/server/static/assets/abap-BdImnpbu.js +0 -0
  101. {mycode → mycode_cli}/server/static/assets/actionscript-3-CoDkCxhg.js +0 -0
  102. {mycode → mycode_cli}/server/static/assets/ada-bCR0ucgS.js +0 -0
  103. {mycode → mycode_cli}/server/static/assets/andromeeda-C4gqWexZ.js +0 -0
  104. {mycode → mycode_cli}/server/static/assets/angular-html-DA-rfuFy.js +0 -0
  105. {mycode → mycode_cli}/server/static/assets/angular-ts-BrjP3tb8.js +0 -0
  106. {mycode → mycode_cli}/server/static/assets/apache-Pmp26Uib.js +0 -0
  107. {mycode → mycode_cli}/server/static/assets/apex-D8_7TLub.js +0 -0
  108. {mycode → mycode_cli}/server/static/assets/apl-CORt7UWP.js +0 -0
  109. {mycode → mycode_cli}/server/static/assets/applescript-Co6uUVPk.js +0 -0
  110. {mycode → mycode_cli}/server/static/assets/ara-BRHolxvo.js +0 -0
  111. {mycode → mycode_cli}/server/static/assets/asciidoc-Ve4PFQV2.js +0 -0
  112. {mycode → mycode_cli}/server/static/assets/asm-D_Q5rh1f.js +0 -0
  113. {mycode → mycode_cli}/server/static/assets/astro-HNnZUWAn.js +0 -0
  114. {mycode → mycode_cli}/server/static/assets/aurora-x-D-2ljcwZ.js +0 -0
  115. {mycode → mycode_cli}/server/static/assets/awk-DMzUqQB5.js +0 -0
  116. {mycode → mycode_cli}/server/static/assets/ayu-dark-DYE7WIF3.js +0 -0
  117. {mycode → mycode_cli}/server/static/assets/ayu-light-BA47KaF1.js +0 -0
  118. {mycode → mycode_cli}/server/static/assets/ayu-mirage-32ctXXKs.js +0 -0
  119. {mycode → mycode_cli}/server/static/assets/ballerina-BFfxhgS-.js +0 -0
  120. {mycode → mycode_cli}/server/static/assets/bat-BkioyH1T.js +0 -0
  121. {mycode → mycode_cli}/server/static/assets/beancount-k_qm7-4y.js +0 -0
  122. {mycode → mycode_cli}/server/static/assets/berry-uYugtg8r.js +0 -0
  123. {mycode → mycode_cli}/server/static/assets/bibtex-CHM0blh-.js +0 -0
  124. {mycode → mycode_cli}/server/static/assets/bicep-Bmn6On1c.js +0 -0
  125. {mycode → mycode_cli}/server/static/assets/bird2-BIv1doCn.js +0 -0
  126. {mycode → mycode_cli}/server/static/assets/blade-BjGOyj-B.js +0 -0
  127. {mycode → mycode_cli}/server/static/assets/bsl-BO_Y6i37.js +0 -0
  128. {mycode → mycode_cli}/server/static/assets/c-BIGW1oBm.js +0 -0
  129. {mycode → mycode_cli}/server/static/assets/c3-eo99z4R2.js +0 -0
  130. {mycode → mycode_cli}/server/static/assets/cadence-Bv_4Rxtq.js +0 -0
  131. {mycode → mycode_cli}/server/static/assets/cairo-KRGpt6FW.js +0 -0
  132. {mycode → mycode_cli}/server/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
  133. {mycode → mycode_cli}/server/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
  134. {mycode → mycode_cli}/server/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
  135. {mycode → mycode_cli}/server/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
  136. {mycode → mycode_cli}/server/static/assets/clarity-D53aC0YG.js +0 -0
  137. {mycode → mycode_cli}/server/static/assets/clojure-P80f7IUj.js +0 -0
  138. {mycode → mycode_cli}/server/static/assets/cmake-D1j8_8rp.js +0 -0
  139. {mycode → mycode_cli}/server/static/assets/cobol-nBiQ_Alo.js +0 -0
  140. {mycode → mycode_cli}/server/static/assets/codeowners-Bp6g37R7.js +0 -0
  141. {mycode → mycode_cli}/server/static/assets/codeql-DsOJ9woJ.js +0 -0
  142. {mycode → mycode_cli}/server/static/assets/coffee-Ch7k5sss.js +0 -0
  143. {mycode → mycode_cli}/server/static/assets/common-lisp-Cg-RD9OK.js +0 -0
  144. {mycode → mycode_cli}/server/static/assets/coq-DkFqJrB1.js +0 -0
  145. {mycode → mycode_cli}/server/static/assets/cpp-CofmeUqb.js +0 -0
  146. {mycode → mycode_cli}/server/static/assets/crystal-DNxU26gB.js +0 -0
  147. {mycode → mycode_cli}/server/static/assets/csharp-COcwbKMJ.js +0 -0
  148. {mycode → mycode_cli}/server/static/assets/css-CLj8gQPS.js +0 -0
  149. {mycode → mycode_cli}/server/static/assets/csv-fuZLfV_i.js +0 -0
  150. {mycode → mycode_cli}/server/static/assets/cue-D82EKSYY.js +0 -0
  151. {mycode → mycode_cli}/server/static/assets/cypher-COkxafJQ.js +0 -0
  152. {mycode → mycode_cli}/server/static/assets/d-85-TOEBH.js +0 -0
  153. {mycode → mycode_cli}/server/static/assets/dark-plus-C3mMm8J8.js +0 -0
  154. {mycode → mycode_cli}/server/static/assets/dart-bE4Kk8sk.js +0 -0
  155. {mycode → mycode_cli}/server/static/assets/dax-CEL-wOlO.js +0 -0
  156. {mycode → mycode_cli}/server/static/assets/desktop-BmXAJ9_W.js +0 -0
  157. {mycode → mycode_cli}/server/static/assets/diff-D97Zzqfu.js +0 -0
  158. {mycode → mycode_cli}/server/static/assets/docker-BcOcwvcX.js +0 -0
  159. {mycode → mycode_cli}/server/static/assets/dotenv-Da5cRb03.js +0 -0
  160. {mycode → mycode_cli}/server/static/assets/dracula-BzJJZx-M.js +0 -0
  161. {mycode → mycode_cli}/server/static/assets/dracula-soft-BXkSAIEj.js +0 -0
  162. {mycode → mycode_cli}/server/static/assets/dream-maker-BtqSS_iP.js +0 -0
  163. {mycode → mycode_cli}/server/static/assets/edge-FbVlp4U3.js +0 -0
  164. {mycode → mycode_cli}/server/static/assets/elixir-CkH2-t6x.js +0 -0
  165. {mycode → mycode_cli}/server/static/assets/elm-DbKCFpqz.js +0 -0
  166. {mycode → mycode_cli}/server/static/assets/emacs-lisp-CXvaQtF9.js +0 -0
  167. {mycode → mycode_cli}/server/static/assets/erb-BYCe7drp.js +0 -0
  168. {mycode → mycode_cli}/server/static/assets/erlang-DsQrWhSR.js +0 -0
  169. {mycode → mycode_cli}/server/static/assets/everforest-dark-BgDCqdQA.js +0 -0
  170. {mycode → mycode_cli}/server/static/assets/everforest-light-C8M2exoo.js +0 -0
  171. {mycode → mycode_cli}/server/static/assets/fennel-BYunw83y.js +0 -0
  172. {mycode → mycode_cli}/server/static/assets/fish-BvzEVeQv.js +0 -0
  173. {mycode → mycode_cli}/server/static/assets/fluent-C4IJs8-o.js +0 -0
  174. {mycode → mycode_cli}/server/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
  175. {mycode → mycode_cli}/server/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
  176. {mycode → mycode_cli}/server/static/assets/fsharp-CXgrBDvD.js +0 -0
  177. {mycode → mycode_cli}/server/static/assets/gdresource-BOOCDP_w.js +0 -0
  178. {mycode → mycode_cli}/server/static/assets/gdscript-C5YyOfLZ.js +0 -0
  179. {mycode → mycode_cli}/server/static/assets/gdshader-DkwncUOv.js +0 -0
  180. {mycode → mycode_cli}/server/static/assets/genie-D0YGMca9.js +0 -0
  181. {mycode → mycode_cli}/server/static/assets/gherkin-DyxjwDmM.js +0 -0
  182. {mycode → mycode_cli}/server/static/assets/git-commit-F4YmCXRG.js +0 -0
  183. {mycode → mycode_cli}/server/static/assets/git-rebase-r7XF79zn.js +0 -0
  184. {mycode → mycode_cli}/server/static/assets/github-dark-DHJKELXO.js +0 -0
  185. {mycode → mycode_cli}/server/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
  186. {mycode → mycode_cli}/server/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
  187. {mycode → mycode_cli}/server/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
  188. {mycode → mycode_cli}/server/static/assets/github-light-DAi9KRSo.js +0 -0
  189. {mycode → mycode_cli}/server/static/assets/github-light-default-D7oLnXFd.js +0 -0
  190. {mycode → mycode_cli}/server/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
  191. {mycode → mycode_cli}/server/static/assets/gleam-BspZqrRM.js +0 -0
  192. {mycode → mycode_cli}/server/static/assets/glimmer-js-ByusRIyA.js +0 -0
  193. {mycode → mycode_cli}/server/static/assets/glimmer-ts-BfAWNZQY.js +0 -0
  194. {mycode → mycode_cli}/server/static/assets/glsl-DplSGwfg.js +0 -0
  195. {mycode → mycode_cli}/server/static/assets/gn-n2N0HUVH.js +0 -0
  196. {mycode → mycode_cli}/server/static/assets/gnuplot-DdkO51Og.js +0 -0
  197. {mycode → mycode_cli}/server/static/assets/go-C27-OAKa.js +0 -0
  198. {mycode → mycode_cli}/server/static/assets/graphql-ChdNCCLP.js +0 -0
  199. {mycode → mycode_cli}/server/static/assets/groovy-gcz8RCvz.js +0 -0
  200. {mycode → mycode_cli}/server/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
  201. {mycode → mycode_cli}/server/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
  202. {mycode → mycode_cli}/server/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
  203. {mycode → mycode_cli}/server/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
  204. {mycode → mycode_cli}/server/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
  205. {mycode → mycode_cli}/server/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
  206. {mycode → mycode_cli}/server/static/assets/hack-i7_Ulhet.js +0 -0
  207. {mycode → mycode_cli}/server/static/assets/haml-D5jkg6IW.js +0 -0
  208. {mycode → mycode_cli}/server/static/assets/handlebars-BpdQsYii.js +0 -0
  209. {mycode → mycode_cli}/server/static/assets/haskell-Df6bDoY_.js +0 -0
  210. {mycode → mycode_cli}/server/static/assets/haxe-CzTSHFRz.js +0 -0
  211. {mycode → mycode_cli}/server/static/assets/hcl-BWvSN4gD.js +0 -0
  212. {mycode → mycode_cli}/server/static/assets/hjson-D5-asLiD.js +0 -0
  213. {mycode → mycode_cli}/server/static/assets/hlsl-D3lLCCz7.js +0 -0
  214. {mycode → mycode_cli}/server/static/assets/horizon-BUw7H-hv.js +0 -0
  215. {mycode → mycode_cli}/server/static/assets/horizon-bright-CUuTKBJd.js +0 -0
  216. {mycode → mycode_cli}/server/static/assets/houston-DnULxvSX.js +0 -0
  217. {mycode → mycode_cli}/server/static/assets/html-derivative-DlHx6ybY.js +0 -0
  218. {mycode → mycode_cli}/server/static/assets/html-pp8916En.js +0 -0
  219. {mycode → mycode_cli}/server/static/assets/http-jrhK8wxY.js +0 -0
  220. {mycode → mycode_cli}/server/static/assets/hurl-irOxFIW8.js +0 -0
  221. {mycode → mycode_cli}/server/static/assets/hxml-Bvhsp5Yf.js +0 -0
  222. {mycode → mycode_cli}/server/static/assets/hy-DFXneXwc.js +0 -0
  223. {mycode → mycode_cli}/server/static/assets/imba-DGztddWO.js +0 -0
  224. {mycode → mycode_cli}/server/static/assets/index-Bi2yKki-.css +0 -0
  225. {mycode → mycode_cli}/server/static/assets/index-C8gu4B-1.js +0 -0
  226. {mycode → mycode_cli}/server/static/assets/ini-BEwlwnbL.js +0 -0
  227. {mycode → mycode_cli}/server/static/assets/java-CylS5w8V.js +0 -0
  228. {mycode → mycode_cli}/server/static/assets/javascript-wDzz0qaB.js +0 -0
  229. {mycode → mycode_cli}/server/static/assets/jinja-f2NsQr07.js +0 -0
  230. {mycode → mycode_cli}/server/static/assets/jison-wvAkD_A8.js +0 -0
  231. {mycode → mycode_cli}/server/static/assets/json-Cp-IABpG.js +0 -0
  232. {mycode → mycode_cli}/server/static/assets/json5-C9tS-k6U.js +0 -0
  233. {mycode → mycode_cli}/server/static/assets/jsonc-Des-eS-w.js +0 -0
  234. {mycode → mycode_cli}/server/static/assets/jsonl-DcaNXYhu.js +0 -0
  235. {mycode → mycode_cli}/server/static/assets/jsonnet-DFQXde-d.js +0 -0
  236. {mycode → mycode_cli}/server/static/assets/jssm-C2t-YnRu.js +0 -0
  237. {mycode → mycode_cli}/server/static/assets/jsx-g9-lgVsj.js +0 -0
  238. {mycode → mycode_cli}/server/static/assets/julia-CxzCAyBv.js +0 -0
  239. {mycode → mycode_cli}/server/static/assets/just-VxiPbLrw.js +0 -0
  240. {mycode → mycode_cli}/server/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
  241. {mycode → mycode_cli}/server/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
  242. {mycode → mycode_cli}/server/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
  243. {mycode → mycode_cli}/server/static/assets/kdl-DV7GczEv.js +0 -0
  244. {mycode → mycode_cli}/server/static/assets/kotlin-BdnUsdx6.js +0 -0
  245. {mycode → mycode_cli}/server/static/assets/kusto-wEQ09or8.js +0 -0
  246. {mycode → mycode_cli}/server/static/assets/laserwave-DUszq2jm.js +0 -0
  247. {mycode → mycode_cli}/server/static/assets/latex-CWtU0Tv5.js +0 -0
  248. {mycode → mycode_cli}/server/static/assets/lean-BZvkOJ9d.js +0 -0
  249. {mycode → mycode_cli}/server/static/assets/less-B1dDrJ26.js +0 -0
  250. {mycode → mycode_cli}/server/static/assets/light-plus-B7mTdjB0.js +0 -0
  251. {mycode → mycode_cli}/server/static/assets/liquid-C0sCDyMI.js +0 -0
  252. {mycode → mycode_cli}/server/static/assets/llvm-DjAJT7YJ.js +0 -0
  253. {mycode → mycode_cli}/server/static/assets/log-2UxHyX5q.js +0 -0
  254. {mycode → mycode_cli}/server/static/assets/logo-BtOb2qkB.js +0 -0
  255. {mycode → mycode_cli}/server/static/assets/lua-BaeVxFsk.js +0 -0
  256. {mycode → mycode_cli}/server/static/assets/luau-C-HG3fhB.js +0 -0
  257. {mycode → mycode_cli}/server/static/assets/make-CHLpvVh8.js +0 -0
  258. {mycode → mycode_cli}/server/static/assets/markdown-Cvjx9yec.js +0 -0
  259. {mycode → mycode_cli}/server/static/assets/marko-DjSrsDqO.js +0 -0
  260. {mycode → mycode_cli}/server/static/assets/material-theme-D5KoaKCx.js +0 -0
  261. {mycode → mycode_cli}/server/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
  262. {mycode → mycode_cli}/server/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
  263. {mycode → mycode_cli}/server/static/assets/material-theme-ocean-CyktbL80.js +0 -0
  264. {mycode → mycode_cli}/server/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
  265. {mycode → mycode_cli}/server/static/assets/matlab-D7o27uSR.js +0 -0
  266. {mycode → mycode_cli}/server/static/assets/mdc-DTYItulj.js +0 -0
  267. {mycode → mycode_cli}/server/static/assets/mdx-Cmh6b_Ma.js +0 -0
  268. {mycode → mycode_cli}/server/static/assets/mermaid-mWjccvbQ.js +0 -0
  269. {mycode → mycode_cli}/server/static/assets/min-dark-CafNBF8u.js +0 -0
  270. {mycode → mycode_cli}/server/static/assets/min-light-CTRr51gU.js +0 -0
  271. {mycode → mycode_cli}/server/static/assets/mipsasm-CKIfxQSi.js +0 -0
  272. {mycode → mycode_cli}/server/static/assets/mojo-rZm6bMo-.js +0 -0
  273. {mycode → mycode_cli}/server/static/assets/monokai-D4h5O-jR.js +0 -0
  274. {mycode → mycode_cli}/server/static/assets/moonbit-_H4v1dQx.js +0 -0
  275. {mycode → mycode_cli}/server/static/assets/move-IF9eRakj.js +0 -0
  276. {mycode → mycode_cli}/server/static/assets/narrat-DRg8JJMk.js +0 -0
  277. {mycode → mycode_cli}/server/static/assets/nextflow-C-mBbutL.js +0 -0
  278. {mycode → mycode_cli}/server/static/assets/nextflow-groovy-vE_lwT2v.js +0 -0
  279. {mycode → mycode_cli}/server/static/assets/nginx-BpAMiNFr.js +0 -0
  280. {mycode → mycode_cli}/server/static/assets/night-owl-C39BiMTA.js +0 -0
  281. {mycode → mycode_cli}/server/static/assets/night-owl-light-CMTm3GFP.js +0 -0
  282. {mycode → mycode_cli}/server/static/assets/nim-BIad80T-.js +0 -0
  283. {mycode → mycode_cli}/server/static/assets/nix-CwoSXNpI.js +0 -0
  284. {mycode → mycode_cli}/server/static/assets/nord-Ddv68eIx.js +0 -0
  285. {mycode → mycode_cli}/server/static/assets/nushell-Cz2AlsmD.js +0 -0
  286. {mycode → mycode_cli}/server/static/assets/objective-c-DXmwc3jG.js +0 -0
  287. {mycode → mycode_cli}/server/static/assets/objective-cpp-CLxacb5B.js +0 -0
  288. {mycode → mycode_cli}/server/static/assets/ocaml-C0hk2d4L.js +0 -0
  289. {mycode → mycode_cli}/server/static/assets/odin-BBf5iR-q.js +0 -0
  290. {mycode → mycode_cli}/server/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
  291. {mycode → mycode_cli}/server/static/assets/one-light-C3Wv6jpd.js +0 -0
  292. {mycode → mycode_cli}/server/static/assets/openscad-C4EeE6gA.js +0 -0
  293. {mycode → mycode_cli}/server/static/assets/pascal-D93ZcfNL.js +0 -0
  294. {mycode → mycode_cli}/server/static/assets/perl-NvoQZIq0.js +0 -0
  295. {mycode → mycode_cli}/server/static/assets/php-R6g_5hLQ.js +0 -0
  296. {mycode → mycode_cli}/server/static/assets/pkl-u5AG7uiY.js +0 -0
  297. {mycode → mycode_cli}/server/static/assets/plastic-3e1v2bzS.js +0 -0
  298. {mycode → mycode_cli}/server/static/assets/plsql-ChMvpjG-.js +0 -0
  299. {mycode → mycode_cli}/server/static/assets/po-BTJTHyun.js +0 -0
  300. {mycode → mycode_cli}/server/static/assets/poimandres-CS3Unz2-.js +0 -0
  301. {mycode → mycode_cli}/server/static/assets/polar-C0HS_06l.js +0 -0
  302. {mycode → mycode_cli}/server/static/assets/postcss-CXtECtnM.js +0 -0
  303. {mycode → mycode_cli}/server/static/assets/powerquery-CEu0bR-o.js +0 -0
  304. {mycode → mycode_cli}/server/static/assets/powershell-Dpen1YoG.js +0 -0
  305. {mycode → mycode_cli}/server/static/assets/prisma-Dd19v3D-.js +0 -0
  306. {mycode → mycode_cli}/server/static/assets/prolog-CbFg5uaA.js +0 -0
  307. {mycode → mycode_cli}/server/static/assets/proto-C7zT0LnQ.js +0 -0
  308. {mycode → mycode_cli}/server/static/assets/pug-DKIMFp6K.js +0 -0
  309. {mycode → mycode_cli}/server/static/assets/puppet-BMWR74SV.js +0 -0
  310. {mycode → mycode_cli}/server/static/assets/purescript-CklMAg4u.js +0 -0
  311. {mycode → mycode_cli}/server/static/assets/python-B6aJPvgy.js +0 -0
  312. {mycode → mycode_cli}/server/static/assets/qml-3beO22l8.js +0 -0
  313. {mycode → mycode_cli}/server/static/assets/qmldir-C8lEn-DE.js +0 -0
  314. {mycode → mycode_cli}/server/static/assets/qss-IeuSbFQv.js +0 -0
  315. {mycode → mycode_cli}/server/static/assets/r-Dspwwk_N.js +0 -0
  316. {mycode → mycode_cli}/server/static/assets/racket-BqYA7rlc.js +0 -0
  317. {mycode → mycode_cli}/server/static/assets/raku-DXvB9xmW.js +0 -0
  318. {mycode → mycode_cli}/server/static/assets/razor-BDqjjVU7.js +0 -0
  319. {mycode → mycode_cli}/server/static/assets/red-bN70gL4F.js +0 -0
  320. {mycode → mycode_cli}/server/static/assets/reg-C-SQnVFl.js +0 -0
  321. {mycode → mycode_cli}/server/static/assets/regexp-CDVJQ6XC.js +0 -0
  322. {mycode → mycode_cli}/server/static/assets/rel-C3B-1QV4.js +0 -0
  323. {mycode → mycode_cli}/server/static/assets/riscv-BM1_JUlF.js +0 -0
  324. {mycode → mycode_cli}/server/static/assets/ron-D8l8udqQ.js +0 -0
  325. {mycode → mycode_cli}/server/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
  326. {mycode → mycode_cli}/server/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
  327. {mycode → mycode_cli}/server/static/assets/rose-pine-qdsjHGoJ.js +0 -0
  328. {mycode → mycode_cli}/server/static/assets/rosmsg-BJDFO7_C.js +0 -0
  329. {mycode → mycode_cli}/server/static/assets/rst-CRjBmOyv.js +0 -0
  330. {mycode → mycode_cli}/server/static/assets/ruby-Wjq7vjNf.js +0 -0
  331. {mycode → mycode_cli}/server/static/assets/rust-B1yitclQ.js +0 -0
  332. {mycode → mycode_cli}/server/static/assets/sas-cz2c8ADy.js +0 -0
  333. {mycode → mycode_cli}/server/static/assets/sass-Cj5Yp3dK.js +0 -0
  334. {mycode → mycode_cli}/server/static/assets/scala-C151Ov-r.js +0 -0
  335. {mycode → mycode_cli}/server/static/assets/scheme-C98Dy4si.js +0 -0
  336. {mycode → mycode_cli}/server/static/assets/scss-D5BDwBP9.js +0 -0
  337. {mycode → mycode_cli}/server/static/assets/sdbl-DVxCFoDh.js +0 -0
  338. {mycode → mycode_cli}/server/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
  339. {mycode → mycode_cli}/server/static/assets/shellscript-Yzrsuije.js +0 -0
  340. {mycode → mycode_cli}/server/static/assets/shellsession-BADoaaVG.js +0 -0
  341. {mycode → mycode_cli}/server/static/assets/slack-dark-BthQWCQV.js +0 -0
  342. {mycode → mycode_cli}/server/static/assets/slack-ochin-DqwNpetd.js +0 -0
  343. {mycode → mycode_cli}/server/static/assets/smalltalk-BERRCDM3.js +0 -0
  344. {mycode → mycode_cli}/server/static/assets/snazzy-light-Bw305WKR.js +0 -0
  345. {mycode → mycode_cli}/server/static/assets/solarized-dark-DXbdFlpD.js +0 -0
  346. {mycode → mycode_cli}/server/static/assets/solarized-light-L9t79GZl.js +0 -0
  347. {mycode → mycode_cli}/server/static/assets/solidity-rGO070M0.js +0 -0
  348. {mycode → mycode_cli}/server/static/assets/soy-8wufbnw4.js +0 -0
  349. {mycode → mycode_cli}/server/static/assets/sparql-rVzFXLq3.js +0 -0
  350. {mycode → mycode_cli}/server/static/assets/splunk-BtCnVYZw.js +0 -0
  351. {mycode → mycode_cli}/server/static/assets/sql-BLtJtn59.js +0 -0
  352. {mycode → mycode_cli}/server/static/assets/ssh-config-_ykCGR6B.js +0 -0
  353. {mycode → mycode_cli}/server/static/assets/stata-BH5u7GGu.js +0 -0
  354. {mycode → mycode_cli}/server/static/assets/stylus-BEDo0Tqx.js +0 -0
  355. {mycode → mycode_cli}/server/static/assets/surrealql-Bq5Q-fJD.js +0 -0
  356. {mycode → mycode_cli}/server/static/assets/svelte-Cy7k_4gC.js +0 -0
  357. {mycode → mycode_cli}/server/static/assets/swift-D82vCrfD.js +0 -0
  358. {mycode → mycode_cli}/server/static/assets/synthwave-84-CbfX1IO0.js +0 -0
  359. {mycode → mycode_cli}/server/static/assets/system-verilog-CnnmHF94.js +0 -0
  360. {mycode → mycode_cli}/server/static/assets/systemd-4A_iFExJ.js +0 -0
  361. {mycode → mycode_cli}/server/static/assets/talonscript-CkByrt1z.js +0 -0
  362. {mycode → mycode_cli}/server/static/assets/tasl-QIJgUcNo.js +0 -0
  363. {mycode → mycode_cli}/server/static/assets/tcl-dwOrl1Do.js +0 -0
  364. {mycode → mycode_cli}/server/static/assets/templ-DhtptRzy.js +0 -0
  365. {mycode → mycode_cli}/server/static/assets/terraform-BETggiCN.js +0 -0
  366. {mycode → mycode_cli}/server/static/assets/tex-idrVyKtj.js +0 -0
  367. {mycode → mycode_cli}/server/static/assets/tokyo-night-hegEt444.js +0 -0
  368. {mycode → mycode_cli}/server/static/assets/toml-vGWfd6FD.js +0 -0
  369. {mycode → mycode_cli}/server/static/assets/ts-tags-DQrlYJgV.js +0 -0
  370. {mycode → mycode_cli}/server/static/assets/tsv-B_m7g4N7.js +0 -0
  371. {mycode → mycode_cli}/server/static/assets/tsx-COt5Ahok.js +0 -0
  372. {mycode → mycode_cli}/server/static/assets/turtle-BsS91CYL.js +0 -0
  373. {mycode → mycode_cli}/server/static/assets/twig-xg9kU7Mw.js +0 -0
  374. {mycode → mycode_cli}/server/static/assets/typescript-BPQ3VLAy.js +0 -0
  375. {mycode → mycode_cli}/server/static/assets/typespec-CAFt9gP4.js +0 -0
  376. {mycode → mycode_cli}/server/static/assets/typst-DHCkPAjA.js +0 -0
  377. {mycode → mycode_cli}/server/static/assets/v-BcVCzyr7.js +0 -0
  378. {mycode → mycode_cli}/server/static/assets/vala-CsfeWuGM.js +0 -0
  379. {mycode → mycode_cli}/server/static/assets/vb-D17OF-Vu.js +0 -0
  380. {mycode → mycode_cli}/server/static/assets/verilog-BQ8w6xss.js +0 -0
  381. {mycode → mycode_cli}/server/static/assets/vesper-DU1UobuO.js +0 -0
  382. {mycode → mycode_cli}/server/static/assets/vhdl-CeAyd5Ju.js +0 -0
  383. {mycode → mycode_cli}/server/static/assets/viml-CJc9bBzg.js +0 -0
  384. {mycode → mycode_cli}/server/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
  385. {mycode → mycode_cli}/server/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
  386. {mycode → mycode_cli}/server/static/assets/vitesse-light-CVO1_9PV.js +0 -0
  387. {mycode → mycode_cli}/server/static/assets/vue-D2xRrEX4.js +0 -0
  388. {mycode → mycode_cli}/server/static/assets/vue-html-AaS7Mt5G.js +0 -0
  389. {mycode → mycode_cli}/server/static/assets/vue-vine-BoDAl6tE.js +0 -0
  390. {mycode → mycode_cli}/server/static/assets/vyper-CDx5xZoG.js +0 -0
  391. {mycode → mycode_cli}/server/static/assets/wasm-CG6Dc4jp.js +0 -0
  392. {mycode → mycode_cli}/server/static/assets/wasm-MzD3tlZU.js +0 -0
  393. {mycode → mycode_cli}/server/static/assets/wenyan-BV7otONQ.js +0 -0
  394. {mycode → mycode_cli}/server/static/assets/wgsl-Dx-B1_4e.js +0 -0
  395. {mycode → mycode_cli}/server/static/assets/wikitext-BhOHFoWU.js +0 -0
  396. {mycode → mycode_cli}/server/static/assets/wit-5i3qLPDT.js +0 -0
  397. {mycode → mycode_cli}/server/static/assets/wolfram-lXgVvXCa.js +0 -0
  398. {mycode → mycode_cli}/server/static/assets/xml-sdJ4AIDG.js +0 -0
  399. {mycode → mycode_cli}/server/static/assets/xsl-CtQFsRM5.js +0 -0
  400. {mycode → mycode_cli}/server/static/assets/yaml-Buea-lGh.js +0 -0
  401. {mycode → mycode_cli}/server/static/assets/zenscript-DVFEvuxE.js +0 -0
  402. {mycode → mycode_cli}/server/static/assets/zig-VOosw3JB.js +0 -0
  403. {mycode → mycode_cli}/server/static/favicon_slashes.svg +0 -0
  404. {mycode → mycode_cli}/server/static/index.html +0 -0
  405. {mycode/cli → mycode_cli/tui}/theme.py +0 -0
  406. {mycode_cli-0.3.4.dist-info → mycode_cli-0.4.2.dist-info}/WHEEL +0 -0
  407. {mycode_cli-0.3.4.dist-info → mycode_cli-0.4.2.dist-info}/licenses/LICENSE +0 -0
mycode_cli/__init__.py ADDED
@@ -0,0 +1 @@
1
+ """mycode-cli — interactive CLI and FastAPI server for the mycode agent."""
@@ -13,12 +13,12 @@ import json
13
13
  import logging
14
14
  import os
15
15
  import re
16
- from dataclasses import dataclass, field, replace
16
+ from dataclasses import dataclass, field
17
17
  from pathlib import Path
18
18
  from typing import Any
19
19
 
20
- from mycode.core.models import ModelMetadata, lookup_model_metadata
21
- from mycode.core.providers import (
20
+ from mycode.models import resolve_model_metadata
21
+ from mycode.providers import (
22
22
  get_provider_adapter,
23
23
  is_supported_provider,
24
24
  list_env_discoverable_providers,
@@ -27,11 +27,15 @@ from mycode.core.providers import (
27
27
  provider_default_models,
28
28
  provider_env_api_key_names,
29
29
  )
30
- from mycode.core.utils import as_bool, as_int
30
+ from mycode.session import resolve_mycode_home
31
+ from mycode.utils import as_bool, as_int
31
32
 
32
- _DEFAULT_MYCODE_HOME = "~/.mycode"
33
33
  _API_KEY_ENV_REF_RE = re.compile(r"^\$\{([A-Za-z_][A-Za-z0-9_]*)\}$")
34
- _VALID_REASONING_EFFORTS = ("none", "low", "medium", "high", "xhigh")
34
+ # Full set of user-facing choices. "auto" means "do not send an explicit effort
35
+ # to the provider" and is represented internally as `None` after normalization.
36
+ REASONING_EFFORT_OPTIONS = ("auto", "none", "low", "medium", "high", "xhigh")
37
+ _EFFORT_AUTO_ALIASES = frozenset({"", "auto", "default"})
38
+ _EFFORT_OFF_ALIASES = frozenset({"off", "disabled"})
35
39
 
36
40
 
37
41
  @dataclass(frozen=True)
@@ -76,30 +80,8 @@ class ResolvedProvider:
76
80
  api_key: str | None
77
81
  api_base: str | None
78
82
  reasoning_effort: str | None
79
- max_tokens: int = 16_384
80
- context_window: int | None = 128_000
81
- supports_reasoning: bool | None = None
82
- supports_image_input: bool | None = None
83
- supports_pdf_input: bool | None = None
84
83
  provider_name: str | None = None
85
84
 
86
- @property
87
- def provider_type(self) -> str:
88
- return self.provider
89
-
90
-
91
- def resolve_mycode_home() -> Path:
92
- """Resolve the mycode home directory."""
93
-
94
- raw = os.environ.get("MYCODE_HOME", _DEFAULT_MYCODE_HOME)
95
- return Path(raw).expanduser().resolve(strict=False)
96
-
97
-
98
- def resolve_sessions_dir() -> Path:
99
- """Resolve the default directory used for persisted sessions."""
100
-
101
- return resolve_mycode_home() / "sessions"
102
-
103
85
 
104
86
  def find_workspace_root(cwd: str) -> Path:
105
87
  """Resolve the project/workspace root for the current cwd."""
@@ -183,15 +165,28 @@ def _parse_compact_threshold(value: Any) -> float | None:
183
165
 
184
166
 
185
167
  def normalize_reasoning_effort(value: Any) -> str | None:
186
- if not isinstance(value, str):
168
+ """Normalize a reasoning effort setting.
169
+
170
+ Returns `None` for "auto"/"default"/empty — the sentinel for "do not send an
171
+ explicit effort to the provider". Returns "none" for "off"/"disabled" and
172
+ a canonical tier string for recognized levels. Raises `ValueError` for any
173
+ other string (or non-string, non-None value).
174
+ """
175
+
176
+ if value is None:
187
177
  return None
178
+ if not isinstance(value, str):
179
+ raise ValueError(f"reasoning_effort must be a string, got {type(value).__name__}")
188
180
 
189
181
  effort = value.strip().lower()
190
- if effort in {"", "auto", "default"}:
182
+ if effort in _EFFORT_AUTO_ALIASES:
191
183
  return None
192
- if effort in {"off", "disabled"}:
184
+ if effort in _EFFORT_OFF_ALIASES:
193
185
  return "none"
194
- return effort
186
+ if effort in REASONING_EFFORT_OPTIONS:
187
+ return effort
188
+ supported = ", ".join(REASONING_EFFORT_OPTIONS)
189
+ raise ValueError(f"unsupported reasoning_effort {value!r}; supported: {supported}")
195
190
 
196
191
 
197
192
  def _config_api_key_from_env_var(provider: ProviderConfig, *, require: bool = False) -> str | None:
@@ -453,43 +448,6 @@ def _resolve_provider_runtime(
453
448
  resolved_model = defaults[0]
454
449
 
455
450
  resolved_api_base = api_base or (provider_config.base_url if provider_config else None)
456
- model_metadata = lookup_model_metadata(
457
- provider_type=provider_type,
458
- model=resolved_model,
459
- )
460
- if provider_config:
461
- model_config = provider_config.models.get(resolved_model)
462
- if model_config:
463
- if model_metadata is None:
464
- model_metadata = ModelMetadata(
465
- provider=provider_type,
466
- model=resolved_model,
467
- context_window=model_config.context_window,
468
- max_output_tokens=model_config.max_output_tokens,
469
- supports_reasoning=model_config.supports_reasoning,
470
- supports_image_input=model_config.supports_image_input,
471
- supports_pdf_input=model_config.supports_pdf_input,
472
- )
473
- else:
474
- # Per-field: use the config override when set, keep catalog value otherwise.
475
- model_metadata = replace(
476
- model_metadata,
477
- context_window=model_config.context_window
478
- if model_config.context_window is not None
479
- else model_metadata.context_window,
480
- max_output_tokens=model_config.max_output_tokens
481
- if model_config.max_output_tokens is not None
482
- else model_metadata.max_output_tokens,
483
- supports_reasoning=model_config.supports_reasoning
484
- if model_config.supports_reasoning is not None
485
- else model_metadata.supports_reasoning,
486
- supports_image_input=model_config.supports_image_input
487
- if model_config.supports_image_input is not None
488
- else model_metadata.supports_image_input,
489
- supports_pdf_input=model_config.supports_pdf_input
490
- if model_config.supports_pdf_input is not None
491
- else model_metadata.supports_pdf_input,
492
- )
493
451
 
494
452
  configured_effort = (
495
453
  provider_config.reasoning_effort
@@ -497,22 +455,18 @@ def _resolve_provider_runtime(
497
455
  else settings.default_reasoning_effort
498
456
  )
499
457
 
500
- if configured_effort is not None and configured_effort not in _VALID_REASONING_EFFORTS:
501
- supported = ", ".join(_VALID_REASONING_EFFORTS)
502
- raise ValueError(f"unsupported reasoning_effort {configured_effort!r}; supported: {supported}")
503
-
504
- supports_reasoning = model_metadata.supports_reasoning if model_metadata else None
505
- supports_image_input = model_metadata.supports_image_input if model_metadata else None
506
- supports_pdf_input = model_metadata.supports_pdf_input if model_metadata else None
458
+ # Drop reasoning_effort when the model does not support reasoning. Config
459
+ # overrides win over catalog metadata.
460
+ model_config = provider_config.models.get(resolved_model) if provider_config else None
461
+ meta = resolve_model_metadata(
462
+ provider=provider_type,
463
+ model=resolved_model,
464
+ supports_reasoning=model_config.supports_reasoning if model_config else None,
465
+ )
507
466
  adapter = get_provider_adapter(provider_type)
508
467
  reasoning_effort = (
509
468
  configured_effort
510
- if (
511
- configured_effort is not None
512
- and model_metadata is not None
513
- and supports_reasoning is True
514
- and adapter.supports_reasoning_effort
515
- )
469
+ if configured_effort is not None and meta.supports_reasoning is True and adapter.supports_reasoning_effort
516
470
  else None
517
471
  )
518
472
 
@@ -536,11 +490,6 @@ def _resolve_provider_runtime(
536
490
  api_key=resolved_api_key,
537
491
  api_base=resolved_api_base,
538
492
  reasoning_effort=reasoning_effort,
539
- max_tokens=(model_metadata.max_output_tokens if model_metadata else None) or 16_384,
540
- context_window=(model_metadata.context_window if model_metadata else None) or 128_000,
541
- supports_reasoning=supports_reasoning,
542
- supports_image_input=supports_image_input,
543
- supports_pdf_input=supports_pdf_input,
544
493
  )
545
494
 
546
495
 
@@ -5,43 +5,37 @@ from __future__ import annotations
5
5
  import asyncio
6
6
  import os
7
7
  import sys
8
+ from dataclasses import dataclass
8
9
  from typing import Annotated
9
10
 
10
11
  import typer
11
12
 
12
- from mycode.core.agent import Agent
13
- from mycode.core.config import get_settings, resolve_provider
14
- from mycode.core.messages import ConversationMessage
15
- from mycode.core.session import SessionStore
13
+ from mycode.agent import Agent
14
+ from mycode.messages import ConversationMessage
15
+ from mycode.session import SessionStore
16
+ from mycode_cli.config import ResolvedProvider, Settings, get_settings, resolve_provider
16
17
 
17
- from .chat import TerminalChat
18
- from .render import TerminalView
19
- from .runtime import append_session_message, build_agent, resolve_session
18
+ from .runtime import ResolvedSession, build_agent, resolve_session
19
+ from .tui.chat import TerminalChat
20
+ from .tui.render import TerminalView
20
21
 
21
22
  app = typer.Typer(add_completion=False, pretty_exceptions_enable=False)
22
23
  session_app = typer.Typer(help="Session management")
23
24
  app.add_typer(session_app, name="session")
24
25
 
25
26
 
26
- async def run_noninteractive(
27
- agent: Agent,
28
- *,
29
- store: SessionStore,
30
- session_id: str,
31
- message: str,
32
- ) -> int:
27
+ async def run_noninteractive(agent: Agent, message: str) -> int:
33
28
  """Run one message non-interactively and print only the final assistant reply."""
34
29
 
35
30
  latest_assistant: ConversationMessage | None = None
36
31
 
37
- async def persist(payload: ConversationMessage) -> None:
32
+ async def track(payload: ConversationMessage) -> None:
38
33
  nonlocal latest_assistant
39
34
  if payload.get("role") == "assistant":
40
35
  latest_assistant = payload
41
- await append_session_message(store, session_id, payload, agent=agent)
42
36
 
43
37
  error_message = ""
44
- async for event in agent.achat(message, on_persist=persist):
38
+ async for event in agent.achat(message, on_persist=track):
45
39
  if event.type == "error":
46
40
  error_message = str(event.data.get("message") or "agent error")
47
41
 
@@ -64,31 +58,28 @@ async def run_noninteractive(
64
58
  return 0
65
59
 
66
60
 
67
- def _validate_session_options(session: str | None, continue_last: bool) -> None:
68
- """Reject conflicting --session and --continue options."""
69
-
70
- if session and continue_last:
71
- raise typer.BadParameter("--session and --continue are mutually exclusive")
72
-
61
+ @dataclass
62
+ class _BootstrapContext:
63
+ store: SessionStore
64
+ view: TerminalView
65
+ settings: Settings
66
+ resolved_provider: ResolvedProvider
67
+ resolved_session: ResolvedSession
68
+ agent: Agent
73
69
 
74
- # -- Commands ----------------------------------------------------------------
75
70
 
71
+ def _bootstrap(
72
+ *,
73
+ provider: str | None,
74
+ model: str | None,
75
+ session: str | None,
76
+ continue_last: bool,
77
+ max_turns: int | None,
78
+ ) -> _BootstrapContext:
79
+ """Shared setup for the chat and run commands."""
76
80
 
77
- @app.callback(invoke_without_command=True)
78
- def chat(
79
- ctx: typer.Context,
80
- provider: Annotated[str | None, typer.Option(help="Provider id or configured alias")] = None,
81
- model: Annotated[str | None, typer.Option(help="Model name (overrides default)")] = None,
82
- max_turns: Annotated[int | None, typer.Option(min=1, help="Limit agent loop turns")] = None,
83
- session: Annotated[str | None, typer.Option(help="Resume a specific session id")] = None,
84
- continue_last: Annotated[bool, typer.Option("--continue", "-c", help="Resume the most recent session")] = False,
85
- ) -> None:
86
- """Interactive coding agent."""
87
-
88
- if ctx.invoked_subcommand is not None:
89
- return
90
-
91
- _validate_session_options(session, continue_last)
81
+ if session and continue_last:
82
+ raise typer.BadParameter("--session and --continue are mutually exclusive")
92
83
 
93
84
  cwd = os.path.abspath(os.getcwd())
94
85
  store = SessionStore()
@@ -117,28 +108,65 @@ def chat(
117
108
  cwd=cwd,
118
109
  settings=settings,
119
110
  resolved_provider=resolved_provider,
111
+ session_id=resolved_session.session_id,
112
+ messages=resolved_session.messages,
113
+ max_turns=max_turns,
114
+ )
115
+
116
+ return _BootstrapContext(
117
+ store=store,
118
+ view=view,
119
+ settings=settings,
120
+ resolved_provider=resolved_provider,
120
121
  resolved_session=resolved_session,
122
+ agent=agent,
123
+ )
124
+
125
+
126
+ # -- Commands ----------------------------------------------------------------
127
+
128
+
129
+ @app.callback(invoke_without_command=True)
130
+ def chat(
131
+ ctx: typer.Context,
132
+ provider: Annotated[str | None, typer.Option(help="Provider id or configured alias")] = None,
133
+ model: Annotated[str | None, typer.Option(help="Model name (overrides default)")] = None,
134
+ max_turns: Annotated[int | None, typer.Option(min=1, help="Limit agent loop turns")] = None,
135
+ session: Annotated[str | None, typer.Option(help="Resume a specific session id")] = None,
136
+ continue_last: Annotated[bool, typer.Option("--continue", "-c", help="Resume the most recent session")] = False,
137
+ ) -> None:
138
+ """Interactive coding agent."""
139
+
140
+ if ctx.invoked_subcommand is not None:
141
+ return
142
+
143
+ setup = _bootstrap(
144
+ provider=provider,
145
+ model=model,
146
+ session=session,
147
+ continue_last=continue_last,
121
148
  max_turns=max_turns,
122
149
  )
123
150
 
124
- view.print_header(
125
- provider=resolved_provider.provider,
126
- model=resolved_provider.model,
127
- session=resolved_session.session,
128
- mode=resolved_session.mode,
129
- message_count=len(resolved_session.messages),
130
- reasoning_effort=resolved_provider.reasoning_effort,
151
+ setup.view.print_header(
152
+ provider=setup.resolved_provider.provider,
153
+ model=setup.resolved_provider.model,
154
+ session=setup.resolved_session.session,
155
+ mode=setup.resolved_session.mode,
156
+ message_count=len(setup.resolved_session.messages),
157
+ reasoning_effort=setup.resolved_provider.reasoning_effort,
131
158
  )
132
- if resolved_session.mode == "resumed":
133
- view.print_history_preview(resolved_session.messages)
159
+ if setup.resolved_session.mode == "resumed":
160
+ setup.view.print_history_preview(setup.resolved_session.messages)
134
161
 
135
162
  try:
136
163
  asyncio.run(
137
164
  TerminalChat(
138
- agent=agent,
139
- store=store,
140
- session_id=resolved_session.session_id,
141
- view=view,
165
+ agent=setup.agent,
166
+ settings=setup.settings,
167
+ store=setup.store,
168
+ session_id=setup.resolved_session.session_id,
169
+ view=setup.view,
142
170
  ).run()
143
171
  )
144
172
  except KeyboardInterrupt:
@@ -156,47 +184,15 @@ def run(
156
184
  ) -> None:
157
185
  """Send one message and exit."""
158
186
 
159
- _validate_session_options(session, continue_last)
160
-
161
- cwd = os.path.abspath(os.getcwd())
162
- store = SessionStore()
163
- view = TerminalView()
164
- settings = get_settings(cwd)
165
-
166
- try:
167
- resolved_provider = resolve_provider(settings, provider_name=provider, model=model)
168
- resolved_session = asyncio.run(
169
- resolve_session(
170
- store=store,
171
- provider=resolved_provider.provider,
172
- cwd=cwd,
173
- model=resolved_provider.model,
174
- api_base=resolved_provider.api_base,
175
- requested_session_id=session,
176
- continue_last=continue_last,
177
- )
178
- )
179
- except ValueError as exc:
180
- view.console.print(f"[red]{exc}[/red]")
181
- raise SystemExit(1) from exc
182
-
183
- agent = build_agent(
184
- store=store,
185
- cwd=cwd,
186
- settings=settings,
187
- resolved_provider=resolved_provider,
188
- resolved_session=resolved_session,
187
+ setup = _bootstrap(
188
+ provider=provider,
189
+ model=model,
190
+ session=session,
191
+ continue_last=continue_last,
189
192
  max_turns=max_turns,
190
193
  )
191
194
 
192
- code = asyncio.run(
193
- run_noninteractive(
194
- agent,
195
- store=store,
196
- session_id=resolved_session.session_id,
197
- message=" ".join(message).strip(),
198
- )
199
- )
195
+ code = asyncio.run(run_noninteractive(setup.agent, " ".join(message).strip()))
200
196
  raise SystemExit(code)
201
197
 
202
198
 
@@ -214,7 +210,7 @@ def web(
214
210
 
215
211
  import uvicorn
216
212
 
217
- from mycode.server.app import create_app
213
+ from mycode_cli.server.app import create_app
218
214
 
219
215
  uvicorn.run(create_app(serve_web=not dev), host=hostname, port=resolved_port)
220
216
 
@@ -5,17 +5,17 @@ from __future__ import annotations
5
5
  from dataclasses import dataclass
6
6
  from typing import Any
7
7
 
8
- from mycode.core.agent import Agent
9
- from mycode.core.config import ResolvedProvider, Settings, get_settings, provider_has_api_key, resolve_provider
10
- from mycode.core.providers import (
8
+ from mycode.agent import Agent
9
+ from mycode.providers import (
11
10
  get_provider_adapter,
12
11
  list_env_discoverable_providers,
13
12
  provider_api_key_from_env,
14
13
  provider_default_models,
15
14
  )
16
- from mycode.core.session import SessionStore
17
-
18
- REASONING_EFFORT_OPTIONS = ("auto", "none", "low", "medium", "high", "xhigh")
15
+ from mycode.session import SessionStore
16
+ from mycode.tools import DEFAULT_TOOL_SPECS
17
+ from mycode_cli.config import ModelConfig, ResolvedProvider, Settings, provider_has_api_key
18
+ from mycode_cli.system_prompt import build_system_prompt
19
19
 
20
20
 
21
21
  @dataclass
@@ -47,31 +47,45 @@ def build_agent(
47
47
  cwd: str,
48
48
  settings: Settings,
49
49
  resolved_provider: ResolvedProvider,
50
- resolved_session: ResolvedSession,
51
- max_turns: int | None,
50
+ session_id: str,
51
+ messages: list[dict[str, Any]] | None = None,
52
+ max_turns: int | None = None,
53
+ reasoning_effort: str | None = None,
52
54
  ) -> Agent:
53
- """Build the CLI agent from the resolved provider and session."""
55
+ """Build an agent from the resolved provider, honoring model config overrides."""
54
56
 
57
+ model_config = _model_config_for(settings, resolved_provider)
55
58
  return Agent(
56
59
  model=resolved_provider.model,
57
60
  provider=resolved_provider.provider,
58
61
  cwd=cwd,
59
- session_dir=store.session_dir(resolved_session.session_id),
60
- session_id=resolved_session.session_id,
62
+ session_dir=store.session_dir(session_id),
63
+ session_id=session_id,
61
64
  api_key=resolved_provider.api_key,
62
65
  api_base=resolved_provider.api_base,
63
- messages=resolved_session.messages,
64
- settings=settings,
65
- reasoning_effort=resolved_provider.reasoning_effort,
66
- supports_image_input=resolved_provider.supports_image_input,
67
- supports_pdf_input=resolved_provider.supports_pdf_input,
68
- max_tokens=resolved_provider.max_tokens,
69
- context_window=resolved_provider.context_window,
66
+ messages=messages,
67
+ reasoning_effort=reasoning_effort if reasoning_effort is not None else resolved_provider.reasoning_effort,
68
+ max_tokens=model_config.max_output_tokens if model_config else None,
69
+ context_window=model_config.context_window if model_config else None,
70
+ supports_reasoning=model_config.supports_reasoning if model_config else None,
71
+ supports_image_input=model_config.supports_image_input if model_config else None,
72
+ supports_pdf_input=model_config.supports_pdf_input if model_config else None,
70
73
  compact_threshold=settings.compact_threshold,
71
74
  max_turns=max_turns,
75
+ system=build_system_prompt(cwd, settings),
76
+ tools=DEFAULT_TOOL_SPECS,
72
77
  )
73
78
 
74
79
 
80
+ def _model_config_for(settings: Settings, resolved: ResolvedProvider) -> ModelConfig | None:
81
+ """Return the user-configured overrides for the resolved provider+model, if any."""
82
+
83
+ provider_config = settings.providers.get(resolved.provider_name or "")
84
+ if provider_config is None:
85
+ return None
86
+ return provider_config.models.get(resolved.model)
87
+
88
+
75
89
  def clone_agent(agent: Agent, *, store: SessionStore, session_id: str, messages: list[dict[str, Any]]) -> Agent:
76
90
  """Keep the current runtime config while swapping session state."""
77
91
 
@@ -86,29 +100,14 @@ def clone_agent(agent: Agent, *, store: SessionStore, session_id: str, messages:
86
100
  messages=messages,
87
101
  max_turns=agent.max_turns,
88
102
  max_tokens=agent.max_tokens,
103
+ context_window=agent.context_window,
104
+ compact_threshold=agent.compact_threshold,
89
105
  reasoning_effort=agent.reasoning_effort,
106
+ supports_reasoning=agent.supports_reasoning,
90
107
  supports_image_input=agent.supports_image_input,
91
108
  supports_pdf_input=agent.supports_pdf_input,
92
- settings=agent.settings,
93
- )
94
-
95
-
96
- async def append_session_message(
97
- store: SessionStore,
98
- session_id: str,
99
- message: dict[str, Any],
100
- *,
101
- agent: Agent,
102
- ) -> None:
103
- """Persist one message with the current agent runtime metadata."""
104
-
105
- await store.append_message(
106
- session_id,
107
- message,
108
- provider=agent.provider,
109
- model=agent.model,
110
- cwd=agent.cwd,
111
- api_base=agent.api_base,
109
+ system=agent.system,
110
+ tools=DEFAULT_TOOL_SPECS,
112
111
  )
113
112
 
114
113
 
@@ -158,37 +157,15 @@ def get_provider_option(settings: Settings, *, provider: str, api_base: str | No
158
157
  def list_model_options(settings: Settings, *, provider: str, api_base: str | None, current_model: str) -> list[str]:
159
158
  """Return the selectable model list for the current provider runtime."""
160
159
 
161
- models = [current_model, *provider_default_models(provider)]
162
- for option in list_provider_options(settings):
163
- if option.provider == provider and option.api_base == api_base:
164
- models = [current_model, *option.models]
165
- break
166
- return list(dict.fromkeys(models))
160
+ option = get_provider_option(settings, provider=provider, api_base=api_base)
161
+ models = option.models if option else provider_default_models(provider)
162
+ return list(dict.fromkeys([current_model, *models]))
167
163
 
168
164
 
169
165
  def supports_reasoning_effort(agent: Agent) -> bool:
170
166
  """Return whether the current agent provider+model supports reasoning effort."""
171
167
 
172
- adapter = get_provider_adapter(agent.provider)
173
- if not adapter.supports_reasoning_effort:
174
- return False
175
- option = get_provider_option(agent.settings, provider=agent.provider, api_base=agent.api_base)
176
- resolved = resolve_provider(
177
- agent.settings,
178
- provider_name=option.name if option else agent.provider,
179
- model=agent.model,
180
- api_base=agent.api_base,
181
- )
182
- return resolved.supports_reasoning is True
183
-
184
-
185
- def update_reasoning_effort(agent: Agent, effort: str | None) -> bool:
186
- """Update reasoning effort on the in-memory agent."""
187
-
188
- if effort == agent.reasoning_effort:
189
- return False
190
- agent.reasoning_effort = effort
191
- return True
168
+ return agent.supports_reasoning is True and get_provider_adapter(agent.provider).supports_reasoning_effort
192
169
 
193
170
 
194
171
  async def resolve_session(
@@ -233,31 +210,20 @@ async def resolve_session(
233
210
  return ResolvedSession(str(session.get("id") or ""), session, [], "new")
234
211
 
235
212
 
236
- async def update_agent_runtime(
237
- agent: Agent,
238
- *,
239
- provider_name: str | None,
240
- model: str | None,
241
- ) -> bool:
242
- """Update provider-related request settings on the active agent.
213
+ def apply_resolved_provider(agent: Agent, resolved: ResolvedProvider, settings: Settings) -> bool:
214
+ """Copy runtime settings from a resolved provider onto an active agent.
243
215
 
244
- This refreshes settings from disk and changes the in-memory agent runtime
245
- only. Stored session metadata remains unchanged.
216
+ Returns whether any field actually changed. Does not touch session state.
217
+ Re-derives model capability fields from metadata when the provider or model
218
+ changes so the agent reports accurate support flags.
246
219
  """
247
220
 
248
- settings = get_settings(agent.cwd)
249
- resolved = resolve_provider(settings, provider_name=provider_name, model=model)
250
-
251
221
  runtime_changed = (
252
222
  agent.provider != resolved.provider
253
223
  or agent.model != resolved.model
254
224
  or agent.api_base != resolved.api_base
255
225
  or agent.api_key != resolved.api_key
256
226
  or agent.reasoning_effort != resolved.reasoning_effort
257
- or agent.max_tokens != resolved.max_tokens
258
- or agent.context_window != resolved.context_window
259
- or agent.supports_image_input != resolved.supports_image_input
260
- or agent.supports_pdf_input != resolved.supports_pdf_input
261
227
  )
262
228
 
263
229
  agent.provider = resolved.provider
@@ -265,11 +231,14 @@ async def update_agent_runtime(
265
231
  agent.api_key = resolved.api_key
266
232
  agent.api_base = resolved.api_base
267
233
  agent.reasoning_effort = resolved.reasoning_effort
268
- agent.max_tokens = resolved.max_tokens
269
- agent.context_window = resolved.context_window
270
- agent.supports_image_input = bool(resolved.supports_image_input)
271
- agent.supports_pdf_input = bool(resolved.supports_pdf_input)
272
- agent.settings = settings
273
- if hasattr(agent, "tools") and hasattr(agent.tools, "supports_image_input"):
274
- agent.tools.supports_image_input = bool(agent.supports_image_input)
234
+
235
+ if runtime_changed:
236
+ model_config = _model_config_for(settings, resolved)
237
+ agent.refresh_capabilities(
238
+ max_tokens=model_config.max_output_tokens if model_config else None,
239
+ context_window=model_config.context_window if model_config else None,
240
+ supports_reasoning=model_config.supports_reasoning if model_config else None,
241
+ supports_image_input=model_config.supports_image_input if model_config else None,
242
+ supports_pdf_input=model_config.supports_pdf_input if model_config else None,
243
+ )
275
244
  return runtime_changed
@@ -7,8 +7,8 @@ from fastapi import FastAPI
7
7
  from fastapi.middleware.cors import CORSMiddleware
8
8
  from fastapi.staticfiles import StaticFiles
9
9
 
10
- from mycode.core.config import setup_logging
11
- from mycode.server.routers import chat_router, sessions_router, workspaces_router
10
+ from mycode_cli.config import setup_logging
11
+ from mycode_cli.server.routers import chat_router, sessions_router, workspaces_router
12
12
 
13
13
  logger = logging.getLogger(__name__)
14
14
 
@@ -7,8 +7,8 @@ from typing import Annotated
7
7
 
8
8
  from fastapi import Depends
9
9
 
10
- from mycode.core.session import SessionStore
11
- from mycode.server.run_manager import RunManager
10
+ from mycode.session import SessionStore
11
+ from mycode_cli.server.run_manager import RunManager
12
12
 
13
13
 
14
14
  @lru_cache