mycode-cli 0.1.2__tar.gz → 0.2.1__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 (487) hide show
  1. mycode_cli-0.2.1/.basedpyright/baseline.json +3 -0
  2. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/.github/workflows/ci.yml +9 -6
  3. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/.github/workflows/publish.yml +2 -2
  4. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/.pre-commit-config.yaml +7 -0
  5. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/AGENTS.md +4 -1
  6. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/PKG-INFO +3 -3
  7. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/README.md +2 -2
  8. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/docs/api.md +12 -3
  9. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/docs/config.md +4 -1
  10. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/docs/providers.md +16 -5
  11. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/docs/sessions.md +1 -1
  12. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/docs/web.md +12 -5
  13. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/hatch_build.py +3 -2
  14. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/cli/chat.py +59 -36
  15. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/cli/main.py +5 -7
  16. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/cli/render.py +8 -4
  17. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/cli/runtime.py +4 -0
  18. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/agent.py +24 -14
  19. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/config.py +52 -36
  20. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/messages.py +21 -5
  21. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/models.py +2 -0
  22. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/models_catalog.json +417 -9
  23. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/providers/anthropic_like.py +24 -9
  24. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/providers/base.py +42 -6
  25. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/providers/gemini.py +13 -12
  26. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/providers/openai_chat.py +25 -13
  27. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/providers/openai_responses.py +78 -32
  28. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/session.py +29 -16
  29. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/system_prompt.py +1 -1
  30. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/tools.py +20 -5
  31. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/utils.py +5 -0
  32. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/routers/chat.py +76 -35
  33. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/routers/sessions.py +2 -1
  34. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/run_manager.py +2 -3
  35. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/schemas.py +2 -1
  36. mycode_cli-0.1.2/mycode/server/static/assets/EditDiff-B_aujzJQ.js → mycode_cli-0.2.1/mycode/server/static/assets/EditDiff-COEpHWbJ.js +1 -1
  37. mycode_cli-0.2.1/mycode/server/static/assets/index-CGtO7YrK.js +477 -0
  38. mycode_cli-0.2.1/mycode/server/static/assets/index-DSy61xeD.css +1 -0
  39. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/index.html +2 -2
  40. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/pyproject.toml +49 -14
  41. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/scripts/build_web.py +2 -2
  42. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/scripts/update_models_catalog.py +6 -2
  43. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_agent_loop.py +5 -4
  44. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_cli.py +103 -9
  45. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_config.py +29 -0
  46. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_models.py +19 -0
  47. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_provider_adapters.py +314 -182
  48. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_rewind.py +1 -1
  49. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_tools.py +1 -1
  50. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/uv.lock +66 -1
  51. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/package.json +2 -0
  52. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/pnpm-lock.yaml +180 -0
  53. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/App.tsx +53 -26
  54. mycode_cli-0.2.1/web/src/components/Chat/InputArea.tsx +383 -0
  55. mycode_cli-0.2.1/web/src/components/Chat/MarkdownBlock.test.tsx +48 -0
  56. mycode_cli-0.2.1/web/src/components/Chat/MarkdownBlock.tsx +135 -0
  57. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Chat/MessageBubble.tsx +84 -7
  58. mycode_cli-0.2.1/web/src/hooks/useChat.test.tsx +244 -0
  59. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/hooks/useChat.ts +26 -17
  60. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/types.ts +33 -2
  61. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/messages.test.ts +62 -0
  62. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/messages.ts +69 -13
  63. mycode_cli-0.2.1/web/src/vite-env.d.ts +1 -0
  64. mycode_cli-0.1.2/mycode/server/static/assets/auto-render-xntwXHOX.js +0 -261
  65. mycode_cli-0.1.2/mycode/server/static/assets/index-BhG63UMx.css +0 -1
  66. mycode_cli-0.1.2/mycode/server/static/assets/index-DpmWOCHa.js +0 -206
  67. mycode_cli-0.1.2/mycode/server/static/assets/katex-DnJR2-55.css +0 -1
  68. mycode_cli-0.1.2/web/src/components/Chat/InputArea.tsx +0 -256
  69. mycode_cli-0.1.2/web/src/components/Chat/MarkdownBlock.tsx +0 -103
  70. mycode_cli-0.1.2/web/src/hooks/useChat.test.tsx +0 -67
  71. mycode_cli-0.1.2/web/src/vite-env.d.ts +0 -17
  72. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/.gitignore +0 -0
  73. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/LICENSE +0 -0
  74. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/biome.json +0 -0
  75. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/__init__.py +0 -0
  76. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/cli/__init__.py +0 -0
  77. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/cli/theme.py +0 -0
  78. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/__init__.py +0 -0
  79. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/providers/__init__.py +0 -0
  80. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/__init__.py +0 -0
  81. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/app.py +0 -0
  82. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/deps.py +0 -0
  83. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/routers/__init__.py +0 -0
  84. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/routers/workspaces.py +0 -0
  85. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  86. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  87. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  88. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  89. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  90. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  91. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  92. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  93. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  94. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  95. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  96. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  97. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  98. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  99. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  100. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  101. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  102. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  103. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  104. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  105. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  106. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  107. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  108. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  109. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  110. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  111. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  112. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  113. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  114. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  115. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  116. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  117. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  118. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  119. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  120. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  121. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  122. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  123. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  124. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  125. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  126. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  127. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  128. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  129. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  130. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  131. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  132. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  133. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  134. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  135. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  136. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  137. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  138. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  139. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  140. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  141. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  142. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  143. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  144. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/abap-BdImnpbu.js +0 -0
  145. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/actionscript-3-CoDkCxhg.js +0 -0
  146. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ada-bCR0ucgS.js +0 -0
  147. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/andromeeda-C4gqWexZ.js +0 -0
  148. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/angular-html-DA-rfuFy.js +0 -0
  149. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/angular-ts-BrjP3tb8.js +0 -0
  150. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/apache-Pmp26Uib.js +0 -0
  151. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/apex-D8_7TLub.js +0 -0
  152. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/apl-CORt7UWP.js +0 -0
  153. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/applescript-Co6uUVPk.js +0 -0
  154. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ara-BRHolxvo.js +0 -0
  155. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/asciidoc-Ve4PFQV2.js +0 -0
  156. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/asm-D_Q5rh1f.js +0 -0
  157. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/astro-HNnZUWAn.js +0 -0
  158. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/aurora-x-D-2ljcwZ.js +0 -0
  159. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/awk-DMzUqQB5.js +0 -0
  160. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ayu-dark-DYE7WIF3.js +0 -0
  161. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ayu-light-BA47KaF1.js +0 -0
  162. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ayu-mirage-32ctXXKs.js +0 -0
  163. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ballerina-BFfxhgS-.js +0 -0
  164. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/bat-BkioyH1T.js +0 -0
  165. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/beancount-k_qm7-4y.js +0 -0
  166. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/berry-uYugtg8r.js +0 -0
  167. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/bibtex-CHM0blh-.js +0 -0
  168. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/bicep-Bmn6On1c.js +0 -0
  169. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/bird2-BIv1doCn.js +0 -0
  170. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/blade-BjGOyj-B.js +0 -0
  171. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/bsl-BO_Y6i37.js +0 -0
  172. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/c-BIGW1oBm.js +0 -0
  173. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/c3-eo99z4R2.js +0 -0
  174. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/cadence-Bv_4Rxtq.js +0 -0
  175. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/cairo-KRGpt6FW.js +0 -0
  176. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
  177. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
  178. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
  179. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
  180. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/clarity-D53aC0YG.js +0 -0
  181. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/clojure-P80f7IUj.js +0 -0
  182. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/cmake-D1j8_8rp.js +0 -0
  183. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/cobol-nBiQ_Alo.js +0 -0
  184. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/codeowners-Bp6g37R7.js +0 -0
  185. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/codeql-DsOJ9woJ.js +0 -0
  186. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/coffee-Ch7k5sss.js +0 -0
  187. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/common-lisp-Cg-RD9OK.js +0 -0
  188. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/coq-DkFqJrB1.js +0 -0
  189. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/cpp-CofmeUqb.js +0 -0
  190. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/crystal-DNxU26gB.js +0 -0
  191. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/csharp-COcwbKMJ.js +0 -0
  192. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/css-CLj8gQPS.js +0 -0
  193. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/csv-fuZLfV_i.js +0 -0
  194. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/cue-D82EKSYY.js +0 -0
  195. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/cypher-COkxafJQ.js +0 -0
  196. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/d-85-TOEBH.js +0 -0
  197. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/dark-plus-C3mMm8J8.js +0 -0
  198. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/dart-bE4Kk8sk.js +0 -0
  199. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/dax-CEL-wOlO.js +0 -0
  200. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/desktop-BmXAJ9_W.js +0 -0
  201. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/diff-D97Zzqfu.js +0 -0
  202. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/docker-BcOcwvcX.js +0 -0
  203. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/dotenv-Da5cRb03.js +0 -0
  204. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/dracula-BzJJZx-M.js +0 -0
  205. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/dracula-soft-BXkSAIEj.js +0 -0
  206. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/dream-maker-BtqSS_iP.js +0 -0
  207. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/edge-FbVlp4U3.js +0 -0
  208. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/elixir-CkH2-t6x.js +0 -0
  209. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/elm-DbKCFpqz.js +0 -0
  210. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/emacs-lisp-CXvaQtF9.js +0 -0
  211. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/erb-BYCe7drp.js +0 -0
  212. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/erlang-DsQrWhSR.js +0 -0
  213. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/everforest-dark-BgDCqdQA.js +0 -0
  214. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/everforest-light-C8M2exoo.js +0 -0
  215. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/fennel-BYunw83y.js +0 -0
  216. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/fish-BvzEVeQv.js +0 -0
  217. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/fluent-C4IJs8-o.js +0 -0
  218. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
  219. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
  220. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/fsharp-CXgrBDvD.js +0 -0
  221. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gdresource-BOOCDP_w.js +0 -0
  222. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gdscript-C5YyOfLZ.js +0 -0
  223. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gdshader-DkwncUOv.js +0 -0
  224. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/genie-D0YGMca9.js +0 -0
  225. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gherkin-DyxjwDmM.js +0 -0
  226. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/git-commit-F4YmCXRG.js +0 -0
  227. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/git-rebase-r7XF79zn.js +0 -0
  228. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/github-dark-DHJKELXO.js +0 -0
  229. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
  230. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
  231. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
  232. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/github-light-DAi9KRSo.js +0 -0
  233. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/github-light-default-D7oLnXFd.js +0 -0
  234. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
  235. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gleam-BspZqrRM.js +0 -0
  236. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/glimmer-js-ByusRIyA.js +0 -0
  237. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/glimmer-ts-BfAWNZQY.js +0 -0
  238. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/glsl-DplSGwfg.js +0 -0
  239. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gn-n2N0HUVH.js +0 -0
  240. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gnuplot-DdkO51Og.js +0 -0
  241. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/go-C27-OAKa.js +0 -0
  242. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/graphql-ChdNCCLP.js +0 -0
  243. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/groovy-gcz8RCvz.js +0 -0
  244. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
  245. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
  246. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
  247. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
  248. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
  249. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
  250. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/hack-i7_Ulhet.js +0 -0
  251. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/haml-D5jkg6IW.js +0 -0
  252. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/handlebars-BpdQsYii.js +0 -0
  253. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/haskell-Df6bDoY_.js +0 -0
  254. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/haxe-CzTSHFRz.js +0 -0
  255. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/hcl-BWvSN4gD.js +0 -0
  256. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/hjson-D5-asLiD.js +0 -0
  257. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/hlsl-D3lLCCz7.js +0 -0
  258. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/horizon-BUw7H-hv.js +0 -0
  259. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/horizon-bright-CUuTKBJd.js +0 -0
  260. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/houston-DnULxvSX.js +0 -0
  261. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/html-derivative-DlHx6ybY.js +0 -0
  262. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/html-pp8916En.js +0 -0
  263. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/http-jrhK8wxY.js +0 -0
  264. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/hurl-irOxFIW8.js +0 -0
  265. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/hxml-Bvhsp5Yf.js +0 -0
  266. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/hy-DFXneXwc.js +0 -0
  267. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/imba-DGztddWO.js +0 -0
  268. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ini-BEwlwnbL.js +0 -0
  269. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/java-CylS5w8V.js +0 -0
  270. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/javascript-wDzz0qaB.js +0 -0
  271. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/jinja-f2NsQr07.js +0 -0
  272. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/jison-wvAkD_A8.js +0 -0
  273. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/json-Cp-IABpG.js +0 -0
  274. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/json5-C9tS-k6U.js +0 -0
  275. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/jsonc-Des-eS-w.js +0 -0
  276. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/jsonl-DcaNXYhu.js +0 -0
  277. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/jsonnet-DFQXde-d.js +0 -0
  278. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/jssm-C2t-YnRu.js +0 -0
  279. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/jsx-g9-lgVsj.js +0 -0
  280. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/julia-CxzCAyBv.js +0 -0
  281. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/just-VxiPbLrw.js +0 -0
  282. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
  283. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
  284. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
  285. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/kdl-DV7GczEv.js +0 -0
  286. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/kotlin-BdnUsdx6.js +0 -0
  287. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/kusto-wEQ09or8.js +0 -0
  288. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/laserwave-DUszq2jm.js +0 -0
  289. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/latex-CWtU0Tv5.js +0 -0
  290. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/lean-BZvkOJ9d.js +0 -0
  291. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/less-B1dDrJ26.js +0 -0
  292. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/light-plus-B7mTdjB0.js +0 -0
  293. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/liquid-C0sCDyMI.js +0 -0
  294. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/llvm-DjAJT7YJ.js +0 -0
  295. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/log-2UxHyX5q.js +0 -0
  296. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/logo-BtOb2qkB.js +0 -0
  297. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/lua-BaeVxFsk.js +0 -0
  298. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/luau-C-HG3fhB.js +0 -0
  299. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/make-CHLpvVh8.js +0 -0
  300. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/markdown-Cvjx9yec.js +0 -0
  301. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/marko-DjSrsDqO.js +0 -0
  302. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/material-theme-D5KoaKCx.js +0 -0
  303. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
  304. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
  305. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/material-theme-ocean-CyktbL80.js +0 -0
  306. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
  307. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/matlab-D7o27uSR.js +0 -0
  308. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/mdc-DTYItulj.js +0 -0
  309. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/mdx-Cmh6b_Ma.js +0 -0
  310. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/mermaid-mWjccvbQ.js +0 -0
  311. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/min-dark-CafNBF8u.js +0 -0
  312. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/min-light-CTRr51gU.js +0 -0
  313. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/mipsasm-CKIfxQSi.js +0 -0
  314. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/mojo-rZm6bMo-.js +0 -0
  315. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/monokai-D4h5O-jR.js +0 -0
  316. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/moonbit-_H4v1dQx.js +0 -0
  317. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/move-IF9eRakj.js +0 -0
  318. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/narrat-DRg8JJMk.js +0 -0
  319. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/nextflow-C-mBbutL.js +0 -0
  320. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/nextflow-groovy-vE_lwT2v.js +0 -0
  321. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/nginx-BpAMiNFr.js +0 -0
  322. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/night-owl-C39BiMTA.js +0 -0
  323. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/night-owl-light-CMTm3GFP.js +0 -0
  324. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/nim-BIad80T-.js +0 -0
  325. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/nix-CwoSXNpI.js +0 -0
  326. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/nord-Ddv68eIx.js +0 -0
  327. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/nushell-Cz2AlsmD.js +0 -0
  328. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/objective-c-DXmwc3jG.js +0 -0
  329. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/objective-cpp-CLxacb5B.js +0 -0
  330. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ocaml-C0hk2d4L.js +0 -0
  331. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/odin-BBf5iR-q.js +0 -0
  332. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
  333. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/one-light-C3Wv6jpd.js +0 -0
  334. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/openscad-C4EeE6gA.js +0 -0
  335. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/pascal-D93ZcfNL.js +0 -0
  336. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/perl-NvoQZIq0.js +0 -0
  337. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/php-R6g_5hLQ.js +0 -0
  338. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/pkl-u5AG7uiY.js +0 -0
  339. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/plastic-3e1v2bzS.js +0 -0
  340. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/plsql-ChMvpjG-.js +0 -0
  341. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/po-BTJTHyun.js +0 -0
  342. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/poimandres-CS3Unz2-.js +0 -0
  343. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/polar-C0HS_06l.js +0 -0
  344. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/postcss-CXtECtnM.js +0 -0
  345. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/powerquery-CEu0bR-o.js +0 -0
  346. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/powershell-Dpen1YoG.js +0 -0
  347. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/prisma-Dd19v3D-.js +0 -0
  348. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/prolog-CbFg5uaA.js +0 -0
  349. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/proto-C7zT0LnQ.js +0 -0
  350. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/pug-DKIMFp6K.js +0 -0
  351. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/puppet-BMWR74SV.js +0 -0
  352. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/purescript-CklMAg4u.js +0 -0
  353. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/python-B6aJPvgy.js +0 -0
  354. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/qml-3beO22l8.js +0 -0
  355. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/qmldir-C8lEn-DE.js +0 -0
  356. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/qss-IeuSbFQv.js +0 -0
  357. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/r-Dspwwk_N.js +0 -0
  358. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/racket-BqYA7rlc.js +0 -0
  359. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/raku-DXvB9xmW.js +0 -0
  360. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/razor-BDqjjVU7.js +0 -0
  361. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/red-bN70gL4F.js +0 -0
  362. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/reg-C-SQnVFl.js +0 -0
  363. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/regexp-CDVJQ6XC.js +0 -0
  364. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/rel-C3B-1QV4.js +0 -0
  365. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/riscv-BM1_JUlF.js +0 -0
  366. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ron-D8l8udqQ.js +0 -0
  367. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
  368. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
  369. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/rose-pine-qdsjHGoJ.js +0 -0
  370. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/rosmsg-BJDFO7_C.js +0 -0
  371. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/rst-CRjBmOyv.js +0 -0
  372. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ruby-Wjq7vjNf.js +0 -0
  373. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/rust-B1yitclQ.js +0 -0
  374. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/sas-cz2c8ADy.js +0 -0
  375. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/sass-Cj5Yp3dK.js +0 -0
  376. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/scala-C151Ov-r.js +0 -0
  377. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/scheme-C98Dy4si.js +0 -0
  378. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/scss-D5BDwBP9.js +0 -0
  379. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/sdbl-DVxCFoDh.js +0 -0
  380. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
  381. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/shellscript-Yzrsuije.js +0 -0
  382. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/shellsession-BADoaaVG.js +0 -0
  383. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/slack-dark-BthQWCQV.js +0 -0
  384. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/slack-ochin-DqwNpetd.js +0 -0
  385. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/smalltalk-BERRCDM3.js +0 -0
  386. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/snazzy-light-Bw305WKR.js +0 -0
  387. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/solarized-dark-DXbdFlpD.js +0 -0
  388. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/solarized-light-L9t79GZl.js +0 -0
  389. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/solidity-rGO070M0.js +0 -0
  390. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/soy-8wufbnw4.js +0 -0
  391. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/sparql-rVzFXLq3.js +0 -0
  392. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/splunk-BtCnVYZw.js +0 -0
  393. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/sql-BLtJtn59.js +0 -0
  394. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ssh-config-_ykCGR6B.js +0 -0
  395. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/stata-BH5u7GGu.js +0 -0
  396. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/stylus-BEDo0Tqx.js +0 -0
  397. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/surrealql-Bq5Q-fJD.js +0 -0
  398. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/svelte-Cy7k_4gC.js +0 -0
  399. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/swift-D82vCrfD.js +0 -0
  400. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/synthwave-84-CbfX1IO0.js +0 -0
  401. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/system-verilog-CnnmHF94.js +0 -0
  402. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/systemd-4A_iFExJ.js +0 -0
  403. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/talonscript-CkByrt1z.js +0 -0
  404. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/tasl-QIJgUcNo.js +0 -0
  405. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/tcl-dwOrl1Do.js +0 -0
  406. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/templ-DhtptRzy.js +0 -0
  407. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/terraform-BETggiCN.js +0 -0
  408. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/tex-idrVyKtj.js +0 -0
  409. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/tokyo-night-hegEt444.js +0 -0
  410. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/toml-vGWfd6FD.js +0 -0
  411. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ts-tags-DQrlYJgV.js +0 -0
  412. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/tsv-B_m7g4N7.js +0 -0
  413. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/tsx-COt5Ahok.js +0 -0
  414. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/turtle-BsS91CYL.js +0 -0
  415. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/twig-xg9kU7Mw.js +0 -0
  416. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/typescript-BPQ3VLAy.js +0 -0
  417. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/typespec-CAFt9gP4.js +0 -0
  418. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/typst-DHCkPAjA.js +0 -0
  419. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/v-BcVCzyr7.js +0 -0
  420. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vala-CsfeWuGM.js +0 -0
  421. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vb-D17OF-Vu.js +0 -0
  422. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/verilog-BQ8w6xss.js +0 -0
  423. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vesper-DU1UobuO.js +0 -0
  424. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vhdl-CeAyd5Ju.js +0 -0
  425. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/viml-CJc9bBzg.js +0 -0
  426. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
  427. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
  428. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vitesse-light-CVO1_9PV.js +0 -0
  429. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vue-D2xRrEX4.js +0 -0
  430. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vue-html-AaS7Mt5G.js +0 -0
  431. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vue-vine-BoDAl6tE.js +0 -0
  432. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vyper-CDx5xZoG.js +0 -0
  433. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/wasm-CG6Dc4jp.js +0 -0
  434. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/wasm-MzD3tlZU.js +0 -0
  435. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/wenyan-BV7otONQ.js +0 -0
  436. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/wgsl-Dx-B1_4e.js +0 -0
  437. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/wikitext-BhOHFoWU.js +0 -0
  438. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/wit-5i3qLPDT.js +0 -0
  439. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/wolfram-lXgVvXCa.js +0 -0
  440. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/xml-sdJ4AIDG.js +0 -0
  441. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/xsl-CtQFsRM5.js +0 -0
  442. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/yaml-Buea-lGh.js +0 -0
  443. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/zenscript-DVFEvuxE.js +0 -0
  444. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/zig-VOosw3JB.js +0 -0
  445. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/favicon_slashes.svg +0 -0
  446. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/scripts/__init__.py +0 -0
  447. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/scripts/release.sh +0 -0
  448. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/conftest.py +0 -0
  449. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_agent_provider_request.py +0 -0
  450. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_bash.py +0 -0
  451. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_cli_imports.py +0 -0
  452. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_compact.py +0 -0
  453. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_instructions.py +0 -0
  454. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_run_manager.py +0 -0
  455. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_server_app.py +0 -0
  456. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_session.py +0 -0
  457. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_skills.py +0 -0
  458. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/index.html +0 -0
  459. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/postcss.config.js +0 -0
  460. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/public/favicon_slashes.svg +0 -0
  461. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Chat/CodeBlock.tsx +0 -0
  462. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Chat/EditDiff.tsx +0 -0
  463. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Chat/HighlightedCode.tsx +0 -0
  464. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Chat/MessageList.tsx +0 -0
  465. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Chat/ReasoningBlock.tsx +0 -0
  466. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Chat/ToolCard.tsx +0 -0
  467. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Layout.tsx +0 -0
  468. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/MobileHeader.tsx +0 -0
  469. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Sidebar.tsx +0 -0
  470. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/ThemeProvider.tsx +0 -0
  471. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/UI/Button.tsx +0 -0
  472. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/WorkspacePicker.tsx +0 -0
  473. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/hooks/sessionSelection.test.ts +0 -0
  474. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/hooks/sessionSelection.ts +0 -0
  475. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/index.css +0 -0
  476. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/main.tsx +0 -0
  477. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/test/setup.ts +0 -0
  478. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/clipboard.ts +0 -0
  479. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/cn.ts +0 -0
  480. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/config.ts +0 -0
  481. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/highlighter.ts +0 -0
  482. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/storage.test.ts +0 -0
  483. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/storage.ts +0 -0
  484. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/tailwind.config.js +0 -0
  485. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/tsconfig.json +0 -0
  486. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/vite.config.ts +0 -0
  487. {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/vitest.config.ts +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ "files": {}
3
+ }
@@ -21,14 +21,14 @@ jobs:
21
21
  uses: astral-sh/setup-uv@v7
