mycode-cli 0.6.0__tar.gz → 0.7.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 (393) hide show
  1. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/PKG-INFO +3 -3
  2. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/README.md +1 -1
  3. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/pyproject.toml +2 -2
  4. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/config.py +87 -23
  5. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/main.py +34 -9
  6. mycode_cli-0.7.1/src/mycode_cli/permissions.py +228 -0
  7. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/runtime.py +6 -1
  8. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/routers/chat.py +27 -3
  9. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/run_manager.py +75 -0
  10. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/schemas.py +11 -0
  11. mycode_cli-0.6.0/src/mycode_cli/server/static/assets/EditDiff-CyrLN4Wq.js → mycode_cli-0.7.1/src/mycode_cli/server/static/assets/EditDiff-C5JPx5vJ.js +1 -1
  12. mycode_cli-0.6.0/src/mycode_cli/server/static/assets/index-iNJwUrpx.css → mycode_cli-0.7.1/src/mycode_cli/server/static/assets/index-CbtQLsjO.css +1 -1
  13. mycode_cli-0.7.1/src/mycode_cli/server/static/assets/index-Dp879Ucn.js +476 -0
  14. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/index.html +2 -2
  15. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/system_prompt.py +22 -21
  16. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/tui/chat.py +32 -1
  17. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/tui/render.py +22 -3
  18. mycode_cli-0.6.0/src/mycode_cli/server/static/assets/index-Bu2AYfiR.js +0 -476
  19. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/.gitignore +0 -0
  20. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/LICENSE +0 -0
  21. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/hatch_build.py +0 -0
  22. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/__init__.py +0 -0
  23. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/__init__.py +0 -0
  24. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/app.py +0 -0
  25. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/deps.py +0 -0
  26. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/routers/__init__.py +0 -0
  27. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/routers/sessions.py +0 -0
  28. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/routers/workspaces.py +0 -0
  29. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  30. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  31. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  32. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  33. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  34. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  35. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  36. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  37. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  38. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  39. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  40. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  41. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  42. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  43. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  44. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  45. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  46. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  47. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  48. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  49. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  50. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  51. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  52. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  53. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  54. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  55. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  56. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  57. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  58. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  59. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  60. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  61. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  62. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  63. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  64. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  65. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  66. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  67. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  68. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  69. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  70. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  71. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  72. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  73. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  74. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  75. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  76. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  77. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  78. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  79. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  80. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  81. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  82. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  83. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  84. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  85. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  86. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  87. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  88. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/abap-BdImnpbu.js +0 -0
  89. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/actionscript-3-CoDkCxhg.js +0 -0
  90. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/ada-bCR0ucgS.js +0 -0
  91. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/andromeeda-C4gqWexZ.js +0 -0
  92. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/angular-html-CU67Zn6k.js +0 -0
  93. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/angular-ts-BwZT4LLn.js +0 -0
  94. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/apache-Pmp26Uib.js +0 -0
  95. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/apex-D8_7TLub.js +0 -0
  96. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/apl-dKokRX4l.js +0 -0
  97. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/applescript-Co6uUVPk.js +0 -0
  98. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/ara-BRHolxvo.js +0 -0
  99. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/asciidoc-Ve4PFQV2.js +0 -0
  100. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/asm-D_Q5rh1f.js +0 -0
  101. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/astro-CbQHKStN.js +0 -0
  102. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/aurora-x-D-2ljcwZ.js +0 -0
  103. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/awk-DMzUqQB5.js +0 -0
  104. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/ayu-dark-DYE7WIF3.js +0 -0
  105. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/ayu-light-BA47KaF1.js +0 -0
  106. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/ayu-mirage-32ctXXKs.js +0 -0
  107. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/ballerina-BFfxhgS-.js +0 -0
  108. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/bat-BkioyH1T.js +0 -0
  109. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/beancount-k_qm7-4y.js +0 -0
  110. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/berry-uYugtg8r.js +0 -0
  111. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/bibtex-CHM0blh-.js +0 -0
  112. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/bicep-Bmn6On1c.js +0 -0
  113. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/bird2-DPOp833l.js +0 -0
  114. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/blade-D4QpJJKB.js +0 -0
  115. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/bsl-BO_Y6i37.js +0 -0
  116. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/c-BIGW1oBm.js +0 -0
  117. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/c3-eo99z4R2.js +0 -0
  118. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/cadence-Bv_4Rxtq.js +0 -0
  119. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/cairo-KRGpt6FW.js +0 -0
  120. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
  121. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
  122. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
  123. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
  124. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/clarity-D53aC0YG.js +0 -0
  125. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/clojure-P80f7IUj.js +0 -0
  126. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/cmake-D1j8_8rp.js +0 -0
  127. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/cobol-nwyudZeR.js +0 -0
  128. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/codeowners-Bp6g37R7.js +0 -0
  129. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/codeql-DsOJ9woJ.js +0 -0
  130. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/coffee-Ch7k5sss.js +0 -0
  131. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/common-lisp-Cg-RD9OK.js +0 -0
  132. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/coq-DkFqJrB1.js +0 -0
  133. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/cpp-CofmeUqb.js +0 -0
  134. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/crystal-tKQVLTB8.js +0 -0
  135. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/csharp-COcwbKMJ.js +0 -0
  136. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/css-DPfMkruS.js +0 -0
  137. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/csv-fuZLfV_i.js +0 -0
  138. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/cue-D82EKSYY.js +0 -0
  139. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/cypher-COkxafJQ.js +0 -0
  140. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/d-85-TOEBH.js +0 -0
  141. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/dark-plus-C3mMm8J8.js +0 -0
  142. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/dart-CF10PKvl.js +0 -0
  143. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/dax-CEL-wOlO.js +0 -0
  144. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/desktop-BmXAJ9_W.js +0 -0
  145. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/diff-D97Zzqfu.js +0 -0
  146. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/docker-BcOcwvcX.js +0 -0
  147. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/dotenv-Da5cRb03.js +0 -0
  148. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/dracula-BzJJZx-M.js +0 -0
  149. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/dracula-soft-BXkSAIEj.js +0 -0
  150. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/dream-maker-BtqSS_iP.js +0 -0
  151. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/edge-BkV0erSs.js +0 -0
  152. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/elixir-CDX3lj18.js +0 -0
  153. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/elm-DbKCFpqz.js +0 -0
  154. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/emacs-lisp-C9XAeP06.js +0 -0
  155. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/erb-B12qg9BL.js +0 -0
  156. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/erlang-DsQrWhSR.js +0 -0
  157. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/everforest-dark-BgDCqdQA.js +0 -0
  158. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/everforest-light-C8M2exoo.js +0 -0
  159. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/fennel-BYunw83y.js +0 -0
  160. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/fish-BvzEVeQv.js +0 -0
  161. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/fluent-C4IJs8-o.js +0 -0
  162. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
  163. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
  164. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/fsharp-CXgrBDvD.js +0 -0
  165. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/gdresource-BOOCDP_w.js +0 -0
  166. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/gdscript-C5YyOfLZ.js +0 -0
  167. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/gdshader-DkwncUOv.js +0 -0
  168. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/genie-D0YGMca9.js +0 -0
  169. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/gherkin-DyxjwDmM.js +0 -0
  170. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/git-commit-F4YmCXRG.js +0 -0
  171. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/git-rebase-r7XF79zn.js +0 -0
  172. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/github-dark-DHJKELXO.js +0 -0
  173. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
  174. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
  175. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
  176. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/github-light-DAi9KRSo.js +0 -0
  177. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/github-light-default-D7oLnXFd.js +0 -0
  178. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
  179. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/gleam-BspZqrRM.js +0 -0
  180. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
  181. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/glimmer-ts-U6CK756n.js +0 -0
  182. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/glsl-DplSGwfg.js +0 -0
  183. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/gn-n2N0HUVH.js +0 -0
  184. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/gnuplot-DdkO51Og.js +0 -0
  185. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/go-CxLEBnE3.js +0 -0
  186. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/graphql-ChdNCCLP.js +0 -0
  187. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/groovy-gcz8RCvz.js +0 -0
  188. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
  189. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
  190. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
  191. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
  192. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
  193. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
  194. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/hack-CaT9iCJl.js +0 -0
  195. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/haml-B8DHNrY2.js +0 -0
  196. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/handlebars-BL8al0AC.js +0 -0
  197. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/haskell-Df6bDoY_.js +0 -0
  198. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/haxe-CzTSHFRz.js +0 -0
  199. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/hcl-BWvSN4gD.js +0 -0
  200. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/hjson-D5-asLiD.js +0 -0
  201. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/hlsl-D3lLCCz7.js +0 -0
  202. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/horizon-BUw7H-hv.js +0 -0
  203. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/horizon-bright-Cn-bp-IR.js +0 -0
  204. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/houston-DnULxvSX.js +0 -0
  205. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/html-GMplVEZG.js +0 -0
  206. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/html-derivative-BFtXZ54Q.js +0 -0
  207. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/http-jrhK8wxY.js +0 -0
  208. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/hurl-irOxFIW8.js +0 -0
  209. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/hxml-Bvhsp5Yf.js +0 -0
  210. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/hy-DFXneXwc.js +0 -0
  211. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/imba-DGztddWO.js +0 -0
  212. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/ini-BEwlwnbL.js +0 -0
  213. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/java-CylS5w8V.js +0 -0
  214. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/javascript-wDzz0qaB.js +0 -0
  215. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/jinja-4LBKfQ-Z.js +0 -0
  216. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/jison-wvAkD_A8.js +0 -0
  217. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/json-Cp-IABpG.js +0 -0
  218. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/json5-C9tS-k6U.js +0 -0
  219. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/jsonc-Des-eS-w.js +0 -0
  220. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/jsonl-DcaNXYhu.js +0 -0
  221. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/jsonnet-DFQXde-d.js +0 -0
  222. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/jssm-C2t-YnRu.js +0 -0
  223. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/jsx-g9-lgVsj.js +0 -0
  224. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/julia-CxzCAyBv.js +0 -0
  225. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/just-Cw27pwNe.js +0 -0
  226. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
  227. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
  228. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
  229. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/kdl-DV7GczEv.js +0 -0
  230. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/kotlin-BdnUsdx6.js +0 -0
  231. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/kusto-DZf3V79B.js +0 -0
  232. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/laserwave-DUszq2jm.js +0 -0
  233. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/latex-CWtU0Tv5.js +0 -0
  234. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/lean-BZvkOJ9d.js +0 -0
  235. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/less-B1dDrJ26.js +0 -0
  236. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/light-plus-B7mTdjB0.js +0 -0
  237. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/liquid-DYVedYrR.js +0 -0
  238. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/llvm-DjAJT7YJ.js +0 -0
  239. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/log-2UxHyX5q.js +0 -0
  240. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/logo-BtOb2qkB.js +0 -0
  241. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/lua-BaeVxFsk.js +0 -0
  242. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/luau-C-HG3fhB.js +0 -0
  243. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/make-CHLpvVh8.js +0 -0
  244. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/markdown-Cvjx9yec.js +0 -0
  245. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/marko-CnJfTvn9.js +0 -0
  246. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/material-theme-D5KoaKCx.js +0 -0
  247. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
  248. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
  249. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/material-theme-ocean-CyktbL80.js +0 -0
  250. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
  251. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/matlab-D7o27uSR.js +0 -0
  252. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/mdc-BMNejdWA.js +0 -0
  253. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/mdx-Cmh6b_Ma.js +0 -0
  254. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/mermaid-mWjccvbQ.js +0 -0
  255. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/min-dark-CafNBF8u.js +0 -0
  256. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/min-light-CTRr51gU.js +0 -0
  257. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/mipsasm-CKIfxQSi.js +0 -0
  258. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/mojo-rZm6bMo-.js +0 -0
  259. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/monokai-D4h5O-jR.js +0 -0
  260. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/moonbit-_H4v1dQx.js +0 -0
  261. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/move-IF9eRakj.js +0 -0
  262. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/narrat-DRg8JJMk.js +0 -0
  263. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/nextflow-Zz6hmt5N.js +0 -0
  264. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/nextflow-groovy-BeH2EWoN.js +0 -0
  265. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/nginx-BpAMiNFr.js +0 -0
  266. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/night-owl-C39BiMTA.js +0 -0
  267. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/night-owl-light-CMTm3GFP.js +0 -0
  268. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/nim-CVrawwO9.js +0 -0
  269. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/nix-CwoSXNpI.js +0 -0
  270. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/nord-Ddv68eIx.js +0 -0
  271. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/nushell-Cz2AlsmD.js +0 -0
  272. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/objective-c-DXmwc3jG.js +0 -0
  273. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/objective-cpp-CLxacb5B.js +0 -0
  274. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/ocaml-C0hk2d4L.js +0 -0
  275. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/odin-BBf5iR-q.js +0 -0
  276. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
  277. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/one-light-C3Wv6jpd.js +0 -0
  278. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/openscad-C4EeE6gA.js +0 -0
  279. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/pascal-D93ZcfNL.js +0 -0
  280. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/perl-C0TMdlhV.js +0 -0
  281. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/php-Dhbhpdrm.js +0 -0
  282. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/pierre-dark-DF2SEV7i.js +0 -0
  283. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/pierre-light-DOlZxES8.js +0 -0
  284. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/pkl-u5AG7uiY.js +0 -0
  285. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/plastic-3e1v2bzS.js +0 -0
  286. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/plsql-ChMvpjG-.js +0 -0
  287. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/po-BTJTHyun.js +0 -0
  288. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/poimandres-CS3Unz2-.js +0 -0
  289. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/polar-C0HS_06l.js +0 -0
  290. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/postcss-CXtECtnM.js +0 -0
  291. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/powerquery-CEu0bR-o.js +0 -0
  292. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/powershell-Dpen1YoG.js +0 -0
  293. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/prisma-Dd19v3D-.js +0 -0
  294. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/prolog-CbFg5uaA.js +0 -0
  295. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/proto-C7zT0LnQ.js +0 -0
  296. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/pug-CGlum2m_.js +0 -0
  297. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/puppet-BMWR74SV.js +0 -0
  298. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/purescript-CklMAg4u.js +0 -0
  299. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/python-B6aJPvgy.js +0 -0
  300. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/qml-3beO22l8.js +0 -0
  301. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/qmldir-C8lEn-DE.js +0 -0
  302. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/qss-IeuSbFQv.js +0 -0
  303. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/r-Dspwwk_N.js +0 -0
  304. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/racket-BqYA7rlc.js +0 -0
  305. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/raku-DXvB9xmW.js +0 -0
  306. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/razor-Uh8Bk_45.js +0 -0
  307. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/red-bN70gL4F.js +0 -0
  308. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/reg-C-SQnVFl.js +0 -0
  309. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/regexp-CDVJQ6XC.js +0 -0
  310. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/rel-C3B-1QV4.js +0 -0
  311. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/riscv-BM1_JUlF.js +0 -0
  312. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/ron-D8l8udqQ.js +0 -0
  313. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
  314. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
  315. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/rose-pine-qdsjHGoJ.js +0 -0
  316. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/rosmsg-BJDFO7_C.js +0 -0
  317. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/rst-BrH8l1NY.js +0 -0
  318. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/ruby-Dw2BHqvy.js +0 -0
  319. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/rust-B1yitclQ.js +0 -0
  320. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/sas-cz2c8ADy.js +0 -0
  321. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/sass-Cj5Yp3dK.js +0 -0
  322. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/scala-C151Ov-r.js +0 -0
  323. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/scheme-C98Dy4si.js +0 -0
  324. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/scss-OYdSNvt2.js +0 -0
  325. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/sdbl-DVxCFoDh.js +0 -0
  326. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
  327. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/shellscript-Yzrsuije.js +0 -0
  328. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/shellsession-BADoaaVG.js +0 -0
  329. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/slack-dark-BthQWCQV.js +0 -0
  330. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/slack-ochin-DqwNpetd.js +0 -0
  331. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/smalltalk-BERRCDM3.js +0 -0
  332. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/snazzy-light-Bw305WKR.js +0 -0
  333. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/solarized-dark-DXbdFlpD.js +0 -0
  334. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/solarized-light-L9t79GZl.js +0 -0
  335. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/solidity-rGO070M0.js +0 -0
  336. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/soy-Brmx7dQM.js +0 -0
  337. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/sparql-rVzFXLq3.js +0 -0
  338. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/splunk-BtCnVYZw.js +0 -0
  339. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/sql-BLtJtn59.js +0 -0
  340. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/ssh-config-_ykCGR6B.js +0 -0
  341. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/stata-BH5u7GGu.js +0 -0
  342. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/stylus-BEDo0Tqx.js +0 -0
  343. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/surrealql-Bq5Q-fJD.js +0 -0
  344. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/svelte-C_ipcX3V.js +0 -0
  345. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/swift-D82vCrfD.js +0 -0
  346. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/synthwave-84-CbfX1IO0.js +0 -0
  347. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/system-verilog-CnnmHF94.js +0 -0
  348. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/systemd-4A_iFExJ.js +0 -0
  349. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/talonscript-CkByrt1z.js +0 -0
  350. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/tasl-QIJgUcNo.js +0 -0
  351. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/tcl-dwOrl1Do.js +0 -0
  352. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/templ-P3uqSqPl.js +0 -0
  353. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/terraform-BETggiCN.js +0 -0
  354. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/tex-idrVyKtj.js +0 -0
  355. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/tokyo-night-hegEt444.js +0 -0
  356. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/toml-vGWfd6FD.js +0 -0
  357. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/ts-tags-zn1MmPIZ.js +0 -0
  358. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/tsv-B_m7g4N7.js +0 -0
  359. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/tsx-COt5Ahok.js +0 -0
  360. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/turtle-BsS91CYL.js +0 -0
  361. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/twig-DNn4PbVi.js +0 -0
  362. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/typescript-BPQ3VLAy.js +0 -0
  363. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/typespec-BGHnOYBU.js +0 -0
  364. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/typst-DHCkPAjA.js +0 -0
  365. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/v-BcVCzyr7.js +0 -0
  366. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/vala-CsfeWuGM.js +0 -0
  367. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/vb-D17OF-Vu.js +0 -0
  368. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/verilog-BQ8w6xss.js +0 -0
  369. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/vesper-DU1UobuO.js +0 -0
  370. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/vhdl-CeAyd5Ju.js +0 -0
  371. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/viml-CJc9bBzg.js +0 -0
  372. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
  373. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
  374. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/vitesse-light-CVO1_9PV.js +0 -0
  375. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/vue-DN_0RTcg.js +0 -0
  376. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/vue-html-AaS7Mt5G.js +0 -0
  377. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/vue-vine-CQOfvN7w.js +0 -0
  378. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/vyper-CDx5xZoG.js +0 -0
  379. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/wasm-CG6Dc4jp.js +0 -0
  380. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/wasm-MzD3tlZU.js +0 -0
  381. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/wenyan-BV7otONQ.js +0 -0
  382. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/wgsl-Dx-B1_4e.js +0 -0
  383. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/wikitext-BhOHFoWU.js +0 -0
  384. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/wit-5i3qLPDT.js +0 -0
  385. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/wolfram-lXgVvXCa.js +0 -0
  386. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/xml-sdJ4AIDG.js +0 -0
  387. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/xsl-CtQFsRM5.js +0 -0
  388. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/yaml-Buea-lGh.js +0 -0
  389. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/zenscript-DVFEvuxE.js +0 -0
  390. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/assets/zig-VOosw3JB.js +0 -0
  391. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/server/static/favicon_slashes.svg +0 -0
  392. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/tui/__init__.py +0 -0
  393. {mycode_cli-0.6.0 → mycode_cli-0.7.1}/src/mycode_cli/tui/theme.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mycode-cli
