pythinker-code 0.49.0__tar.gz → 0.51.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 (1047) hide show
  1. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/PKG-INFO +26 -23
  2. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/README.md +25 -22
  3. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/pyproject.toml +1 -1
  4. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/CHANGELOG.md +47 -0
  5. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/app.py +11 -2
  6. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/__init__.py +69 -3
  7. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/llm.py +62 -1
  8. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/pythinkersoul.py +6 -1
  9. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/__init__.py +13 -6
  10. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/prompt.py +11 -7
  11. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/slash.py +5 -4
  12. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/update.py +78 -7
  13. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/update_orchestrator.py +31 -1
  14. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/terminal_capabilities.py +13 -1
  15. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/rich/diff_render.py +32 -2
  16. pythinker_code-0.51.0/src/pythinker_code/web/static/assets/architecture-7EHR7CIX-BAIjZ1OY.js +1 -0
  17. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/architectureDiagram-3BPJPVTR-8P7Dw-aw.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/architectureDiagram-3BPJPVTR-X_oHUYO1.js +1 -1
  18. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/blockDiagram-GPEHLZMM-CypKTjfa.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/blockDiagram-GPEHLZMM-2zLgN0bS.js +1 -1
  19. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/bootstrap-BRrCAqKJ.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/bootstrap-BSt4IsKh.js +5 -5
  20. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/c4Diagram-AAUBKEIU-D5hZJRzZ.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/c4Diagram-AAUBKEIU-DzBGLsx8.js +1 -1
  21. pythinker_code-0.51.0/src/pythinker_code/web/static/assets/channel-CmYAmtsI.js +1 -0
  22. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/chunk-2J33WTMH-nTs3yxRo.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/chunk-2J33WTMH-FPSU5QaJ.js +1 -1
  23. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/chunk-3OPIFGDE-CvxSbMxc.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/chunk-3OPIFGDE-D_AIrjRF.js +1 -1
  24. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/chunk-5ZQYHXKU-DckQgMEY.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/chunk-5ZQYHXKU-CkynCyNs.js +1 -1
  25. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/chunk-727SXJPM-Be3jJzVo.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/chunk-727SXJPM-Dr6tFoBV.js +1 -1
  26. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/chunk-AQP2D5EJ-Dx2Pp5Dq.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/chunk-AQP2D5EJ-Bj1KY-58.js +1 -1
  27. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/chunk-CSCIHK7Q-OaEZ-6uN.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/chunk-CSCIHK7Q-D38wt_PS.js +1 -1
  28. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/chunk-JAPRZBRM-CcRf5EDu.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/chunk-JAPRZBRM-YeVubvkM.js +4 -4
  29. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/chunk-KSCS5N6A-B-mPOL85.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/chunk-KSCS5N6A-DrGH79o7.js +1 -1
  30. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/chunk-L5ZTLDWV-DcejFnL6.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/chunk-L5ZTLDWV-J3LkyD5q.js +1 -1
  31. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/chunk-LZXEDZCA-DPrjBxrl.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/chunk-LZXEDZCA-CKgXoi0f.js +2 -2
  32. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/chunk-ND2GUHAM-CEcqPWij.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/chunk-ND2GUHAM-DHx_WFtN.js +1 -1
  33. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/chunk-NZK2D7GU-BwNMQT6J.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/chunk-NZK2D7GU-DSLSgJfA.js +1 -1
  34. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/chunk-O5CBEL6O-CXyebJGo.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/chunk-O5CBEL6O-wpjhg9ym.js +1 -1
  35. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/chunk-WU5MYG2G-BtCs4_b5.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/chunk-WU5MYG2G-BLq7E7Qg.js +1 -1
  36. pythinker_code-0.51.0/src/pythinker_code/web/static/assets/classDiagram-4FO5ZUOK-DcdRX25I.js +1 -0
  37. pythinker_code-0.51.0/src/pythinker_code/web/static/assets/classDiagram-v2-Q7XG4LA2-DcdRX25I.js +1 -0
  38. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-DfXuXuzr.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-Dx4cRVQ_.js +1 -1
  39. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/dagre-BM42HDAG-Djt0Oj00.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/dagre-BM42HDAG-DRlm8MQJ.js +1 -1
  40. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/diagram-2AECGRRQ-Dfqwct61.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/diagram-2AECGRRQ-BEfjBQLI.js +1 -1
  41. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/diagram-5GNKFQAL-Bv6aMU5Q.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/diagram-5GNKFQAL-Ci0HEJWT.js +1 -1
  42. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/diagram-KO2AKTUF-fmo7eunv.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/diagram-KO2AKTUF-zYONKSY6.js +1 -1
  43. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/diagram-LMA3HP47-8jpLa_GO.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/diagram-LMA3HP47-DQ4T4lCx.js +1 -1
  44. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/diagram-OG6HWLK6-DWpWgWg4.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/diagram-OG6HWLK6-CrV-9Ra-.js +1 -1
  45. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/dist-DzLFb5Ym.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/dist-npKuNvtv.js +1 -1
  46. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/erDiagram-TEJ5UH35-qRC0f43x.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/erDiagram-TEJ5UH35-0lIyRbv9.js +1 -1
  47. pythinker_code-0.51.0/src/pythinker_code/web/static/assets/eventmodeling-FCH6USID-D8j82yTe.js +1 -0
  48. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/flowDiagram-I6XJVG4X-BUegYc64.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/flowDiagram-I6XJVG4X-86rTWOtS.js +1 -1
  49. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/ganttDiagram-6RSMTGT7-3_jqrl5b.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/ganttDiagram-6RSMTGT7-DIe58hAf.js +1 -1
  50. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/gitGraph-WXDBUCRP-Dptxzqkh.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/gitGraph-WXDBUCRP-MrGKOHQS.js +1 -1
  51. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/gitGraphDiagram-PVQCEYII-BBgs0Srm.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/gitGraphDiagram-PVQCEYII-CbxdWdr-.js +1 -1
  52. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/index-BJm0fIR8.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/index-Csj5xlwo.js +2 -2
  53. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/info-J43DQDTF-BPNakArK.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/info-J43DQDTF-ICUzUEU3.js +1 -1
  54. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/infoDiagram-5YYISTIA-DwQTFnFC.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/infoDiagram-5YYISTIA-DJXqNoxd.js +1 -1
  55. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/ishikawaDiagram-YF4QCWOH-VNLWCphq.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/ishikawaDiagram-YF4QCWOH-1JFbxySp.js +1 -1
  56. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/journeyDiagram-JHISSGLW-CQpCZGl9.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/journeyDiagram-JHISSGLW-COQF3o6_.js +1 -1
  57. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/kanban-definition-UN3LZRKU-DGglk---.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/kanban-definition-UN3LZRKU-D423FO9N.js +1 -1
  58. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/line-DHSR6621.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/line-u46X678h.js +1 -1
  59. pythinker_code-0.51.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-69jhIuwd.js +1 -0
  60. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/mermaid-parser.core-BrCjxUcy.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/mermaid-parser.core-C9rzL2kO.js +2 -2
  61. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/mermaid.core-CcWhY1k6.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/mermaid.core-9_tLDRHh.js +3 -3
  62. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/mindmap-definition-RKZ34NQL-CrT5EymU.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/mindmap-definition-RKZ34NQL-DTtZqqkw.js +1 -1
  63. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/packet-YPE3B663-aeeN_vvA.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/packet-YPE3B663-B6LMWa1u.js +1 -1
  64. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/pie-LRSECV5Y-BWLDg9TI.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/pie-LRSECV5Y-CMHowp3u.js +1 -1
  65. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/pieDiagram-4H26LBE5-CAK-uMMx.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/pieDiagram-4H26LBE5-B01DYhfB.js +1 -1
  66. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/quadrantDiagram-W4KKPZXB-D8XZuCAc.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/quadrantDiagram-W4KKPZXB-C66dg48I.js +1 -1
  67. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/radar-GUYGQ44K-DMvNjH0L.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/radar-GUYGQ44K-DTCBzdz2.js +1 -1
  68. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/requirementDiagram-4Y6WPE33-x6sOUkN4.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/requirementDiagram-4Y6WPE33-nNGWXMs_.js +1 -1
  69. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/sankeyDiagram-5OEKKPKP-jtpFOSUV.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/sankeyDiagram-5OEKKPKP-Qb_nK7Gb.js +1 -1
  70. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/sequenceDiagram-3UESZ5HK-CfYp6bks.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/sequenceDiagram-3UESZ5HK-z3RBHyMA.js +1 -1
  71. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/stateDiagram-AJRCARHV-DGUs0TTR.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/stateDiagram-AJRCARHV-C-G3lcYY.js +1 -1
  72. pythinker_code-0.51.0/src/pythinker_code/web/static/assets/stateDiagram-v2-BHNVJYJU-BSsLK9GJ.js +1 -0
  73. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/timeline-definition-PNZ67QCA-E7RDe6Mw.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/timeline-definition-PNZ67QCA-DXVndtCG.js +1 -1
  74. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/treeView-BLDUP644-CLRP_UjH.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/treeView-BLDUP644-CSfnlEh1.js +1 -1
  75. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/treemap-LRROVOQU-BlA7JmGG.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/treemap-LRROVOQU-DSDCVrgU.js +1 -1
  76. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/vennDiagram-CIIHVFJN-DBNeq9PV.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/vennDiagram-CIIHVFJN-B0Ef6p6-.js +1 -1
  77. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/wardley-L42UT6IY-DLJkcBVG.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/wardley-L42UT6IY-wr5KeEdQ.js +1 -1
  78. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/wardleyDiagram-YWT4CUSO-G9kSoXJz.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/wardleyDiagram-YWT4CUSO-B3B0a_Mc.js +1 -1
  79. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/xychartDiagram-2RQKCTM6-C1SbDTz8.js → pythinker_code-0.51.0/src/pythinker_code/web/static/assets/xychartDiagram-2RQKCTM6-CsHCuQhe.js +1 -1
  80. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/index.html +1 -1
  81. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/architecture-7EHR7CIX-Do98Lw91.js +0 -1
  82. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/channel-BPxSSOqK.js +0 -1
  83. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/classDiagram-4FO5ZUOK-DIJ9beSs.js +0 -1
  84. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/classDiagram-v2-Q7XG4LA2-DIJ9beSs.js +0 -1
  85. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/eventmodeling-FCH6USID-BqcnucrD.js +0 -1
  86. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-CIokUM1h.js +0 -1
  87. pythinker_code-0.49.0/src/pythinker_code/web/static/assets/stateDiagram-v2-BHNVJYJU-CqI3mto4.js +0 -1
  88. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/LICENSE +0 -0
  89. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/NOTICE +0 -0
  90. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/__init__.py +0 -0
  91. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/__main__.py +0 -0
  92. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/acp/AGENTS.md +0 -0
  93. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/acp/__init__.py +0 -0
  94. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/acp/convert.py +0 -0
  95. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/acp/host.py +0 -0
  96. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/acp/mcp.py +0 -0
  97. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/acp/server.py +0 -0
  98. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/acp/session.py +0 -0
  99. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/acp/tools.py +0 -0
  100. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/acp/types.py +0 -0
  101. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/acp/version.py +0 -0
  102. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/agent.yaml +0 -0
  103. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/ask.yaml +0 -0
  104. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/code_reviewer.yaml +0 -0
  105. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/coder.yaml +0 -0
  106. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/debug.yaml +0 -0
  107. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/debugger.yaml +0 -0
  108. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/explore.yaml +0 -0
  109. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/implementer.yaml +0 -0
  110. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/judge.yaml +0 -0
  111. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/plan.yaml +0 -0
  112. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/planner.yaml +0 -0
  113. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/review.yaml +0 -0
  114. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/scout.yaml +0 -0
  115. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/security_reviewer.yaml +0 -0
  116. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/system.md +0 -0
  117. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/default/verifier.yaml +0 -0
  118. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
  119. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/agentspec.py +0 -0
  120. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
  121. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/approval_runtime/models.py +0 -0
  122. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
  123. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/__init__.py +0 -0
  124. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/alibaba.py +0 -0
  125. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
  126. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/browser_login_page.py +0 -0
  127. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/deepseek.py +0 -0
  128. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/github_feedback.py +0 -0
  129. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/kimi.py +0 -0
  130. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/lm_studio.py +0 -0
  131. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/minimax.py +0 -0
  132. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/moonshot.py +0 -0
  133. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/oauth.py +0 -0
  134. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/ollama.py +0 -0
  135. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/openai/__init__.py +0 -0
  136. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/openai/_shared.py +0 -0
  137. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/openai/browser_flow.py +0 -0
  138. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/openai/catalog.py +0 -0
  139. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/openai/config_apply.py +0 -0
  140. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/openai/constants.py +0 -0
  141. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/openai/login.py +0 -0
  142. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/openai/models.py +0 -0
  143. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/openai/oauth_client.py +0 -0
  144. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/opencode_go.py +0 -0
  145. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/openrouter.py +0 -0
  146. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/platforms.py +0 -0
  147. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/auth/z_ai.py +0 -0
  148. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/background/__init__.py +0 -0
  149. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/background/agent_runner.py +0 -0
  150. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/background/ids.py +0 -0
  151. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/background/manager.py +0 -0
  152. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/background/models.py +0 -0
  153. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/background/store.py +0 -0
  154. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/background/summary.py +0 -0
  155. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/background/worker.py +0 -0
  156. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/__main__.py +0 -0
  157. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/_lazy_group.py +0 -0
  158. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/dashboard.py +0 -0
  159. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/debug.py +0 -0
  160. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/export.py +0 -0
  161. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/info.py +0 -0
  162. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/mcp.py +0 -0
  163. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/plugin.py +0 -0
  164. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/review.py +0 -0
  165. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/secscan.py +0 -0
  166. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/security_scan.py +0 -0
  167. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/skill.py +0 -0
  168. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/system_prompt.py +0 -0
  169. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/toad.py +0 -0
  170. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/update.py +0 -0
  171. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/cli/web.py +0 -0
  172. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/config.py +0 -0
  173. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/constant.py +0 -0
  174. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/__init__.py +0 -0
  175. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/api/__init__.py +0 -0
  176. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/api/sessions.py +0 -0
  177. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/api/statistics.py +0 -0
  178. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/api/system.py +0 -0
  179. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/app.py +0 -0
  180. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/static/assets/highlighted-body-OFNGDK62-BxVUIXn9.js +0 -0
  181. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/static/assets/index-DAN_VzOP.css +0 -0
  182. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/static/assets/index-DYyxzHPY.js +0 -0
  183. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  184. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  185. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  186. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  187. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  188. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  189. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  190. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/static/assets/mermaid-GHXKKRXX-BR6KjYwB.js +0 -0
  191. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/dashboard/static/index.html +0 -0
  192. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/events.py +0 -0
  193. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/exception.py +0 -0
  194. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/execution_profiles.py +0 -0
  195. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/extensions.py +0 -0
  196. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/feedback.py +0 -0
  197. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/feedback_repo.py +0 -0
  198. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/file_restore.py +0 -0
  199. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/hooks/__init__.py +0 -0
  200. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/hooks/config.py +0 -0
  201. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/hooks/engine.py +0 -0
  202. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/hooks/events.py +0 -0
  203. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/hooks/runner.py +0 -0
  204. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/lsp/__init__.py +0 -0
  205. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/lsp/client.py +0 -0
  206. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/lsp/diagnostics.py +0 -0
  207. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/lsp/framing.py +0 -0
  208. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/lsp/instance.py +0 -0
  209. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/lsp/manager.py +0 -0
  210. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/lsp/plugin_servers.py +0 -0
  211. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/lsp/protocol.py +0 -0
  212. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/lsp/recommend.py +0 -0
  213. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/lsp/service.py +0 -0
  214. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/memory/__init__.py +0 -0
  215. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/memory/consolidation.py +0 -0
  216. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/memory/harvest.py +0 -0
  217. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/memory/recall.py +0 -0
  218. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/memory/recap.py +0 -0
  219. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/memory/retriever.py +0 -0
  220. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/memory/sanitize.py +0 -0
  221. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/metadata.py +0 -0
  222. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/models_dev.py +0 -0
  223. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/native.py +0 -0
  224. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/notifications/__init__.py +0 -0
  225. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/notifications/llm.py +0 -0
  226. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/notifications/manager.py +0 -0
  227. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/notifications/models.py +0 -0
  228. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/notifications/notifier.py +0 -0
  229. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/notifications/store.py +0 -0
  230. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/notifications/wire.py +0 -0
  231. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/plugin/__init__.py +0 -0
  232. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/plugin/artifacts.py +0 -0
  233. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/plugin/dependency.py +0 -0
  234. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/plugin/directories.py +0 -0
  235. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/plugin/install.py +0 -0
  236. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/plugin/installed.py +0 -0
  237. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/plugin/integration.py +0 -0
  238. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/plugin/loader.py +0 -0
  239. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/plugin/manager.py +0 -0
  240. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/plugin/manifest.py +0 -0
  241. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/plugin/marketplace.py +0 -0
  242. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/plugin/options.py +0 -0
  243. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/plugin/policy.py +0 -0
  244. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/plugin/tool.py +0 -0
  245. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/project_memory.py +0 -0
  246. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/project_trust.py +0 -0
  247. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/prompt_templates.py +0 -0
  248. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/prompts/__init__.py +0 -0
  249. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/prompts/best_practices.md +0 -0
  250. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/prompts/compact.md +0 -0
  251. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/prompts/goal_continuation.md +0 -0
  252. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/prompts/goal_set.md +0 -0
  253. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/prompts/goal_wrap_up.md +0 -0
  254. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/prompts/init.md +0 -0
  255. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/prompts/learn.md +0 -0
  256. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/py.typed +0 -0
  257. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/scratchpad.py +0 -0
  258. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/session.py +0 -0
  259. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/session_cleanup.py +0 -0
  260. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/session_fork.py +0 -0
  261. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/session_recap.py +0 -0
  262. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/session_state.py +0 -0
  263. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/share.py +0 -0
  264. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skill/__init__.py +0 -0
  265. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
  266. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skill/flow/d2.py +0 -0
  267. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
  268. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skill/lockfile.py +0 -0
  269. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/agent-creator/SKILL.md +0 -0
  270. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/check-impl-against-spec/SKILL.md +0 -0
  271. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/cleanup-audit/SKILL.md +0 -0
  272. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/create-pr/SKILL.md +0 -0
  273. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/customize-pythinker/SKILL.md +0 -0
  274. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/designer-skill/SKILL.md +0 -0
  275. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/diagnose-ci-failures/SKILL.md +0 -0
  276. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/fix-errors/SKILL.md +0 -0
  277. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/implement-specs/SKILL.md +0 -0
  278. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/pr-walkthrough/SKILL.md +0 -0
  279. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
  280. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/reproduce-bug-report/SKILL.md +0 -0
  281. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/resolve-merge-conflicts/SKILL.md +0 -0
  282. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/review-pr/SKILL.md +0 -0
  283. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
  284. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/spec-driven-implementation/SKILL.md +0 -0
  285. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/write-product-spec/SKILL.md +0 -0
  286. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/skills/write-tech-spec/SKILL.md +0 -0
  287. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/__init__.py +0 -0
  288. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/agent.py +0 -0
  289. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/api_errors.py +0 -0
  290. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/approval.py +0 -0
  291. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/btw.py +0 -0
  292. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/compaction.py +0 -0
  293. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/compaction_restore.py +0 -0
  294. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/context.py +0 -0
  295. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/deliberation.py +0 -0
  296. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/denwarenji.py +0 -0
  297. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/dynamic_injection.py +0 -0
  298. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
  299. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/dynamic_injections/agent_list.py +0 -0
  300. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
  301. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/dynamic_injections/git_status.py +0 -0
  302. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/dynamic_injections/goal_mode.py +0 -0
  303. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/dynamic_injections/inline_commands.py +0 -0
  304. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/dynamic_injections/lsp_diagnostics.py +0 -0
  305. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/dynamic_injections/model_defense.py +0 -0
  306. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/dynamic_injections/orchestration.py +0 -0
  307. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/dynamic_injections/permissions_state.py +0 -0
  308. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
  309. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/flow_runner.py +0 -0
  310. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/live_tokens.py +0 -0
  311. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/message.py +0 -0
  312. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/permission.py +0 -0
  313. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/slash.py +0 -0
  314. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/soul/toolset.py +0 -0
  315. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/subagents/__init__.py +0 -0
  316. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/subagents/builder.py +0 -0
  317. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/subagents/codenames.py +0 -0
  318. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/subagents/core.py +0 -0
  319. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/subagents/discovery.py +0 -0
  320. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/subagents/git_context.py +0 -0
  321. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/subagents/models.py +0 -0
  322. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/subagents/output.py +0 -0
  323. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/subagents/registry.py +0 -0
  324. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/subagents/runner.py +0 -0
  325. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/subagents/store.py +0 -0
  326. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/subagents/usage.py +0 -0
  327. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/subagents/worktree.py +0 -0
  328. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/telemetry/__init__.py +0 -0
  329. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/telemetry/config.py +0 -0
  330. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/telemetry/crash.py +0 -0
  331. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/telemetry/errors.py +0 -0
  332. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/telemetry/metrics.py +0 -0
  333. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/telemetry/names.py +0 -0
  334. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/telemetry/otel.py +0 -0
  335. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/telemetry/sentry.py +0 -0
  336. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/telemetry/sink.py +0 -0
  337. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/thinking.py +0 -0
  338. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/AGENTS.md +0 -0
  339. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/__init__.py +0 -0
  340. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/agent/__init__.py +0 -0
  341. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/agent/description.md +0 -0
  342. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/ask_user/__init__.py +0 -0
  343. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
  344. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/background/__init__.py +0 -0
  345. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/background/handoff.md +0 -0
  346. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/background/input.md +0 -0
  347. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/background/list.md +0 -0
  348. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/background/output.md +0 -0
  349. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/background/stop.md +0 -0
  350. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/display.py +0 -0
  351. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
  352. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
  353. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/__init__.py +0 -0
  354. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/glob.md +0 -0
  355. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/glob.py +0 -0
  356. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/grep.md +0 -0
  357. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/grep_local.py +0 -0
  358. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
  359. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/read.md +0 -0
  360. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/read.py +0 -0
  361. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/read_media.md +0 -0
  362. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/read_media.py +0 -0
  363. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/replace.md +0 -0
  364. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/replace.py +0 -0
  365. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/utils.py +0 -0
  366. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/write.md +0 -0
  367. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/file/write.py +0 -0
  368. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/goal/__init__.py +0 -0
  369. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/goal/update_goal.md +0 -0
  370. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/lsp/__init__.py +0 -0
  371. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/lsp/formatters.py +0 -0
  372. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/lsp/schemas.py +0 -0
  373. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/lsp/symbol_context.py +0 -0
  374. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/lsp/tool.md +0 -0
  375. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/lsp/tool.py +0 -0
  376. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/mcp_resource/__init__.py +0 -0
  377. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/mcp_resource/list_description.md +0 -0
  378. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/mcp_resource/prompt_description.md +0 -0
  379. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/mcp_resource/read_description.md +0 -0
  380. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/memory/__init__.py +0 -0
  381. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/memory/memory.md +0 -0
  382. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/memory/routing_guard.py +0 -0
  383. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/plan/__init__.py +0 -0
  384. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/plan/description.md +0 -0
  385. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/plan/enter.py +0 -0
  386. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
  387. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/plan/handoff.py +0 -0
  388. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
  389. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/progress/__init__.py +0 -0
  390. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/progress/description.md +0 -0
  391. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/recall/__init__.py +0 -0
  392. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/recall/description.md +0 -0
  393. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/scratchpad/__init__.py +0 -0
  394. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/scratchpad/scratchpad_tool.md +0 -0
  395. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/shell/__init__.py +0 -0
  396. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/shell/bash.md +0 -0
  397. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
  398. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/skill/__init__.py +0 -0
  399. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/skill/_mcp_bridge.py +0 -0
  400. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/skill/description.md +0 -0
  401. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/suggest/__init__.py +0 -0
  402. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/suggest/description.md +0 -0
  403. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/test.py +0 -0
  404. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/think/__init__.py +0 -0
  405. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/think/think.md +0 -0
  406. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
  407. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
  408. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/tool_search/__init__.py +0 -0
  409. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/tool_search/tool_search.md +0 -0
  410. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/utils.py +0 -0
  411. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/web/__init__.py +0 -0
  412. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/web/_allowlist.py +0 -0
  413. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/web/fetch.md +0 -0
  414. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/web/fetch.py +0 -0
  415. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/web/search.md +0 -0
  416. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/web/search.py +0 -0
  417. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/worktree/__init__.py +0 -0
  418. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/worktree/enter_worktree.md +0 -0
  419. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/tools/worktree/exit_worktree.md +0 -0
  420. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/__init__.py +0 -0
  421. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
  422. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/color_utils.py +0 -0
  423. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/print/__init__.py +0 -0
  424. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/print/visualize.py +0 -0
  425. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
  426. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
  427. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
  428. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
  429. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/diff.py +0 -0
  430. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/dynamic_border.py +0 -0
  431. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
  432. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
  433. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/markdown.py +0 -0
  434. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
  435. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/panel.py +0 -0
  436. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
  437. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/report.py +0 -0
  438. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/report_prose_blocks.py +0 -0
  439. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/report_update.py +0 -0
  440. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
  441. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
  442. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
  443. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/console.py +0 -0
  444. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/debug.py +0 -0
  445. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/design_system.py +0 -0
  446. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/echo.py +0 -0
  447. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
  448. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/glyphs.py +0 -0
  449. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
  450. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
  451. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/markdown/__init__.py +0 -0
  452. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/markdown/audit.py +0 -0
  453. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/markdown/elements.py +0 -0
  454. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/markdown/fences.py +0 -0
  455. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/markdown/normalizers.py +0 -0
  456. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/markdown/renderer.py +0 -0
  457. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/markdown/streaming.py +0 -0
  458. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
  459. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
  460. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/motion.py +0 -0
  461. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
  462. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
  463. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/render_constants.py +0 -0
  464. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/replay.py +0 -0
  465. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/selector.py +0 -0
  466. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
  467. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/selectors/code_theme.py +0 -0
  468. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
  469. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
  470. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
  471. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
  472. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
  473. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
  474. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
  475. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/setup.py +0 -0
  476. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/spacing.py +0 -0
  477. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/spinner_words.py +0 -0
  478. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/startup.py +0 -0
  479. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/stats.py +0 -0
  480. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/stats_collector.py +0 -0
  481. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/stats_pricing.py +0 -0
  482. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/statusline.py +0 -0
  483. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/sync_output.py +0 -0
  484. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
  485. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tips.py +0 -0
  486. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
  487. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/_file_diff.py +0 -0
  488. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -0
  489. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
  490. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
  491. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
  492. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
  493. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
  494. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
  495. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
  496. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
  497. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/lsp.py +0 -0
  498. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/mcp_resource.py +0 -0
  499. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/memory.py +0 -0
  500. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
  501. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
  502. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/read_media.py +0 -0
  503. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/skill.py +0 -0
  504. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/smart_search.py +0 -0
  505. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
  506. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
  507. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/tool_search.py +0 -0
  508. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -0
  509. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/worktree.py +0 -0
  510. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
  511. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage.py +0 -0
  512. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage_activity.py +0 -0
  513. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
  514. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage_adapters/alibaba.py +0 -0
  515. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
  516. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
  517. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
  518. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
  519. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
  520. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
  521. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
  522. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
  523. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
  524. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
  525. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
  526. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
  527. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/visualize/_activity_tree.py +0 -0
  528. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
  529. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +0 -0
  530. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
  531. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/visualize/_dialog_shell.py +0 -0
  532. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/visualize/_diff_live.py +0 -0
  533. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
  534. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +0 -0
  535. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +0 -0
  536. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
  537. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/visualize/_transcript.py +0 -0
  538. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
  539. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/terminal_background.py +0 -0
  540. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/theme/__init__.py +0 -0
  541. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/theme/adapters/__init__.py +0 -0
  542. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/theme/adapters/markdown.py +0 -0
  543. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/theme/adapters/task_browser.py +0 -0
  544. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/theme/capabilities.py +0 -0
  545. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/theme/palettes.py +0 -0
  546. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/theme/pythinker_themes.py +0 -0
  547. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/theme/registry.py +0 -0
  548. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/theme/resolver.py +0 -0
  549. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/theme/spec.py +0 -0
  550. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/ui/tui_config.py +0 -0
  551. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/update_policy.py +0 -0
  552. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
  553. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/__init__.py +0 -0
  554. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/aiohttp.py +0 -0
  555. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/aioqueue.py +0 -0
  556. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/artifacts.py +0 -0
  557. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/broadcast.py +0 -0
  558. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/changelog.py +0 -0
  559. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/clipboard.py +0 -0
  560. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/datetime.py +0 -0
  561. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/diff.py +0 -0
  562. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/editor.py +0 -0
  563. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/environment.py +0 -0
  564. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/envvar.py +0 -0
  565. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/export.py +0 -0
  566. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/file_filter.py +0 -0
  567. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/file_read_cache.py +0 -0
  568. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/frontmatter.py +0 -0
  569. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/gitignore.py +0 -0
  570. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/io.py +0 -0
  571. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/logging.py +0 -0
  572. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/mcp_names.py +0 -0
  573. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/media_limits.py +0 -0
  574. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/media_tags.py +0 -0
  575. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/message.py +0 -0
  576. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/path.py +0 -0
  577. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/proctitle.py +0 -0
  578. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/proxy.py +0 -0
  579. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
  580. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
  581. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/rich/columns.py +0 -0
  582. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
  583. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
  584. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
  585. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
  586. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/sensitive.py +0 -0
  587. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/server.py +0 -0
  588. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/signals.py +0 -0
  589. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/slashcmd.py +0 -0
  590. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/sleep_inhibitor.py +0 -0
  591. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/string.py +0 -0
  592. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
  593. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/term.py +0 -0
  594. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/trust.py +0 -0
  595. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/utils/typing.py +0 -0
  596. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/__init__.py +0 -0
  597. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/api/__init__.py +0 -0
  598. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/api/config.py +0 -0
  599. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/api/open_in.py +0 -0
  600. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/api/sessions.py +0 -0
  601. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/app.py +0 -0
  602. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/auth.py +0 -0
  603. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/models.py +0 -0
  604. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/runner/__init__.py +0 -0
  605. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/runner/messages.py +0 -0
  606. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/runner/process.py +0 -0
  607. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/runner/worker.py +0 -0
  608. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/_headers +0 -0
  609. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  610. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  611. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  612. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  613. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  614. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  615. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  616. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  617. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  618. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  619. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  620. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  621. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  622. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  623. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  624. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  625. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  626. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  627. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  628. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  629. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  630. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  631. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  632. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  633. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  634. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  635. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  636. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  637. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  638. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  639. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  640. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  641. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  642. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  643. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  644. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  645. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  646. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  647. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  648. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  649. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  650. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  651. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  652. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  653. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  654. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  655. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  656. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  657. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  658. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  659. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  660. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  661. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  662. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  663. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  664. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  665. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  666. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  667. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  668. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/abap-CLvhMVsD.js +0 -0
  669. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/actionscript-3--17pq3dv.js +0 -0
  670. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/ada-C5qYipkI.js +0 -0
  671. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/andromeeda-vGVdxbeo.js +0 -0
  672. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/angular-html-BKhkKBsm.js +0 -0
  673. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/angular-ts-CYPbMJCA.js +0 -0
  674. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/apache-U0d_L8uA.js +0 -0
  675. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/apex-CGTLDQj6.js +0 -0
  676. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/apl-D7bENxmy.js +0 -0
  677. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/applescript-CCn79oCD.js +0 -0
  678. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/ara-4CJ0cIlV.js +0 -0
  679. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/arc-8BWbC-0s.js +0 -0
  680. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/array-BifhSqXX.js +0 -0
  681. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/asciidoc-DE70LPWp.js +0 -0
  682. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/asm-Cmm7eHzH.js +0 -0
  683. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/astro-B1l9MDUT.js +0 -0
  684. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/aurora-x-CDeNXAV0.js +0 -0
  685. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/awk-BWXHIvNe.js +0 -0
  686. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/ayu-dark-DluEY0Gj.js +0 -0
  687. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/ayu-light-C3h-C4tm.js +0 -0
  688. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/ayu-mirage-Bqwy1Gya.js +0 -0
  689. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/ballerina-B7ZEbQpA.js +0 -0
  690. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/bat-Bo4NYOV-.js +0 -0
  691. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/beancount-D-usSTwE.js +0 -0
  692. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/berry-DKpUyyne.js +0 -0
  693. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/bibtex-Ci_nEsc7.js +0 -0
  694. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/bicep-CUHmPFLl.js +0 -0
  695. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/bird2-C2hNVINV.js +0 -0
  696. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/blade-BlkqRXu6.js +0 -0
  697. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/bootstrap-BhLLvBaE.css +0 -0
  698. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/bsl-BkkzgIyY.js +0 -0
  699. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/c-PpPxyn8g.js +0 -0
  700. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/c3-CnJL0r0V.js +0 -0
  701. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/cadence-CQ2zXKGN.js +0 -0
  702. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/cairo-DLTphjLi.js +0 -0
  703. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-3VR1Za6u.js +0 -0
  704. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/catppuccin-latte-DwIHMF0Q.js +0 -0
  705. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DYnBP6_5.js +0 -0
  706. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-DYhrFGRu.js +0 -0
  707. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/character-entities-legacy-Wut6vMuj.js +0 -0
  708. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/chevrons-up-down-Dwo0Il5v.js +0 -0
  709. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-C0kf5ycP.js +0 -0
  710. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/chunk-55IACEB6-QyFAFTWp.js +0 -0
  711. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/chunk-BSJP7CBP-DIpfLhEz.js +0 -0
  712. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/chunk-Cyuzqnbw.js +0 -0
  713. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-C9D6P7Uq.js +0 -0
  714. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/chunk-NNHCCRGN-DmZbXBJw.js +0 -0
  715. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-CyVdgm44.js +0 -0
  716. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/chunk-XPW4576I-ru3A962d.js +0 -0
  717. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/clarity-SemFz856.js +0 -0
  718. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/clojure-DqKBuwfJ.js +0 -0
  719. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/cmake-Bj61d0ZC.js +0 -0
  720. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/cobol-BoXxFQjh.js +0 -0
  721. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/codeowners-C8r90Shi.js +0 -0
  722. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/codeql-oeQT6MSM.js +0 -0
  723. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/coffee-B5TREocO.js +0 -0
  724. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/common-lisp-Cv5bFMCO.js +0 -0
  725. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/coq-BrsZFFmf.js +0 -0
  726. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-PjRvINHM.js +0 -0
  727. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/cpp-CVIk4zoB.js +0 -0
  728. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/crystal-CvUuUt6_.js +0 -0
  729. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/csharp-Ct8U2NOr.js +0 -0
  730. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/css-D7o5g6xi.js +0 -0
  731. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/csv-Dx-8-gkx.js +0 -0
  732. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/cue-CE9AQfxI.js +0 -0
  733. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/cypher-ClKdZ_lG.js +0 -0
  734. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/cytoscape.esm-jXPf2pm4.js +0 -0
  735. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/d-qD-0Kul2.js +0 -0
  736. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/dagre-Uyq5yTtG.js +0 -0
  737. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/dark-plus-Cs2F2srj.js +0 -0
  738. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/dart-DkHntEIa.js +0 -0
  739. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/dax-BkyTk9wS.js +0 -0
  740. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/defaultLocale-C8Fc0cco.js +0 -0
  741. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/desktop-Dlh5hvp9.js +0 -0
  742. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/diff-BDNflWRl.js +0 -0
  743. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/diff-Dvab7kiv.css +0 -0
  744. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/diff-woXpYk--.js +0 -0
  745. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/dist-B7jLwIkG.js +0 -0
  746. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/dist-D4B_Bs5p.js +0 -0
  747. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/dist-reBDvVlc.js +0 -0
  748. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/docker-IyjqRm3v.js +0 -0
  749. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/dotenv-_5a1GRtc.js +0 -0
  750. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/dracula-BHWKrbxM.js +0 -0
  751. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/dracula-soft-5eyTD99u.js +0 -0
  752. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/dream-maker-DW3nJb8Q.js +0 -0
  753. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/edge-CmXZi-az.js +0 -0
  754. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/elixir-BoRIkjDi.js +0 -0
  755. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/elm-Cm7sFdI1.js +0 -0
  756. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9PiwqqW.js +0 -0
  757. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/erb-DuMAGb6i.js +0 -0
  758. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/erlang-Cphh6RMH.js +0 -0
  759. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/everforest-dark-sB-x3p7T.js +0 -0
  760. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/everforest-light-Df2xbC6M.js +0 -0
  761. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/fennel-DQxkIbk2.js +0 -0
  762. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/fish-BJitypiv.js +0 -0
  763. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/fluent-C03EYrpw.js +0 -0
  764. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-DEKoE2YW.js +0 -0
  765. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/fortran-free-form-CYNrtFtB.js +0 -0
  766. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/fsharp-D13ZGOAj.js +0 -0
  767. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/gdresource-C0sCabJj.js +0 -0
  768. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/gdscript-Cp2uCuqX.js +0 -0
  769. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/gdshader-CBce3t8t.js +0 -0
  770. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/genie-CV2tkWYe.js +0 -0
  771. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/gherkin-DExj1W_8.js +0 -0
  772. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/git-commit-BSykSTBG.js +0 -0
  773. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/git-rebase-D2tSwjJb.js +0 -0
  774. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/github-dark-C-LZuMrd.js +0 -0
  775. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/github-dark-default-DXG-b-1a.js +0 -0
  776. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-Bx1FflLF.js +0 -0
  777. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/github-dark-high-contrast-B_tTalzw.js +0 -0
  778. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/github-light-EUqPIrTm.js +0 -0
  779. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/github-light-default-BXViO-2h.js +0 -0
  780. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-B68TUdTA.js +0 -0
  781. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/gleam-CSRkHgEL.js +0 -0
  782. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/glimmer-js--VVKNatA.js +0 -0
  783. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/glimmer-ts-Bfa_wiNC.js +0 -0
  784. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/glsl-MPwHyiXQ.js +0 -0
  785. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/gn-ilITqXS6.js +0 -0
  786. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/gnuplot-7GGW24-e.js +0 -0
  787. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/go-BJwz_mda.js +0 -0
  788. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/graphlib-C22s9MDV.js +0 -0
  789. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/graphql-NW854Khs.js +0 -0
  790. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/groovy-CacY0gHj.js +0 -0
  791. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-C820rvS2.js +0 -0
  792. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-BPjhmG05.js +0 -0
  793. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-MrdJrrXF.js +0 -0
  794. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-BC_s9l72.js +0 -0
  795. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-BAWPOn9u.js +0 -0
  796. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-BSMLrYjP.js +0 -0
  797. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/hack-CSl79E5u.js +0 -0
  798. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/haml-Dmb1YmHj.js +0 -0
  799. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/handlebars-Du8DtnRB.js +0 -0
  800. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/haskell-D8IpX4py.js +0 -0
  801. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/haxe-OTjmBuCE.js +0 -0
  802. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/hcl-Dh228itO.js +0 -0
  803. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/hjson-CxZEssPk.js +0 -0
  804. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/hlsl-Cvrh5tZx.js +0 -0
  805. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/horizon-CE9ld1lL.js +0 -0
  806. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/horizon-bright-Br1oVSNq.js +0 -0
  807. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/houston-CsvMBhTu.js +0 -0
  808. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/html-Kpl3bQKd.js +0 -0
  809. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/html-derivative-BEEWNZ8Y.js +0 -0
  810. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/http-HvMG3K54.js +0 -0
  811. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/hurl-CLh1t2ES.js +0 -0
  812. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/hxml-B0Qn7Nwc.js +0 -0
  813. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/hy-CZbG8q4J.js +0 -0
  814. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/imba-DsUTQ-LC.js +0 -0
  815. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/ini-B5eOa1yu.js +0 -0
  816. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/init-D6jRqBbL.js +0 -0
  817. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  818. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  819. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  820. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  821. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  822. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  823. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  824. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/java-Cst_eZTE.js +0 -0
  825. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/javascript-i_rUTyCW.js +0 -0
  826. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/jinja-CaXggA6f.js +0 -0
  827. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/jison-D9Fg2JgN.js +0 -0
  828. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/json-DS5j4FfK.js +0 -0
  829. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/json5-BR5RXkoi.js +0 -0
  830. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/jsonc-CYpm1nAK.js +0 -0
  831. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/jsonl-CmCQp5Yx.js +0 -0
  832. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/jsonnet-CJTPZ8u_.js +0 -0
  833. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/jssm-DXw9l8Rf.js +0 -0
  834. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/jsx-CFyhNHav.js +0 -0
  835. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/jsx-runtime-wSvXh6gi.js +0 -0
  836. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/julia-R8NNmfP1.js +0 -0
  837. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/just-BhhHYlS8.js +0 -0
  838. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CXtmUGW6.js +0 -0
  839. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-BN08jTvb.js +0 -0
  840. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/kanagawa-wave-CTweb8Dz.js +0 -0
  841. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/katex-BGaDVET_.js +0 -0
  842. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/katex-BorAY7qD.css +0 -0
  843. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/kdl-CsD5j6eV.js +0 -0
  844. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/kotlin-DhhofPvG.js +0 -0
  845. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/kusto-BUv0MjJC.js +0 -0
  846. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/laserwave-C_8bwKvT.js +0 -0
  847. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/latex-D5k_uhWv.js +0 -0
  848. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/lean-CewbzKMR.js +0 -0
  849. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/less-DVTAwKKz.js +0 -0
  850. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/lib-BLxG8W6T.js +0 -0
  851. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/libesm-8-2luV-1.js +0 -0
  852. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/light-plus-DVQuIRkW.js +0 -0
  853. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/linear-BktLjFGX.js +0 -0
  854. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/liquid-Q0_hzjly.js +0 -0
  855. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/llvm-Cm23YOpf.js +0 -0
  856. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/log-BNLmms1o.js +0 -0
  857. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/logo-Cluzi2Zq.js +0 -0
  858. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/lua-VoGSg0xb.js +0 -0
  859. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/luau-CNKltnaQ.js +0 -0
  860. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/make-Dixweg8N.js +0 -0
  861. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/markdown-BYOwaDjH.js +0 -0
  862. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/marked.esm-DLdcrU5H.js +0 -0
  863. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/marko-D_aeUD__.js +0 -0
  864. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/material-theme-Bm3Qr25_.js +0 -0
  865. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/material-theme-darker-2IIEA8gg.js +0 -0
  866. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/material-theme-lighter-uhdI0v04.js +0 -0
  867. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CHQ94UKr.js +0 -0
  868. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/material-theme-palenight-B5W6OYN7.js +0 -0
  869. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/matlab-D7qyCx1q.js +0 -0
  870. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/mdc-BSifqehP.js +0 -0
  871. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/mdx-DQZ5AkYe.js +0 -0
  872. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/mermaid-Bk4SNUv9.js +0 -0
  873. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/min-dark-BSWPekZh.js +0 -0
  874. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/min-light-DDpmG2fV.js +0 -0
  875. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/mipsasm-BMqwQI7S.js +0 -0
  876. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/mojo-BgCJLMeH.js +0 -0
  877. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/monokai-CdkpiU2Y.js +0 -0
  878. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/moonbit-CaWjb8XO.js +0 -0
  879. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/move-B1IS1UjX.js +0 -0
  880. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/narrat-_X_XdTYD.js +0 -0
  881. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/nextflow-Bbiyy34d.js +0 -0
  882. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/nextflow-groovy-Dc_ddanL.js +0 -0
  883. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/nginx-CgHaWcsO.js +0 -0
  884. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/night-owl-DhmEMT88.js +0 -0
  885. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/night-owl-light-eJ-hLW7d.js +0 -0
  886. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/nim-BuixXxPS.js +0 -0
  887. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/nix-IvuFDN5E.js +0 -0
  888. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/nord-Cb4Vim4T.js +0 -0
  889. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/nushell-DcLAeLz5.js +0 -0
  890. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/objective-c-D1A_Heim.js +0 -0
  891. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/objective-cpp-BsSzOQcm.js +0 -0
  892. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/ocaml-O90oeIOV.js +0 -0
  893. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/odin-B1RWQWA5.js +0 -0
  894. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/one-dark-pro-CLwyXe_n.js +0 -0
  895. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/one-light-D7Lr4KcI.js +0 -0
  896. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/openscad-BUDT5pXO.js +0 -0
  897. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/ordinal-hYBb2elL.js +0 -0
  898. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/pascal-4ZHwLPI5.js +0 -0
  899. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/path-BWPyau1x.js +0 -0
  900. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/perl-BLMySlFJ.js +0 -0
  901. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/php-Czf_fybR.js +0 -0
  902. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/pkl-ot-7Btpt.js +0 -0
  903. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/plastic-DQwYfKfQ.js +0 -0
  904. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/plsql-DGHpHOYJ.js +0 -0
  905. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/po-BiJDBrnU.js +0 -0
  906. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/poimandres-DRFjx7u4.js +0 -0
  907. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/polar-C7UOKdEL.js +0 -0
  908. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/postcss-BXeXVLqQ.js +0 -0
  909. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/powerquery-DNMTfnFr.js +0 -0
  910. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/powershell-DshXNtvi.js +0 -0
  911. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/prisma-BsRQq5mF.js +0 -0
  912. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/prolog-iXnhIJG7.js +0 -0
  913. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/proto-DB4EqR-F.js +0 -0
  914. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/pug-CsZglf8T.js +0 -0
  915. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/puppet-CDv2pdJW.js +0 -0
  916. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/purescript-9MfHhQsQ.js +0 -0
  917. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/python-gzcpVVnB.js +0 -0
  918. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/qml-DcW_sT3t.js +0 -0
  919. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/qmldir-DCQb3MpD.js +0 -0
  920. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/qss-Fe1Jh2GI.js +0 -0
  921. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/r-D2d3McyU.js +0 -0
  922. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/racket-DcIDlBhZ.js +0 -0
  923. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/raku-B3gFvitq.js +0 -0
  924. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/razor-oFpUW61Z.js +0 -0
  925. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/red-CJ3rzSJv.js +0 -0
  926. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/reg-CRGYupPL.js +0 -0
  927. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/regexp-Bu0flJgP.js +0 -0
  928. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/rel-BtDbiS_P.js +0 -0
  929. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/riscv-Ckw8ddFX.js +0 -0
  930. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/ron-VUp2lXgN.js +0 -0
  931. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/rose-pine-BthvhNj6.js +0 -0
  932. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-Dg85fqjY.js +0 -0
  933. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/rose-pine-moon-hon4tzzS.js +0 -0
  934. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/rosmsg-CAekHB0j.js +0 -0
  935. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/rough.esm-CSKSodPl.js +0 -0
  936. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/rst-U6Eu7ipE.js +0 -0
  937. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/ruby-CUQsVT6d.js +0 -0
  938. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/rust-Cfkwpbl8.js +0 -0
  939. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/sas-CNBFrLhc.js +0 -0
  940. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/sass-DXrisJhu.js +0 -0
  941. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/scala-DKOlJaKm.js +0 -0
  942. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/scheme-DQCgrYNe.js +0 -0
  943. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/scss-CPnU-uuv.js +0 -0
  944. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/sdbl-bTVj8UrX.js +0 -0
  945. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/shaderlab-TOUzSsQk.js +0 -0
  946. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/shellscript-BbTp1yjG.js +0 -0
  947. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/shellsession-BmAC8SMF.js +0 -0
  948. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/slack-dark-DnToyrRv.js +0 -0
  949. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/slack-ochin-B2OO5cIa.js +0 -0
  950. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/smalltalk-B16xEiuN.js +0 -0
  951. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/snazzy-light-4G7pJPwS.js +0 -0
  952. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/solarized-dark-DV17i1UV.js +0 -0
  953. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/solarized-light-DSh2HLQt.js +0 -0
  954. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/solidity-CKzVLygQ.js +0 -0
  955. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/soy-CdbyEXp6.js +0 -0
  956. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/space-separated-tokens-DpjE5PGy.js +0 -0
  957. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/sparql-D_iOobhT.js +0 -0
  958. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/splunk-BC2Px7Mm.js +0 -0
  959. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/sql-hpBkusIy.js +0 -0
  960. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/src-D-NMWEou.js +0 -0
  961. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/ssh-config-BgfXC-Er.js +0 -0
  962. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/stata-DVbvk3qH.js +0 -0
  963. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/stylus-B6D30XZt.js +0 -0
  964. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/surrealql-DxccxuMd.js +0 -0
  965. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/svelte-DzNm5V2w.js +0 -0
  966. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/swift-DonLKvLd.js +0 -0
  967. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/synthwave-84-nFMaYfgc.js +0 -0
  968. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/system-verilog-DJ5XKQeo.js +0 -0
  969. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/systemd-BxMlprV5.js +0 -0
  970. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/talonscript-CohzipZa.js +0 -0
  971. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/tasl-DMoTqEGO.js +0 -0
  972. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/tcl-CZd0xW_V.js +0 -0
  973. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/templ-CsM0tTsw.js +0 -0
  974. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/terraform-DswuEJGm.js +0 -0
  975. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/tex-B0f_hYr8.js +0 -0
  976. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/tokyo-night-oM2G3aXe.js +0 -0
  977. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/toml-CcmNWLt0.js +0 -0
  978. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/ts-tags-Bf-FGGvT.js +0 -0
  979. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/tsv-sltzmVWM.js +0 -0
  980. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/tsx-DFvk7AwW.js +0 -0
  981. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/turtle-ByJddavk.js +0 -0
  982. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/twig-VJ4-Ntm0.js +0 -0
  983. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/typescript-DHTLvXzV.js +0 -0
  984. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/typespec-B88KGewJ.js +0 -0
  985. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/typst-DI99ib-x.js +0 -0
  986. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/v-DETTlOr0.js +0 -0
  987. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/v4-DqR3yzBO.js +0 -0
  988. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/vala-zf12oZj6.js +0 -0
  989. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/vb-Djn5o6TS.js +0 -0
  990. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/verilog-CiiDBU1e.js +0 -0
  991. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/vesper-D5bVUKB1.js +0 -0
  992. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/vhdl-BroJfC0k.js +0 -0
  993. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/viml-DvXPmvsu.js +0 -0
  994. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/vitesse-black-fwtXNY1n.js +0 -0
  995. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/vitesse-dark-BZCL-v6S.js +0 -0
  996. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/vitesse-light-VbXTXTou.js +0 -0
  997. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/vue-D3dSYZKz.js +0 -0
  998. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/vue-html-DQch_7VQ.js +0 -0
  999. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/vue-vine-B67Dz05t.js +0 -0
  1000. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/vyper-CgoNMtux.js +0 -0
  1001. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/wasm-BnjxR4X6.js +0 -0
  1002. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/wasm-ByWQv1Qj.js +0 -0
  1003. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/wenyan-C8pVoKbM.js +0 -0
  1004. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/wgsl-BsKzXJz4.js +0 -0
  1005. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/wikitext-ClFFjSW2.js +0 -0
  1006. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/wit-DdvCle-K.js +0 -0
  1007. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/wolfram-DLL8P-h_.js +0 -0
  1008. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/xml-C33zriiW.js +0 -0
  1009. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/xsl-BFS2wyMt.js +0 -0
  1010. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/yaml-w0rMsuN4.js +0 -0
  1011. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/zenscript-BnlCZFoB.js +0 -0
  1012. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/assets/zig-CMLA9XwU.js +0 -0
  1013. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
  1014. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
  1015. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
  1016. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
  1017. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
  1018. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
  1019. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
  1020. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
  1021. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
  1022. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
  1023. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
  1024. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
  1025. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
  1026. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
  1027. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
  1028. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
  1029. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
  1030. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
  1031. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
  1032. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
  1033. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
  1034. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
  1035. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/install.ps1 +0 -0
  1036. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/install.sh +0 -0
  1037. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/static/logo.png +0 -0
  1038. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/store/__init__.py +0 -0
  1039. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/web/store/sessions.py +0 -0
  1040. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/wire/__init__.py +0 -0
  1041. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/wire/file.py +0 -0
  1042. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
  1043. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/wire/protocol.py +0 -0
  1044. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/wire/root_hub.py +0 -0
  1045. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/wire/serde.py +0 -0
  1046. {pythinker_code-0.49.0 → pythinker_code-0.51.0}/src/pythinker_code/wire/server.py +0 -0
  1047. {pythinker_code-0.49.0 → pythinker_code-0.51.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.49.0
3
+ Version: 0.51.0
4
4
  Summary: Pythinker — an agentic CLI developed by Pythoughts-labs.
5
5
  Keywords: cli,agent,ai,coding-assistant,llm,claude,openai,terminal
6
6
  Author: Pythoughts-labs
@@ -115,13 +115,16 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
115
115
 
116
116
  ---
117
117
 
118
- ## 🆕 What's New in 0.49.0
118
+ ## 🆕 What's New in 0.51.0
119
119
 
120
- - **Cleaner code by default.** The agent now walks an explicit *reduction ladder* before writing code — does this need to exist at all, then the standard library, a native platform or framework feature, an already-installed dependency, one line, and only then the minimum custom code — so it reaches for the simplest working solution without trading away input validation, error handling, security, or accessibility. The same guidance layers into the `/best-practices` profile.
121
- - **New `cleanup-audit` skill.** A read-only, whole-repo audit that ranks over-engineering what to delete, simplify, or replace with standard-library/platform equivalents as the repo-wide complement to the diff-scoped `pythinker review diff --mode deslopify`. It applies no fixes.
122
- - **Smoother startup.** Update notices no longer appear twice; the hint now renders once on the persistent under-input line instead of also flashing as a footer toast.
120
+ - **Model-aware thinking levels.** The thinking selector and Shift+Tab cycle now scope reasoning effort to what the active GPT-5-family model accepts; unsupported persisted levels are clamped before the API call.
121
+ - **Cleaner diff cards.** Diff syntax highlighting no longer paints an opaque code-theme background over green/red row tintstints show through on every terminal.
122
+ - **Truecolor in VS Code terminals.** Integrated terminals reporting `TERM_PROGRAM=vscode` (and forks) are promoted to truecolor so diff tints don't fall back to 16-color mode.
123
+ - **No duplicate welcome banner on reload.** Same-session reloads (`/model`, `/theme`, `/thinking`, …) keep the existing banner instead of stacking a second splash.
124
+ - **Update notice moved to footer.** The persistent "Restart to apply" / "Update available" line renders below the status/clock row, clear of the input box.
125
+ - **Safer Homebrew self-upgrades.** Silent `brew upgrade` runs with cleanup/auto-update disabled so the in-use Cellar version isn't deleted mid-session.
123
126
 
124
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.49.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
127
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.51.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
125
128
 
126
129
 
127
130
  ---
@@ -211,7 +214,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
211
214
 
212
215
  | Platform | Recommended install | Artifact source |
213
216
  |---|---|---|
214
- | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.49.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
217
+ | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.51.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
215
218
  | **<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/Pythoughts-labs/pythinker-code/releases/latest) |
216
219
  | **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> — Homebrew** | `brew install Pythoughts-labs/pythinker/pythinker-code` | auto-published Homebrew tap |
217
220
  | **🐳 Docker** | `docker run --rm -it ghcr.io/pythoughts-labs/pythinker-code` | GHCR multi-arch image |
@@ -239,7 +242,7 @@ pythinker # start the interactive TUI
239
242
 
240
243
  ### 🪟 Windows — native installer
241
244
 
242
- `PythinkerSetup-0.49.0.exe` is a signed* Inno Setup wizard. Installs per-user
245
+ `PythinkerSetup-0.51.0.exe` is a signed* Inno Setup wizard. Installs per-user
243
246
  into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
244
247
  PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
245
248
  the change. **No UAC prompt.**
@@ -250,13 +253,13 @@ irm https://pythinker.com/install.ps1 | iex
250
253
 
251
254
  # Or manually download the installer + checksum from the Releases page,
252
255
  # verify with Get-FileHash, then run:
253
- .\PythinkerSetup-0.49.0.exe
256
+ .\PythinkerSetup-0.51.0.exe
254
257
 
255
258
  # Open a fresh PowerShell
256
259
  pythinker --version
257
260
  ```
258
261
 
259
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.49.0.exe /ALLUSERS`
262
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.51.0.exe /ALLUSERS`
260
263
  installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
261
264
 
262
265
  **Upgrade:** `pythinker update` from inside the running app — it downloads
@@ -314,26 +317,26 @@ attached to every GitHub Release.
314
317
 
315
318
  ```sh
316
319
  # Debian / Ubuntu (x86_64)
317
- sudo dpkg -i pythinker-code_0.49.0_amd64.deb
320
+ sudo dpkg -i pythinker-code_0.51.0_amd64.deb
318
321
  sudo apt-get install -f # only if dpkg reports missing deps
319
322
 
320
323
  # Debian / Ubuntu (ARM64)
321
- sudo dpkg -i pythinker-code_0.49.0_arm64.deb
324
+ sudo dpkg -i pythinker-code_0.51.0_arm64.deb
322
325
 
323
326
  # Fedora / RHEL / openSUSE (x86_64)
324
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.49.0/pythinker-code-0.49.0.x86_64.rpm
325
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.49.0/pythinker-code-0.49.0.x86_64.rpm.sha256
326
- sha256sum -c pythinker-code-0.49.0.x86_64.rpm.sha256
327
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.51.0/pythinker-code-0.51.0.x86_64.rpm
328
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.51.0/pythinker-code-0.51.0.x86_64.rpm.sha256
329
+ sha256sum -c pythinker-code-0.51.0.x86_64.rpm.sha256
327
330
  # Fedora / RHEL:
328
- sudo dnf install ./pythinker-code-0.49.0.x86_64.rpm
331
+ sudo dnf install ./pythinker-code-0.51.0.x86_64.rpm
329
332
  # openSUSE:
