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.
Files changed (849) hide show
  1. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/PKG-INFO +26 -27
  2. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/README.md +25 -26
  3. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/pyproject.toml +1 -1
  4. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/CHANGELOG.md +13 -0
  5. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/system.md +6 -2
  6. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/opencode_go.py +92 -0
  7. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/platforms.py +22 -0
  8. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/core.py +17 -0
  9. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/runner.py +3 -1
  10. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/replace.py +66 -2
  11. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/__init__.py +10 -3
  12. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/markdown.py +29 -2
  13. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/report.py +59 -23
  14. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +3 -4
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. pythinker_code-0.26.0/src/pythinker_code/web/static/assets/channel-BUTOao-m.js +1 -0
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. pythinker_code-0.26.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-CLIe0T4n.js +1 -0
  30. pythinker_code-0.26.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-CLIe0T4n.js +1 -0
  31. pythinker_code-0.26.0/src/pythinker_code/web/static/assets/clone-BjWb914D.js +1 -0
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. 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
  38. 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
  39. 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
  40. 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
  41. 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
  42. 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
  43. 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
  44. 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
  45. 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
  46. 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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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
  54. 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
  55. 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
  56. 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
  57. 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
  58. 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
  59. 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
  60. 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
  61. 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
  62. pythinker_code-0.26.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-C6C4PIor.js +1 -0
  63. 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
  64. 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
  65. 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
  66. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/index.html +1 -1
  67. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/install.ps1 +23 -9
  68. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/install.sh +28 -1
  69. pythinker_code-0.25.0/src/pythinker_code/web/static/assets/channel-BZrJ1_EH.js +0 -1
  70. pythinker_code-0.25.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-DmBruagE.js +0 -1
  71. pythinker_code-0.25.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-DmBruagE.js +0 -1
  72. pythinker_code-0.25.0/src/pythinker_code/web/static/assets/clone-x4PiU-uh.js +0 -1
  73. pythinker_code-0.25.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-DoANuOAR.js +0 -1
  74. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/LICENSE +0 -0
  75. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/NOTICE +0 -0
  76. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/__init__.py +0 -0
  77. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/__main__.py +0 -0
  78. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/AGENTS.md +0 -0
  79. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/__init__.py +0 -0
  80. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/convert.py +0 -0
  81. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/host.py +0 -0
  82. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/mcp.py +0 -0
  83. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/server.py +0 -0
  84. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/session.py +0 -0
  85. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/tools.py +0 -0
  86. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/types.py +0 -0
  87. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/acp/version.py +0 -0
  88. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/agent.yaml +0 -0
  89. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/code_reviewer.yaml +0 -0
  90. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/coder.yaml +0 -0
  91. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/debugger.yaml +0 -0
  92. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/explore.yaml +0 -0
  93. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/implementer.yaml +0 -0
  94. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/plan.yaml +0 -0
  95. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/review.yaml +0 -0
  96. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/security_reviewer.yaml +0 -0
  97. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/default/verifier.yaml +0 -0
  98. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
  99. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/agentspec.py +0 -0
  100. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/app.py +0 -0
  101. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
  102. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/approval_runtime/models.py +0 -0
  103. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
  104. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/__init__.py +0 -0
  105. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
  106. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/deepseek.py +0 -0
  107. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/github_feedback.py +0 -0
  108. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/lm_studio.py +0 -0
  109. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/minimax.py +0 -0
  110. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/oauth.py +0 -0
  111. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/ollama.py +0 -0
  112. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/openai.py +0 -0
  113. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/auth/openrouter.py +0 -0
  114. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/__init__.py +0 -0
  115. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/agent_runner.py +0 -0
  116. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/ids.py +0 -0
  117. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/manager.py +0 -0
  118. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/models.py +0 -0
  119. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/store.py +0 -0
  120. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/summary.py +0 -0
  121. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/background/worker.py +0 -0
  122. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/__init__.py +0 -0
  123. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/__main__.py +0 -0
  124. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/_lazy_group.py +0 -0
  125. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/debug.py +0 -0
  126. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/export.py +0 -0
  127. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/info.py +0 -0
  128. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/mcp.py +0 -0
  129. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/plugin.py +0 -0
  130. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/review.py +0 -0
  131. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/secscan.py +0 -0
  132. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/security_scan.py +0 -0
  133. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/skill.py +0 -0
  134. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/toad.py +0 -0
  135. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/update.py +0 -0
  136. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/vis.py +0 -0
  137. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/cli/web.py +0 -0
  138. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/config.py +0 -0
  139. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/constant.py +0 -0
  140. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/events.py +0 -0
  141. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/exception.py +0 -0
  142. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/execution_profiles.py +0 -0
  143. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/extensions.py +0 -0
  144. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/file_restore.py +0 -0
  145. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/hooks/__init__.py +0 -0
  146. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/hooks/config.py +0 -0
  147. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/hooks/engine.py +0 -0
  148. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/hooks/events.py +0 -0
  149. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/hooks/runner.py +0 -0
  150. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/llm.py +0 -0
  151. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/__init__.py +0 -0
  152. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/consolidation.py +0 -0
  153. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/harvest.py +0 -0
  154. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/recall.py +0 -0
  155. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/recap.py +0 -0
  156. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/retriever.py +0 -0
  157. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/retriever_sqlite.py +0 -0
  158. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/memory/sanitize.py +0 -0
  159. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/metadata.py +0 -0
  160. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/native.py +0 -0
  161. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/notifications/__init__.py +0 -0
  162. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/notifications/llm.py +0 -0
  163. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/notifications/manager.py +0 -0
  164. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/notifications/models.py +0 -0
  165. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/notifications/notifier.py +0 -0
  166. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/notifications/store.py +0 -0
  167. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/notifications/wire.py +0 -0
  168. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/plugin/__init__.py +0 -0
  169. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/plugin/manager.py +0 -0
  170. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/plugin/tool.py +0 -0
  171. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/project_memory.py +0 -0
  172. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/prompt_templates.py +0 -0
  173. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/prompts/__init__.py +0 -0
  174. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/prompts/compact.md +0 -0
  175. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/prompts/init.md +0 -0
  176. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/py.typed +0 -0
  177. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/scratchpad.py +0 -0
  178. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/session.py +0 -0
  179. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/session_fork.py +0 -0
  180. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/session_state.py +0 -0
  181. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/share.py +0 -0
  182. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skill/__init__.py +0 -0
  183. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
  184. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skill/flow/d2.py +0 -0
  185. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
  186. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skill/lockfile.py +0 -0
  187. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/check-impl-against-spec/SKILL.md +0 -0
  188. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/create-pr/SKILL.md +0 -0
  189. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/diagnose-ci-failures/SKILL.md +0 -0
  190. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/fix-errors/SKILL.md +0 -0
  191. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/implement-specs/SKILL.md +0 -0
  192. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/pr-walkthrough/SKILL.md +0 -0
  193. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
  194. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/reproduce-bug-report/SKILL.md +0 -0
  195. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/resolve-merge-conflicts/SKILL.md +0 -0
  196. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/review-pr/SKILL.md +0 -0
  197. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
  198. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/spec-driven-implementation/SKILL.md +0 -0
  199. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/write-product-spec/SKILL.md +0 -0
  200. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/skills/write-tech-spec/SKILL.md +0 -0
  201. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/__init__.py +0 -0
  202. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/agent.py +0 -0
  203. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/approval.py +0 -0
  204. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/btw.py +0 -0
  205. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/compaction.py +0 -0
  206. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/compaction_restore.py +0 -0
  207. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/context.py +0 -0
  208. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/denwarenji.py +0 -0
  209. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/dynamic_injection.py +0 -0
  210. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
  211. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
  212. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
  213. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/message.py +0 -0
  214. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/permission.py +0 -0
  215. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/pythinkersoul.py +0 -0
  216. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/slash.py +0 -0
  217. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/soul/toolset.py +0 -0
  218. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/__init__.py +0 -0
  219. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/builder.py +0 -0
  220. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/discovery.py +0 -0
  221. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/git_context.py +0 -0
  222. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/models.py +0 -0
  223. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/output.py +0 -0
  224. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/registry.py +0 -0
  225. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/subagents/store.py +0 -0
  226. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/__init__.py +0 -0
  227. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/config.py +0 -0
  228. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/crash.py +0 -0
  229. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/errors.py +0 -0
  230. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/metrics.py +0 -0
  231. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/otel.py +0 -0
  232. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/sentry.py +0 -0
  233. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/telemetry/sink.py +0 -0
  234. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/AGENTS.md +0 -0
  235. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/__init__.py +0 -0
  236. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/agent/__init__.py +0 -0
  237. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/agent/description.md +0 -0
  238. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/ask_user/__init__.py +0 -0
  239. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
  240. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/background/__init__.py +0 -0
  241. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/background/handoff.md +0 -0
  242. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/background/input.md +0 -0
  243. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/background/list.md +0 -0
  244. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/background/output.md +0 -0
  245. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/background/stop.md +0 -0
  246. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/display.py +0 -0
  247. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
  248. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
  249. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/__init__.py +0 -0
  250. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/glob.md +0 -0
  251. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/glob.py +0 -0
  252. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/grep.md +0 -0
  253. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/grep_local.py +0 -0
  254. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
  255. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/read.md +0 -0
  256. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/read.py +0 -0
  257. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/read_media.md +0 -0
  258. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/read_media.py +0 -0
  259. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/replace.md +0 -0
  260. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/utils.py +0 -0
  261. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/write.md +0 -0
  262. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/file/write.py +0 -0
  263. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/memory/__init__.py +0 -0
  264. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/memory/memory.md +0 -0
  265. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/plan/__init__.py +0 -0
  266. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/plan/description.md +0 -0
  267. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/plan/enter.py +0 -0
  268. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
  269. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/plan/handoff.py +0 -0
  270. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
  271. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/scratchpad/__init__.py +0 -0
  272. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/scratchpad/scratchpad_tool.md +0 -0
  273. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/shell/__init__.py +0 -0
  274. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/shell/bash.md +0 -0
  275. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
  276. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/skill/__init__.py +0 -0
  277. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/skill/description.md +0 -0
  278. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/test.py +0 -0
  279. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/think/__init__.py +0 -0
  280. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/think/think.md +0 -0
  281. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
  282. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
  283. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/utils.py +0 -0
  284. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/web/__init__.py +0 -0
  285. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/web/_allowlist.py +0 -0
  286. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/web/fetch.md +0 -0
  287. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/web/fetch.py +0 -0
  288. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/web/search.md +0 -0
  289. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/tools/web/search.py +0 -0
  290. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/__init__.py +0 -0
  291. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
  292. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/print/__init__.py +0 -0
  293. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/print/visualize.py +0 -0
  294. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
  295. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
  296. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
  297. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
  298. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/diff.py +0 -0
  299. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/dynamic_border.py +0 -0
  300. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
  301. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
  302. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
  303. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/panel.py +0 -0
  304. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
  305. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
  306. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
  307. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
  308. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/console.py +0 -0
  309. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/debug.py +0 -0
  310. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/design_system.py +0 -0
  311. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/echo.py +0 -0
  312. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
  313. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/glyphs.py +0 -0
  314. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
  315. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
  316. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
  317. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
  318. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/motion.py +0 -0
  319. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
  320. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
  321. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/prompt.py +0 -0
  322. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/render_constants.py +0 -0
  323. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/replay.py +0 -0
  324. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selector.py +0 -0
  325. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
  326. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
  327. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
  328. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
  329. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
  330. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
  331. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
  332. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
  333. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/setup.py +0 -0
  334. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/slash.py +0 -0
  335. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/spacing.py +0 -0
  336. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/spinner_words.py +0 -0
  337. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/startup.py +0 -0
  338. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
  339. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tips.py +0 -0
  340. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
  341. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/_file_diff.py +0 -0
  342. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -0
  343. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
  344. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
  345. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
  346. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
  347. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
  348. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
  349. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
  350. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
  351. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
  352. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
  353. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
  354. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
  355. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -0
  356. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
  357. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/update.py +0 -0
  358. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage.py +0 -0
  359. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
  360. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
  361. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
  362. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
  363. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
  364. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
  365. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
  366. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
  367. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
  368. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
  369. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
  370. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
  371. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
  372. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_activity_tree.py +0 -0
  373. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
  374. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +0 -0
  375. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
  376. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_dialog_shell.py +0 -0
  377. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
  378. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +0 -0
  379. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
  380. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_transcript.py +0 -0
  381. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
  382. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/theme.py +0 -0
  383. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/ui/tui_config.py +0 -0
  384. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
  385. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/__init__.py +0 -0
  386. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/aiohttp.py +0 -0
  387. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/aioqueue.py +0 -0
  388. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/broadcast.py +0 -0
  389. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/changelog.py +0 -0
  390. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/clipboard.py +0 -0
  391. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/datetime.py +0 -0
  392. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/diff.py +0 -0
  393. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/editor.py +0 -0
  394. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/environment.py +0 -0
  395. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/envvar.py +0 -0
  396. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/export.py +0 -0
  397. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/file_filter.py +0 -0
  398. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/frontmatter.py +0 -0
  399. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/io.py +0 -0
  400. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/logging.py +0 -0
  401. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/media_tags.py +0 -0
  402. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/message.py +0 -0
  403. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/path.py +0 -0
  404. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/proctitle.py +0 -0
  405. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/proxy.py +0 -0
  406. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
  407. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
  408. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/rich/columns.py +0 -0
  409. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/rich/diff_render.py +0 -0
  410. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
  411. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
  412. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
  413. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
  414. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/sensitive.py +0 -0
  415. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/server.py +0 -0
  416. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/signals.py +0 -0
  417. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/slashcmd.py +0 -0
  418. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/sleep_inhibitor.py +0 -0
  419. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/string.py +0 -0
  420. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
  421. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/term.py +0 -0
  422. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/utils/typing.py +0 -0
  423. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/__init__.py +0 -0
  424. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/api/__init__.py +0 -0
  425. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/api/sessions.py +0 -0
  426. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/api/statistics.py +0 -0
  427. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/api/system.py +0 -0
  428. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/app.py +0 -0
  429. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-CY1rtwrX.js +0 -0
  430. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/index-DSRInNnm.css +0 -0
  431. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/index-DgmTI2M_.js +0 -0
  432. {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
  433. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  434. {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
  435. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  436. {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
  437. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  438. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  439. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/vis/static/index.html +0 -0
  440. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/__init__.py +0 -0
  441. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/api/__init__.py +0 -0
  442. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/api/config.py +0 -0
  443. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/api/open_in.py +0 -0
  444. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/api/sessions.py +0 -0
  445. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/app.py +0 -0
  446. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/auth.py +0 -0
  447. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/models.py +0 -0
  448. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/runner/__init__.py +0 -0
  449. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/runner/messages.py +0 -0
  450. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/runner/process.py +0 -0
  451. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/runner/worker.py +0 -0
  452. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/_headers +0 -0
  453. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  454. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  455. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  456. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  457. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  458. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  459. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  460. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  461. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  462. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  463. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  464. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  465. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  466. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  467. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  468. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  469. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  470. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  471. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  472. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  473. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  474. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  475. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  476. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  477. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  478. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  479. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  480. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  481. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  482. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  483. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  484. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  485. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  486. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  487. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  488. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  489. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  490. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  491. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  492. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  493. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  494. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  495. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  496. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  497. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  498. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  499. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  500. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  501. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  502. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  503. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  504. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  505. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  506. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  507. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  508. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  509. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  510. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  511. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  512. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/abap-BdImnpbu.js +0 -0
  513. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +0 -0
  514. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ada-bCR0ucgS.js +0 -0
  515. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +0 -0
  516. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +0 -0
  517. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +0 -0
  518. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/apache-Pmp26Uib.js +0 -0
  519. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/apex-D8_7TLub.js +0 -0
  520. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/apl-dKokRX4l.js +0 -0
  521. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/applescript-Co6uUVPk.js +0 -0
  522. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ara-BRHolxvo.js +0 -0
  523. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +0 -0
  524. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/asm-D_Q5rh1f.js +0 -0
  525. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/astro-CbQHKStN.js +0 -0
  526. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +0 -0
  527. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/awk-DMzUqQB5.js +0 -0
  528. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +0 -0
  529. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +0 -0
  530. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/bat-BkioyH1T.js +0 -0
  531. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/beancount-k_qm7-4y.js +0 -0
  532. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/berry-uYugtg8r.js +0 -0
  533. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/bibtex-CHM0blh-.js +0 -0
  534. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/bicep-Bmn6On1c.js +0 -0
  535. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/blade-D4QpJJKB.js +0 -0
  536. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/bsl-BO_Y6i37.js +0 -0
  537. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/c-BIGW1oBm.js +0 -0
  538. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/c3-VCDPK7BO.js +0 -0
  539. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +0 -0
  540. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/cairo-KRGpt6FW.js +0 -0
  541. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
  542. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
  543. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
  544. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
  545. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/clarity-D53aC0YG.js +0 -0
  546. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/clojure-P80f7IUj.js +0 -0
  547. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/cmake-D1j8_8rp.js +0 -0
  548. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/cobol-nwyudZeR.js +0 -0
  549. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +0 -0
  550. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +0 -0
  551. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/coffee-Ch7k5sss.js +0 -0
  552. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +0 -0
  553. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/coq-DkFqJrB1.js +0 -0
  554. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/cpp-CofmeUqb.js +0 -0
  555. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/crystal-tKQVLTB8.js +0 -0
  556. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/csharp-K5feNrxe.js +0 -0
  557. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/css-DPfMkruS.js +0 -0
  558. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/csv-fuZLfV_i.js +0 -0
  559. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/cue-D82EKSYY.js +0 -0
  560. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/cypher-COkxafJQ.js +0 -0
  561. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/d-85-TOEBH.js +0 -0
  562. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +0 -0
  563. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/dart-CF10PKvl.js +0 -0
  564. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/dax-CEL-wOlO.js +0 -0
  565. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +0 -0
  566. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +0 -0
  567. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/diff-D97Zzqfu.js +0 -0
  568. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/docker-BcOcwvcX.js +0 -0
  569. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/dotenv-Da5cRb03.js +0 -0
  570. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/dracula-BzJJZx-M.js +0 -0
  571. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +0 -0
  572. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +0 -0
  573. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/edge-BkV0erSs.js +0 -0
  574. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/elixir-CDX3lj18.js +0 -0
  575. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/elm-DbKCFpqz.js +0 -0
  576. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +0 -0
  577. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/erb-BOJIQeun.js +0 -0
  578. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/erlang-DsQrWhSR.js +0 -0
  579. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +0 -0
  580. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +0 -0
  581. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/fennel-BYunw83y.js +0 -0
  582. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/fish-BvzEVeQv.js +0 -0
  583. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/fluent-C4IJs8-o.js +0 -0
  584. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
  585. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
  586. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +0 -0
  587. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +0 -0
  588. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +0 -0
  589. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gdshader-DkwncUOv.js +0 -0
  590. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/genie-D0YGMca9.js +0 -0
  591. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +0 -0
  592. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +0 -0
  593. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +0 -0
  594. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/github-dark-DHJKELXO.js +0 -0
  595. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
  596. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
  597. {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
  598. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/github-light-DAi9KRSo.js +0 -0
  599. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +0 -0
  600. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
  601. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gleam-BspZqrRM.js +0 -0
  602. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
  603. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +0 -0
  604. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/glsl-DplSGwfg.js +0 -0
  605. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gn-n2N0HUVH.js +0 -0
  606. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +0 -0
  607. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/go-Dn2_MT6a.js +0 -0
  608. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/graphql-ChdNCCLP.js +0 -0
  609. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/groovy-gcz8RCvz.js +0 -0
  610. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
  611. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
  612. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
  613. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
  614. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
  615. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
  616. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/hack-CaT9iCJl.js +0 -0
  617. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/haml-B8DHNrY2.js +0 -0
  618. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/handlebars-BL8al0AC.js +0 -0
  619. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/haskell-Df6bDoY_.js +0 -0
  620. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/haxe-CzTSHFRz.js +0 -0
  621. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/hcl-BWvSN4gD.js +0 -0
  622. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/hjson-D5-asLiD.js +0 -0
  623. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +0 -0
  624. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/houston-DnULxvSX.js +0 -0
  625. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/html-GMplVEZG.js +0 -0
  626. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +0 -0
  627. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/http-jrhK8wxY.js +0 -0
  628. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/hurl-irOxFIW8.js +0 -0
  629. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +0 -0
  630. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/hy-DFXneXwc.js +0 -0
  631. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/imba-DGztddWO.js +0 -0
  632. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/index-BpoLgcEt.js +0 -0
  633. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/index-CzV_vCfu.css +0 -0
  634. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/index-DI2oedCt.js +0 -0
  635. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ini-BEwlwnbL.js +0 -0
  636. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/init-Gi6I4Gst.js +0 -0
  637. {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
  638. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  639. {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
  640. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  641. {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
  642. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  643. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  644. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/java-CylS5w8V.js +0 -0
  645. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/javascript-wDzz0qaB.js +0 -0
  646. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +0 -0
  647. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/jison-wvAkD_A8.js +0 -0
  648. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/json-Cp-IABpG.js +0 -0
  649. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/json5-C9tS-k6U.js +0 -0
  650. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/jsonc-Des-eS-w.js +0 -0
  651. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +0 -0
  652. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +0 -0
  653. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/jssm-C2t-YnRu.js +0 -0
  654. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/jsx-g9-lgVsj.js +0 -0
  655. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/julia-CxzCAyBv.js +0 -0
  656. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
  657. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
  658. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
  659. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/katex-D2lIc1rk.css +0 -0
  660. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/kdl-DV7GczEv.js +0 -0
  661. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +0 -0
  662. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/kusto-DZf3V79B.js +0 -0
  663. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/laserwave-DUszq2jm.js +0 -0
  664. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/latex-B4uzh10-.js +0 -0
  665. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/lean-BZvkOJ9d.js +0 -0
  666. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/less-B1dDrJ26.js +0 -0
  667. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +0 -0
  668. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/liquid-DYVedYrR.js +0 -0
  669. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/llvm-BtvRca6l.js +0 -0
  670. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/log-2UxHyX5q.js +0 -0
  671. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/logo-BtOb2qkB.js +0 -0
  672. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/lua-BbnMAYS6.js +0 -0
  673. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/luau-C-HG3fhB.js +0 -0
  674. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/make-CHLpvVh8.js +0 -0
  675. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/markdown-Cvjx9yec.js +0 -0
  676. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/marko-DZsq8hO1.js +0 -0
  677. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +0 -0
  678. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
  679. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
  680. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +0 -0
  681. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
  682. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/matlab-D7o27uSR.js +0 -0
  683. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/mdc-DUICxH0z.js +0 -0
  684. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +0 -0
  685. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B2P5VJ9v.css +0 -0
  686. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +0 -0
  687. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/min-dark-CafNBF8u.js +0 -0
  688. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/min-light-CTRr51gU.js +0 -0
  689. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +0 -0
  690. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/mojo-B93PlW-d.js +0 -0
  691. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/monokai-D4h5O-jR.js +0 -0
  692. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/moonbit-Ba13S78F.js +0 -0
  693. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/move-Bu9oaDYs.js +0 -0
  694. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/narrat-DRg8JJMk.js +0 -0
  695. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +0 -0
  696. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/nginx-DknmC5AR.js +0 -0
  697. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/night-owl-C39BiMTA.js +0 -0
  698. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/nim-CVrawwO9.js +0 -0
  699. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/nix-CwoSXNpI.js +0 -0
  700. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/nord-Ddv68eIx.js +0 -0
  701. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/nushell-C-sUppwS.js +0 -0
  702. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +0 -0
  703. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +0 -0
  704. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +0 -0
  705. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
  706. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/one-light-PoHY5YXO.js +0 -0
  707. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/openscad-C4EeE6gA.js +0 -0
  708. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +0 -0
  709. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/pascal-D93ZcfNL.js +0 -0
  710. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/perl-C0TMdlhV.js +0 -0
  711. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/php-CDn_0X-4.js +0 -0
  712. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/pkl-u5AG7uiY.js +0 -0
  713. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/plastic-3e1v2bzS.js +0 -0
  714. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/plsql-ChMvpjG-.js +0 -0
  715. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/po-BTJTHyun.js +0 -0
  716. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +0 -0
  717. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/polar-C0HS_06l.js +0 -0
  718. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/postcss-CXtECtnM.js +0 -0
  719. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +0 -0
  720. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/powershell-Dpen1YoG.js +0 -0
  721. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/prisma-Dd19v3D-.js +0 -0
  722. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/prolog-CbFg5uaA.js +0 -0
  723. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/proto-C7zT0LnQ.js +0 -0
  724. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/pug-CGlum2m_.js +0 -0
  725. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/puppet-BMWR74SV.js +0 -0
  726. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/purescript-CklMAg4u.js +0 -0
  727. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/python-B6aJPvgy.js +0 -0
  728. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/qml-3beO22l8.js +0 -0
  729. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +0 -0
  730. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/qss-IeuSbFQv.js +0 -0
  731. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/r-Dspwwk_N.js +0 -0
  732. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/racket-BqYA7rlc.js +0 -0
  733. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/raku-DXvB9xmW.js +0 -0
  734. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/razor-C1TweQQi.js +0 -0
  735. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/red-bN70gL4F.js +0 -0
  736. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/reg-C-SQnVFl.js +0 -0
  737. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +0 -0
  738. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/rel-C3B-1QV4.js +0 -0
  739. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/riscv-BM1_JUlF.js +0 -0
  740. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
  741. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
  742. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +0 -0
  743. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +0 -0
  744. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/rst-B0xPkSld.js +0 -0
  745. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ruby-BvKwtOVI.js +0 -0
  746. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/rust-B1yitclQ.js +0 -0
  747. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/sas-cz2c8ADy.js +0 -0
  748. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +0 -0
  749. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/scala-C151Ov-r.js +0 -0
  750. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/scheme-C98Dy4si.js +0 -0
  751. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/scss-OYdSNvt2.js +0 -0
  752. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +0 -0
  753. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
  754. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/shellscript-Yzrsuije.js +0 -0
  755. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/shellsession-BADoaaVG.js +0 -0
  756. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +0 -0
  757. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +0 -0
  758. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +0 -0
  759. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +0 -0
  760. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +0 -0
  761. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +0 -0
  762. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/solidity-rGO070M0.js +0 -0
  763. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/soy-Brmx7dQM.js +0 -0
  764. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/sparql-rVzFXLq3.js +0 -0
  765. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/splunk-BtCnVYZw.js +0 -0
  766. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/sql-BLtJtn59.js +0 -0
  767. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +0 -0
  768. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/stata-BH5u7GGu.js +0 -0
  769. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +0 -0
  770. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/svelte-zxCyuUbr.js +0 -0
  771. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/swift-Dg5xB15N.js +0 -0
  772. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +0 -0
  773. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +0 -0
  774. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/systemd-4A_iFExJ.js +0 -0
  775. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/talonscript-CkByrt1z.js +0 -0
  776. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/tasl-QIJgUcNo.js +0 -0
  777. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/tcl-dwOrl1Do.js +0 -0
  778. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/templ-W15q3VgB.js +0 -0
  779. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/terraform-BETggiCN.js +0 -0
  780. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/tex-CvyZ59Mk.js +0 -0
  781. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/tokyo-night-hegEt444.js +0 -0
  782. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/toml-vGWfd6FD.js +0 -0
  783. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +0 -0
  784. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/tsv-B_m7g4N7.js +0 -0
  785. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/tsx-COt5Ahok.js +0 -0
  786. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/turtle-BsS91CYL.js +0 -0
  787. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/twig-CO9l9SDP.js +0 -0
  788. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +0 -0
  789. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/typespec-BGHnOYBU.js +0 -0
  790. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/typst-DHCkPAjA.js +0 -0
  791. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/v-BcVCzyr7.js +0 -0
  792. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vala-CsfeWuGM.js +0 -0
  793. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vb-D17OF-Vu.js +0 -0
  794. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/verilog-BQ8w6xss.js +0 -0
  795. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vesper-DU1UobuO.js +0 -0
  796. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +0 -0
  797. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/viml-CJc9bBzg.js +0 -0
  798. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
  799. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
  800. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +0 -0
  801. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vue-DN_0RTcg.js +0 -0
  802. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +0 -0
  803. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +0 -0
  804. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/vyper-CDx5xZoG.js +0 -0
  805. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +0 -0
  806. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/wasm-MzD3tlZU.js +0 -0
  807. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/wenyan-BV7otONQ.js +0 -0
  808. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +0 -0
  809. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +0 -0
  810. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/wit-5i3qLPDT.js +0 -0
  811. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +0 -0
  812. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/xml-sdJ4AIDG.js +0 -0
  813. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/xsl-CtQFsRM5.js +0 -0
  814. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/yaml-Buea-lGh.js +0 -0
  815. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +0 -0
  816. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/assets/zig-VOosw3JB.js +0 -0
  817. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
  818. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
  819. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
  820. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
  821. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
  822. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
  823. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
  824. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
  825. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
  826. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
  827. {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
  828. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
  829. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
  830. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
  831. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
  832. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
  833. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
  834. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
  835. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
  836. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
  837. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
  838. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
  839. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/static/logo.png +0 -0
  840. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/store/__init__.py +0 -0
  841. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/web/store/sessions.py +0 -0
  842. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/__init__.py +0 -0
  843. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/file.py +0 -0
  844. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
  845. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/protocol.py +0 -0
  846. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/root_hub.py +0 -0
  847. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/serde.py +0 -0
  848. {pythinker_code-0.25.0 → pythinker_code-0.26.0}/src/pythinker_code/wire/server.py +0 -0
  849. {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.25.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.25.0
118
+ ## 🆕 What's New in 0.26.0
119
119
 
120
- - **`Fetch` re-checks every redirect hop against the SSRF guard.** Redirects were followed without re-validating the destination, so a public URL could redirect to a link-local address (e.g. a cloud metadata endpoint) and slip past the guard. Every hop is now re-validated, closing the public→link-local bypass.
121
- - **Web domain allowlist for `Fetch` and `Search`.** Set `web.allowed_domains` to restrict which hosts the web tools may reach `Fetch` (every redirect hop included) and `Search` reject anything off the list. Leave it unset to keep web access unrestricted.
122
- - **Crash-consistent background tasks.** Task state is serialised under a cross-process lock, terminal updates route through a single finalizer, and recovery reconciles records left divergent by a crash or kill without clobbering a live agent. Bash output is capped (default 50 MiB), kills escalate SIGTERM→SIGKILL, and aged terminal tasks are pruned (default 7 days).
123
- - **Calmer TUI with live tool feedback.** Tool calls show a "preparing" row during approval, stream shell output as a running tail, and render a live Markdown preview as the model writes. The todo list no longer renders twice mid-turn, links open through a detached launcher, and the terminal is restored to a sane state on `SIGTERM`/`SIGQUIT` and at exit.
124
- - **Steadier agent loop.** The model is nudged when a turn ends on a bare statement of intent, steered away from blocking on one background task while siblings run, and a `SetTodoList` whose todos arrive as a JSON string is parsed transparently instead of failing validation.
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.25.0`, or use the native installer for your platform from the [Releases page](https://github.com/TechMatrix-labs/pythinker-code/releases/latest).
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.25.0.exe` from [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
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.25.0.exe` is a signed* Inno Setup wizard. Installs per-user
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.25.0.exe
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.25.0.exe /ALLUSERS`
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.25.0_amd64.deb
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.25.0_arm64.deb
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.25.0/pythinker-code-0.25.0.x86_64.rpm
318
- curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.25.0/pythinker-code-0.25.0.x86_64.rpm.sha256
319
- sha256sum -c pythinker-code-0.25.0.x86_64.rpm.sha256
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.25.0.x86_64.rpm
320
+ sudo dnf install ./pythinker-code-0.26.0.x86_64.rpm
322
321
  # openSUSE:
323
- sudo zypper install ./pythinker-code-0.25.0.x86_64.rpm
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.25.0/pythinker-code-0.25.0.aarch64.rpm
327
- curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.25.0/pythinker-code-0.25.0.aarch64.rpm.sha256
328
- sha256sum -c pythinker-code-0.25.0.aarch64.rpm.sha256
329
- sudo dnf install ./pythinker-code-0.25.0.aarch64.rpm
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.25.0_amd64.deb.sha256 # Debian/Ubuntu
339
- sha256sum -c pythinker-code-0.25.0.x86_64.rpm.sha256 # Fedora/RHEL
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.25.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.25.0
53
+ ## 🆕 What's New in 0.26.0
54
54
 
55
- - **`Fetch` re-checks every redirect hop against the SSRF guard.** Redirects were followed without re-validating the destination, so a public URL could redirect to a link-local address (e.g. a cloud metadata endpoint) and slip past the guard. Every hop is now re-validated, closing the public→link-local bypass.
56
- - **Web domain allowlist for `Fetch` and `Search`.** Set `web.allowed_domains` to restrict which hosts the web tools may reach `Fetch` (every redirect hop included) and `Search` reject anything off the list. Leave it unset to keep web access unrestricted.
57
- - **Crash-consistent background tasks.** Task state is serialised under a cross-process lock, terminal updates route through a single finalizer, and recovery reconciles records left divergent by a crash or kill without clobbering a live agent. Bash output is capped (default 50 MiB), kills escalate SIGTERM→SIGKILL, and aged terminal tasks are pruned (default 7 days).
58
- - **Calmer TUI with live tool feedback.** Tool calls show a "preparing" row during approval, stream shell output as a running tail, and render a live Markdown preview as the model writes. The todo list no longer renders twice mid-turn, links open through a detached launcher, and the terminal is restored to a sane state on `SIGTERM`/`SIGQUIT` and at exit.
59
- - **Steadier agent loop.** The model is nudged when a turn ends on a bare statement of intent, steered away from blocking on one background task while siblings run, and a `SetTodoList` whose todos arrive as a JSON string is parsed transparently instead of failing validation.
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.25.0`, or use the native installer for your platform from the [Releases page](https://github.com/TechMatrix-labs/pythinker-code/releases/latest).
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.25.0.exe` from [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
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.25.0.exe` is a signed* Inno Setup wizard. Installs per-user
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.25.0.exe
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.25.0.exe /ALLUSERS`
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.25.0_amd64.deb
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.25.0_arm64.deb
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.25.0/pythinker-code-0.25.0.x86_64.rpm
253
- curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.25.0/pythinker-code-0.25.0.x86_64.rpm.sha256
254
- sha256sum -c pythinker-code-0.25.0.x86_64.rpm.sha256
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.25.0.x86_64.rpm
255
+ sudo dnf install ./pythinker-code-0.26.0.x86_64.rpm
257
256
  # openSUSE:
258
- sudo zypper install ./pythinker-code-0.25.0.x86_64.rpm
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.25.0/pythinker-code-0.25.0.aarch64.rpm
262
- curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.25.0/pythinker-code-0.25.0.aarch64.rpm.sha256
263
- sha256sum -c pythinker-code-0.25.0.aarch64.rpm.sha256
264
- sudo dnf install ./pythinker-code-0.25.0.aarch64.rpm
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.25.0_amd64.deb.sha256 # Debian/Ubuntu
274
- sha256sum -c pythinker-code-0.25.0.x86_64.rpm.sha256 # Fedora/RHEL
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.25.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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pythinker-code"
3
- version = "0.25.0"
3
+ version = "0.26.0"
4
4
  description = "Pythinker Code is your next CLI agent."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -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 that includes:
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
- # Start the update check in the background only. Startup must never be
621
- # blocked by version polling; users get a cached toast and can run
622
- # /update when they are ready.
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: