pythinker-code 0.25.0__tar.gz → 0.26.0__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.
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/PKG-INFO +26 -27
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/README.md +25 -26
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/pyproject.toml +1 -1
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/CHANGELOG.md +13 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/system.md +6 -2
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/opencode_go.py +92 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/platforms.py +22 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/core.py +17 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/runner.py +3 -1
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/replace.py +66 -2
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/__init__.py +10 -3
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/markdown.py +29 -2
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/report.py +59 -23
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +3 -4
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/_baseUniq-BETuyuSd.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/_baseUniq-BV0IcpWE.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/arc-9aCOI9DB.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/arc-Cyrtvkp5.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-purnwxgj.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-C6WJgnXC.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-CWJkQ8lw.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-GQd1_IMc.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-CNLtpYDT.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-B47mx86g.js +1 -1
- pythinker_code-0.26.0/src/pythinker_code/web/static/assets/channel-BUTOao-m.js +1 -0
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-CxMQKWPK.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-Cy5x8E1K.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-B-Sjvo9Q.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-DifqgNgE.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-CAxNHDi-.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-r0-BeGnv.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-efzZlF1X.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-XWQHVeUW.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-CLE-PgkS.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-CA_nMgAr.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-DzeBoua8.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-CJveaI0H.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-DWiNjSHn.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-C1sAjmrf.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-UYL3QrRr.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-dYY99i90.js +1 -1
- pythinker_code-0.26.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-CLIe0T4n.js +1 -0
- pythinker_code-0.26.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-CLIe0T4n.js +1 -0
- pythinker_code-0.26.0/src/pythinker_code/web/static/assets/clone-BjWb914D.js +1 -0
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-2PObM5Ub.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-CtrXu_Qg.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-BzG7eohs.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-Ka1axIdw.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/cytoscape.esm-D8GEO0BE.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/cytoscape.esm-CYgRHX5l.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-Dq4xiUtL.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-DxeUvDkL.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-DFC71d2h.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-UpoQP3fh.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-Te_SRUeO.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-rexPrmXt.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-BiSlcy8L.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-Bqsmg2Ru.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-CduNSzrC.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-B0XOb2uZ.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-CtFMWQpr.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-CcOatfXl.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-Cl1hY2iv.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-D1YtSUzx.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-iPKWpJ0a.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-VZLZurNq.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/graph-DFyiQ_iC.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/graph-CqflUrXP.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/index-v6n3kvtp.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/index-BYhDBSlX.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/index-Dfd6WqqI.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/index-CJApTS5K.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/index-ClOjNFIa.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/index-CddeEW2V.js +2 -2
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-DZcQqQGx.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-CBaPkiOc.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-BJsGiEDw.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-Dk3pQbWG.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-DYD8Cc2b.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-DP_5IDy5.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/layout-KNAe020y.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/layout-YlHbm7XF.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/linear-F-ASHo5W.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/linear-BDRfWBAl.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-BPp7ITVn.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-DyUoFCBx.js +7 -7
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/mermaid.core-DguUuNI2.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/mermaid.core-COuleAQZ.js +5 -5
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/min-CtILYf0e.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/min-BGh5aeLW.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-Cz5GuDHV.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-C6QBRyVb.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-BZoqT-q3.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-CSNHu75h.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-xckz1CKJ.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-D5XNXTa7.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-TQ3Cky43.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-BMcLVFmN.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-C0fe9iOM.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-BurCLwEY.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-BRw2gAdM.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-B2M0ZAUV.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-DT4CUX8-.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-vdkc_FHq.js +1 -1
- pythinker_code-0.26.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-C6C4PIor.js +1 -0
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-CsLQ1mau.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-CXwebPi6.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-BbC_5Wbj.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-s78Ox8eo.js +1 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-Ce0W0nFs.js → pythinker_code-0.26.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-B8BvWA5q.js +1 -1
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/index.html +1 -1
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/install.ps1 +23 -9
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/install.sh +28 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/channel-BZrJ1_EH.js +0 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-DmBruagE.js +0 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-DmBruagE.js +0 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/clone-x4PiU-uh.js +0 -1
- pythinker_code-0.25.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-DoANuOAR.js +0 -1
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/LICENSE +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/NOTICE +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/__main__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/AGENTS.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/convert.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/host.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/mcp.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/server.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/session.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/tools.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/types.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/version.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/agent.yaml +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/code_reviewer.yaml +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/coder.yaml +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/debugger.yaml +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/explore.yaml +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/implementer.yaml +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/plan.yaml +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/review.yaml +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/security_reviewer.yaml +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/verifier.yaml +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agentspec.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/app.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/approval_runtime/models.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/deepseek.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/github_feedback.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/lm_studio.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/minimax.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/oauth.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/ollama.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/openai.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/openrouter.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/agent_runner.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/ids.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/manager.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/models.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/store.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/summary.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/worker.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/__main__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/_lazy_group.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/debug.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/export.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/info.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/mcp.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/plugin.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/review.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/secscan.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/security_scan.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/skill.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/toad.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/update.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/vis.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/web.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/config.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/constant.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/events.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/exception.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/execution_profiles.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/extensions.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/file_restore.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/hooks/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/hooks/config.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/hooks/engine.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/hooks/events.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/hooks/runner.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/llm.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/consolidation.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/harvest.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/recall.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/recap.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/retriever.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/retriever_sqlite.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/sanitize.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/metadata.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/native.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/notifications/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/notifications/llm.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/notifications/manager.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/notifications/models.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/notifications/notifier.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/notifications/store.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/notifications/wire.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/plugin/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/plugin/manager.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/plugin/tool.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/project_memory.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/prompt_templates.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/prompts/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/prompts/compact.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/prompts/init.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/py.typed +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/scratchpad.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/session.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/session_fork.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/session_state.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/share.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skill/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skill/flow/d2.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skill/lockfile.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/check-impl-against-spec/SKILL.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/create-pr/SKILL.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/diagnose-ci-failures/SKILL.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/fix-errors/SKILL.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/implement-specs/SKILL.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/pr-walkthrough/SKILL.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/reproduce-bug-report/SKILL.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/resolve-merge-conflicts/SKILL.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/review-pr/SKILL.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/spec-driven-implementation/SKILL.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/write-product-spec/SKILL.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/write-tech-spec/SKILL.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/agent.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/approval.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/btw.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/compaction.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/compaction_restore.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/context.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/denwarenji.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/dynamic_injection.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/message.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/permission.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/pythinkersoul.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/slash.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/toolset.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/builder.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/discovery.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/git_context.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/models.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/output.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/registry.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/store.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/config.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/crash.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/errors.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/metrics.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/otel.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/sentry.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/sink.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/AGENTS.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/agent/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/agent/description.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/ask_user/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/background/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/background/handoff.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/background/input.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/background/list.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/background/output.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/background/stop.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/display.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/glob.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/glob.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/grep.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/grep_local.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/read.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/read.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/read_media.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/read_media.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/replace.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/utils.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/write.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/write.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/memory/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/memory/memory.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/plan/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/plan/description.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/plan/enter.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/plan/handoff.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/scratchpad/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/scratchpad/scratchpad_tool.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/shell/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/shell/bash.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/skill/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/skill/description.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/test.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/think/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/think/think.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/utils.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/web/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/web/_allowlist.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/web/fetch.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/web/fetch.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/web/search.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/web/search.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/print/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/print/visualize.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/diff.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/dynamic_border.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/panel.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/console.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/debug.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/design_system.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/echo.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/glyphs.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/motion.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/prompt.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/render_constants.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/replay.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selector.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/setup.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/slash.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/spacing.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/spinner_words.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/startup.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tips.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/_file_diff.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/update.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_activity_tree.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_dialog_shell.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_transcript.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/theme.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/tui_config.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/aiohttp.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/aioqueue.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/broadcast.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/changelog.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/clipboard.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/datetime.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/diff.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/editor.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/environment.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/envvar.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/export.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/file_filter.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/frontmatter.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/io.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/logging.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/media_tags.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/message.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/path.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/proctitle.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/proxy.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/rich/columns.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/rich/diff_render.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/sensitive.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/server.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/signals.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/slashcmd.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/sleep_inhibitor.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/string.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/term.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/typing.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/api/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/api/sessions.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/api/statistics.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/api/system.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/app.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-CY1rtwrX.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/index-DSRInNnm.css +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/index-DgmTI2M_.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/index.html +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/api/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/api/config.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/api/open_in.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/api/sessions.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/app.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/auth.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/models.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/runner/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/runner/messages.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/runner/process.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/runner/worker.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/_headers +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/abap-BdImnpbu.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ada-bCR0ucgS.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/apache-Pmp26Uib.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/apex-D8_7TLub.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/apl-dKokRX4l.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/applescript-Co6uUVPk.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ara-BRHolxvo.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/asm-D_Q5rh1f.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/astro-CbQHKStN.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/awk-DMzUqQB5.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/bat-BkioyH1T.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/beancount-k_qm7-4y.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/berry-uYugtg8r.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/bibtex-CHM0blh-.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/bicep-Bmn6On1c.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/blade-D4QpJJKB.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/bsl-BO_Y6i37.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/c-BIGW1oBm.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/c3-VCDPK7BO.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/cairo-KRGpt6FW.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/clarity-D53aC0YG.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/clojure-P80f7IUj.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/cmake-D1j8_8rp.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/cobol-nwyudZeR.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/coffee-Ch7k5sss.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/coq-DkFqJrB1.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/cpp-CofmeUqb.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/crystal-tKQVLTB8.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/csharp-K5feNrxe.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/css-DPfMkruS.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/csv-fuZLfV_i.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/cue-D82EKSYY.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/cypher-COkxafJQ.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/d-85-TOEBH.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/dart-CF10PKvl.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/dax-CEL-wOlO.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/diff-D97Zzqfu.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/docker-BcOcwvcX.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/dotenv-Da5cRb03.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/dracula-BzJJZx-M.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/edge-BkV0erSs.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/elixir-CDX3lj18.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/elm-DbKCFpqz.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/erb-BOJIQeun.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/erlang-DsQrWhSR.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/fennel-BYunw83y.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/fish-BvzEVeQv.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/fluent-C4IJs8-o.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gdshader-DkwncUOv.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/genie-D0YGMca9.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/github-dark-DHJKELXO.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/github-light-DAi9KRSo.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gleam-BspZqrRM.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/glsl-DplSGwfg.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gn-n2N0HUVH.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/go-Dn2_MT6a.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/graphql-ChdNCCLP.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/groovy-gcz8RCvz.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/hack-CaT9iCJl.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/haml-B8DHNrY2.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/handlebars-BL8al0AC.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/haskell-Df6bDoY_.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/haxe-CzTSHFRz.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/hcl-BWvSN4gD.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/hjson-D5-asLiD.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/houston-DnULxvSX.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/html-GMplVEZG.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/http-jrhK8wxY.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/hurl-irOxFIW8.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/hy-DFXneXwc.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/imba-DGztddWO.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/index-BpoLgcEt.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/index-CzV_vCfu.css +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/index-DI2oedCt.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ini-BEwlwnbL.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/init-Gi6I4Gst.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/java-CylS5w8V.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/javascript-wDzz0qaB.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/jison-wvAkD_A8.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/json-Cp-IABpG.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/json5-C9tS-k6U.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/jsonc-Des-eS-w.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/jssm-C2t-YnRu.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/jsx-g9-lgVsj.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/julia-CxzCAyBv.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/katex-D2lIc1rk.css +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/kdl-DV7GczEv.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/kusto-DZf3V79B.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/laserwave-DUszq2jm.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/latex-B4uzh10-.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/lean-BZvkOJ9d.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/less-B1dDrJ26.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/liquid-DYVedYrR.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/llvm-BtvRca6l.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/log-2UxHyX5q.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/logo-BtOb2qkB.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/lua-BbnMAYS6.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/luau-C-HG3fhB.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/make-CHLpvVh8.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/markdown-Cvjx9yec.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/marko-DZsq8hO1.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/matlab-D7o27uSR.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/mdc-DUICxH0z.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B2P5VJ9v.css +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/min-dark-CafNBF8u.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/min-light-CTRr51gU.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/mojo-B93PlW-d.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/monokai-D4h5O-jR.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/moonbit-Ba13S78F.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/move-Bu9oaDYs.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/narrat-DRg8JJMk.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/nginx-DknmC5AR.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/night-owl-C39BiMTA.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/nim-CVrawwO9.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/nix-CwoSXNpI.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/nord-Ddv68eIx.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/nushell-C-sUppwS.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/one-light-PoHY5YXO.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/openscad-C4EeE6gA.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/pascal-D93ZcfNL.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/perl-C0TMdlhV.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/php-CDn_0X-4.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/pkl-u5AG7uiY.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/plastic-3e1v2bzS.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/plsql-ChMvpjG-.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/po-BTJTHyun.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/polar-C0HS_06l.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/postcss-CXtECtnM.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/powershell-Dpen1YoG.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/prisma-Dd19v3D-.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/prolog-CbFg5uaA.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/proto-C7zT0LnQ.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/pug-CGlum2m_.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/puppet-BMWR74SV.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/purescript-CklMAg4u.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/python-B6aJPvgy.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/qml-3beO22l8.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/qss-IeuSbFQv.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/r-Dspwwk_N.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/racket-BqYA7rlc.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/raku-DXvB9xmW.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/razor-C1TweQQi.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/red-bN70gL4F.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/reg-C-SQnVFl.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/rel-C3B-1QV4.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/riscv-BM1_JUlF.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/rst-B0xPkSld.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ruby-BvKwtOVI.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/rust-B1yitclQ.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/sas-cz2c8ADy.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/scala-C151Ov-r.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/scheme-C98Dy4si.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/scss-OYdSNvt2.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/shellscript-Yzrsuije.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/shellsession-BADoaaVG.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/solidity-rGO070M0.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/soy-Brmx7dQM.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/sparql-rVzFXLq3.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/splunk-BtCnVYZw.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/sql-BLtJtn59.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/stata-BH5u7GGu.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/svelte-zxCyuUbr.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/swift-Dg5xB15N.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/systemd-4A_iFExJ.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/talonscript-CkByrt1z.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/tasl-QIJgUcNo.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/tcl-dwOrl1Do.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/templ-W15q3VgB.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/terraform-BETggiCN.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/tex-CvyZ59Mk.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/tokyo-night-hegEt444.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/toml-vGWfd6FD.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/tsv-B_m7g4N7.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/tsx-COt5Ahok.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/turtle-BsS91CYL.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/twig-CO9l9SDP.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/typespec-BGHnOYBU.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/typst-DHCkPAjA.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/v-BcVCzyr7.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vala-CsfeWuGM.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vb-D17OF-Vu.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/verilog-BQ8w6xss.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vesper-DU1UobuO.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/viml-CJc9bBzg.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vue-DN_0RTcg.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vyper-CDx5xZoG.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/wasm-MzD3tlZU.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/wenyan-BV7otONQ.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/wit-5i3qLPDT.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/xml-sdJ4AIDG.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/xsl-CtQFsRM5.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/yaml-Buea-lGh.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/zig-VOosw3JB.js +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/logo.png +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/store/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/store/sessions.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/__init__.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/file.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/protocol.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/root_hub.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/serde.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/server.py +0 -0
- {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/types.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pythinker-code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.26.0
|
|
4
4
|
Summary: Pythinker Code is your next CLI agent.
|
|
5
5
|
Keywords: cli,agent,ai,coding-assistant,llm,claude,openai,terminal
|
|
6
6
|
Author: Mohamed Elkholy
|
|
@@ -115,16 +115,15 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
|
|
|
115
115
|
|
|
116
116
|
---
|
|
117
117
|
|
|
118
|
-
## 🆕 What's New in 0.
|
|
118
|
+
## 🆕 What's New in 0.26.0
|
|
119
119
|
|
|
120
|
-
-
|
|
121
|
-
- **
|
|
122
|
-
- **
|
|
123
|
-
- **
|
|
124
|
-
- **Steadier agent
|
|
125
|
-
- **Unified report rendering.** Code review, verify, and security-review output share one standardized renderer, including `report` blocks emitted by skills and agents.
|
|
120
|
+
- **Install and update no longer 404 on a freshly published release.** Releases are now published as a prerelease and promoted to "latest" only once every platform asset has uploaded, and the curl/PowerShell installers wait for their archive + checksum before downloading — so `irm | iex` / `curl | bash` run mid-publish no longer fail on a missing installer.
|
|
121
|
+
- **OpenCode Go model catalog refreshes on startup without a re-login.** Bundled catalog changes (new models, corrected provider shapes) now reach existing installs through the every-startup refresh, across both OpenAI- and Anthropic-shaped providers, while preserving your default model and thinking settings.
|
|
122
|
+
- **Homebrew install shows the logo and fails fast on a missing tap token.** `brew install` now prints the robot-head banner via formula caveats, and the tap workflow reports an actionable error when `HOMEBREW_TAP_TOKEN` is missing instead of an opaque git failure.
|
|
123
|
+
- **Markdown and report rendering hardened against real model output.** Code-span pipes inside tables no longer fracture the table, and a `report` block nested inside a documentation fence is no longer wrongly promoted — report fences are now extracted via a markdown-it AST walk.
|
|
124
|
+
- **Steadier agent editing and a restored update prompt.** File-replace edit handling is hardened, subagent prompt persistence and the agent's working language are preserved, and the blocking pre-start update prompt is restored so it runs before every interactive session.
|
|
126
125
|
|
|
127
|
-
Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.
|
|
126
|
+
Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.26.0`, or use the native installer for your platform from the [Releases page](https://github.com/TechMatrix-labs/pythinker-code/releases/latest).
|
|
128
127
|
|
|
129
128
|
|
|
130
129
|
---
|
|
@@ -214,7 +213,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
|
|
|
214
213
|
|
|
215
214
|
| Platform | Recommended install | Artifact source |
|
|
216
215
|
|---|---|---|
|
|
217
|
-
| **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.
|
|
216
|
+
| **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.26.0.exe` from [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
|
|
218
217
|
| **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> / <img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux">** | `curl -fsSL https://pythinker.com/install.sh \| bash` | native tarball from [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
|
|
219
218
|
| **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> — Homebrew** | `brew install TechMatrix-labs/pythinker/pythinker-code` | auto-published Homebrew tap |
|
|
220
219
|
| **<img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux"> — system package** | Download the `.deb` or `.rpm` for your distro below | [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
|
|
@@ -239,7 +238,7 @@ pythinker # start the interactive TUI
|
|
|
239
238
|
|
|
240
239
|
### 🪟 Windows — native installer
|
|
241
240
|
|
|
242
|
-
`PythinkerSetup-0.
|
|
241
|
+
`PythinkerSetup-0.26.0.exe` is a signed* Inno Setup wizard. Installs per-user
|
|
243
242
|
into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
|
|
244
243
|
PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
|
|
245
244
|
the change. **No UAC prompt.**
|
|
@@ -250,13 +249,13 @@ irm https://pythinker.com/install.ps1 | iex
|
|
|
250
249
|
|
|
251
250
|
# Or manually download the installer + checksum from the Releases page,
|
|
252
251
|
# verify with Get-FileHash, then run:
|
|
253
|
-
.\PythinkerSetup-0.
|
|
252
|
+
.\PythinkerSetup-0.26.0.exe
|
|
254
253
|
|
|
255
254
|
# Open a fresh PowerShell
|
|
256
255
|
pythinker --version
|
|
257
256
|
```
|
|
258
257
|
|
|
259
|
-
**Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.
|
|
258
|
+
**Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.26.0.exe /ALLUSERS`
|
|
260
259
|
installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
|
|
261
260
|
|
|
262
261
|
**Upgrade:** `pythinker update` from inside the running app — it downloads
|
|
@@ -307,26 +306,26 @@ attached to every GitHub Release.
|
|
|
307
306
|
|
|
308
307
|
```sh
|
|
309
308
|
# Debian / Ubuntu (x86_64)
|
|
310
|
-
sudo dpkg -i pythinker-code_0.
|
|
309
|
+
sudo dpkg -i pythinker-code_0.26.0_amd64.deb
|
|
311
310
|
sudo apt-get install -f # only if dpkg reports missing deps
|
|
312
311
|
|
|
313
312
|
# Debian / Ubuntu (ARM64)
|
|
314
|
-
sudo dpkg -i pythinker-code_0.
|
|
313
|
+
sudo dpkg -i pythinker-code_0.26.0_arm64.deb
|
|
315
314
|
|
|
316
315
|
# Fedora / RHEL / openSUSE (x86_64)
|
|
317
|
-
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.
|
|
318
|
-
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.
|
|
319
|
-
sha256sum -c pythinker-code-0.
|
|
316
|
+
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.26.0/pythinker-code-0.26.0.x86_64.rpm
|
|
317
|
+
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.26.0/pythinker-code-0.26.0.x86_64.rpm.sha256
|
|
318
|
+
sha256sum -c pythinker-code-0.26.0.x86_64.rpm.sha256
|
|
320
319
|
# Fedora / RHEL:
|
|
321
|
-
sudo dnf install ./pythinker-code-0.
|
|
320
|
+
sudo dnf install ./pythinker-code-0.26.0.x86_64.rpm
|
|
322
321
|
# openSUSE:
|
|
323
|
-
sudo zypper install ./pythinker-code-0.
|
|
322
|
+
sudo zypper install ./pythinker-code-0.26.0.x86_64.rpm
|
|
324
323
|
|
|
325
324
|
# Fedora / RHEL (aarch64)
|
|
326
|
-
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.
|
|
327
|
-
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.
|
|
328
|
-
sha256sum -c pythinker-code-0.
|
|
329
|
-
sudo dnf install ./pythinker-code-0.
|
|
325
|
+
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.26.0/pythinker-code-0.26.0.aarch64.rpm
|
|
326
|
+
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.26.0/pythinker-code-0.26.0.aarch64.rpm.sha256
|
|
327
|
+
sha256sum -c pythinker-code-0.26.0.aarch64.rpm.sha256
|
|
328
|
+
sudo dnf install ./pythinker-code-0.26.0.aarch64.rpm
|
|
330
329
|
```
|
|
331
330
|
|
|
332
331
|
Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
|
|
@@ -335,8 +334,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
|
|
|
335
334
|
**Verify before install:**
|
|
336
335
|
|
|
337
336
|
```sh
|
|
338
|
-
sha256sum -c pythinker-code_0.
|
|
339
|
-
sha256sum -c pythinker-code-0.
|
|
337
|
+
sha256sum -c pythinker-code_0.26.0_amd64.deb.sha256 # Debian/Ubuntu
|
|
338
|
+
sha256sum -c pythinker-code-0.26.0.x86_64.rpm.sha256 # Fedora/RHEL
|
|
340
339
|
```
|
|
341
340
|
|
|
342
341
|
**Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
|
|
@@ -366,7 +365,7 @@ at `~/.local/bin/pythinker`.
|
|
|
366
365
|
curl -fsSL https://pythinker.com/install.sh | bash
|
|
367
366
|
|
|
368
367
|
# Pin a specific version
|
|
369
|
-
curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.
|
|
368
|
+
curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.26.0
|
|
370
369
|
|
|
371
370
|
# Custom prefix (defaults to $HOME/.local)
|
|
372
371
|
curl -fsSL https://pythinker.com/install.sh | bash -s -- --prefix /opt/pythinker
|
|
@@ -50,16 +50,15 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
|
|
|
50
50
|
|
|
51
51
|
---
|
|
52
52
|
|
|
53
|
-
## 🆕 What's New in 0.
|
|
53
|
+
## 🆕 What's New in 0.26.0
|
|
54
54
|
|
|
55
|
-
-
|
|
56
|
-
- **
|
|
57
|
-
- **
|
|
58
|
-
- **
|
|
59
|
-
- **Steadier agent
|
|
60
|
-
- **Unified report rendering.** Code review, verify, and security-review output share one standardized renderer, including `report` blocks emitted by skills and agents.
|
|
55
|
+
- **Install and update no longer 404 on a freshly published release.** Releases are now published as a prerelease and promoted to "latest" only once every platform asset has uploaded, and the curl/PowerShell installers wait for their archive + checksum before downloading — so `irm | iex` / `curl | bash` run mid-publish no longer fail on a missing installer.
|
|
56
|
+
- **OpenCode Go model catalog refreshes on startup without a re-login.** Bundled catalog changes (new models, corrected provider shapes) now reach existing installs through the every-startup refresh, across both OpenAI- and Anthropic-shaped providers, while preserving your default model and thinking settings.
|
|
57
|
+
- **Homebrew install shows the logo and fails fast on a missing tap token.** `brew install` now prints the robot-head banner via formula caveats, and the tap workflow reports an actionable error when `HOMEBREW_TAP_TOKEN` is missing instead of an opaque git failure.
|
|
58
|
+
- **Markdown and report rendering hardened against real model output.** Code-span pipes inside tables no longer fracture the table, and a `report` block nested inside a documentation fence is no longer wrongly promoted — report fences are now extracted via a markdown-it AST walk.
|
|
59
|
+
- **Steadier agent editing and a restored update prompt.** File-replace edit handling is hardened, subagent prompt persistence and the agent's working language are preserved, and the blocking pre-start update prompt is restored so it runs before every interactive session.
|
|
61
60
|
|
|
62
|
-
Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.
|
|
61
|
+
Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.26.0`, or use the native installer for your platform from the [Releases page](https://github.com/TechMatrix-labs/pythinker-code/releases/latest).
|
|
63
62
|
|
|
64
63
|
|
|
65
64
|
---
|
|
@@ -149,7 +148,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
|
|
|
149
148
|
|
|
150
149
|
| Platform | Recommended install | Artifact source |
|
|
151
150
|
|---|---|---|
|
|
152
|
-
| **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.
|
|
151
|
+
| **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.26.0.exe` from [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
|
|
153
152
|
| **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> / <img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux">** | `curl -fsSL https://pythinker.com/install.sh \| bash` | native tarball from [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
|
|
154
153
|
| **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> — Homebrew** | `brew install TechMatrix-labs/pythinker/pythinker-code` | auto-published Homebrew tap |
|
|
155
154
|
| **<img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux"> — system package** | Download the `.deb` or `.rpm` for your distro below | [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
|
|
@@ -174,7 +173,7 @@ pythinker # start the interactive TUI
|
|
|
174
173
|
|
|
175
174
|
### 🪟 Windows — native installer
|
|
176
175
|
|
|
177
|
-
`PythinkerSetup-0.
|
|
176
|
+
`PythinkerSetup-0.26.0.exe` is a signed* Inno Setup wizard. Installs per-user
|
|
178
177
|
into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
|
|
179
178
|
PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
|
|
180
179
|
the change. **No UAC prompt.**
|
|
@@ -185,13 +184,13 @@ irm https://pythinker.com/install.ps1 | iex
|
|
|
185
184
|
|
|
186
185
|
# Or manually download the installer + checksum from the Releases page,
|
|
187
186
|
# verify with Get-FileHash, then run:
|
|
188
|
-
.\PythinkerSetup-0.
|
|
187
|
+
.\PythinkerSetup-0.26.0.exe
|
|
189
188
|
|
|
190
189
|
# Open a fresh PowerShell
|
|
191
190
|
pythinker --version
|
|
192
191
|
```
|
|
193
192
|
|
|
194
|
-
**Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.
|
|
193
|
+
**Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.26.0.exe /ALLUSERS`
|
|
195
194
|
installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
|
|
196
195
|
|
|
197
196
|
**Upgrade:** `pythinker update` from inside the running app — it downloads
|
|
@@ -242,26 +241,26 @@ attached to every GitHub Release.
|
|
|
242
241
|
|
|
243
242
|
```sh
|
|
244
243
|
# Debian / Ubuntu (x86_64)
|
|
245
|
-
sudo dpkg -i pythinker-code_0.
|
|
244
|
+
sudo dpkg -i pythinker-code_0.26.0_amd64.deb
|
|
246
245
|
sudo apt-get install -f # only if dpkg reports missing deps
|
|
247
246
|
|
|
248
247
|
# Debian / Ubuntu (ARM64)
|
|
249
|
-
sudo dpkg -i pythinker-code_0.
|
|
248
|
+
sudo dpkg -i pythinker-code_0.26.0_arm64.deb
|
|
250
249
|
|
|
251
250
|
# Fedora / RHEL / openSUSE (x86_64)
|
|
252
|
-
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.
|
|
253
|
-
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.
|
|
254
|
-
sha256sum -c pythinker-code-0.
|
|
251
|
+
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.26.0/pythinker-code-0.26.0.x86_64.rpm
|
|
252
|
+
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.26.0/pythinker-code-0.26.0.x86_64.rpm.sha256
|
|
253
|
+
sha256sum -c pythinker-code-0.26.0.x86_64.rpm.sha256
|
|
255
254
|
# Fedora / RHEL:
|
|
256
|
-
sudo dnf install ./pythinker-code-0.
|
|
255
|
+
sudo dnf install ./pythinker-code-0.26.0.x86_64.rpm
|
|
257
256
|
# openSUSE:
|
|
258
|
-
sudo zypper install ./pythinker-code-0.
|
|
257
|
+
sudo zypper install ./pythinker-code-0.26.0.x86_64.rpm
|
|
259
258
|
|
|
260
259
|
# Fedora / RHEL (aarch64)
|
|
261
|
-
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.
|
|
262
|
-
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.
|
|
263
|
-
sha256sum -c pythinker-code-0.
|
|
264
|
-
sudo dnf install ./pythinker-code-0.
|
|
260
|
+
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.26.0/pythinker-code-0.26.0.aarch64.rpm
|
|
261
|
+
curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.26.0/pythinker-code-0.26.0.aarch64.rpm.sha256
|
|
262
|
+
sha256sum -c pythinker-code-0.26.0.aarch64.rpm.sha256
|
|
263
|
+
sudo dnf install ./pythinker-code-0.26.0.aarch64.rpm
|
|
265
264
|
```
|
|
266
265
|
|
|
267
266
|
Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
|
|
@@ -270,8 +269,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
|
|
|
270
269
|
**Verify before install:**
|
|
271
270
|
|
|
272
271
|
```sh
|
|
273
|
-
sha256sum -c pythinker-code_0.
|
|
274
|
-
sha256sum -c pythinker-code-0.
|
|
272
|
+
sha256sum -c pythinker-code_0.26.0_amd64.deb.sha256 # Debian/Ubuntu
|
|
273
|
+
sha256sum -c pythinker-code-0.26.0.x86_64.rpm.sha256 # Fedora/RHEL
|
|
275
274
|
```
|
|
276
275
|
|
|
277
276
|
**Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
|
|
@@ -301,7 +300,7 @@ at `~/.local/bin/pythinker`.
|
|
|
301
300
|
curl -fsSL https://pythinker.com/install.sh | bash
|
|
302
301
|
|
|
303
302
|
# Pin a specific version
|
|
304
|
-
curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.
|
|
303
|
+
curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.26.0
|
|
305
304
|
|
|
306
305
|
# Custom prefix (defaults to $HOME/.local)
|
|
307
306
|
curl -fsSL https://pythinker.com/install.sh | bash -s -- --prefix /opt/pythinker
|
|
@@ -15,6 +15,19 @@ GitHub Releases page; `0.8.0` is the new starting line.
|
|
|
15
15
|
|
|
16
16
|
## Unreleased
|
|
17
17
|
|
|
18
|
+
## 0.26.0 (2026-05-30)
|
|
19
|
+
|
|
20
|
+
### What changed in this release
|
|
21
|
+
|
|
22
|
+
- **Install and update no longer 404 on a freshly published release.** The 0.24.0 "atomic latest" gate turned out to be dead code — it ran only on a `release: published` event that a token-created release never fires, and did not affect `/releases/latest` anyway. The GitHub Release is now created as a **prerelease**, and a new `promote-release.yml` runs on the tag push, waits for every platform asset to finish uploading, then clears the prerelease flag and marks the release latest — the single point at which a version becomes resolvable by installers and the in-app updater. As defense-in-depth, the curl and PowerShell installers now resolve the newest release that actually carries their platform asset (skipping drafts and prereleases) and wait for the archive plus checksum before downloading, so `irm | iex` / `curl | bash` run during the publish window no longer fail on a missing `PythinkerSetup-<ver>.exe` or archive.
|
|
23
|
+
- **OpenCode Go model catalog refreshes on every startup without a re-login.** Bundled catalog changes — new models, corrected provider shapes — previously reached an existing install only after a manual `pythinker login --opencode-go`. OpenCode Go is now wired into the every-startup `refresh_managed_models` task with its own discovery and a dedicated apply that upserts and prunes across both its OpenAI- and Anthropic-shaped providers while preserving your `default_model` and `default_thinking`. Discovery failures are isolated so they cannot abort other providers' saves; provider `base_url` repairs still require a re-login.
|
|
24
|
+
- **Homebrew install shows the logo and fails fast on a missing tap token.** `brew install` now prints the robot-head banner via a formula `caveats` block — the banner previously lived only in the curl and PowerShell installers, which Homebrew never runs. The tap auto-update workflow now detects an empty `HOMEBREW_TAP_TOKEN` (lost in the org migration, which had frozen the tap at 0.23.0) and fails with an actionable error instead of an opaque git exit-128.
|
|
25
|
+
- **Markdown and report rendering hardened against real model output.** Code-span pipes inside Markdown tables are now protected so a `|` inside backticks no longer fractures the table, and a `report` block nested inside an outer documentation fence is no longer wrongly promoted to a report — report fences are extracted via a markdown-it AST walk instead of a flat regex. Backed by a new TUI markdown/report contract test suite grounded in a real security-scan fixture.
|
|
26
|
+
- **Steadier agent editing and a restored update prompt.** File-replace edit handling is hardened, subagent prompt persistence and the agent's working language are preserved across turns, and the todo list stays aligned during a turn. The blocking pre-start update prompt — wired in 0.24.0 but again left unwired by a later refactor — is restored so it runs before every interactive session.
|
|
27
|
+
- **CI runs required checks on every pull request.** The `check`, `test`, and `release-validate` contexts were path-filtered off docs-only (and `sdks/`/`examples/`-only) PRs, so the required statuses never reported and those PRs stayed BLOCKED under branch protection with no clean override. The `pull_request` path filter is dropped so every PR runs each required context exactly once; the `push` trigger keeps its filter unchanged.
|
|
28
|
+
|
|
29
|
+
Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.26.0`, or use the native installer for your OS (see the README install table).
|
|
30
|
+
|
|
18
31
|
## 0.25.0 (2026-05-29)
|
|
19
32
|
|
|
20
33
|
### What changed in this release
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
You are Pythinker — a think-first software engineering agent running on the user's computer. Before you write code, you read code.
|
|
2
2
|
|
|
3
|
+
# Output Language
|
|
4
|
+
|
|
5
|
+
Always write natural-language output in the same language as the user's latest human request, unless the user explicitly asks for another language. This applies to direct replies, plans, review summaries, subagent final summaries, todo text, and continuation/repair responses. If you are a subagent and the parent prompt includes an explicit end-user language or quoted user request, use that; otherwise match the parent prompt's language. Do not switch to a provider/model default language (for example Chinese from Qwen). Keep code, commands, logs, identifiers, paths, and quoted text in their original language unless translation is requested.
|
|
6
|
+
|
|
3
7
|
Your identity, in order of priority:
|
|
4
8
|
|
|
5
9
|
1. **Code reviewer.** Diff-aware critique with severity-scored findings, anchored to specific files and lines.
|
|
@@ -54,6 +58,8 @@ For any codebase, architecture, debugging, security, performance, planning, or "
|
|
|
54
58
|
|
|
55
59
|
`title` is required; `scope`, `note`, `location`, and `body` are optional. `severity` must be one of the five listed values. Order does not matter — the renderer groups by severity (critical first) and derives the summary tally. Put narrative prose outside the block, before or after it.
|
|
56
60
|
|
|
61
|
+
**Dual-destination reports:** When acting as the root agent and the user asks for a review, audit, deep scan, or other report, always do both: present a concise terminal report in your final response and save the full report under `.pythinker/reports/<descriptive-slug>.md`. Create `.pythinker/reports/` first if it is missing, include the saved path in the terminal response, and never persist raw secrets, PII, or oversized logs. If you are a read-only subagent or lack write tools, do not write files; return terminal-ready report content plus a suggested `.pythinker/reports/...` path so the parent can display and persist it.
|
|
62
|
+
|
|
57
63
|
# Engineering Discipline
|
|
58
64
|
|
|
59
65
|
These principles govern every engineering response. They override speed: a slow right answer beats a fast wrong one.
|
|
@@ -134,8 +140,6 @@ If the `Shell`, `TaskList`, `TaskOutput`, and `TaskStop` tools are available and
|
|
|
134
140
|
|
|
135
141
|
If a foreground tool call or a background agent requests approval, the approval is coordinated through the unified approval runtime and surfaced through the root UI channel. Do not assume approvals are local to a single subagent turn.
|
|
136
142
|
|
|
137
|
-
When responding to the user, you MUST use the SAME language as the user, unless explicitly instructed to do otherwise.
|
|
138
|
-
|
|
139
143
|
# General Guidelines for Coding
|
|
140
144
|
|
|
141
145
|
When building something from scratch, you should:
|
|
@@ -21,6 +21,10 @@ OPENCODE_GO_BASE_URL = "https://opencode.ai/zen/go/v1"
|
|
|
21
21
|
OPENCODE_GO_ANTHROPIC_BASE_URL = "https://opencode.ai/zen/go"
|
|
22
22
|
OPENCODE_GO_OPENAI_PROVIDER_KEY = "managed:opencode-go-openai"
|
|
23
23
|
OPENCODE_GO_ANTHROPIC_PROVIDER_KEY = "managed:opencode-go-anthropic"
|
|
24
|
+
OPENCODE_GO_PROVIDER_KEYS = (
|
|
25
|
+
OPENCODE_GO_OPENAI_PROVIDER_KEY,
|
|
26
|
+
OPENCODE_GO_ANTHROPIC_PROVIDER_KEY,
|
|
27
|
+
)
|
|
24
28
|
OPENCODE_GO_DEFAULT_MODEL_ALIAS = "opencode-go/kimi-k2.6"
|
|
25
29
|
OPENCODE_GO_DEFAULT_CONTEXT = 262_000
|
|
26
30
|
|
|
@@ -297,6 +301,94 @@ async def _discover_opencode_go_models(api_key: str) -> tuple[OpenCodeGoModel, .
|
|
|
297
301
|
return _build_models(model_ids, metadata)
|
|
298
302
|
|
|
299
303
|
|
|
304
|
+
def _opencode_go_api_key(config: Config) -> str | None:
|
|
305
|
+
"""The saved OpenCode Go key (both providers share it), or None if absent."""
|
|
306
|
+
for provider_key in OPENCODE_GO_PROVIDER_KEYS:
|
|
307
|
+
provider = config.providers.get(provider_key)
|
|
308
|
+
if provider is None:
|
|
309
|
+
continue
|
|
310
|
+
value = provider.api_key.get_secret_value().strip()
|
|
311
|
+
if value:
|
|
312
|
+
return value
|
|
313
|
+
return None
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def apply_opencode_go_models(config: Config, models: tuple[OpenCodeGoModel, ...]) -> bool:
|
|
317
|
+
"""Upsert discovered OpenCode Go models and prune ones no longer offered,
|
|
318
|
+
across both shape providers.
|
|
319
|
+
|
|
320
|
+
Unlike ``_apply_opencode_go_config`` (the login path), this preserves the
|
|
321
|
+
user's ``default_model`` and ``default_thinking`` — it only reassigns the
|
|
322
|
+
default when the currently selected model was pruned. This mirrors
|
|
323
|
+
``platforms._apply_models`` for the two-provider OpenCode Go split, so the
|
|
324
|
+
background refresh can keep the catalog current without resetting choices.
|
|
325
|
+
|
|
326
|
+
Returns True if ``config.models`` (or the default) changed.
|
|
327
|
+
"""
|
|
328
|
+
changed = False
|
|
329
|
+
aliases: list[str] = []
|
|
330
|
+
for model in models:
|
|
331
|
+
alias = model.alias
|
|
332
|
+
aliases.append(alias)
|
|
333
|
+
existing = config.models.get(alias)
|
|
334
|
+
if existing is None:
|
|
335
|
+
config.models[alias] = LLMModel(
|
|
336
|
+
provider=model.provider_key,
|
|
337
|
+
model=model.model_id,
|
|
338
|
+
max_context_size=model.max_context_size,
|
|
339
|
+
display_name=model.display_name,
|
|
340
|
+
)
|
|
341
|
+
changed = True
|
|
342
|
+
continue
|
|
343
|
+
if existing.provider != model.provider_key:
|
|
344
|
+
existing.provider = model.provider_key
|
|
345
|
+
changed = True
|
|
346
|
+
if existing.model != model.model_id:
|
|
347
|
+
existing.model = model.model_id
|
|
348
|
+
changed = True
|
|
349
|
+
if existing.max_context_size != model.max_context_size:
|
|
350
|
+
existing.max_context_size = model.max_context_size
|
|
351
|
+
changed = True
|
|
352
|
+
if existing.display_name != model.display_name:
|
|
353
|
+
existing.display_name = model.display_name
|
|
354
|
+
changed = True
|
|
355
|
+
|
|
356
|
+
alias_set = set(aliases)
|
|
357
|
+
removed_default = False
|
|
358
|
+
for alias, model_cfg in list(config.models.items()):
|
|
359
|
+
if model_cfg.provider not in OPENCODE_GO_PROVIDER_KEYS:
|
|
360
|
+
continue
|
|
361
|
+
if alias in alias_set:
|
|
362
|
+
continue
|
|
363
|
+
del config.models[alias]
|
|
364
|
+
if config.default_model == alias:
|
|
365
|
+
removed_default = True
|
|
366
|
+
changed = True
|
|
367
|
+
|
|
368
|
+
if removed_default:
|
|
369
|
+
config.default_model = aliases[0] if aliases else next(iter(config.models), "")
|
|
370
|
+
changed = True
|
|
371
|
+
elif config.default_model and config.default_model not in config.models:
|
|
372
|
+
config.default_model = next(iter(config.models), "")
|
|
373
|
+
changed = True
|
|
374
|
+
return changed
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
async def refresh_opencode_go_models(config: Config) -> tuple[OpenCodeGoModel, ...] | None:
|
|
378
|
+
"""Re-discover the live OpenCode Go model list for the startup managed-model
|
|
379
|
+
refresh, reusing the saved API key.
|
|
380
|
+
|
|
381
|
+
Returns the discovered models to apply, or None when OpenCode Go isn't
|
|
382
|
+
configured or discovery yields nothing (so callers leave the saved list
|
|
383
|
+
untouched). Network/HTTP errors propagate to the caller.
|
|
384
|
+
"""
|
|
385
|
+
api_key = _opencode_go_api_key(config)
|
|
386
|
+
if api_key is None:
|
|
387
|
+
return None
|
|
388
|
+
discovered = await _discover_opencode_go_models(api_key)
|
|
389
|
+
return discovered or None
|
|
390
|
+
|
|
391
|
+
|
|
300
392
|
async def login_opencode_go_api_key(
|
|
301
393
|
config: Config, api_key: str | None = None
|
|
302
394
|
) -> AsyncIterator[OAuthEvent]:
|
|
@@ -212,6 +212,13 @@ async def refresh_managed_models(config: Config) -> bool:
|
|
|
212
212
|
if not config.is_from_default_location:
|
|
213
213
|
return False
|
|
214
214
|
|
|
215
|
+
from pythinker_code.auth.opencode_go import (
|
|
216
|
+
OPENCODE_GO_PROVIDER_KEYS,
|
|
217
|
+
OpenCodeGoModel,
|
|
218
|
+
apply_opencode_go_models,
|
|
219
|
+
refresh_opencode_go_models,
|
|
220
|
+
)
|
|
221
|
+
|
|
215
222
|
managed_providers = {
|
|
216
223
|
key: provider for key, provider in config.providers.items() if is_managed_provider_key(key)
|
|
217
224
|
}
|
|
@@ -222,6 +229,11 @@ async def refresh_managed_models(config: Config) -> bool:
|
|
|
222
229
|
updates: list[tuple[str, str, list[ModelInfo]]] = []
|
|
223
230
|
oauth_manager = None
|
|
224
231
|
for provider_key, provider in managed_providers.items():
|
|
232
|
+
# OpenCode Go uses a two-shape (OpenAI- + Anthropic-compatible) provider
|
|
233
|
+
# split that the generic single-provider path below can't express, so it
|
|
234
|
+
# is refreshed via its own discovery after this loop.
|
|
235
|
+
if provider_key in OPENCODE_GO_PROVIDER_KEYS:
|
|
236
|
+
continue
|
|
225
237
|
platform_id = parse_managed_provider_key(provider_key)
|
|
226
238
|
if not platform_id:
|
|
227
239
|
continue
|
|
@@ -341,12 +353,22 @@ async def refresh_managed_models(config: Config) -> bool:
|
|
|
341
353
|
if _apply_models(config, provider_key, platform_id, models):
|
|
342
354
|
changed = True
|
|
343
355
|
|
|
356
|
+
opencode_go_models: tuple[OpenCodeGoModel, ...] | None = None
|
|
357
|
+
try:
|
|
358
|
+
opencode_go_models = await refresh_opencode_go_models(config)
|
|
359
|
+
except (aiohttp.ClientError, TimeoutError, ValueError) as exc:
|
|
360
|
+
logger.warning("Failed to refresh OpenCode Go models: {error}", error=exc)
|
|
361
|
+
if opencode_go_models and apply_opencode_go_models(config, opencode_go_models):
|
|
362
|
+
changed = True
|
|
363
|
+
|
|
344
364
|
if changed:
|
|
345
365
|
config_for_save = load_config()
|
|
346
366
|
save_changed = False
|
|
347
367
|
for provider_key, platform_id, models in updates:
|
|
348
368
|
if _apply_models(config_for_save, provider_key, platform_id, models):
|
|
349
369
|
save_changed = True
|
|
370
|
+
if opencode_go_models and apply_opencode_go_models(config_for_save, opencode_go_models):
|
|
371
|
+
save_changed = True
|
|
350
372
|
if save_changed:
|
|
351
373
|
save_config(config_for_save)
|
|
352
374
|
return changed
|
|
@@ -18,6 +18,16 @@ from pythinker_code.subagents.builder import SubagentBuilder
|
|
|
18
18
|
from pythinker_code.subagents.models import AgentLaunchSpec, AgentTypeDefinition
|
|
19
19
|
from pythinker_code.subagents.store import SubagentStore
|
|
20
20
|
|
|
21
|
+
SUBAGENT_OUTPUT_LANGUAGE_INSTRUCTION = """\
|
|
22
|
+
<output-language>
|
|
23
|
+
Write natural-language output in the same language as the original user request or task
|
|
24
|
+
prompt, unless that request explicitly asks for another language. Do not switch to a
|
|
25
|
+
model/provider default language (for example Chinese from Qwen). Keep code, commands,
|
|
26
|
+
logs, identifiers, paths, and quoted text in their original language unless translation
|
|
27
|
+
is requested.
|
|
28
|
+
</output-language>
|
|
29
|
+
""".strip()
|
|
30
|
+
|
|
21
31
|
if TYPE_CHECKING:
|
|
22
32
|
from pythinker_code.soul.agent import Runtime
|
|
23
33
|
|
|
@@ -33,6 +43,12 @@ class SubagentRunSpec:
|
|
|
33
43
|
resumed: bool
|
|
34
44
|
|
|
35
45
|
|
|
46
|
+
def _prepend_output_language_instruction(prompt: str) -> str:
|
|
47
|
+
if not prompt.strip():
|
|
48
|
+
return SUBAGENT_OUTPUT_LANGUAGE_INSTRUCTION
|
|
49
|
+
return f"{SUBAGENT_OUTPUT_LANGUAGE_INSTRUCTION}\n\n{prompt}"
|
|
50
|
+
|
|
51
|
+
|
|
36
52
|
async def prepare_soul(
|
|
37
53
|
spec: SubagentRunSpec,
|
|
38
54
|
runtime: Runtime,
|
|
@@ -77,6 +93,7 @@ async def prepare_soul(
|
|
|
77
93
|
git_ctx = await collect_git_context(runtime.builtin_args.PYTHINKER_WORK_DIR)
|
|
78
94
|
if git_ctx:
|
|
79
95
|
prompt = f"{git_ctx}\n\n{prompt}"
|
|
96
|
+
prompt = _prepend_output_language_instruction(prompt)
|
|
80
97
|
|
|
81
98
|
# 5. Write prompt snapshot (debugging aid)
|
|
82
99
|
store.prompt_path(spec.agent_id).write_text(prompt, encoding="utf-8")
|
|
@@ -51,7 +51,9 @@ _SUMMARY_MIN_LENGTH_BY_TYPE: dict[str, int] = {
|
|
|
51
51
|
"plan": 300,
|
|
52
52
|
}
|
|
53
53
|
SUMMARY_CONTINUATION_PROMPT = """
|
|
54
|
-
Your previous response was too brief. Please provide a more comprehensive summary
|
|
54
|
+
Your previous response was too brief. Please provide a more comprehensive summary.
|
|
55
|
+
Keep the same natural-language output language as the original task/user request; do not switch
|
|
56
|
+
to a model/provider default language. Include:
|
|
55
57
|
|
|
56
58
|
1. Specific technical details and implementations
|
|
57
59
|
2. Detailed findings and analysis
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import json
|
|
1
2
|
from collections.abc import Callable
|
|
2
3
|
from pathlib import Path
|
|
3
|
-
from typing import override
|
|
4
|
+
from typing import Any, cast, override
|
|
4
5
|
|
|
5
|
-
from pydantic import BaseModel, Field
|
|
6
|
+
from pydantic import BaseModel, Field, model_validator
|
|
6
7
|
from pythinker_core.tooling import CallableTool2, ToolError, ToolReturnValue
|
|
7
8
|
from pythinker_host.path import HostPath
|
|
8
9
|
|
|
@@ -41,6 +42,69 @@ class Params(BaseModel):
|
|
|
41
42
|
)
|
|
42
43
|
)
|
|
43
44
|
|
|
45
|
+
@staticmethod
|
|
46
|
+
def _json_string_to_edit(value: Any) -> Any:
|
|
47
|
+
if not isinstance(value, str):
|
|
48
|
+
return value
|
|
49
|
+
try:
|
|
50
|
+
parsed: Any = json.loads(value)
|
|
51
|
+
except json.JSONDecodeError:
|
|
52
|
+
return value
|
|
53
|
+
return (
|
|
54
|
+
cast(dict[str, Any] | list[Any], parsed) if isinstance(parsed, (dict, list)) else value
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
@classmethod
|
|
58
|
+
def _normalize_edit_aliases(cls, value: Any) -> Any:
|
|
59
|
+
value = cls._json_string_to_edit(value)
|
|
60
|
+
if isinstance(value, list):
|
|
61
|
+
return [cls._normalize_edit_aliases(item) for item in cast(list[Any], value)]
|
|
62
|
+
if not isinstance(value, dict):
|
|
63
|
+
return value
|
|
64
|
+
|
|
65
|
+
normalized: dict[str, Any] = dict(cast(dict[str, Any], value))
|
|
66
|
+
if "old" not in normalized and "oldText" in normalized:
|
|
67
|
+
normalized["old"] = normalized["oldText"]
|
|
68
|
+
if "new" not in normalized and "newText" in normalized:
|
|
69
|
+
normalized["new"] = normalized["newText"]
|
|
70
|
+
if "replace_all" not in normalized and "replaceAll" in normalized:
|
|
71
|
+
normalized["replace_all"] = normalized["replaceAll"]
|
|
72
|
+
return normalized
|
|
73
|
+
|
|
74
|
+
@model_validator(mode="before")
|
|
75
|
+
@classmethod
|
|
76
|
+
def _normalize_common_edit_shapes(cls, data: Any) -> Any:
|
|
77
|
+
"""Accept common model-generated StrReplaceFile argument shapes.
|
|
78
|
+
|
|
79
|
+
Agents occasionally pass the nested ``edit`` payload as a JSON string, or
|
|
80
|
+
flatten ``old``/``new`` at the top level after seeing the UI label this
|
|
81
|
+
tool as "Update". Normalize those shapes before Pydantic validates the
|
|
82
|
+
canonical schema.
|
|
83
|
+
"""
|
|
84
|
+
if not isinstance(data, dict):
|
|
85
|
+
return data
|
|
86
|
+
|
|
87
|
+
values: dict[str, Any] = dict(cast(dict[str, Any], data))
|
|
88
|
+
if "edit" in values:
|
|
89
|
+
values["edit"] = cls._normalize_edit_aliases(values["edit"])
|
|
90
|
+
return values
|
|
91
|
+
if "edits" in values:
|
|
92
|
+
values["edit"] = cls._normalize_edit_aliases(values["edits"])
|
|
93
|
+
return values
|
|
94
|
+
|
|
95
|
+
old_key = "old" if "old" in values else "oldText" if "oldText" in values else None
|
|
96
|
+
new_key = "new" if "new" in values else "newText" if "newText" in values else None
|
|
97
|
+
if old_key is not None and new_key is not None:
|
|
98
|
+
edit: dict[str, Any] = {"old": values[old_key], "new": values[new_key]}
|
|
99
|
+
if "replace_all" in values:
|
|
100
|
+
edit["replace_all"] = values["replace_all"]
|
|
101
|
+
elif "replaceAll" in values:
|
|
102
|
+
edit["replace_all"] = values["replaceAll"]
|
|
103
|
+
values["edit"] = edit
|
|
104
|
+
return values
|
|
105
|
+
|
|
106
|
+
return values
|
|
107
|
+
|
|
44
108
|
|
|
45
109
|
class StrReplaceFile(CallableTool2[Params]):
|
|
46
110
|
name: str = "StrReplaceFile"
|
|
@@ -54,6 +54,7 @@ from pythinker_code.ui.shell.slash import SKILL_COMMAND_PREFIX, shell_mode_regis
|
|
|
54
54
|
from pythinker_code.ui.shell.slash import registry as shell_slash_registry
|
|
55
55
|
from pythinker_code.ui.shell.update import (
|
|
56
56
|
pending_update_notice,
|
|
57
|
+
prompt_pre_start_update,
|
|
57
58
|
refresh_update_cache_if_due,
|
|
58
59
|
)
|
|
59
60
|
from pythinker_code.ui.shell.visualize import (
|
|
@@ -617,9 +618,15 @@ class Shell:
|
|
|
617
618
|
finally:
|
|
618
619
|
self._cancel_background_tasks()
|
|
619
620
|
|
|
620
|
-
#
|
|
621
|
-
#
|
|
622
|
-
#
|
|
621
|
+
# Blocking pre-start update prompt. Must run before _auto_update so the
|
|
622
|
+
# same upgrade isn't shown as both a blocking menu and a background
|
|
623
|
+
# toast; if the user picks "Skip this session" the toast is suppressed
|
|
624
|
+
# by _skipped_version_this_session. May raise typer.Exit on "Update now"
|
|
625
|
+
# or "Exit" — that's the documented behavior. prompt_pre_start_update
|
|
626
|
+
# self-suppresses for source checkouts and non-TTY sessions.
|
|
627
|
+
await prompt_pre_start_update()
|
|
628
|
+
|
|
629
|
+
# Start auto-update background task if not disabled.
|
|
623
630
|
if get_env_bool("PYTHINKER_CLI_NO_AUTO_UPDATE"):
|
|
624
631
|
logger.info("Auto-update disabled by PYTHINKER_CLI_NO_AUTO_UPDATE environment variable")
|
|
625
632
|
else:
|