330
- sudo zypper install ./pythinker-code-0.49.0.x86_64.rpm
333
+ sudo zypper install ./pythinker-code-0.51.0.x86_64.rpm
331
334
 
332
335
  # Fedora / RHEL (aarch64)
333
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.49.0/pythinker-code-0.49.0.aarch64.rpm
334
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.49.0/pythinker-code-0.49.0.aarch64.rpm.sha256
335
- sha256sum -c pythinker-code-0.49.0.aarch64.rpm.sha256
336
- sudo dnf install ./pythinker-code-0.49.0.aarch64.rpm
336
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.51.0/pythinker-code-0.51.0.aarch64.rpm
337
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.51.0/pythinker-code-0.51.0.aarch64.rpm.sha256
338
+ sha256sum -c pythinker-code-0.51.0.aarch64.rpm.sha256
339
+ sudo dnf install ./pythinker-code-0.51.0.aarch64.rpm
337
340
  ```
338
341
 
339
342
  Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
@@ -342,8 +345,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
342
345
  **Verify before install:**
343
346
 
344
347
  ```sh
345
- sha256sum -c pythinker-code_0.49.0_amd64.deb.sha256 # Debian/Ubuntu
346
- sha256sum -c pythinker-code-0.49.0.x86_64.rpm.sha256 # Fedora/RHEL
348
+ sha256sum -c pythinker-code_0.51.0_amd64.deb.sha256 # Debian/Ubuntu
349
+ sha256sum -c pythinker-code-0.51.0.x86_64.rpm.sha256 # Fedora/RHEL
347
350
  ```
348
351
 
349
352
  **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
@@ -50,13 +50,16 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
50
50
 
51
51
  ---
52
52
 
53
- ## 🆕 What's New in 0.49.0
53
+ ## 🆕 What's New in 0.51.0
54
54
 
55
- - **Cleaner code by default.** The agent now walks an explicit *reduction ladder* before writing code — does this need to exist at all, then the standard library, a native platform or framework feature, an already-installed dependency, one line, and only then the minimum custom code — so it reaches for the simplest working solution without trading away input validation, error handling, security, or accessibility. The same guidance layers into the `/best-practices` profile.
56
- - **New `cleanup-audit` skill.** A read-only, whole-repo audit that ranks over-engineering what to delete, simplify, or replace with standard-library/platform equivalents as the repo-wide complement to the diff-scoped `pythinker review diff --mode deslopify`. It applies no fixes.
57
- - **Smoother startup.** Update notices no longer appear twice; the hint now renders once on the persistent under-input line instead of also flashing as a footer toast.
55
+ - **Model-aware thinking levels.** The thinking selector and Shift+Tab cycle now scope reasoning effort to what the active GPT-5-family model accepts; unsupported persisted levels are clamped before the API call.
56
+ - **Cleaner diff cards.** Diff syntax highlighting no longer paints an opaque code-theme background over green/red row tintstints show through on every terminal.
57
+ - **Truecolor in VS Code terminals.** Integrated terminals reporting `TERM_PROGRAM=vscode` (and forks) are promoted to truecolor so diff tints don't fall back to 16-color mode.
58
+ - **No duplicate welcome banner on reload.** Same-session reloads (`/model`, `/theme`, `/thinking`, …) keep the existing banner instead of stacking a second splash.
59
+ - **Update notice moved to footer.** The persistent "Restart to apply" / "Update available" line renders below the status/clock row, clear of the input box.
60
+ - **Safer Homebrew self-upgrades.** Silent `brew upgrade` runs with cleanup/auto-update disabled so the in-use Cellar version isn't deleted mid-session.
58
61
 
59
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.49.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
62
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.51.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
60
63
 
61
64
 
62
65
  ---
@@ -146,7 +149,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
146
149
 
147
150
  | Platform | Recommended install | Artifact source |
148
151
  |---|---|---|
149
- | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.49.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
152
+ | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.51.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
150
153
  | **<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/Pythoughts-labs/pythinker-code/releases/latest) |
151
154
  | **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> — Homebrew** | `brew install Pythoughts-labs/pythinker/pythinker-code` | auto-published Homebrew tap |
152
155
  | **🐳 Docker** | `docker run --rm -it ghcr.io/pythoughts-labs/pythinker-code` | GHCR multi-arch image |
@@ -174,7 +177,7 @@ pythinker # start the interactive TUI
174
177
 
175
178
  ### 🪟 Windows — native installer
176
179
 
177
- `PythinkerSetup-0.49.0.exe` is a signed* Inno Setup wizard. Installs per-user
180
+ `PythinkerSetup-0.51.0.exe` is a signed* Inno Setup wizard. Installs per-user
178
181
  into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
179
182
  PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
180
183
  the change. **No UAC prompt.**
@@ -185,13 +188,13 @@ irm https://pythinker.com/install.ps1 | iex
185
188
 
186
189
  # Or manually download the installer + checksum from the Releases page,
187
190
  # verify with Get-FileHash, then run:
188
- .\PythinkerSetup-0.49.0.exe
191
+ .\PythinkerSetup-0.51.0.exe
189
192
 
190
193
  # Open a fresh PowerShell
191
194
  pythinker --version
192
195
  ```