22
22
 
23
23
  - name: Install pnpm
24
- uses: pnpm/action-setup@v4
24
+ uses: pnpm/action-setup@v5
25
25
  with:
26
26
  version: 10
27
27
 
28
28
  - name: Install Node.js
29
29
  uses: actions/setup-node@v6
30
30
  with:
31
- node-version: 20
31
+ node-version: 24
32
32
  cache: pnpm
33
33
  cache-dependency-path: web/pnpm-lock.yaml
34
34
 
@@ -41,6 +41,9 @@ jobs:
41
41
  - name: Lint Python
42
42
  run: uv run ruff check .
43
43
 
44
+ - name: Typecheck Python
45
+ run: uv run basedpyright
46
+
44
47
  - name: Run Python tests
45
48
  run: uv run pytest
46
49
 
@@ -51,14 +54,14 @@ jobs:
51
54
  uses: actions/checkout@v6
52
55
 
53
56
  - name: Install pnpm
54
- uses: pnpm/action-setup@v4
57
+ uses: pnpm/action-setup@v5
55
58
  with:
56
59
  version: 10
57
60
 
58
61
  - name: Install Node.js
59
62
  uses: actions/setup-node@v6
60
63
  with:
61
- node-version: 20
64
+ node-version: 24
62
65
  cache: pnpm