3
- Version: 0.6.0
3
+ Version: 0.7.1
4
4
  Summary: Minimal coding agent CLI and web UI built on mycode-sdk.
5
5
  Project-URL: Homepage, https://github.com/legibet/mycode
6
6
  Project-URL: Repository, https://github.com/legibet/mycode
@@ -22,7 +22,7 @@ Classifier: Programming Language :: Python :: 3.13
22
22
  Classifier: Topic :: Software Development
23
23
  Requires-Python: >=3.12
24
24
  Requires-Dist: fastapi>=0.115.0
25
- Requires-Dist: mycode-sdk==0.6.0
25
+ Requires-Dist: mycode-sdk==0.7.1
26
26
  Requires-Dist: prompt-toolkit>=3.0.52
27
27
  Requires-Dist: pyyaml>=6.0.0
28
28
  Requires-Dist: rich>=14.2.0
@@ -89,7 +89,7 @@ Run `/model` in tui to see the available models.
89
89
 
90
90
  A config file is optional — API keys from the environment are usually sufficient.
91
91
 
92
- Create `~/.mycode/config.json` (global) or `<workspace>/.mycode/config.json` (project, takes precedence) to:
92
+ Create `~/.mycode/config.json` (global) or `.mycode/config.json` under the current project to:
93
93
 
94
94
  - set a default provider, model, and reasoning effort
95
95
  - expose additional models on an existing provider (e.g. OpenRouter's catalog)
@@ -57,7 +57,7 @@ Run `/model` in tui to see the available models.
57
57
 
58
58
  A config file is optional — API keys from the environment are usually sufficient.
59
59
 
60
- Create `~/.mycode/config.json` (global) or `<workspace>/.mycode/config.json` (project, takes precedence) to:
60
+ Create `~/.mycode/config.json` (global) or `.mycode/config.json` under the current project to:
61
61
 
62
62
  - set a default provider, model, and reasoning effort
63
63
  - expose additional models on an existing provider (e.g. OpenRouter's catalog)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "mycode-cli"
7
- version = "0.6.0"
7
+ version = "0.7.1"
8
8
  description = "Minimal coding agent CLI and web UI built on mycode-sdk."
9
9
  requires-python = ">=3.12"
10
10
  license = "MIT"
@@ -26,7 +26,7 @@ classifiers = [
26
26
  ]
27
27
  keywords = ["agent", "cli", "llm", "coding-agent", "fastapi"]
28
28
  dependencies = [
29
- "mycode-sdk==0.6.0",
29
+ "mycode-sdk==0.7.1",
30
30
  "fastapi>=0.115.0",
31
31
  "uvicorn[standard]>=0.32.0",
32
32
  "rich>=14.2.0",
@@ -8,7 +8,7 @@ import os
8
8
  import re
9
9
  from dataclasses import dataclass, field
10
10
  from pathlib import Path
11
- from typing import Any
11
+ from typing import Any, Literal
12
12
 
13
13
  from mycode.models import resolve_model_metadata
14
14
  from mycode.providers import (
@@ -42,9 +42,14 @@ _API_KEY_ENV_REF_RE = re.compile(r"^\$\{([A-Za-z_][A-Za-z0-9_]*)\}$")
42
42
  # Full set of user-facing choices. "auto" means "do not send an explicit effort
43
43
  # to the provider" and is represented internally as `None` after normalization.
44
44
  REASONING_EFFORT_OPTIONS = ("auto", "none", "low", "medium", "high", "xhigh")
45
+ PERMISSION_LEVEL_OPTIONS = ("readonly", "safe", "standard", "yolo")
46
+ PERMISSION_MODE_OPTIONS = ("ask", "deny")
45
47
  _EFFORT_AUTO_ALIASES = frozenset({"", "auto", "default"})
46
48
  _EFFORT_OFF_ALIASES = frozenset({"off", "disabled"})
47
49
 
50
+ PermissionLevel = Literal["readonly", "safe", "standard", "yolo"]
51
+ PermissionMode = Literal["ask", "deny"]
52
+
48
53
 
49
54
  @dataclass(frozen=True)
50
55
  class ModelConfig:
@@ -66,6 +71,12 @@ class ProviderConfig:
66
71
  reasoning_effort: str | None = None
67
72
 
68
73
 
74
+ @dataclass(frozen=True)
75
+ class PermissionConfig:
76
+ level: PermissionLevel = "safe"
77
+ mode: PermissionMode = "ask"
78
+
79
+
69
80
  @dataclass(frozen=True)
70
81
  class Settings:
71
82
  providers: dict[str, ProviderConfig]
@@ -73,9 +84,10 @@ class Settings:
73
84
  default_model: str | None
74
85
  port: int
75
86
  cwd: str
76
- workspace_root: str
87
+ project: str
77
88
  default_reasoning_effort: str | None = None
78
89
  compact_threshold: float | None = None
90
+ permission: PermissionConfig = field(default_factory=PermissionConfig)
79
91
  config_paths: list[str] = field(default_factory=list)
80
92
 
81
93
 
@@ -91,16 +103,6 @@ class ResolvedProvider:
91
103
  provider_name: str | None = None
92
104
 
93
105
 
94
- def find_workspace_root(cwd: str) -> Path:
95
- """Resolve the project/workspace root for the current cwd."""
96
-
97
- current = Path(cwd).expanduser().resolve(strict=False)
98
- for parent in [current, *current.parents]:
99
- if (parent / ".git").exists():
100
- return parent
101
- return current
102
-
103
-
104
106
  def _load_json(path: Path) -> dict[str, Any] | None:
105
107
  if not path.is_file():
106
108
  return None
@@ -111,6 +113,32 @@ def _load_json(path: Path) -> dict[str, Any] | None:
111
113
  return data if isinstance(data, dict) else None
112
114
 
113
115
 
116
+ def resolve_project(cwd: str) -> Path:
117
+ """Return the nearest Git project root, or cwd when no .git is found."""
118
+
119
+ cwd_path = Path(cwd).expanduser().resolve(strict=False)
120
+ for path in (cwd_path, *cwd_path.parents):
121
+ if (path / ".git").exists():
122
+ return path
123
+ return cwd_path
124
+
125
+
126
+ def project_dirs(cwd: str, project: str | Path | None = None) -> list[Path]:
127
+ """Return directories from project to cwd, inclusive."""
128
+
129
+ cwd_path = Path(cwd).expanduser().resolve(strict=False)
130
+ project_path = Path(project).expanduser().resolve(strict=False) if project is not None else resolve_project(cwd)
131
+
132
+ dirs = [cwd_path]
133
+ while dirs[-1] != project_path:
134
+ parent = dirs[-1].parent
135
+ if parent == dirs[-1]:
136
+ break
137
+ dirs.append(parent)
138
+
139
+ return list(reversed(dirs))
140
+
141
+
114
142
  def _normalize_models(value: Any) -> dict[str, ModelConfig]:
115
143
  if not isinstance(value, dict):
116
144
  return {}
@@ -197,6 +225,39 @@ def normalize_reasoning_effort(value: Any) -> str | None:
197
225
  raise ValueError(f"unsupported reasoning_effort {value!r}; supported: {supported}")
198
226
 
199
227
 
228
+ def normalize_permission_level(value: Any) -> PermissionLevel:
229
+ if not isinstance(value, str):
230
+ raise ValueError(f"permission level must be a string, got {type(value).__name__}")
231
+ level = value.strip().lower()
232
+ if level in PERMISSION_LEVEL_OPTIONS:
233
+ return level
234
+ supported = ", ".join(PERMISSION_LEVEL_OPTIONS)
235
+ raise ValueError(f"unsupported permission level {value!r}; supported: {supported}")
236
+
237
+
238
+ def normalize_permission_mode(value: Any) -> PermissionMode:
239
+ if not isinstance(value, str):
240
+ raise ValueError(f"permission mode must be a string, got {type(value).__name__}")
241
+ mode = value.strip().lower()
242
+ if mode in PERMISSION_MODE_OPTIONS:
243
+ return mode
244
+ supported = ", ".join(PERMISSION_MODE_OPTIONS)
245
+ raise ValueError(f"unsupported permission mode {value!r}; supported: {supported}")
246
+
247
+
248
+ def parse_permission(value: Any, current: PermissionConfig | None = None) -> PermissionConfig:
249
+ base = current or PermissionConfig()
250
+ if value is None:
251
+ return base
252
+ if isinstance(value, str):
253
+ return PermissionConfig(level=normalize_permission_level(value), mode=base.mode)
254
+ if isinstance(value, dict):
255
+ level = normalize_permission_level(value.get("level")) if "level" in value else base.level
256
+ mode = normalize_permission_mode(value.get("mode")) if "mode" in value else base.mode
257
+ return PermissionConfig(level=level, mode=mode)
258
+ raise ValueError(f"permission must be a string or object, got {type(value).__name__}")
259
+
260
+
200
261
  def _config_api_key_from_env_var(provider: ProviderConfig, *, require: bool = False) -> str | None:
201
262
  env_name = provider.api_key_env_var
202
263
  if not env_name:
@@ -219,12 +280,10 @@ def provider_has_api_key(provider: ProviderConfig) -> bool:
219
280
  return bool(provider.api_key or provider_api_key_from_env(provider.type))
220
281
 
221
282
 
222
- def _candidate_config_paths(cwd: str) -> list[Path]:
223
- workspace_root = find_workspace_root(cwd)
224
- return [
225
- resolve_mycode_home() / "config.json",
226
- workspace_root / ".mycode" / "config.json",
227
- ]
283
+ def _candidate_config_paths(cwd: str, project: str | Path) -> list[Path]:
284
+ paths = [resolve_mycode_home() / "config.json"]
285
+ paths.extend(path / ".mycode" / "config.json" for path in project_dirs(cwd, project))
286
+ return paths
228
287
 
229
288
 
230
289
  def _build_providers(raw_providers: dict[str, dict[str, Any]]) -> dict[str, ProviderConfig]:
@@ -257,19 +316,20 @@ def _build_providers(raw_providers: dict[str, dict[str, Any]]) -> dict[str, Prov
257
316
 
258
317
 
259
318
  def get_settings(cwd: str | None = None) -> Settings:
260
- """Load settings from global and workspace config files."""
319
+ """Load settings from global and project config files."""
261
320
 
262
321
  resolved_cwd = str(Path(cwd or os.getcwd()).expanduser().resolve(strict=False))
263
- workspace_root = find_workspace_root(resolved_cwd)
322
+ resolved_project = str(resolve_project(resolved_cwd))
264
323
 
265
324
  raw_providers: dict[str, dict[str, Any]] = {}
266
325
  default_provider: str | None = None
267
326
  default_model: str | None = None
268
327
  default_reasoning_effort: str | None = None
269
328
  compact_threshold: float | None = None
329
+ permission = PermissionConfig()
270
330
  config_paths: list[str] = []
271
331
 
272
- for path in _candidate_config_paths(resolved_cwd):
332
+ for path in _candidate_config_paths(resolved_cwd, resolved_project):
273
333
  data = _load_json(path)
274
334
  if data is None:
275
335
  continue
@@ -315,15 +375,19 @@ def get_settings(cwd: str | None = None) -> Settings:
315
375
  if parsed_threshold is not None:
316
376
  compact_threshold = parsed_threshold
317
377
 
378
+ if "permission" in data:
379
+ permission = parse_permission(data.get("permission"), permission)
380
+
318
381
  return Settings(
319
382
  providers=_build_providers(raw_providers),
320
383
  default_provider=default_provider,
321
384
  default_model=default_model,
322
385
  default_reasoning_effort=normalize_reasoning_effort(default_reasoning_effort),
323
386
  compact_threshold=compact_threshold,
387
+ permission=permission,
324
388
  port=int(os.environ.get("PORT", "8000")),
325
389
  cwd=resolved_cwd,
326
- workspace_root=str(workspace_root),
390
+ project=resolved_project,
327
391
  config_paths=config_paths,
328
392
  )
329
393
 
@@ -368,7 +432,7 @@ def resolve_provider(
368
432
  checked = ", ".join(env_names) or "<api key env>"
369
433
  raise ValueError(
370
434
  "no available providers found; set one of the supported API key env vars "
371
- + f"({checked}) or configure a provider in ~/.mycode/config.json or <workspace>/.mycode/config.json"
435
+ + f"({checked}) or configure a provider in ~/.mycode/config.json or a project .mycode/config.json"
372
436
  )
373
437
 
374
438
 
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  import asyncio
6
6
  import os
7
7
  import sys
8
- from dataclasses import dataclass
8
+ from dataclasses import dataclass, replace
9
9
  from typing import Annotated
10
10
 
11
11
  import typer
@@ -14,7 +14,15 @@ from mycode.agent import Agent
14
14
  from mycode.messages import ConversationMessage
15
15
  from mycode.session import SessionStore
16
16
  from mycode_cli import __version__
17
- from mycode_cli.config import ResolvedProvider, Settings, get_settings, resolve_provider, resolve_sessions_dir
17
+ from mycode_cli.config import (
18
+ ResolvedProvider,
19
+ Settings,
20
+ get_settings,
21
+ parse_permission,
22
+ resolve_provider,
23
+ resolve_sessions_dir,
24
+ )
25
+ from mycode_cli.permissions import PERMISSION_DENIED_BY_USER_OUTPUT, PERMISSION_DENIED_OUTPUT
18
26
 
19
27
  from .runtime import ResolvedSession, build_agent, resolve_session
20
28
  from .tui.chat import TerminalChat
@@ -46,10 +54,10 @@ async def run_noninteractive(agent: Agent, message: str) -> int:
46
54
  async for event in agent.achat(message, on_persist=track):
47
55
  if event.type == "error":
48
56
  error_message = str(event.data.get("message") or "agent error")
49
-
50
- if error_message:
51
- print(error_message, file=sys.stderr)
52
- return 1
57
+ elif event.type == "tool_done" and event.data.get("is_error"):
58
+ output = str(event.data.get("output") or "")
59
+ if output in {PERMISSION_DENIED_OUTPUT, PERMISSION_DENIED_BY_USER_OUTPUT}:
60
+ error_message = output
53
61
 
54
62
  reply = ""
55
63
  if latest_assistant:
@@ -63,6 +71,12 @@ async def run_noninteractive(agent: Agent, message: str) -> int:
63
71
  sys.stdout.write(reply)
64
72
  if not reply.endswith("\n"):
65
73
  sys.stdout.write("\n")
74
+
75
+ if error_message:
76
+ if not reply:
77
+ print(error_message, file=sys.stderr)
78
+ return 1
79
+
66
80
  return 0
67
81
 
68
82
 
@@ -83,6 +97,7 @@ def _bootstrap(
83
97
  session: str | None,
84
98
  continue_last: bool,
85
99
  max_turns: int | None,
100
+ permission: str | None,
86
101
  ) -> _BootstrapContext:
87
102
  """Shared setup for the chat and run commands."""
88
103
 
@@ -92,9 +107,10 @@ def _bootstrap(
92
107
  cwd = os.path.abspath(os.getcwd())
93
108
  store = SessionStore(data_dir=resolve_sessions_dir())
94
109
  view = TerminalView()
95
- settings = get_settings(cwd)
96
-
97
110
  try:
111
+ settings = get_settings(cwd)
112
+ if permission is not None:
113
+ settings = replace(settings, permission=parse_permission(permission, settings.permission))
98
114
  resolved_provider = resolve_provider(settings, provider_name=provider, model=model)
99
115
  resolved_session = asyncio.run(
100
116
  resolve_session(
@@ -136,6 +152,10 @@ def chat(
136
152
  provider: Annotated[str | None, typer.Option(help="Provider id or configured alias")] = None,
137
153
  model: Annotated[str | None, typer.Option(help="Model name (overrides default)")] = None,
138
154
  max_turns: Annotated[int | None, typer.Option(min=1, help="Limit agent loop turns")] = None,
155
+ permission: Annotated[
156
+ str | None,
157
+ typer.Option("--permission", help="Permission level: readonly, safe, standard, yolo"),
158
+ ] = None,
139
159
  session: Annotated[str | None, typer.Option(help="Resume a specific session id")] = None,
140
160
  continue_last: Annotated[bool, typer.Option("--continue", "-c", help="Resume the most recent session")] = False,
141
161
  version: Annotated[
@@ -146,7 +166,6 @@ def chat(
146
166
  callback=_show_version,
147
167
  help="Show version and exit.",
148
168
  is_eager=True,
149
- is_flag=True,
150
169
  ),
151
170
  ] = False,
152
171
  ) -> None:
@@ -164,6 +183,7 @@ def chat(
164
183
  session=session,
165
184
  continue_last=continue_last,
166
185
  max_turns=max_turns,
186
+ permission=permission,
167
187
  )
168
188
 
169
189
  setup.view.print_header(
@@ -197,6 +217,10 @@ def run(
197
217
  provider: Annotated[str | None, typer.Option(help="Provider id or configured alias")] = None,
198
218
  model: Annotated[str | None, typer.Option(help="Model name (overrides default)")] = None,
199
219
  max_turns: Annotated[int | None, typer.Option(min=1, help="Limit agent loop turns")] = None,
220
+ permission: Annotated[
221
+ str | None,
222
+ typer.Option("--permission", help="Permission level: readonly, safe, standard, yolo"),
223
+ ] = None,
200
224
  session: Annotated[str | None, typer.Option(help="Resume a specific session id")] = None,
201
225
  continue_last: Annotated[bool, typer.Option("--continue", "-c", help="Resume the most recent session")] = False,
202
226
  ) -> None:
@@ -208,6 +232,7 @@ def run(
208
232
  session=session,
209
233
  continue_last=continue_last,
210
234
  max_turns=max_turns,
235
+ permission=permission,
211
236
  )
212
237
 
213
238
  code = asyncio.run(run_noninteractive(setup.agent, " ".join(message).strip()))
@@ -0,0 +1,228 @@
1
+ """CLI permission policy built on SDK tool hooks."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import shlex
6
+ from collections.abc import Awaitable, Callable
7
+ from dataclasses import dataclass
8
+ from pathlib import Path
9
+ from typing import Literal, NamedTuple
10
+
11
+ from mycode import Hooks, ToolExecutionResult, ToolHookContext
12
+ from mycode.tools import resolve_path
13
+ from mycode_cli.config import PermissionConfig, PermissionLevel, Settings
14
+ from mycode_cli.system_prompt import discover_skills
15
+
16
+ PermissionTier = Literal["readonly", "safe", "standard", "yolo"]
17
+ PermissionDecision = Literal["allow", "ask", "deny"]
18
+ ToolReviewDecision = Literal["allow", "deny"]
19
+
20
+ PERMISSION_DENIED_OUTPUT = "error: permission denied"
21
+ PERMISSION_DENIED_BY_USER_OUTPUT = "error: permission denied by user"
22
+
23
+ _LEVEL_RANK: dict[PermissionLevel, int] = {"readonly": 0, "safe": 1, "standard": 2, "yolo": 3}
24
+
25
+ _SHELL_CONTROL_TOKENS = {
26
+ "&&", "||", ";", "|", "|&", "&",
27
+ ">", ">>", ">|", "&>", ">&",
28
+ "<", "<<", "<<<", "<&",
29
+ } # fmt: skip
30
+
31
+ _DANGEROUS_PROGRAMS = {
32
+ "rm", "rmdir", "mv", "cp", "sudo", "chmod", "chown",
33
+ "kill", "pkill", "dd", "mkfs", "mount", "umount", "shutdown", "reboot",
34
+ } # fmt: skip
35
+ _DANGEROUS_GIT_SUBCOMMANDS = {"reset", "clean", "checkout", "restore"}
36
+
37
+ # awk/sed are excluded: both can write files and shell out, and statically
38
+ # parsing their scripts isn't worth it.
39
+ _READONLY_PROGRAMS = {
40
+ "pwd", "ls", "dir", "tree", "rg", "grep", "cat", "head", "tail",
41
+ "wc", "stat", "file", "du", "df", "which", "env", "printenv",
42
+ "date", "uname", "whoami", "id", "hostname", "ps", "uptime",
43
+ "realpath", "dirname", "basename",
44
+ "sort", "uniq", "cut", "tr",
45
+ } # fmt: skip
46
+ _READONLY_GIT_SUBCOMMANDS = {"status", "diff", "log", "show", "rev-parse", "ls-files", "grep", "blame", "describe"}
47
+ _READONLY_BRANCH_FLAGS = {"-a", "-r", "-v", "-vv", "--all", "--remotes", "--verbose", "--show-current"}
48
+
49
+ # find flags that write files or execute commands.
50
+ _FIND_DANGEROUS_FLAGS = {
51
+ "-delete", "-exec", "-execdir", "-ok", "-okdir",
52
+ "-fprint", "-fprint0", "-fprintf", "-fls",
53
+ } # fmt: skip
54
+
55
+
56
+ class PermissionCheck(NamedTuple):
57
+ tier: PermissionTier
58
+ preview: str
59
+
60
+
61
+ @dataclass(frozen=True)
62
+ class ToolReviewRequest:
63
+ tool_call_id: str
64
+ tool_name: str
65
+ preview: str
66
+ permission: PermissionConfig
67
+
68
+
69
+ ToolReviewCallback = Callable[[ToolReviewRequest], Awaitable[ToolReviewDecision]]
70
+
71
+
72
+ def build_permission_hooks(
73
+ settings: Settings,
74
+ *,
75
+ review: ToolReviewCallback | None = None,
76
+ on_user_denied: Callable[[], None] | None = None,
77
+ ) -> Hooks:
78
+ hooks = Hooks()
79
+ skill_roots = [Path(s.path).parent.resolve(strict=False) for s in discover_skills(settings.cwd)]
80
+
81
+ @hooks.before_tool
82
+ async def check_permission(ctx: ToolHookContext) -> ToolExecutionResult | None:
83
+ check = classify_tool(ctx, cwd=settings.cwd, project=settings.project, skill_roots=skill_roots)
84
+ decision = permission_decision(settings.permission, check.tier)
85
+ if decision == "allow":
86
+ return None
87
+
88
+ if decision == "ask" and review is not None:
89
+ review_decision = await review(
90
+ ToolReviewRequest(
91
+ tool_call_id=ctx.tool_call_id,
92
+ tool_name=ctx.tool_name,
93
+ preview=check.preview,
94
+ permission=settings.permission,
95
+ )
96
+ )
97
+ if review_decision == "allow":
98
+ return None
99
+ if on_user_denied is not None:
100
+ on_user_denied()
101
+ return ToolExecutionResult(output=PERMISSION_DENIED_BY_USER_OUTPUT, is_error=True)
102
+
103
+ return ToolExecutionResult(output=PERMISSION_DENIED_OUTPUT, is_error=True)
104
+
105
+ return hooks
106
+
107
+
108
+ def permission_decision(permission: PermissionConfig, tier: PermissionTier) -> PermissionDecision:
109
+ if permission.level == "yolo":
110
+ return "allow"
111
+ if tier != "yolo" and _LEVEL_RANK[tier] <= _LEVEL_RANK[permission.level]:
112
+ return "allow"
113
+ return permission.mode
114
+
115
+
116
+ def classify_tool(
117
+ ctx: ToolHookContext,
118
+ *,
119
+ cwd: str,
120
+ project: str,
121
+ skill_roots: list[Path],
122
+ ) -> PermissionCheck:
123
+ name = ctx.tool_name.lower()
124
+
125
+ if name == "bash":
126
+ command = str(ctx.tool_input.get("command") or "").strip()
127
+ return PermissionCheck(_classify_bash(command), command)
128
+
129
+ if name in {"read", "write", "edit"}:
130
+ raw = str(ctx.tool_input.get("path") or "")
131
+ path = Path(resolve_path(raw, cwd=cwd)).resolve(strict=False)
132
+ project_path = Path(project).resolve(strict=False)
133
+ preview = raw or str(path)
134
+ if name == "read" and any(path.is_relative_to(root) for root in skill_roots):
135
+ return PermissionCheck("readonly", preview)
136
+ if not path.is_relative_to(project_path):
137
+ return PermissionCheck("yolo", preview)
138
+ return PermissionCheck("readonly" if name == "read" else "safe", preview)
139
+
140
+ return PermissionCheck("yolo", ctx.tool_name)
141
+
142
+
143
+ def _classify_bash(command: str) -> PermissionTier:
144
+ if not command:
145
+ return "yolo"
146
+ # Newlines and shell expansion bypass static analysis; treat as compound.
147
+ if "\n" in command or "\r" in command or "$(" in command or "`" in command:
148
+ return "yolo"
149
+ try:
150
+ lexer = shlex.shlex(command, posix=True, punctuation_chars=True)
151
+ lexer.whitespace_split = True
152
+ tokens = list(lexer)
153
+ words = shlex.split(command, posix=True)
154
+ except ValueError:
155
+ return "yolo"
156
+ if not words or any(t in _SHELL_CONTROL_TOKENS for t in tokens):
157
+ return "yolo"
158
+
159
+ program = Path(words[0]).name
160
+ if _is_dangerous(program, words):
161
+ return "yolo"
162
+ if _is_readonly(program, words):
163
+ return "readonly"
164
+ return "standard"
165
+
166
+
167
+ def _is_dangerous(program: str, words: list[str]) -> bool:
168
+ if program in _DANGEROUS_PROGRAMS:
169
+ return True
170
+ if program == "sed" and any(w == "-i" or w.startswith("-i") for w in words[1:]):
171
+ return True
172
+ if program == "find" and any(w in _FIND_DANGEROUS_FLAGS for w in words[1:]):
173
+ return True
174
+ if program != "git":
175
+ return False
176
+ sub = _git_subcommand(words)
177
+ if sub in _DANGEROUS_GIT_SUBCOMMANDS:
178
+ return True
179
+ return sub == "push" and any(w in {"-f", "--force", "--force-with-lease"} for w in words[2:])
180
+
181
+
182
+ def _is_readonly(program: str, words: list[str]) -> bool:
183
+ if len(words) == 2 and words[1] in {"--version", "-v", "version"}:
184
+ return True
185
+ if program in _READONLY_PROGRAMS:
186
+ return True
187
+ if program == "find":
188
+ return True
189
+ if program == "command" and words[1:2] == ["-v"] and len(words) >= 3:
190
+ return True
191
+ if program == "type" and len(words) >= 2:
192
+ return True
193
+ if program != "git":
194
+ return False
195
+ sub = _git_subcommand(words)
196
+ if sub in _READONLY_GIT_SUBCOMMANDS:
197
+ return True
198
+ if sub == "remote":
199
+ return not any(w in {"add", "remove", "rm", "rename", "set-url"} for w in words[2:])
200
+ if sub == "branch":
201
+ return all(w in _READONLY_BRANCH_FLAGS for w in words[2:])
202
+ return False
203
+
204
+
205
+ def _git_subcommand(words: list[str]) -> str | None:
206
+ i = 1
207
+ while i < len(words):
208
+ w = words[i]
209
+ if w in {"-C", "-c", "--git-dir", "--work-tree"}:
210
+ i += 2
211
+ continue
212
+ if w.startswith("-"):
213
+ i += 1
214
+ continue
215
+ return w
216
+ return None
217
+
218
+
219
+ __all__ = [
220
+ "PERMISSION_DENIED_BY_USER_OUTPUT",
221
+ "PERMISSION_DENIED_OUTPUT",
222
+ "ToolReviewCallback",
223
+ "ToolReviewDecision",
224
+ "ToolReviewRequest",
225
+ "build_permission_hooks",
226
+ "classify_tool",
227
+ "permission_decision",
228
+ ]
@@ -16,6 +16,7 @@ from mycode.providers import (
16
16
  from mycode.session import SessionStore
17
17
  from mycode.tools import DEFAULT_TOOL_SPECS
18
18
  from mycode_cli.config import ModelConfig, ResolvedProvider, Settings, provider_has_api_key
19
+ from mycode_cli.permissions import ToolReviewCallback, build_permission_hooks
19
20
  from mycode_cli.system_prompt import build_system_prompt
20
21
 
21
22
 
@@ -51,6 +52,7 @@ def build_agent(
51
52
  session_id: str,
52
53
  max_turns: int | None = None,
53
54
  reasoning_effort: str | None = None,
55
+ review: ToolReviewCallback | None = None,
54
56
  ) -> Agent:
55
57
  """Build an agent from the resolved provider, honoring model config overrides.
56
58
 
@@ -59,7 +61,7 @@ def build_agent(
59
61
  """
60
62
 
61
63
  model_config = model_config_for(settings, resolved_provider)
62
- return Agent(
64
+ agent = Agent(
63
65
  model=resolved_provider.model,
64
66
  provider=resolved_provider.provider,
65
67
  cwd=cwd,
@@ -78,6 +80,8 @@ def build_agent(
78
80
  system=build_system_prompt(cwd, settings),
79
81
  tools=DEFAULT_TOOL_SPECS,
80
82
  )
83
+ agent.hooks = build_permission_hooks(settings, review=review, on_user_denied=agent.cancel)
84
+ return agent
81
85
 
82
86
 
83
87
  def model_config_for(settings: Settings, resolved: ResolvedProvider) -> ModelConfig | None:
@@ -113,6 +117,7 @@ def clone_agent(agent: Agent, *, store: SessionStore, session_id: str) -> Agent:
113
117
  supports_pdf_input=agent.supports_pdf_input,
114
118
  system=agent.system,
115
119
  tools=DEFAULT_TOOL_SPECS,
120
+ hooks=agent.hooks,
116
121
  )
117
122
 
118
123