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.
- mycode_cli-0.2.1/.basedpyright/baseline.json +3 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/.github/workflows/ci.yml +9 -6
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/.github/workflows/publish.yml +2 -2
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/.pre-commit-config.yaml +7 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/AGENTS.md +4 -1
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/PKG-INFO +3 -3
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/README.md +2 -2
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/docs/api.md +12 -3
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/docs/config.md +4 -1
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/docs/providers.md +16 -5
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/docs/sessions.md +1 -1
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/docs/web.md +12 -5
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/hatch_build.py +3 -2
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/cli/chat.py +59 -36
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/cli/main.py +5 -7
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/cli/render.py +8 -4
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/cli/runtime.py +4 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/agent.py +24 -14
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/config.py +52 -36
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/messages.py +21 -5
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/models.py +2 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/models_catalog.json +417 -9
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/providers/anthropic_like.py +24 -9
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/providers/base.py +42 -6
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/providers/gemini.py +13 -12
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/providers/openai_chat.py +25 -13
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/providers/openai_responses.py +78 -32
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/session.py +29 -16
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/system_prompt.py +1 -1
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/tools.py +20 -5
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/utils.py +5 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/routers/chat.py +76 -35
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/routers/sessions.py +2 -1
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/run_manager.py +2 -3
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/schemas.py +2 -1
- 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
- mycode_cli-0.2.1/mycode/server/static/assets/index-CGtO7YrK.js +477 -0
- mycode_cli-0.2.1/mycode/server/static/assets/index-DSy61xeD.css +1 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/index.html +2 -2
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/pyproject.toml +49 -14
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/scripts/build_web.py +2 -2
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/scripts/update_models_catalog.py +6 -2
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_agent_loop.py +5 -4
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_cli.py +103 -9
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_config.py +29 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_models.py +19 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_provider_adapters.py +314 -182
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_rewind.py +1 -1
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_tools.py +1 -1
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/uv.lock +66 -1
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/package.json +2 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/pnpm-lock.yaml +180 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/App.tsx +53 -26
- mycode_cli-0.2.1/web/src/components/Chat/InputArea.tsx +383 -0
- mycode_cli-0.2.1/web/src/components/Chat/MarkdownBlock.test.tsx +48 -0
- mycode_cli-0.2.1/web/src/components/Chat/MarkdownBlock.tsx +135 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Chat/MessageBubble.tsx +84 -7
- mycode_cli-0.2.1/web/src/hooks/useChat.test.tsx +244 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/hooks/useChat.ts +26 -17
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/types.ts +33 -2
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/messages.test.ts +62 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/messages.ts +69 -13
- mycode_cli-0.2.1/web/src/vite-env.d.ts +1 -0
- mycode_cli-0.1.2/mycode/server/static/assets/auto-render-xntwXHOX.js +0 -261
- mycode_cli-0.1.2/mycode/server/static/assets/index-BhG63UMx.css +0 -1
- mycode_cli-0.1.2/mycode/server/static/assets/index-DpmWOCHa.js +0 -206
- mycode_cli-0.1.2/mycode/server/static/assets/katex-DnJR2-55.css +0 -1
- mycode_cli-0.1.2/web/src/components/Chat/InputArea.tsx +0 -256
- mycode_cli-0.1.2/web/src/components/Chat/MarkdownBlock.tsx +0 -103
- mycode_cli-0.1.2/web/src/hooks/useChat.test.tsx +0 -67
- mycode_cli-0.1.2/web/src/vite-env.d.ts +0 -17
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/.gitignore +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/LICENSE +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/biome.json +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/__init__.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/cli/__init__.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/cli/theme.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/__init__.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/core/providers/__init__.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/__init__.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/app.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/deps.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/routers/__init__.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/routers/workspaces.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/abap-BdImnpbu.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/actionscript-3-CoDkCxhg.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ada-bCR0ucgS.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/andromeeda-C4gqWexZ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/angular-html-DA-rfuFy.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/angular-ts-BrjP3tb8.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/apache-Pmp26Uib.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/apex-D8_7TLub.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/apl-CORt7UWP.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/applescript-Co6uUVPk.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ara-BRHolxvo.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/asciidoc-Ve4PFQV2.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/asm-D_Q5rh1f.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/astro-HNnZUWAn.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/aurora-x-D-2ljcwZ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/awk-DMzUqQB5.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ayu-dark-DYE7WIF3.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ayu-light-BA47KaF1.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ayu-mirage-32ctXXKs.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ballerina-BFfxhgS-.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/bat-BkioyH1T.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/beancount-k_qm7-4y.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/berry-uYugtg8r.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/bibtex-CHM0blh-.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/bicep-Bmn6On1c.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/bird2-BIv1doCn.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/blade-BjGOyj-B.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/bsl-BO_Y6i37.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/c-BIGW1oBm.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/c3-eo99z4R2.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/cadence-Bv_4Rxtq.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/cairo-KRGpt6FW.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/clarity-D53aC0YG.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/clojure-P80f7IUj.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/cmake-D1j8_8rp.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/cobol-nBiQ_Alo.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/codeowners-Bp6g37R7.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/codeql-DsOJ9woJ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/coffee-Ch7k5sss.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/common-lisp-Cg-RD9OK.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/coq-DkFqJrB1.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/cpp-CofmeUqb.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/crystal-DNxU26gB.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/csharp-COcwbKMJ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/css-CLj8gQPS.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/csv-fuZLfV_i.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/cue-D82EKSYY.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/cypher-COkxafJQ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/d-85-TOEBH.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/dark-plus-C3mMm8J8.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/dart-bE4Kk8sk.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/dax-CEL-wOlO.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/desktop-BmXAJ9_W.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/diff-D97Zzqfu.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/docker-BcOcwvcX.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/dotenv-Da5cRb03.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/dracula-BzJJZx-M.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/dracula-soft-BXkSAIEj.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/dream-maker-BtqSS_iP.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/edge-FbVlp4U3.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/elixir-CkH2-t6x.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/elm-DbKCFpqz.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/emacs-lisp-CXvaQtF9.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/erb-BYCe7drp.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/erlang-DsQrWhSR.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/everforest-dark-BgDCqdQA.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/everforest-light-C8M2exoo.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/fennel-BYunw83y.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/fish-BvzEVeQv.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/fluent-C4IJs8-o.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/fsharp-CXgrBDvD.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gdresource-BOOCDP_w.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gdscript-C5YyOfLZ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gdshader-DkwncUOv.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/genie-D0YGMca9.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gherkin-DyxjwDmM.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/git-commit-F4YmCXRG.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/git-rebase-r7XF79zn.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/github-dark-DHJKELXO.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/github-light-DAi9KRSo.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/github-light-default-D7oLnXFd.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gleam-BspZqrRM.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/glimmer-js-ByusRIyA.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/glimmer-ts-BfAWNZQY.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/glsl-DplSGwfg.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gn-n2N0HUVH.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gnuplot-DdkO51Og.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/go-C27-OAKa.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/graphql-ChdNCCLP.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/groovy-gcz8RCvz.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/hack-i7_Ulhet.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/haml-D5jkg6IW.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/handlebars-BpdQsYii.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/haskell-Df6bDoY_.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/haxe-CzTSHFRz.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/hcl-BWvSN4gD.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/hjson-D5-asLiD.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/hlsl-D3lLCCz7.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/horizon-BUw7H-hv.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/horizon-bright-CUuTKBJd.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/houston-DnULxvSX.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/html-derivative-DlHx6ybY.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/html-pp8916En.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/http-jrhK8wxY.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/hurl-irOxFIW8.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/hxml-Bvhsp5Yf.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/hy-DFXneXwc.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/imba-DGztddWO.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ini-BEwlwnbL.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/java-CylS5w8V.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/javascript-wDzz0qaB.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/jinja-f2NsQr07.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/jison-wvAkD_A8.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/json-Cp-IABpG.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/json5-C9tS-k6U.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/jsonc-Des-eS-w.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/jsonl-DcaNXYhu.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/jsonnet-DFQXde-d.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/jssm-C2t-YnRu.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/jsx-g9-lgVsj.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/julia-CxzCAyBv.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/just-VxiPbLrw.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/kdl-DV7GczEv.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/kotlin-BdnUsdx6.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/kusto-wEQ09or8.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/laserwave-DUszq2jm.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/latex-CWtU0Tv5.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/lean-BZvkOJ9d.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/less-B1dDrJ26.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/light-plus-B7mTdjB0.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/liquid-C0sCDyMI.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/llvm-DjAJT7YJ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/log-2UxHyX5q.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/logo-BtOb2qkB.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/lua-BaeVxFsk.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/luau-C-HG3fhB.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/make-CHLpvVh8.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/markdown-Cvjx9yec.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/marko-DjSrsDqO.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/material-theme-D5KoaKCx.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/material-theme-ocean-CyktbL80.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/matlab-D7o27uSR.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/mdc-DTYItulj.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/mdx-Cmh6b_Ma.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/mermaid-mWjccvbQ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/min-dark-CafNBF8u.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/min-light-CTRr51gU.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/mipsasm-CKIfxQSi.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/mojo-rZm6bMo-.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/monokai-D4h5O-jR.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/moonbit-_H4v1dQx.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/move-IF9eRakj.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/narrat-DRg8JJMk.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/nextflow-C-mBbutL.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/nextflow-groovy-vE_lwT2v.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/nginx-BpAMiNFr.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/night-owl-C39BiMTA.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/night-owl-light-CMTm3GFP.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/nim-BIad80T-.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/nix-CwoSXNpI.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/nord-Ddv68eIx.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/nushell-Cz2AlsmD.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/objective-c-DXmwc3jG.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/objective-cpp-CLxacb5B.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ocaml-C0hk2d4L.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/odin-BBf5iR-q.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/one-light-C3Wv6jpd.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/openscad-C4EeE6gA.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/pascal-D93ZcfNL.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/perl-NvoQZIq0.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/php-R6g_5hLQ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/pkl-u5AG7uiY.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/plastic-3e1v2bzS.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/plsql-ChMvpjG-.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/po-BTJTHyun.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/poimandres-CS3Unz2-.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/polar-C0HS_06l.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/postcss-CXtECtnM.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/powerquery-CEu0bR-o.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/powershell-Dpen1YoG.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/prisma-Dd19v3D-.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/prolog-CbFg5uaA.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/proto-C7zT0LnQ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/pug-DKIMFp6K.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/puppet-BMWR74SV.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/purescript-CklMAg4u.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/python-B6aJPvgy.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/qml-3beO22l8.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/qmldir-C8lEn-DE.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/qss-IeuSbFQv.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/r-Dspwwk_N.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/racket-BqYA7rlc.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/raku-DXvB9xmW.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/razor-BDqjjVU7.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/red-bN70gL4F.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/reg-C-SQnVFl.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/regexp-CDVJQ6XC.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/rel-C3B-1QV4.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/riscv-BM1_JUlF.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ron-D8l8udqQ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/rose-pine-qdsjHGoJ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/rosmsg-BJDFO7_C.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/rst-CRjBmOyv.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ruby-Wjq7vjNf.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/rust-B1yitclQ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/sas-cz2c8ADy.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/sass-Cj5Yp3dK.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/scala-C151Ov-r.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/scheme-C98Dy4si.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/scss-D5BDwBP9.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/sdbl-DVxCFoDh.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/shellscript-Yzrsuije.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/shellsession-BADoaaVG.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/slack-dark-BthQWCQV.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/slack-ochin-DqwNpetd.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/smalltalk-BERRCDM3.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/snazzy-light-Bw305WKR.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/solarized-dark-DXbdFlpD.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/solarized-light-L9t79GZl.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/solidity-rGO070M0.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/soy-8wufbnw4.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/sparql-rVzFXLq3.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/splunk-BtCnVYZw.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/sql-BLtJtn59.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ssh-config-_ykCGR6B.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/stata-BH5u7GGu.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/stylus-BEDo0Tqx.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/surrealql-Bq5Q-fJD.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/svelte-Cy7k_4gC.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/swift-D82vCrfD.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/synthwave-84-CbfX1IO0.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/system-verilog-CnnmHF94.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/systemd-4A_iFExJ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/talonscript-CkByrt1z.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/tasl-QIJgUcNo.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/tcl-dwOrl1Do.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/templ-DhtptRzy.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/terraform-BETggiCN.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/tex-idrVyKtj.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/tokyo-night-hegEt444.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/toml-vGWfd6FD.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/ts-tags-DQrlYJgV.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/tsv-B_m7g4N7.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/tsx-COt5Ahok.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/turtle-BsS91CYL.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/twig-xg9kU7Mw.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/typescript-BPQ3VLAy.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/typespec-CAFt9gP4.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/typst-DHCkPAjA.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/v-BcVCzyr7.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vala-CsfeWuGM.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vb-D17OF-Vu.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/verilog-BQ8w6xss.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vesper-DU1UobuO.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vhdl-CeAyd5Ju.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/viml-CJc9bBzg.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vitesse-light-CVO1_9PV.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vue-D2xRrEX4.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vue-html-AaS7Mt5G.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vue-vine-BoDAl6tE.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/vyper-CDx5xZoG.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/wasm-CG6Dc4jp.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/wasm-MzD3tlZU.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/wenyan-BV7otONQ.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/wgsl-Dx-B1_4e.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/wikitext-BhOHFoWU.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/wit-5i3qLPDT.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/wolfram-lXgVvXCa.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/xml-sdJ4AIDG.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/xsl-CtQFsRM5.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/yaml-Buea-lGh.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/zenscript-DVFEvuxE.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/assets/zig-VOosw3JB.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/mycode/server/static/favicon_slashes.svg +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/scripts/__init__.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/scripts/release.sh +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/conftest.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_agent_provider_request.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_bash.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_cli_imports.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_compact.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_instructions.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_run_manager.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_server_app.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_session.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/tests/test_skills.py +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/index.html +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/postcss.config.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/public/favicon_slashes.svg +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Chat/CodeBlock.tsx +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Chat/EditDiff.tsx +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Chat/HighlightedCode.tsx +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Chat/MessageList.tsx +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Chat/ReasoningBlock.tsx +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Chat/ToolCard.tsx +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Layout.tsx +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/MobileHeader.tsx +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/Sidebar.tsx +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/ThemeProvider.tsx +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/UI/Button.tsx +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/components/WorkspacePicker.tsx +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/hooks/sessionSelection.test.ts +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/hooks/sessionSelection.ts +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/index.css +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/main.tsx +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/test/setup.ts +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/clipboard.ts +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/cn.ts +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/config.ts +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/highlighter.ts +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/storage.test.ts +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/src/utils/storage.ts +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/tailwind.config.js +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/tsconfig.json +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/vite.config.ts +0 -0
- {mycode_cli-0.1.2 → mycode_cli-0.2.1}/web/vitest.config.ts +0 -0
|
@@ -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@
|
|
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:
|
|
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@
|
|
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:
|
|
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@
|
|
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:
|
|
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@
|
|
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:
|
|
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
|
|
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
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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.
|
|
167
|
-
5.
|
|
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.
|
|
@@ -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
|
-
|
|
93
|
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
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.
|
|
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
|
-
|
|
77
|
+
@override
|
|
78
|
+
def _get_text_fragments(self) -> StyleAndTextTuples:
|
|
74
79
|
# Override rendering: show > based on focus, not checked state.
|
|
75
|
-
result:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
288
|
-
|
|
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
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
33
|
+
"""Run one message non-interactively and print only the final assistant reply."""
|
|
36
34
|
|
|
37
|
-
latest_assistant:
|
|
35
|
+
latest_assistant: ConversationMessage | None = None
|
|
38
36
|
|
|
39
|
-
async def persist(payload:
|
|
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")
|