193
196
 
194
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.49.0.exe /ALLUSERS`
197
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.51.0.exe /ALLUSERS`
195
198
  installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
196
199
 
197
200
  **Upgrade:** `pythinker update` from inside the running app — it downloads
@@ -249,26 +252,26 @@ attached to every GitHub Release.
249
252
 
250
253
  ```sh
251
254
  # Debian / Ubuntu (x86_64)
252
- sudo dpkg -i pythinker-code_0.49.0_amd64.deb
255
+ sudo dpkg -i pythinker-code_0.51.0_amd64.deb
253
256
  sudo apt-get install -f # only if dpkg reports missing deps
254
257
 
255
258
  # Debian / Ubuntu (ARM64)
256
- sudo dpkg -i pythinker-code_0.49.0_arm64.deb
259
+ sudo dpkg -i pythinker-code_0.51.0_arm64.deb
257
260
 
258
261
  # Fedora / RHEL / openSUSE (x86_64)
259
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.49.0/pythinker-code-0.49.0.x86_64.rpm
260
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.49.0/pythinker-code-0.49.0.x86_64.rpm.sha256
261
- sha256sum -c pythinker-code-0.49.0.x86_64.rpm.sha256
262
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.51.0/pythinker-code-0.51.0.x86_64.rpm
263
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.51.0/pythinker-code-0.51.0.x86_64.rpm.sha256
264
+ sha256sum -c pythinker-code-0.51.0.x86_64.rpm.sha256
262
265
  # Fedora / RHEL:
263
- sudo dnf install ./pythinker-code-0.49.0.x86_64.rpm
266
+ sudo dnf install ./pythinker-code-0.51.0.x86_64.rpm
264
267
  # openSUSE:
265
- sudo zypper install ./pythinker-code-0.49.0.x86_64.rpm
268
+ sudo zypper install ./pythinker-code-0.51.0.x86_64.rpm
266
269
 
267
270
  # Fedora / RHEL (aarch64)
268
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.49.0/pythinker-code-0.49.0.aarch64.rpm
269
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.49.0/pythinker-code-0.49.0.aarch64.rpm.sha256
270
- sha256sum -c pythinker-code-0.49.0.aarch64.rpm.sha256
271
- sudo dnf install ./pythinker-code-0.49.0.aarch64.rpm
271
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.51.0/pythinker-code-0.51.0.aarch64.rpm
272
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.51.0/pythinker-code-0.51.0.aarch64.rpm.sha256
273
+ sha256sum -c pythinker-code-0.51.0.aarch64.rpm.sha256
274
+ sudo dnf install ./pythinker-code-0.51.0.aarch64.rpm
272
275
  ```