63
66
  cache-dependency-path: web/pnpm-lock.yaml
64
67
 
@@ -84,14 +87,14 @@ jobs:
84
87
  uses: astral-sh/setup-uv@v7
85
88
 
86
89
  - name: Install pnpm
87
- uses: pnpm/action-setup@v4
90
+ uses: pnpm/action-setup@v5
88
91
  with:
89
92
  version: 10
90
93
 
91
94
  - name: Install Node.js
92
95
  uses: actions/setup-node@v6
93
96
  with:
94
- node-version: 20
97
+ node-version: 24
95
98
  cache: pnpm
96
99
  cache-dependency-path: web/pnpm-lock.yaml
97
100
 
@@ -22,14 +22,14 @@ jobs:
22
22
  uses: astral-sh/setup-uv@v7
23
23
 
24
24
  - name: Install pnpm
25
- uses: pnpm/action-setup@v4
25
+ uses: pnpm/action-setup@v5
26
26
  with:
27
27
  version: 10
28
28
 
29
29
  - name: Install Node.js
30
30
  uses: actions/setup-node@v6
31
31
  with:
32
- node-version: 20
32
+ node-version: 24
33
33
  cache: pnpm
34
34
  cache-dependency-path: web/pnpm-lock.yaml
35
35
 
@@ -12,6 +12,13 @@ repos:
12
12
  - id: check-merge-conflict