273
276
 
274
277
  Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
@@ -277,8 +280,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
277
280
  **Verify before install:**
278
281
 
279
282
  ```sh
280
- sha256sum -c pythinker-code_0.49.0_amd64.deb.sha256 # Debian/Ubuntu
281
- sha256sum -c pythinker-code-0.49.0.x86_64.rpm.sha256 # Fedora/RHEL
283
+ sha256sum -c pythinker-code_0.51.0_amd64.deb.sha256 # Debian/Ubuntu
284
+ sha256sum -c pythinker-code-0.51.0.x86_64.rpm.sha256 # Fedora/RHEL
282
285
  ```
283
286
 
284
287
  **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pythinker-code"
3
- version = "0.49.0"
3
+ version = "0.51.0"
4
4
  description = "Pythinker — an agentic CLI developed by Pythoughts-labs."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -15,6 +15,53 @@ GitHub Releases page; `0.8.0` is the new starting line.
15
15
 
16
16
  ## Unreleased
17
17
 
18
+ ## 0.51.0 (2026-06-22)
19
+
20
+ - **Reasoning levels now match each GPT model.** The thinking selector and
21
+ Shift+Tab cycle scope reasoning effort to what the active OpenAI GPT-5-family
22
+ model actually accepts — e.g. gpt-5.4/gpt-5.5 no longer offer `minimal`
23
+ (which they reject) and keep `xhigh`, while gpt-5.0 keeps `minimal`. A
24
+ persisted unsupported level is clamped to the nearest supported one before
25
+ it is sent, so the API never rejects it.
26
+ - **Diff cards no longer show a "blue overlay".** The syntax highlighter no
27
+ longer paints the code theme's opaque background (e.g. catppuccin `#1E1E2E`)
28
+ onto diff lines, so the green/red row tints — and the terminal background on
29
+ context lines — show through on every terminal. Previously that code-theme
30
+ block masked the row tints and only blended where the terminal background
31
+ happened to match it.
32
+ - **VS Code-family terminals are detected as truecolor.** `color_depth()` now
33
+ promotes integrated terminals reporting `TERM_PROGRAM=vscode` (including forks
34
+ built on it) to truecolor — like the existing Windows Terminal promotion — so
35
+ diff tints don't fall back to the colorless 16-color path when the terminal
36
+ doesn't advertise `COLORTERM`.
37
+ - **Model/theme switches no longer reprint the welcome banner.** A same-session
38
+ reload (`/model`, `/theme`, `/thinking`, `/new`, fork, …) now keeps the
39
+ existing banner and shows only its own "Switched to… / Reloading…"
40
+ confirmation, instead of stacking a redundant second welcome splash below it.
41
+ `/clear` and `/reload` still wipe the screen and reprint the banner.
42
+ - **Update notice no longer crowds the prompt.** The persistent "Restart to apply"
43
+ / "Update available" line now renders as the last footer row — below the
44
+ status/clock line — instead of directly under the input box, keeping the input
45
+ area clear.
46
+ - **Homebrew self-upgrades no longer risk the live session.** The updater now runs
47
+ `brew upgrade` with `HOMEBREW_NO_INSTALL_CLEANUP` and `HOMEBREW_NO_AUTO_UPDATE`,
48
+ so brew can't delete the in-use Cellar version mid-session; the new build is
49
+ staged side-by-side and goes live on restart.
50
+
51
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.51.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
52
+
53
+ ## 0.50.0 (2026-06-20)
54
+
55
+ - **Silent native updates no longer crash a running session.** The downloaded
56
+ build is now staged beside the running executable and swapped in at exit (it goes
57
+ live on the next launch), instead of overwriting the live onefile bundle in place.
58
+ Overwriting it mid-session corrupted later lazy imports with a
59
+ `zlib.error: incorrect header check`. A boundary guard also converts any residual
60
+ post-update archive-corruption crash into a clear "restart to apply" message.
61
+ - **Update notice renders below the input box.** The "Updated → vX. Restart to
62
+ apply." line now appears underneath the prompt's bottom border instead of inside
63
+ the input area.
64
+
18
65
  ## 0.49.0 (2026-06-20)