13
13
  - id: detect-private-key
14
14
 
15
+ # Markdown
16
+ - repo: https://github.com/igorshubovych/markdownlint-cli
17
+ rev: v0.48.0
18
+ hooks:
19
+ - id: markdownlint
20
+ args: ["--dot", "--fix", "--disable", "MD013", "--"]
21
+
15
22
  # Python - Ruff (linter + formatter)
16
23
  - repo: https://github.com/astral-sh/ruff-pre-commit
17
24
  rev: v0.14.13
@@ -168,11 +168,14 @@ All adapters implement `ProviderAdapter.stream_turn()`. Message projection to pr
168
168
 
169
169
  ```bash
170
170
  uv sync --dev # Python setup
171
+ uv run basedpyright # Python type checking
172
+ uv run pytest # Python tests
171
173
  uv run mycode # run CLI
172
174
  uv run mycode web --dev # API only (backend for Vite dev)
175
+ pnpm --dir web typecheck # Web UI type checking
173
176
  pnpm --dir web test:run # run web UI tests once
174
177
  pnpm --dir web dev # Vite web UI dev server
175
- uv run --no-project python scripts/build_web.py # rebuild packaged web UI
178
+ uv run --no-project python scripts/build_web.py # rebuild packaged web UI
176
179
  uv build # build wheel + sdist
177
180
  ```
178
181
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mycode-cli
3
- Version: 0.1.2
3
+ Version: 0.2.1
4
4
  Summary: Minimal coding agent with web UI
5
5
  Project-URL: Homepage, https://github.com/legibet/mycode
6
6
  Project-URL: Repository, https://github.com/legibet/mycode
@@ -41,7 +41,7 @@ A minimal coding agent. Inspired by [pi](https://github.com/badlogic/pi-mono).
41
41
  - Unified message format and robust cross-provider replay.
42
42
  - 4 built-in tools: `read`, `write`, `edit`, `bash`, expanded via skills.
43
43
  - Inspectable runtime, append-only JSONL sessions.
44
- - Native image input.
44
+ - Native image and pdf input support.
45
45
  - Mobile-friendly web UI.
46
46
 
47
47
  ## Quick Start
@@ -142,7 +142,7 @@ Config is loaded from `~/.mycode/config.json` (global) and `<workspace>/.mycode/
142
142
 
143
143
  ## CLI Reference
144
144
 
145
- ```
145
+ ```bash
146
146
  mycode start interactive session (new)
147
147
  mycode --continue resume the most recent session
148
148
  mycode --session <id> resume a specific session
@@ -8,7 +8,7 @@ A minimal coding agent. Inspired by [pi](https://github.com/badlogic/pi-mono).
8
8
  - Unified message format and robust cross-provider replay.
9
9
  - 4 built-in tools: `read`, `write`, `edit`, `bash`, expanded via skills.
10
10
  - Inspectable runtime, append-only JSONL sessions.
11
- - Native image input.
11
+ - Native image and pdf input support.
12
12
  - Mobile-friendly web UI.
13
13
 
14
14
  ## Quick Start
@@ -109,7 +109,7 @@ Config is loaded from `~/.mycode/config.json` (global) and `<workspace>/.mycode/
109
109
 
110
110
  ## CLI Reference
111
111
 
112
- ```
112
+ ```bash
113
113
  mycode start interactive session (new)
114
114
  mycode --continue resume the most recent session
115
115
  mycode --session <id> resume a specific session
@@ -36,16 +36,23 @@ Structured `input` uses `ChatInputBlock`:
36
36
  ```json
37
37
  [
38
38
  {"type": "text", "text": "describe this"},
39
+ {"type": "text", "text": "print('hi')", "name": "main.py", "is_attachment": true},
39
40
  {"type": "image", "path": "cat.png"},
40
- {"type": "image", "data": "<base64>", "mime_type": "image/png", "name": "cat.png"}
41
+ {"type": "image", "data": "<base64>", "mime_type": "image/png", "name": "cat.png"},
42
+ {"type": "document", "path": "report.pdf"},
43
+ {"type": "document", "data": "<base64>", "mime_type": "application/pdf", "name": "report.pdf"}
41
44
  ]
42
45
  ```
43
46
 
44
47
  - `type: "text"` — uses `text`
48
+ - `type: "text"` with `is_attachment=true` — wraps UTF-8 file content as the same `<file ...>` attachment text used by CLI `@file`
45
49
  - `type: "image"` — uses `path` or inline base64 `data`
50
+ - `type: "document"` — uses `path` or inline base64 `data`
46
51
  - `mime_type` is required when `data` is provided
47
52
  - `path` accepts `image/png`, `image/jpeg`, `image/gif`, `image/webp`
53
+ - `path` accepts `application/pdf` for `type: "document"`
48
54
  - The resolved model must have `supports_image_input=true`
55
+ - The resolved model must have `supports_pdf_input=true` for `type: "document"`
49
56
 
50
57
  Response:
51
58
 
@@ -95,7 +102,9 @@ Response:
95
102
  "reasoning_models": ["claude-sonnet-4-6"],
96
103
  "reasoning_effort": "auto",
97
104
  "supports_image_input": true,
98
- "image_input_models": ["claude-sonnet-4-6"]
105
+ "image_input_models": ["claude-sonnet-4-6"],
106
+ "supports_pdf_input": true,
107
+ "pdf_input_models": ["claude-sonnet-4-6"]
99
108
  }
100
109
  },
101
110
  "default": { "provider": "<provider_name>", "model": "claude-sonnet-4-6" },
@@ -107,7 +116,7 @@ Response:
107
116
  }
108
117
  ```
109
118
 
110
- `reasoning_models` is returned only when `supports_reasoning_effort` is true. `image_input_models` lists models with `supports_image_input=true`.
119
+ `reasoning_models` is returned only when `supports_reasoning_effort` is true. `image_input_models` lists models with `supports_image_input=true`. `pdf_input_models` lists models with `supports_pdf_input=true`.
111
120
 
112
121
  ## Sessions
113
122
 
@@ -31,7 +31,8 @@ Config resolution: `get_settings(cwd)` → returns `Settings` dataclass.
31
31
  "context_window": 400000,
32
32
  "max_output_tokens": 128000,
33
33
  "supports_reasoning": true,
34
- "supports_image_input": true
34
+ "supports_image_input": true,
35
+ "supports_pdf_input": true
35
36
  },
36
37
  "model-b": {}
37
38
  },
@@ -55,6 +56,7 @@ Config resolution: `get_settings(cwd)` → returns `Settings` dataclass.
55
56
  - `providers.<name>.models.<model>.max_output_tokens` — override the provider output limit
56
57
  - `providers.<name>.models.<model>.supports_reasoning` — override whether reasoning effort is available
57
58
  - `providers.<name>.models.<model>.supports_image_input` — override image input support
59
+ - `providers.<name>.models.<model>.supports_pdf_input` — override PDF input support
58
60
  - `providers.<name>.api_key` — literal value or `${ENV_NAME}` reference
59
61
  - `providers.<name>.base_url` — override the adapter's default base URL
60
62
  - `providers.<name>.reasoning_effort` — per-provider override of the global default
@@ -104,6 +106,7 @@ Options: `auto` (default) · `none` · `low` · `medium` · `high` · `xhigh`
104
106
 
105
107
  - `supports_reasoning` — whether the model supports extended thinking
106
108
  - `supports_image_input` — whether the model accepts image input
109
+ - `supports_pdf_input` — whether the model accepts PDF input
107
110
  - `context_window` — used for compact threshold calculation
108
111
  - `max_output_tokens` — passed to the provider as the output limit; defaults to `16384` when not available
109
112
  - `context_window` — defaults to `128000` when the bundled catalog does not provide one
@@ -19,17 +19,20 @@ class ProviderAdapter(ABC):
19
19
  ```
20
20
 
21
21
  `prepare_messages()` converts canonical session history to provider-safe wire format. The base implementation in `base.py` handles:
22
+
22
23
  - Stripping error/aborted/cancelled assistant turns
23
24
  - Projecting tool call IDs (some providers restrict charset/length)
24
- - Dropping replay images when `request.supports_image_input` is false
25
+ - Replacing replay images with a short text notice when `request.supports_image_input` is false
26
+ - Replacing replay PDFs with a short text notice when `request.supports_pdf_input` is false
25
27
  - Flushing interrupted tool calls with synthetic error results
26
28
 
27
29
  `stream_turn()` yields `ProviderStreamEvent` objects:
30
+
28
31
  - `thinking_delta` — reasoning text
29
32
  - `text_delta` — response text
30
33
  - `message_done` — final `ConversationMessage` with all blocks and metadata
31
34
 
32
- `ProviderRequest` carries: provider, model, session_id, messages, system, tools, max_tokens, api_key, api_base, reasoning_effort, supports_image_input.
35
+ `ProviderRequest` carries: provider, model, session_id, messages, system, tools, max_tokens, api_key, api_base, reasoning_effort, supports_image_input, supports_pdf_input.
33
36
 
34
37
  ## Adapters
35
38
 
@@ -46,6 +49,7 @@ class ProviderAdapter(ABC):
46
49
  - Adds ephemeral `cache_control` to system prompt block and last user content block
47
50
  - Tool call IDs projected to ASCII-safe format (letters, numbers, underscores, dashes, max 64 chars) with SHA1 collision suffix
48
51
  - Images serialize as Anthropic `image` blocks with base64 `source`
52
+ - PDFs serialize as Anthropic `document` blocks with base64 `source`
49
53
 
50
54
  ### `moonshotai` — `anthropic_like.py`
51
55
 
@@ -57,6 +61,7 @@ class ProviderAdapter(ABC):
57
61
  - Prior reasoning must be replayed on later tool-loop turns when thinking is enabled
58
62
  - Shares Anthropic-like ephemeral cache markers and tool call ID projection
59
63
  - Same image format as `anthropic`
64
+ - Same PDF format as `anthropic`
60
65
 
61
66
  ### `minimax` — `anthropic_like.py`
62
67
 
@@ -68,6 +73,7 @@ class ProviderAdapter(ABC):
68
73
  - Preserves provider-native thinking signatures in `block.meta.native`
69
74
  - Shares Anthropic-like ephemeral cache markers and tool call ID projection
70
75
  - Same image format as `anthropic`
76
+ - Same PDF format as `anthropic`
71
77
 
72
78
  ### `google` — `gemini.py`
73
79
 
@@ -87,6 +93,7 @@ class ProviderAdapter(ABC):
87
93
  - Gemini validates function_call id/name match between function_call and function_response pairs
88
94
  - `thinking_config.include_thoughts` always true; effort level controls `thinking_level`
89
95
  - Images serialize as `inline_data`
96
+ - PDFs serialize as `inline_data`
90
97
 
91
98
  ### `openai` — `openai_responses.py`
92
99
 
@@ -97,11 +104,12 @@ class ProviderAdapter(ABC):
97
104
  - Default models: `gpt-5.4`, `gpt-5.4-mini`
98
105
  - `supports_reasoning_effort`: true (`reasoning = {"effort": ...}`, values: `none/low/medium/high/xhigh`)
99
106
  - Runs stateless: `store=false`, `include=["reasoning.encrypted_content"]`
100
- - Native `response.output` items persisted under `assistant.meta.native.output_items` and replayed directly
107
+ - Streaming turns persist completed output items from `response.output_item.done` under `assistant.meta.native.output_items` and replay them directly
101
108
  - Tool results replay as `function_call_output`; foreign thinking never converted to OpenAI reasoning items
102
109
  - Passes `prompt_cache_key` using current session id
103
110
  - Tool schemas use `strict: true` with nullable optional parameters
104
111
  - Images serialize as `input_image`
112
+ - PDFs serialize as `input_file`
105
113
 
106
114
  ### `openai_chat` — `openai_chat.py`
107
115
 
@@ -113,6 +121,7 @@ class ProviderAdapter(ABC):
113
121
  - Preserves third-party reasoning extensions (`reasoning_content`, `reasoning_details`) from SDK extras
114
122
  - Sends `stream_options: {include_usage: true}`
115
123
  - Images serialize as `image_url` parts with data URLs
124
+ - PDFs serialize as `file` parts with base64 data URLs
116
125
 
117
126
  ### `deepseek` — `openai_chat.py`
118
127
 
@@ -143,6 +152,7 @@ class ProviderAdapter(ABC):
143
152
  - `supports_reasoning_effort`: true (forwarded through `extra_body.reasoning.effort`)
144
153
  - `auto_discoverable`: true
145
154
  - Same image format as `openai_chat`
155
+ - Same PDF format as `openai_chat`
146
156
 
147
157
  ## Reasoning Effort Mapping
148
158
 
@@ -163,7 +173,8 @@ Config-resolved `reasoning_effort` is only applied when both `adapter.supports_r
163
173
  1. Skip assistant messages with `stop_reason` in `{error, aborted, cancelled}`
164
174
  2. Project tool call IDs to provider-safe format (only Anthropic-like adapters override this)
165
175
  3. Preserve `block.meta.native` for provider-specific replay data (signatures, output items, part metadata)
166
- 4. Drop replay images when `request.supports_image_input` is false
167
- 5. Insert synthetic error tool results when pending tool calls would otherwise make replay invalid
176
+ 4. Replace replay images with a short text notice when `request.supports_image_input` is false
177
+ 5. Replace replay PDFs with a short text notice when `request.supports_pdf_input` is false
178
+ 6. Insert synthetic error tool results when pending tool calls would otherwise make replay invalid
168
179
 
169
180
  Provider-specific replay logic lives inside each adapter's serialization methods (e.g., Gemini's `_build_contents` replays native `Part` metadata, OpenAI's `_native_output_items` replays stored output items). These run after `prepare_messages()` produces the canonical replay transcript.
@@ -4,7 +4,7 @@ Source: `mycode/core/session.py`
4
4
 
5
5
  ## Storage Layout
6
6
 
7
- ```
7
+ ```text
8
8
  ~/.mycode/sessions/<session_id>/
9
9
  meta.json # session metadata
10
10
  messages.jsonl # one JSON record per line (append-only)
@@ -11,7 +11,7 @@ CORS is enabled for all origins in the FastAPI app.
11
11
 
12
12
  ## Component Structure
13
13
 
14
- ```
14
+ ```text
15
15
  web/src/
16
16
  App.tsx # root layout, config loading, session init
17
17
  main.tsx # React entry
@@ -52,11 +52,13 @@ web/src/
52
52
  ## Message State Model
53
53
 
54
54
  `useChat.ts` stores three related pieces of state:
55
+
55
56
  - `rawMessages` — canonical block messages
56
57
  - `messages` — render-ready messages
57
58
  - `toolRuntimeById` — ephemeral tool runtime state
58
59
 
59
60
  State is managed via `useReducer` with actions:
61
+
60
62
  - `set_messages` — load session history from server
61
63
  - `start_turn` — optimistic user message + empty assistant
62
64
  - `rewind_and_start_turn` — rewind + optimistic new turn
@@ -65,11 +67,13 @@ State is managed via `useReducer` with actions:
65
67
  `buildRenderMessages()` in `utils/messages.ts` is used when loading or rebuilding from canonical messages. During streaming, the reducer updates both `rawMessages` and `messages` incrementally.
66
68
 
67
69
  Key design decisions:
70
+
68
71
  - Tool results persisted as `user` messages with `tool_result` blocks are visually folded into the preceding assistant message during rendering
69
72
  - Each render message and block gets a stable `renderKey` for React reconciliation
70
73
  - `sourceIndex` tracks the original message position for scroll targeting
71
74
 
72
75
  Rendering rules:
76
+
73
77
  - `thinking` blocks → `ReasoningBlock` (expanded while streaming, auto-collapses after)
74
78
  - `tool_use` blocks → `ToolCard` (with matching `tool_result` and live runtime folded in)
75
79
  - `text` blocks → `MarkdownBlock`
@@ -85,14 +89,17 @@ Rendering rules:
85
89
  6. 409 conflict: attach to the existing run's stream
86
90
 
87
91
  Streaming state tracking:
92
+
88
93
  - `streamTokenRef` — incremented to invalidate stale streams
89
94
  - `pendingRequestTokenRef` — deduplicates concurrent send requests
90
95
  - `activeRunRef` — tracks the current run for cancel
91
96
 
92
- Image input:
93
- - `InputArea` supports file picker and drag-and-drop
94
- - Images are sent as structured `input` blocks
95
- - The attachment button uses `image_input_models`; pending images are cleared on unsupported model switch
97
+ Attachments:
98
+
99
+ - `InputArea` always shows the attachment button and supports file picker and drag-and-drop
100
+ - UTF-8 text/code/config files are attached as the same text snapshot format used by CLI `@file`
101
+ - Images and PDFs are sent as structured `input` blocks
102
+ - The attachment button uses `image_input_models` and `pdf_input_models`; unsupported pending attachments are cleared on model switch
96
103
 
97
104
  ## Config Persistence
98
105
 
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import sys
4
4
  from pathlib import Path
5
+ from typing import Any
5
6
 
6
7
  from hatchling.builders.hooks.plugin.interface import BuildHookInterface
7
8
 
@@ -16,8 +17,8 @@ def build_web_assets() -> None:
16
17
  build_web()
17
18
 
18
19
 
19
- class CustomBuildHook(BuildHookInterface):
20
- def initialize(self, version: str, build_data: dict) -> None:
20
+ class CustomBuildHook(BuildHookInterface[Any]):
21
+ def initialize(self, version: str, build_data: dict[str, Any]) -> None:
21
22
  del version, build_data
22
23
  build_web_assets()
23
24
 
@@ -7,15 +7,18 @@ import html
7
7
  import re
8
8
  import shlex
9
9
  from base64 import b64encode
10
+ from collections.abc import Iterable
10
11
  from pathlib import Path
11
- from typing import Any
12
+ from typing import Any, override
12
13
 
13
14
  from prompt_toolkit import PromptSession
14
15
  from prompt_toolkit.application import Application, get_app
15
- from prompt_toolkit.completion import Completer, Completion
16
- from prompt_toolkit.formatted_text import ANSI
16
+ from prompt_toolkit.completion import CompleteEvent, Completer, Completion
17
+ from prompt_toolkit.document import Document
18
+ from prompt_toolkit.formatted_text import ANSI, StyleAndTextTuples
17
19
  from prompt_toolkit.history import FileHistory
18
20
  from prompt_toolkit.key_binding import KeyBindings
21
+ from prompt_toolkit.key_binding.key_processor import KeyPressEvent
19
22
  from prompt_toolkit.keys import Keys
20
23
  from prompt_toolkit.layout import Layout
21
24
  from prompt_toolkit.widgets import RadioList
@@ -23,9 +26,9 @@ from rich.text import Text
23
26
 
24
27
  from mycode.core.agent import Agent
25
28
  from mycode.core.config import resolve_mycode_home
26
- from mycode.core.messages import build_message, image_block, text_block
29
+ from mycode.core.messages import build_message, document_block, image_block, text_block
27
30
  from mycode.core.session import SessionStore
28
- from mycode.core.tools import detect_image_mime_type, resolve_path
31
+ from mycode.core.tools import detect_document_mime_type, detect_image_mime_type, resolve_path
29
32
 
30
33
  from .render import ReplyRenderer, TerminalView, format_local_timestamp
31
34
  from .runtime import (
@@ -62,17 +65,19 @@ _AT_PATH_RE = re.compile(r"(?<!\S)@(?:(?P<quote>['\"])(?P<quoted>[^'\"]*)|(?P<pl
62
65
  _FOCUSED_STYLE = "bold blue" if TERMINAL_THEME == "light" else "bold cyan"
63
66
 
64
67
 
65
- class _InlineRadioList[T](RadioList):
68
+ class _InlineRadioList[T](RadioList[T]):
66
69
  """Arrow-key list that shows > on the focused item and exits on Enter."""
67
70
 
71
+ @override
68
72
  def _handle_enter(self) -> None:
69
73
  # Only called by Enter/Space (not arrows), so safe to exit.
70
74
  self.current_value = self.values[self._selected_index][0]
71
75
  get_app().exit(result=self.current_value)
72
76
 
73
- def _get_text_fragments(self):
77
+ @override
78
+ def _get_text_fragments(self) -> StyleAndTextTuples:
74
79
  # Override rendering: show > based on focus, not checked state.
75
- result: list[tuple[str, str]] = []
80
+ result: StyleAndTextTuples = []
76
81
  for i, (_value, text) in enumerate(self.values):
77
82
  focused = i == self._selected_index
78
83
  style = _FOCUSED_STYLE if focused else ""
@@ -97,7 +102,7 @@ async def choose[T](options: list[tuple[T, str]], *, default: T | None = None) -
97
102
 
98
103
  @kb.add("c-c")
99
104
  @kb.add("escape")
100
- def _cancel(event) -> None:
105
+ def _cancel(event: KeyPressEvent) -> None:
101
106
  event.app.exit(result=None)
102
107
 
103
108
  app: Application[T | None] = Application(
@@ -116,7 +121,8 @@ class _PromptCompleter(Completer):
116
121
  def __init__(self, *, cwd: str | None = None) -> None:
117
122
  self._cwd = cwd
118
123
 
119
- def get_completions(self, document, complete_event):
124
+ def get_completions(self, document: Document, complete_event: CompleteEvent) -> Iterable[Completion]:
125
+ del complete_event
120
126
  text_before_cursor = document.text_before_cursor
121
127
  text = text_before_cursor.lstrip()
122
128
  if self._cwd:
@@ -186,16 +192,25 @@ def _build_chat_key_bindings() -> KeyBindings:
186
192
  """Build key bindings for the main chat prompt."""
187
193
  kb = KeyBindings()
188
194
 
189
- kb.add("c-l")(lambda event: event.app.renderer.clear())
195
+ def _clear(event: KeyPressEvent) -> None:
196
+ event.app.renderer.clear()
197
+
198
+ kb.add("c-l")(_clear)
190
199
 
191
200
  # In multiline mode the default Enter inserts a newline; override it to submit.
192
- kb.add("enter", eager=True)(lambda event: event.current_buffer.validate_and_handle())
201
+ def _submit(event: KeyPressEvent) -> None:
202
+ event.current_buffer.validate_and_handle()
203
+
204
+ kb.add("enter", eager=True)(_submit)
193
205
 
194
206
  # Esc+Enter (Meta+Enter) inserts a newline for multiline input.
195
- kb.add("escape", "enter")(lambda event: event.current_buffer.insert_text("\n"))
207
+ def _insert_newline(event: KeyPressEvent) -> None:
208
+ event.current_buffer.insert_text("\n")
209
+
210
+ kb.add("escape", "enter")(_insert_newline)
196
211
 
197
212
  @kb.add(Keys.BracketedPaste, eager=True)
198
- def _handle_bracketed_paste(event) -> None:
213
+ def _handle_bracketed_paste(event: KeyPressEvent) -> None:
199
214
  pasted = event.data.replace("\r\n", "\n").replace("\r", "\n")
200
215
  event.current_buffer.insert_text(_rewrite_pasted_file_paths(pasted) or pasted)
201
216
 
@@ -225,7 +240,7 @@ class TerminalChat:
225
240
  self.store = store
226
241
  self.session_id = session_id
227
242
  self.view = view or TerminalView()
228
- self.prompt_session = PromptSession(
243
+ self.prompt_session: PromptSession[str] = PromptSession(
229
244
  history=FileHistory(history_file_path()),
230
245
  completer=_PromptCompleter(cwd=self.agent.cwd),
231
246
  key_bindings=_build_chat_key_bindings(),
@@ -284,9 +299,9 @@ class TerminalChat:
284
299
  def _build_user_message(self, text: str) -> dict[str, Any]:
285
300
  """Build one user message with the raw prompt first, then resolved attachments.
286
301
 
287
- Text files are appended as extra text blocks in their final provider-facing
288
- form. Images are appended as image blocks. Only explicit `@path` tokens
289
- that resolve to real files are attached.
302
+ Text files are appended as extra text blocks. Images and PDFs become
303
+ native blocks only when the current model supports that input type.
304
+ Only explicit `@path` tokens that resolve to real files are attached.
290
305
  """
291
306
 
292
307
  blocks = [text_block(text)]
@@ -309,10 +324,27 @@ class TerminalChat:
309
324
  continue
310
325
  seen.add(path_text)
311
326
 
312
- image_mime_type = detect_image_mime_type(path)
313
- if image_mime_type:
314
- image_data = b64encode(path.read_bytes()).decode("utf-8")
315
- blocks.append(image_block(image_data, mime_type=image_mime_type, name=path.name))
327
+ # Detect image or document; bundle (kind, mime, supported) together.
328
+ media: tuple[str, str, bool] | None = None
329
+ if m := detect_image_mime_type(path):
330
+ media = ("image", m, self.agent.supports_image_input)
331
+ elif m := detect_document_mime_type(path):
332
+ media = ("document", m, self.agent.supports_pdf_input)
333
+
334
+ if media:
335
+ kind, mime_type, supported = media
336
+ if supported:
337
+ data = b64encode(path.read_bytes()).decode("utf-8")
338
+ fn = image_block if kind == "image" else document_block
339
+ blocks.append(fn(data, mime_type=mime_type, name=path.name))
340
+ else:
341
+ label = "image input" if kind == "image" else "PDF input"
342
+ blocks.append(
343
+ text_block(
344
+ f'<file name="{html.escape(path_text, quote=True)}" media_type="{mime_type}" kind="{kind}">Current model does not support {label}.</file>',
345
+ meta={"attachment": True, "path": path_text},
346
+ )
347
+ )
316
348
  continue
317
349
 
318
350
  # Reuse the existing read tool so attached text files follow the same
@@ -459,20 +491,16 @@ class TerminalChat:
459
491
 
460
492
  # Collect real user text messages (skip synthetic compact summaries
461
493
  # and tool-result-only user messages).
462
- user_turns: list[tuple[int, str]] = [] # (message_index, full_text)
494
+ user_turns: dict[int, str] = {} # message_index -> text
463
495
  for i, msg in enumerate(messages):
464
496
  if msg.get("role") != "user":
465
497
  continue
466
498
  if (msg.get("meta") or {}).get("synthetic"):
467
499
  continue
468
- blocks = msg.get("content") or []
469
- text = ""
470
- for b in blocks:
500
+ for b in msg.get("content") or []:
471
501
  if isinstance(b, dict) and b.get("type") == "text" and b.get("text"):
472
- text = str(b["text"]).strip()
502
+ user_turns[i] = str(b["text"]).strip()
473
503
  break
474
- if text:
475
- user_turns.append((i, text))
476
504
 
477
505
  if not user_turns:
478
506
  self.view.console.print("[dim]no user messages to rewind to[/dim]")
@@ -480,7 +508,7 @@ class TerminalChat:
480
508
 
481
509
  # Build selector options — most recent first.
482
510
  options: list[tuple[int, str]] = []
483
- for msg_index, text in reversed(user_turns):
511
+ for msg_index, text in reversed(list(user_turns.items())):
484
512
  preview = text.replace("\n", " ")[:60]
485
513
  if len(text) > 60:
486
514
  preview += "..."
@@ -490,12 +518,7 @@ class TerminalChat:
490
518
  if selected is None:
491
519
  return None
492
520
 
493
- # Look up the full text of the selected message for prefill.
494
- original_text = ""
495
- for msg_index, text in user_turns:
496
- if msg_index == selected:
497
- original_text = text
498
- break
521
+ original_text = user_turns.get(selected, "")
499
522
 
500
523
  # Persist the rewind event and truncate in-memory messages.
501
524
  await self.store.append_rewind(self.session_id, selected)
@@ -11,6 +11,7 @@ import typer
11
11
 
12
12
  from mycode.core.agent import Agent
13
13
  from mycode.core.config import get_settings, resolve_provider
14
+ from mycode.core.messages import ConversationMessage
14
15
  from mycode.core.session import SessionStore
15
16
 
16
17
  from .chat import TerminalChat
@@ -22,9 +23,6 @@ session_app = typer.Typer(help="Session management")
22
23
  app.add_typer(session_app, name="session")
23
24
 
24
25
 
25
- # -- Shared helpers ----------------------------------------------------------
26
-
27
-
28
26
  async def run_noninteractive(
29
27
  agent: Agent,
30
28
  *,
@@ -32,11 +30,11 @@ async def run_noninteractive(
32
30
  session_id: str,
33
31
  message: str,
34
32
  ) -> int:
35
- """Run one CLI message and print only the final assistant reply."""
33
+ """Run one message non-interactively and print only the final assistant reply."""
36
34
 
37
- latest_assistant: dict | None = None
35
+ latest_assistant: ConversationMessage | None = None
38
36
 
39
- async def persist(payload: dict) -> None:
37
+ async def persist(payload: ConversationMessage) -> None:
40
38
  nonlocal latest_assistant
41
39
  if payload.get("role") == "assistant":
42
40
  latest_assistant = payload
@@ -67,7 +65,7 @@ async def run_noninteractive(
67
65
 
68
66
 
69
67
  def _validate_session_options(session: str | None, continue_last: bool) -> None:
70
- """Reject conflicting session options."""
68
+ """Reject conflicting --session and --continue options."""
71
69
 
72
70
  if session and continue_last:
73
71
  raise typer.BadParameter("--session and --continue are mutually exclusive")