19
66
 
20
67
  - **Reduction ladder in the default agent prompt.** The agent now walks an explicit,
@@ -832,7 +832,11 @@ class PythinkerCLI:
832
832
  await external_cancel_task
833
833
 
834
834
  async def run_shell(
835
- self, command: str | None = None, *, prefill_text: str | None = None
835
+ self,
836
+ command: str | None = None,
837
+ *,
838
+ prefill_text: str | None = None,
839
+ suppress_banner: bool = False,
836
840
  ) -> bool:
837
841
  """Run the Pythinker CLI instance with shell UI."""
838
842
  from pythinker_code.ui.shell import Shell, WelcomeInfoItem
@@ -953,7 +957,12 @@ class PythinkerCLI:
953
957
  )
954
958
  )
955
959
  async with self._env():
956
- shell = Shell(self._soul, welcome_info=welcome_info, prefill_text=prefill_text)
960
+ shell = Shell(
961
+ self._soul,
962
+ welcome_info=welcome_info,
963
+ prefill_text=prefill_text,
964
+ suppress_banner=suppress_banner,
965
+ )
957
966
  return await shell.run(command)
958
967
 
959
968
  async def run_print(
@@ -333,6 +333,43 @@ def _version_callback(value: bool) -> None:
333
333
  raise typer.Exit()
334
334
 
335
335
 
336
+ def _is_post_update_bundle_corruption(exc: BaseException) -> bool:
337
+ """True when a frozen build's archive read failed mid-session.
338
+
339
+ This is the signature of a silent self-update having replaced the running
340
+ bundle on disk (see ``_install_native_archive``): the old process keeps
341
+ running, and the next not-yet-loaded lazy import reads from the now-stale
342
+ on-disk archive and raises ``zlib.error: incorrect header check``.
343
+
344
+ Gated on the PyInstaller ``sys.frozen`` marker so source / pip installs (which
345
+ never self-replace this way) are unaffected, and narrowed to the documented
346
+ corruption message (``incorrect header check``) so an unrelated decompression
347
+ failure elsewhere on a frozen build is *not* misclassified as a stale bundle and
348
+ masked behind a restart-only message. The zlib error class is matched by
349
+ ``__module__``/``__name__`` rather than ``isinstance`` so the handler never
350
+ imports ``zlib`` from a possibly-corrupted archive — ``sys`` is a C built-in and
351
+ is always safe to import. The cause/context chain is walked with a cycle guard so
352
+ a self-referential chain can't spin.
353
+ """
354
+ import sys
355
+
356
+ if not getattr(sys, "frozen", False):
357
+ return False
358
+ seen: set[int] = set()
359
+ current: BaseException | None = exc
360
+ while current is not None and id(current) not in seen:
361
+ seen.add(id(current))
362
+ cls = type(current)
363
+ if (
364
+ cls.__module__ == "zlib"
365
+ and cls.__name__ == "error"
366
+ and "incorrect header check" in str(current).lower()
367
+ ):
368
+ return True
369
+ current = current.__cause__ or current.__context__
370
+ return False
371
+
372
+
336
373
  @cli.callback(invoke_without_command=True)
337
374
  def pythinker(
338
375
  ctx: typer.Context,
@@ -825,7 +862,12 @@ def pythinker(
825
862
  # exception handler can clean it up even when _run() fails before returning.
826
863
  _latest_created_session: Session | None = None
827
864
 
828
- async def _run(session_id: str | None, prefill_text: str | None = None) -> tuple[Session, int]:
865
+ async def _run(
866
+ session_id: str | None,
867
+ prefill_text: str | None = None,
868
+ *,
869
+ suppress_banner: bool = False,
870
+ ) -> tuple[Session, int]:
829
871
  """
830
872
  Create/load session and run the CLI instance.
831
873
 
@@ -1019,7 +1061,11 @@ def pythinker(
1019
1061
  try:
1020
1062
  match ui:
1021
1063
  case "shell":
1022
- shell_ok = await instance.run_shell(prompt, prefill_text=prefill_text)
1064
+ shell_ok = await instance.run_shell(
1065
+ prompt,
1066
+ prefill_text=prefill_text,
1067
+ suppress_banner=suppress_banner,
1068
+ )
1023
1069
  exit_code = ExitCode.SUCCESS if shell_ok else ExitCode.FAILURE
1024
1070
  case "print":
1025
1071
  exit_code = await instance.run_print(
@@ -1153,10 +1199,15 @@ def pythinker(
1153
1199
  """
1154
1200
  last_session: Session | None = None
1155
1201
  prefill_text: str | None = None
1202
+ suppress_banner = False
1156
1203
  try:
1157
1204
  while True:
1158
1205
  try:
1159
- last_session, exit_code = await _run(session_id, prefill_text=prefill_text)
1206
+ last_session, exit_code = await _run(
1207
+ session_id,
1208
+ prefill_text=prefill_text,
1209
+ suppress_banner=suppress_banner,
1210
+ )
1160
1211
  break
1161
1212
  except Reload as e:
1162
1213
  if e.clear_screen:
@@ -1183,6 +1234,10 @@ def pythinker(
1183
1234
  _print_resume_hint(old)
1184
1235
  session_id = e.session_id
1185
1236
  prefill_text = e.prefill_text
1237
+ # A non-clearing reload (/model, /theme, /new, fork, …) leaves
1238
+ # the previous banner on screen, so skip reprinting the splash.
1239
+ # /clear and /reload wiped the screen above and want it back.
1240
+ suppress_banner = not e.clear_screen
1186
1241
  continue
1187
1242
  except SwitchToWeb as e:
1188
1243
  # The web worker subprocess becomes the session's writer.
@@ -1310,6 +1365,17 @@ def pythinker(
1310
1365
  # ClickException includes the errors Typer knows how to render; don't
1311
1366
  # wrap them, or we'd lose the standard error UI and exit codes.
1312
1367
  raise
1368
+ if _is_post_update_bundle_corruption(exc):
1369
+ # A silent self-update replaced this running build on disk; lazy imports
1370
+ # from the stale archive now fail. This only resolves with a restart —
1371
+ # surface a clear, actionable message instead of a fatal traceback.
1372
+ logger.warning("Post-update bundle corruption detected; prompting restart")
1373
+ _emit_fatal_error(
1374
+ "A Pythinker update was installed during this session and the "
1375
+ "running build was replaced on disk.\n"
1376
+ "Please restart Pythinker to finish applying the update."
1377
+ )
1378
+ raise typer.Exit(code=1) from exc
1313
1379
  logger.exception("Fatal error when running CLI")
1314
1380
  if debug:
1315
1381
  import traceback
@@ -3,6 +3,8 @@ from __future__ import annotations
3
3
  import contextlib
4
4
  import json
5
5
  import os
6
+ import re
7
+ from collections.abc import Collection
6
8
  from dataclasses import dataclass
7
9
  from pathlib import Path
8
10
  from typing import TYPE_CHECKING, Any, Literal, cast, get_args
@@ -12,7 +14,9 @@ from pythinker_core.chat_provider import ChatProvider, ThinkingEffort
12
14
  from pythinker_code.constant import USER_AGENT
13
15
  from pythinker_code.thinking import (
14
16
  DEFAULT_THINKING_EFFORT,
17
+ available_thinking_levels,
15
18
  bool_to_thinking_effort,
19
+ clamp_thinking_effort,
16
20
  normalize_thinking_effort,
17
21
  thinking_effort_enabled,
18
22
  )
@@ -457,7 +461,15 @@ def create_llm(
457
461
  else DEFAULT_THINKING_EFFORT
458
462
  )
459
463
  elif supports_thinking:
460
- effective_effort = requested_effort
464
+ # Clamp to the model's actually-supported levels so a persisted effort
465
+ # the model rejects (e.g. ``minimal`` on gpt-5.4/5.5) is never sent.
466
+ effective_effort = (
467
+ clamp_thinking_effort(
468
+ requested_effort, available_model_thinking_levels(model, capabilities)
469
+ )
470
+ if requested_effort is not None
471
+ else None
472
+ )
461
473
  else:
462
474
  # Clamp to the model's supported levels: non-reasoning models have
463
475
  # only the off level, so explicit non-off requests become off instead of
@@ -594,6 +606,55 @@ def derive_model_capabilities(model: LLMModel) -> set[ModelCapability]:
594
606
  return capabilities
595
607
 
596
608
 
609
+ _GPT5_REASONING_RE = re.compile(r"gpt-5(?:\.(\d+))?", re.IGNORECASE)
610
+
611
+
612
+ def openai_gpt_reasoning_levels(model_id: str) -> tuple[ThinkingEffort, ...] | None:
613
+ """Reasoning-effort levels an OpenAI GPT-5-family model actually accepts.
614
+
615
+ OpenAI's ``reasoning_effort`` set is model-dependent and has drifted across
616
+ the GPT-5 line, so the provider-neutral ladder over-offers levels a given
617
+ model rejects (e.g. ``minimal`` on gpt-5.4/5.5). Returns the supported
618
+ levels low->high including ``off`` (OpenAI ``none``), or ``None`` when
619
+ *model_id* is not a recognized GPT-5 reasoning model.
620
+
621
+ Matrix (OpenAI docs):
622
+
623
+ * ``5.0`` -> minimal, low, medium, high
624
+ * ``5.1`` / ``5.2`` / ``5.3`` -> low, medium, high (``minimal`` replaced by ``none``)
625
+ * ``5.1-codex-max``, ``5.4+`` -> low, medium, high, xhigh (``minimal`` dropped)
626
+ """
627
+ match = _GPT5_REASONING_RE.search(model_id)
628
+ if match is None:
629
+ return None
630
+ minor = int(match.group(1)) if match.group(1) else 0
631
+ if minor == 0:
632
+ return ("off", "minimal", "low", "medium", "high")
633
+ if minor >= 4 or "codex-max" in model_id.lower():
634
+ return ("off", "low", "medium", "high", "xhigh")
635
+ return ("off", "low", "medium", "high")
636
+
637
+
638
+ def available_model_thinking_levels(
639
+ model: LLMModel, capabilities: Collection[str] | None
640
+ ) -> tuple[ThinkingEffort, ...]:
641
+ """Selectable thinking levels for *model*, scoped to provider-specific support.
642
+
643
+ Starts from the capability-derived ladder, then narrows to a provider's
644
+ actually-accepted set when known (currently the OpenAI GPT-5 family) so the
645
+ selector never offers — and :func:`create_llm` never sends — a level the
646
+ model rejects. Falls back to the full ladder for models without a known
647
+ per-model rule.
648
+ """
649
+ base = available_thinking_levels(capabilities)
650
+ gpt_levels = openai_gpt_reasoning_levels(model.model)
651
+ if gpt_levels is None:
652
+ return base
653
+ allowed = set(gpt_levels)
654
+ scoped: tuple[ThinkingEffort, ...] = tuple(level for level in base if level in allowed)
655
+ return scoped or base
656
+
657
+
597
658
  def _is_kimi_k2_model(model_name: str) -> bool:
598
659
  return "kimi-k2" in model_name.lower().replace("_", "-")
599
660
 
@@ -924,7 +924,12 @@ class PythinkerSoul:
924
924
  """Selectable thinking levels for the current model."""
925
925
  if self._runtime.llm is None:
926
926
  return ("off",)
927
- return available_thinking_levels(self._runtime.llm.capabilities)
927
+ model = self._runtime.llm.model_config
928
+ if model is None:
929
+ return available_thinking_levels(self._runtime.llm.capabilities)
930
+ from pythinker_code.llm import available_model_thinking_levels
931
+
932
+ return available_model_thinking_levels(model, self._runtime.llm.capabilities)
928
933
 
929
934
  def set_thinking_effort_from_manual(self, effort: ThinkingEffort) -> ThinkingEffort | None:
930
935
  """Apply a user-selected thinking level to the live runtime.
@@ -560,10 +560,16 @@ class Shell:
560
560
  soul: Soul,
561
561
  welcome_info: list[WelcomeInfoItem] | None = None,
562
562
  prefill_text: str | None = None,
563
+ suppress_banner: bool = False,
563
564
  ):
564
565
  self.soul = soul
565
566
  self._welcome_info = list(welcome_info or [])
566
567
  self._prefill_text = prefill_text
568
+ # Skip the full welcome splash on an in-session reload (/model, /theme,
569
+ # /new, fork, …): the screen still shows the previous banner and each
570
+ # reload path prints its own "Switched to… / Reloading…" confirmation,
571
+ # so reprinting the splash just stacks a redundant copy below it.
572
+ self._suppress_banner = suppress_banner
567
573
  self._background_tasks: set[asyncio.Task[Any]] = set()
568
574
  self._prompt_session: CustomPromptSession | None = None
569
575
  # (timestamp, text) memo for the under-input update line; refreshed on a
@@ -839,11 +845,12 @@ class Shell:
839
845
  # carries the blinking "connecting" heartbeat without ever
840
846
  # blocking input.
841
847
  await self.soul.start_background_mcp_loading()
842
- _print_welcome_info(
843
- self.soul.name or "Pythinker CLI",
844
- self._welcome_info,
845
- banner=_welcome_banner_chip(),
846
- )
848
+ if not self._suppress_banner:
849
+ _print_welcome_info(
850
+ self.soul.name or "Pythinker CLI",
851
+ self._welcome_info,
852
+ banner=_welcome_banner_chip(),
853
+ )
847
854
 
848
855
  # Start telemetry periodic flush and disk retry
849
856
  from pythinker_code.telemetry import get_sink
@@ -2135,7 +2142,7 @@ class Shell:
2135
2142
  style="fg:ansiyellow",
2136
2143
  )
2137
2144
  return
2138
- # The persistent under-input line (_prepend_update_notice) already renders
2145
+ # The persistent under-input line (_append_update_notice) already renders
2139
2146
  # the restart message; a toast duplicates it on the footer's second row.
2140
2147
  self._refresh_update_notice_line()
2141
2148
 
@@ -3915,10 +3915,14 @@ class CustomPromptSession:
3915
3915
  error=exc,
3916
3916
  )
3917
3917
 
3918
- def _prepend_update_notice(self, fragments: list[tuple[str, str]], columns: int) -> None:
3919
- """Prepend a persistent yellow 'update available' line above the footer
3920
- separator, so it renders directly under the prompt input. No-op when no
3921
- update is pending; style-agnostic across both toolbar layouts."""
3918
+ def _append_update_notice(self, fragments: list[tuple[str, str]], columns: int) -> None:
3919
+ """Append a persistent yellow 'update available' line as the *last* footer
3920
+ row — below the status/clock line — so it sits fully clear of the prompt
3921
+ input box instead of glued to it. Call this last, after the status lines
3922
+ are assembled: it prepends its own newline (the prior footer line carries
3923
+ none) and adds no trailing newline, so it never leaves a blank row at the
3924
+ bottom. No-op when no update is pending; style-agnostic across both
3925
+ toolbar layouts."""
3922
3926
  provider = getattr(self, "_update_notice_provider", None)
3923
3927
  if provider is None:
3924
3928
  return
@@ -3930,7 +3934,7 @@ class CustomPromptSession:
3930
3934
  return
3931
3935
  tokens = _get_tui_tokens()
3932
3936
  style = f"fg:{tokens.warning or 'ansiyellow'} bold"
3933
- fragments[:0] = [(style, line), ("", "\n")]
3937
+ fragments.extend([("", "\n"), (style, line)])
3934
3938
 
3935
3939
  def _render_bottom_toolbar(self) -> FormattedText:
3936
3940
  if (
@@ -3954,7 +3958,6 @@ class CustomPromptSession:
3954
3958
  fragments: list[tuple[str, str]] = []
3955
3959
  tc = get_toolbar_colors()
3956
3960
 
3957
- self._prepend_update_notice(fragments, columns)
3958
3961
  fragments.append((self._prompt_separator_style(tc.separator), _prompt_rule(columns)))
3959
3962
  fragments.append(("", "\n"))
3960
3963
 
@@ -4076,6 +4079,7 @@ class CustomPromptSession:
4076
4079
  fragments.append(("", " " * max(0, columns - left_width - right_width)))
4077
4080
  fragments.append((secondary_style, right_text))
4078
4081
 
4082
+ self._append_update_notice(fragments, columns)
4079
4083
  return FormattedText(fragments)
4080
4084
 
4081
4085
  def _build_statusline_context(self, columns: int) -> StatusLineContext:
@@ -4185,7 +4189,6 @@ class CustomPromptSession:
4185
4189
  secondary_style = f"fg:{tokens.muted}"
4186
4190
 
4187
4191
  fragments: list[tuple[str, str]] = []
4188
- self._prepend_update_notice(fragments, columns)
4189
4192
  fragments.append((self._prompt_separator_style(tc.separator), _prompt_rule(columns)))
4190
4193
  fragments.append(("", "\n"))
4191
4194
 
@@ -4250,6 +4253,7 @@ class CustomPromptSession:
4250
4253
 
4251
4254
  fragments.append(("", " " * max(0, usable - left_width - right_width)))
4252
4255
  fragments.extend(line2_right)
4256
+ self._append_update_notice(fragments, columns)
4253
4257
  return FormattedText(fragments)
4254
4258
 
4255
4259
  def _get_two_rotating_tips(self) -> str | None: