pythinker-code 0.48.0__tar.gz → 0.50.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.48.0 → pythinker_code-0.50.0}/PKG-INFO +22 -23
  2. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/README.md +21 -22
  3. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/pyproject.toml +1 -1
  4. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/CHANGELOG.md +31 -0
  5. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/system.md +3 -1
  6. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/__init__.py +48 -0
  7. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/best_practices.md +1 -0
  8. pythinker_code-0.50.0/src/pythinker_code/skills/cleanup-audit/SKILL.md +50 -0
  9. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/__init__.py +19 -26
  10. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/prompt.py +8 -7
  11. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/update.py +63 -6
  12. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/update_orchestrator.py +31 -1
  13. pythinker_code-0.50.0/src/pythinker_code/web/static/assets/architecture-7EHR7CIX-CiJci_kb.js +1 -0
  14. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/architectureDiagram-3BPJPVTR-CUrUO6PZ.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/architectureDiagram-3BPJPVTR-BtlQ9wMo.js +1 -1
  15. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/blockDiagram-GPEHLZMM-DqqZRSB4.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/blockDiagram-GPEHLZMM-pChzMWgu.js +1 -1
  16. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/bootstrap-rCQM9IPn.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/bootstrap-BFeiSQNA.js +5 -5
  17. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/c4Diagram-AAUBKEIU-Ddtgkgc0.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/c4Diagram-AAUBKEIU-B0VtZ4LT.js +1 -1
  18. pythinker_code-0.50.0/src/pythinker_code/web/static/assets/channel-2cmWmtiR.js +1 -0
  19. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-2J33WTMH-Cu1UEa0U.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-2J33WTMH-zlKMk14A.js +1 -1
  20. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-3OPIFGDE-BvW09x34.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-3OPIFGDE-DDoUJziC.js +1 -1
  21. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-5ZQYHXKU-DFAbJYk3.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-5ZQYHXKU-BVGDalrl.js +1 -1
  22. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-727SXJPM-g-KAHCVh.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-727SXJPM-B40eBuzy.js +1 -1
  23. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-AQP2D5EJ-BdbLq_iV.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-AQP2D5EJ-Bjy9cEcL.js +1 -1
  24. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-CSCIHK7Q-BbQDo5W4.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-CSCIHK7Q-wEnjLHCK.js +1 -1
  25. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-JAPRZBRM-DX3Z6-Ej.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-JAPRZBRM-D7mf7095.js +4 -4
  26. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-KSCS5N6A-DRzsy3KH.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-KSCS5N6A-B8C4Qo3S.js +1 -1
  27. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-L5ZTLDWV-AhJH6S-7.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-L5ZTLDWV-B6zR5vOT.js +1 -1
  28. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-LZXEDZCA-C3_yAZ2Q.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-LZXEDZCA-E3COZolu.js +2 -2
  29. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-ND2GUHAM-DrT8t-co.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-ND2GUHAM-BMUb9pNq.js +1 -1
  30. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-NZK2D7GU-BW0obcBx.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-NZK2D7GU-lue24LQy.js +1 -1
  31. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-O5CBEL6O-9x-5dTLa.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-O5CBEL6O-DZnhYM8W.js +1 -1
  32. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-WU5MYG2G-BrTKnUCb.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-WU5MYG2G-Cs_Jps3h.js +1 -1
  33. pythinker_code-0.50.0/src/pythinker_code/web/static/assets/classDiagram-4FO5ZUOK-Bss_rOtf.js +1 -0
  34. pythinker_code-0.50.0/src/pythinker_code/web/static/assets/classDiagram-v2-Q7XG4LA2-Bss_rOtf.js +1 -0
  35. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-D4iBD2uo.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-DaJkz64F.js +1 -1
  36. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/dagre-BM42HDAG-CwbOB22m.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/dagre-BM42HDAG-D_p-zlC5.js +1 -1
  37. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/diagram-2AECGRRQ-BH2GdvZS.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/diagram-2AECGRRQ-CRfkF_rs.js +1 -1
  38. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/diagram-5GNKFQAL-04zLB7n6.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/diagram-5GNKFQAL-CBiaQLBW.js +1 -1
  39. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/diagram-KO2AKTUF-BoaneL5m.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/diagram-KO2AKTUF-Dmvj9htg.js +1 -1
  40. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/diagram-LMA3HP47-DmhpyRJr.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/diagram-LMA3HP47-Ch0BqHT8.js +1 -1
  41. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/diagram-OG6HWLK6-C4UMdCZA.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/diagram-OG6HWLK6-B2o6fWB6.js +1 -1
  42. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/dist-C3gosr9x.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/dist-CGayAiNU.js +1 -1
  43. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/erDiagram-TEJ5UH35-coUNnf5j.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/erDiagram-TEJ5UH35-DlA5Xc3P.js +1 -1
  44. pythinker_code-0.50.0/src/pythinker_code/web/static/assets/eventmodeling-FCH6USID-94_6GtjE.js +1 -0
  45. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/flowDiagram-I6XJVG4X-CXdKW96G.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/flowDiagram-I6XJVG4X-kUWABNTK.js +1 -1
  46. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/ganttDiagram-6RSMTGT7-DideiVAp.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/ganttDiagram-6RSMTGT7-YX6-BoSq.js +1 -1
  47. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/gitGraph-WXDBUCRP-DUyPd8kP.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/gitGraph-WXDBUCRP-C5UlYMXv.js +1 -1
  48. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/gitGraphDiagram-PVQCEYII-brm3T9Uk.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/gitGraphDiagram-PVQCEYII-DuBE87Qy.js +1 -1
  49. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/index-1kmjAkaL.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/index-BMV1Ud3J.js +2 -2
  50. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/info-J43DQDTF-CuqVhZPe.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/info-J43DQDTF-DVQzXsUk.js +1 -1
  51. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/infoDiagram-5YYISTIA-CB4vGN6v.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/infoDiagram-5YYISTIA-DLBRYCxD.js +1 -1
  52. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/ishikawaDiagram-YF4QCWOH-Cc2CInct.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/ishikawaDiagram-YF4QCWOH-BbEtfJML.js +1 -1
  53. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/journeyDiagram-JHISSGLW-sixbjax3.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/journeyDiagram-JHISSGLW-B-8ADsM8.js +1 -1
  54. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/kanban-definition-UN3LZRKU-BkWpYweG.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/kanban-definition-UN3LZRKU-DfsCNzSd.js +1 -1
  55. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/line-DG62C0sI.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/line-DkTdvYY0.js +1 -1
  56. pythinker_code-0.50.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-otzZqrpj.js +1 -0
  57. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/mermaid-parser.core-DtG8m5J_.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/mermaid-parser.core-MA0k1ZCT.js +2 -2
  58. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/mermaid.core-CYVEwgHE.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/mermaid.core-acFcYxBT.js +3 -3
  59. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/mindmap-definition-RKZ34NQL-DGLQlQ-3.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/mindmap-definition-RKZ34NQL-BGBf4V3D.js +1 -1
  60. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/packet-YPE3B663-DSyfxZQu.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/packet-YPE3B663-D7dp38ZY.js +1 -1
  61. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/pie-LRSECV5Y-DU6kZ_2f.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/pie-LRSECV5Y-BQu4CDOE.js +1 -1
  62. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/pieDiagram-4H26LBE5-CRh8dmNJ.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/pieDiagram-4H26LBE5-B7rhR3x4.js +1 -1
  63. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/quadrantDiagram-W4KKPZXB-B_SHSaSa.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/quadrantDiagram-W4KKPZXB-Bt28YYzI.js +1 -1
  64. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/radar-GUYGQ44K-DMglnwpK.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/radar-GUYGQ44K-BNCJkAg0.js +1 -1
  65. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/requirementDiagram-4Y6WPE33-BsVz5N3I.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/requirementDiagram-4Y6WPE33-BLkwlWmt.js +1 -1
  66. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/sankeyDiagram-5OEKKPKP-Bpr_uqrj.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/sankeyDiagram-5OEKKPKP-lPWBpzo-.js +1 -1
  67. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/sequenceDiagram-3UESZ5HK-DM9m6PO5.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/sequenceDiagram-3UESZ5HK-TYMLWnFf.js +1 -1
  68. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/stateDiagram-AJRCARHV-DZ0VJ_MH.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/stateDiagram-AJRCARHV-DSPmGaVQ.js +1 -1
  69. pythinker_code-0.50.0/src/pythinker_code/web/static/assets/stateDiagram-v2-BHNVJYJU-C6UIoI0l.js +1 -0
  70. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/timeline-definition-PNZ67QCA-D_uBSLDu.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/timeline-definition-PNZ67QCA-CvP_yVPz.js +1 -1
  71. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/treeView-BLDUP644-DeKJ4uCa.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/treeView-BLDUP644-CJQwlV6p.js +1 -1
  72. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/treemap-LRROVOQU-CiGjpvUt.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/treemap-LRROVOQU-C3lHTEMi.js +1 -1
  73. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/vennDiagram-CIIHVFJN-BZTVj6zw.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/vennDiagram-CIIHVFJN-Br1IKWOD.js +1 -1
  74. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/wardley-L42UT6IY-DNmNjaYq.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/wardley-L42UT6IY-CYgdmfE4.js +1 -1
  75. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/wardleyDiagram-YWT4CUSO-Bo7PoGMZ.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/wardleyDiagram-YWT4CUSO-Cb_9nYBc.js +1 -1
  76. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/xychartDiagram-2RQKCTM6-BilotHsD.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/xychartDiagram-2RQKCTM6-CIdBR3kz.js +1 -1
  77. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/index.html +1 -1
  78. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/architecture-7EHR7CIX-BYamRjh1.js +0 -1
  79. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/channel-DcWGAel6.js +0 -1
  80. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/classDiagram-4FO5ZUOK-nzIv4cHs.js +0 -1
  81. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/classDiagram-v2-Q7XG4LA2-nzIv4cHs.js +0 -1
  82. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/eventmodeling-FCH6USID-DPqNL9oG.js +0 -1
  83. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B9_T5lZN.js +0 -1
  84. pythinker_code-0.48.0/src/pythinker_code/web/static/assets/stateDiagram-v2-BHNVJYJU-vN6RgvSr.js +0 -1
  85. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/LICENSE +0 -0
  86. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/NOTICE +0 -0
  87. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/__init__.py +0 -0
  88. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/__main__.py +0 -0
  89. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/AGENTS.md +0 -0
  90. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/__init__.py +0 -0
  91. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/convert.py +0 -0
  92. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/host.py +0 -0
  93. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/mcp.py +0 -0
  94. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/server.py +0 -0
  95. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/session.py +0 -0
  96. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/tools.py +0 -0
  97. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/types.py +0 -0
  98. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/version.py +0 -0
  99. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/agent.yaml +0 -0
  100. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/ask.yaml +0 -0
  101. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/code_reviewer.yaml +0 -0
  102. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/coder.yaml +0 -0
  103. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/debug.yaml +0 -0
  104. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/debugger.yaml +0 -0
  105. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/explore.yaml +0 -0
  106. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/implementer.yaml +0 -0
  107. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/judge.yaml +0 -0
  108. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/plan.yaml +0 -0
  109. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/planner.yaml +0 -0
  110. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/review.yaml +0 -0
  111. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/scout.yaml +0 -0
  112. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/security_reviewer.yaml +0 -0
  113. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/verifier.yaml +0 -0
  114. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
  115. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agentspec.py +0 -0
  116. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/app.py +0 -0
  117. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
  118. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/approval_runtime/models.py +0 -0
  119. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
  120. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/__init__.py +0 -0
  121. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/alibaba.py +0 -0
  122. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
  123. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/browser_login_page.py +0 -0
  124. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/deepseek.py +0 -0
  125. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/github_feedback.py +0 -0
  126. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/kimi.py +0 -0
  127. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/lm_studio.py +0 -0
  128. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/minimax.py +0 -0
  129. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/moonshot.py +0 -0
  130. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/oauth.py +0 -0
  131. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/ollama.py +0 -0
  132. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/__init__.py +0 -0
  133. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/_shared.py +0 -0
  134. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/browser_flow.py +0 -0
  135. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/catalog.py +0 -0
  136. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/config_apply.py +0 -0
  137. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/constants.py +0 -0
  138. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/login.py +0 -0
  139. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/models.py +0 -0
  140. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/oauth_client.py +0 -0
  141. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/opencode_go.py +0 -0
  142. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openrouter.py +0 -0
  143. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/platforms.py +0 -0
  144. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/z_ai.py +0 -0
  145. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/__init__.py +0 -0
  146. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/agent_runner.py +0 -0
  147. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/ids.py +0 -0
  148. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/manager.py +0 -0
  149. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/models.py +0 -0
  150. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/store.py +0 -0
  151. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/summary.py +0 -0
  152. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/worker.py +0 -0
  153. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/__main__.py +0 -0
  154. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/_lazy_group.py +0 -0
  155. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/dashboard.py +0 -0
  156. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/debug.py +0 -0
  157. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/export.py +0 -0
  158. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/info.py +0 -0
  159. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/mcp.py +0 -0
  160. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/plugin.py +0 -0
  161. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/review.py +0 -0
  162. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/secscan.py +0 -0
  163. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/security_scan.py +0 -0
  164. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/skill.py +0 -0
  165. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/system_prompt.py +0 -0
  166. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/toad.py +0 -0
  167. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/update.py +0 -0
  168. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/web.py +0 -0
  169. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/config.py +0 -0
  170. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/constant.py +0 -0
  171. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/__init__.py +0 -0
  172. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/api/__init__.py +0 -0
  173. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/api/sessions.py +0 -0
  174. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/api/statistics.py +0 -0
  175. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/api/system.py +0 -0
  176. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/app.py +0 -0
  177. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/highlighted-body-OFNGDK62-BxVUIXn9.js +0 -0
  178. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/index-DAN_VzOP.css +0 -0
  179. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/index-DYyxzHPY.js +0 -0
  180. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  181. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  182. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  183. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  184. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  185. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  186. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  187. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/mermaid-GHXKKRXX-BR6KjYwB.js +0 -0
  188. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/index.html +0 -0
  189. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/events.py +0 -0
  190. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/exception.py +0 -0
  191. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/execution_profiles.py +0 -0
  192. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/extensions.py +0 -0
  193. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/feedback.py +0 -0
  194. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/feedback_repo.py +0 -0
  195. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/file_restore.py +0 -0
  196. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/hooks/__init__.py +0 -0
  197. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/hooks/config.py +0 -0
  198. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/hooks/engine.py +0 -0
  199. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/hooks/events.py +0 -0
  200. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/hooks/runner.py +0 -0
  201. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/llm.py +0 -0
  202. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/__init__.py +0 -0
  203. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/client.py +0 -0
  204. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/diagnostics.py +0 -0
  205. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/framing.py +0 -0
  206. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/instance.py +0 -0
  207. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/manager.py +0 -0
  208. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/plugin_servers.py +0 -0
  209. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/protocol.py +0 -0
  210. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/recommend.py +0 -0
  211. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/service.py +0 -0
  212. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/memory/__init__.py +0 -0
  213. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/memory/consolidation.py +0 -0
  214. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/memory/harvest.py +0 -0
  215. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/memory/recall.py +0 -0
  216. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/memory/recap.py +0 -0
  217. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/memory/retriever.py +0 -0
  218. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/memory/sanitize.py +0 -0
  219. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/metadata.py +0 -0
  220. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/models_dev.py +0 -0
  221. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/native.py +0 -0
  222. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/notifications/__init__.py +0 -0
  223. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/notifications/llm.py +0 -0
  224. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/notifications/manager.py +0 -0
  225. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/notifications/models.py +0 -0
  226. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/notifications/notifier.py +0 -0
  227. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/notifications/store.py +0 -0
  228. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/notifications/wire.py +0 -0
  229. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/__init__.py +0 -0
  230. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/artifacts.py +0 -0
  231. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/dependency.py +0 -0
  232. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/directories.py +0 -0
  233. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/install.py +0 -0
  234. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/installed.py +0 -0
  235. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/integration.py +0 -0
  236. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/loader.py +0 -0
  237. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/manager.py +0 -0
  238. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/manifest.py +0 -0
  239. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/marketplace.py +0 -0
  240. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/options.py +0 -0
  241. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/policy.py +0 -0
  242. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/tool.py +0 -0
  243. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/project_memory.py +0 -0
  244. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/project_trust.py +0 -0
  245. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompt_templates.py +0 -0
  246. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/__init__.py +0 -0
  247. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/compact.md +0 -0
  248. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/goal_continuation.md +0 -0
  249. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/goal_set.md +0 -0
  250. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/goal_wrap_up.md +0 -0
  251. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/init.md +0 -0
  252. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/learn.md +0 -0
  253. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/py.typed +0 -0
  254. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/scratchpad.py +0 -0
  255. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/session.py +0 -0
  256. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/session_cleanup.py +0 -0
  257. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/session_fork.py +0 -0
  258. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/session_recap.py +0 -0
  259. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/session_state.py +0 -0
  260. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/share.py +0 -0
  261. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skill/__init__.py +0 -0
  262. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
  263. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skill/flow/d2.py +0 -0
  264. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
  265. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skill/lockfile.py +0 -0
  266. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/agent-creator/SKILL.md +0 -0
  267. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/check-impl-against-spec/SKILL.md +0 -0
  268. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/create-pr/SKILL.md +0 -0
  269. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/customize-pythinker/SKILL.md +0 -0
  270. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/designer-skill/SKILL.md +0 -0
  271. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/diagnose-ci-failures/SKILL.md +0 -0
  272. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/fix-errors/SKILL.md +0 -0
  273. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/implement-specs/SKILL.md +0 -0
  274. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/pr-walkthrough/SKILL.md +0 -0
  275. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
  276. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/reproduce-bug-report/SKILL.md +0 -0
  277. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/resolve-merge-conflicts/SKILL.md +0 -0
  278. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/review-pr/SKILL.md +0 -0
  279. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
  280. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/spec-driven-implementation/SKILL.md +0 -0
  281. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/write-product-spec/SKILL.md +0 -0
  282. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/write-tech-spec/SKILL.md +0 -0
  283. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/__init__.py +0 -0
  284. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/agent.py +0 -0
  285. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/api_errors.py +0 -0
  286. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/approval.py +0 -0
  287. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/btw.py +0 -0
  288. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/compaction.py +0 -0
  289. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/compaction_restore.py +0 -0
  290. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/context.py +0 -0
  291. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/deliberation.py +0 -0
  292. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/denwarenji.py +0 -0
  293. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injection.py +0 -0
  294. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
  295. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/agent_list.py +0 -0
  296. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
  297. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/git_status.py +0 -0
  298. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/goal_mode.py +0 -0
  299. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/inline_commands.py +0 -0
  300. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/lsp_diagnostics.py +0 -0
  301. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/model_defense.py +0 -0
  302. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/orchestration.py +0 -0
  303. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/permissions_state.py +0 -0
  304. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
  305. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/flow_runner.py +0 -0
  306. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/live_tokens.py +0 -0
  307. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/message.py +0 -0
  308. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/permission.py +0 -0
  309. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/pythinkersoul.py +0 -0
  310. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/slash.py +0 -0
  311. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/toolset.py +0 -0
  312. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/__init__.py +0 -0
  313. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/builder.py +0 -0
  314. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/codenames.py +0 -0
  315. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/core.py +0 -0
  316. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/discovery.py +0 -0
  317. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/git_context.py +0 -0
  318. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/models.py +0 -0
  319. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/output.py +0 -0
  320. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/registry.py +0 -0
  321. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/runner.py +0 -0
  322. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/store.py +0 -0
  323. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/usage.py +0 -0
  324. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/worktree.py +0 -0
  325. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/__init__.py +0 -0
  326. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/config.py +0 -0
  327. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/crash.py +0 -0
  328. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/errors.py +0 -0
  329. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/metrics.py +0 -0
  330. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/names.py +0 -0
  331. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/otel.py +0 -0
  332. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/sentry.py +0 -0
  333. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/sink.py +0 -0
  334. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/thinking.py +0 -0
  335. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/AGENTS.md +0 -0
  336. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/__init__.py +0 -0
  337. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/agent/__init__.py +0 -0
  338. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/agent/description.md +0 -0
  339. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/ask_user/__init__.py +0 -0
  340. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
  341. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/background/__init__.py +0 -0
  342. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/background/handoff.md +0 -0
  343. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/background/input.md +0 -0
  344. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/background/list.md +0 -0
  345. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/background/output.md +0 -0
  346. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/background/stop.md +0 -0
  347. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/display.py +0 -0
  348. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
  349. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
  350. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/__init__.py +0 -0
  351. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/glob.md +0 -0
  352. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/glob.py +0 -0
  353. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/grep.md +0 -0
  354. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/grep_local.py +0 -0
  355. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
  356. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/read.md +0 -0
  357. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/read.py +0 -0
  358. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/read_media.md +0 -0
  359. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/read_media.py +0 -0
  360. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/replace.md +0 -0
  361. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/replace.py +0 -0
  362. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/utils.py +0 -0
  363. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/write.md +0 -0
  364. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/write.py +0 -0
  365. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/goal/__init__.py +0 -0
  366. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/goal/update_goal.md +0 -0
  367. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/lsp/__init__.py +0 -0
  368. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/lsp/formatters.py +0 -0
  369. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/lsp/schemas.py +0 -0
  370. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/lsp/symbol_context.py +0 -0
  371. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/lsp/tool.md +0 -0
  372. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/lsp/tool.py +0 -0
  373. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/mcp_resource/__init__.py +0 -0
  374. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/mcp_resource/list_description.md +0 -0
  375. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/mcp_resource/prompt_description.md +0 -0
  376. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/mcp_resource/read_description.md +0 -0
  377. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/memory/__init__.py +0 -0
  378. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/memory/memory.md +0 -0
  379. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/memory/routing_guard.py +0 -0
  380. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/plan/__init__.py +0 -0
  381. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/plan/description.md +0 -0
  382. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/plan/enter.py +0 -0
  383. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
  384. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/plan/handoff.py +0 -0
  385. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
  386. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/progress/__init__.py +0 -0
  387. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/progress/description.md +0 -0
  388. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/recall/__init__.py +0 -0
  389. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/recall/description.md +0 -0
  390. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/scratchpad/__init__.py +0 -0
  391. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/scratchpad/scratchpad_tool.md +0 -0
  392. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/shell/__init__.py +0 -0
  393. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/shell/bash.md +0 -0
  394. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
  395. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/skill/__init__.py +0 -0
  396. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/skill/_mcp_bridge.py +0 -0
  397. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/skill/description.md +0 -0
  398. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/suggest/__init__.py +0 -0
  399. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/suggest/description.md +0 -0
  400. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/test.py +0 -0
  401. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/think/__init__.py +0 -0
  402. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/think/think.md +0 -0
  403. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
  404. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
  405. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/tool_search/__init__.py +0 -0
  406. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/tool_search/tool_search.md +0 -0
  407. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/utils.py +0 -0
  408. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/web/__init__.py +0 -0
  409. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/web/_allowlist.py +0 -0
  410. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/web/fetch.md +0 -0
  411. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/web/fetch.py +0 -0
  412. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/web/search.md +0 -0
  413. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/web/search.py +0 -0
  414. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/worktree/__init__.py +0 -0
  415. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/worktree/enter_worktree.md +0 -0
  416. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/worktree/exit_worktree.md +0 -0
  417. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/__init__.py +0 -0
  418. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
  419. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/color_utils.py +0 -0
  420. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/print/__init__.py +0 -0
  421. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/print/visualize.py +0 -0
  422. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
  423. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
  424. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
  425. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
  426. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/diff.py +0 -0
  427. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/dynamic_border.py +0 -0
  428. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
  429. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
  430. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/markdown.py +0 -0
  431. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
  432. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/panel.py +0 -0
  433. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
  434. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/report.py +0 -0
  435. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/report_prose_blocks.py +0 -0
  436. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/report_update.py +0 -0
  437. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
  438. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
  439. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
  440. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/console.py +0 -0
  441. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/debug.py +0 -0
  442. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/design_system.py +0 -0
  443. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/echo.py +0 -0
  444. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
  445. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/glyphs.py +0 -0
  446. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
  447. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
  448. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/markdown/__init__.py +0 -0
  449. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/markdown/audit.py +0 -0
  450. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/markdown/elements.py +0 -0
  451. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/markdown/fences.py +0 -0
  452. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/markdown/normalizers.py +0 -0
  453. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/markdown/renderer.py +0 -0
  454. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/markdown/streaming.py +0 -0
  455. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
  456. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
  457. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/motion.py +0 -0
  458. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
  459. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
  460. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/render_constants.py +0 -0
  461. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/replay.py +0 -0
  462. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selector.py +0 -0
  463. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
  464. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/code_theme.py +0 -0
  465. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
  466. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
  467. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
  468. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
  469. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
  470. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
  471. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
  472. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/setup.py +0 -0
  473. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/slash.py +0 -0
  474. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/spacing.py +0 -0
  475. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/spinner_words.py +0 -0
  476. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/startup.py +0 -0
  477. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/stats.py +0 -0
  478. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/stats_collector.py +0 -0
  479. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/stats_pricing.py +0 -0
  480. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/statusline.py +0 -0
  481. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/sync_output.py +0 -0
  482. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
  483. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tips.py +0 -0
  484. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
  485. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/_file_diff.py +0 -0
  486. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -0
  487. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
  488. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
  489. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
  490. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
  491. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
  492. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
  493. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
  494. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
  495. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/lsp.py +0 -0
  496. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/mcp_resource.py +0 -0
  497. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/memory.py +0 -0
  498. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
  499. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
  500. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/read_media.py +0 -0
  501. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/skill.py +0 -0
  502. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/smart_search.py +0 -0
  503. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
  504. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
  505. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/tool_search.py +0 -0
  506. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -0
  507. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/worktree.py +0 -0
  508. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
  509. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage.py +0 -0
  510. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_activity.py +0 -0
  511. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
  512. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/alibaba.py +0 -0
  513. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
  514. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
  515. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
  516. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
  517. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
  518. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
  519. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
  520. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
  521. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
  522. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
  523. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
  524. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
  525. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_activity_tree.py +0 -0
  526. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
  527. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +0 -0
  528. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
  529. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_dialog_shell.py +0 -0
  530. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_diff_live.py +0 -0
  531. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
  532. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +0 -0
  533. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +0 -0
  534. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
  535. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_transcript.py +0 -0
  536. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
  537. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/terminal_background.py +0 -0
  538. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/terminal_capabilities.py +0 -0
  539. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/__init__.py +0 -0
  540. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/adapters/__init__.py +0 -0
  541. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/adapters/markdown.py +0 -0
  542. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/adapters/task_browser.py +0 -0
  543. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/capabilities.py +0 -0
  544. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/palettes.py +0 -0
  545. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/pythinker_themes.py +0 -0
  546. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/registry.py +0 -0
  547. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/resolver.py +0 -0
  548. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/spec.py +0 -0
  549. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/tui_config.py +0 -0
  550. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/update_policy.py +0 -0
  551. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
  552. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/__init__.py +0 -0
  553. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/aiohttp.py +0 -0
  554. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/aioqueue.py +0 -0
  555. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/artifacts.py +0 -0
  556. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/broadcast.py +0 -0
  557. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/changelog.py +0 -0
  558. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/clipboard.py +0 -0
  559. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/datetime.py +0 -0
  560. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/diff.py +0 -0
  561. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/editor.py +0 -0
  562. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/environment.py +0 -0
  563. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/envvar.py +0 -0
  564. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/export.py +0 -0
  565. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/file_filter.py +0 -0
  566. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/file_read_cache.py +0 -0
  567. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/frontmatter.py +0 -0
  568. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/gitignore.py +0 -0
  569. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/io.py +0 -0
  570. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/logging.py +0 -0
  571. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/mcp_names.py +0 -0
  572. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/media_limits.py +0 -0
  573. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/media_tags.py +0 -0
  574. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/message.py +0 -0
  575. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/path.py +0 -0
  576. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/proctitle.py +0 -0
  577. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/proxy.py +0 -0
  578. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
  579. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
  580. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/rich/columns.py +0 -0
  581. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/rich/diff_render.py +0 -0
  582. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
  583. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
  584. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
  585. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
  586. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/sensitive.py +0 -0
  587. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/server.py +0 -0
  588. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/signals.py +0 -0
  589. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/slashcmd.py +0 -0
  590. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/sleep_inhibitor.py +0 -0
  591. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/string.py +0 -0
  592. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
  593. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/term.py +0 -0
  594. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/trust.py +0 -0
  595. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/typing.py +0 -0
  596. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/__init__.py +0 -0
  597. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/api/__init__.py +0 -0
  598. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/api/config.py +0 -0
  599. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/api/open_in.py +0 -0
  600. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/api/sessions.py +0 -0
  601. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/app.py +0 -0
  602. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/auth.py +0 -0
  603. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/models.py +0 -0
  604. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/runner/__init__.py +0 -0
  605. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/runner/messages.py +0 -0
  606. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/runner/process.py +0 -0
  607. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/runner/worker.py +0 -0
  608. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/_headers +0 -0
  609. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  610. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  611. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  612. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  613. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  614. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  615. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  616. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  617. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  618. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  619. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  620. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  621. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  622. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  623. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  624. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  625. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  626. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  627. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  628. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  629. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  630. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  631. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  632. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  633. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  634. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  635. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  636. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  637. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  638. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  639. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  640. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  641. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  642. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  643. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  644. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  645. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  646. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  647. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  648. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  649. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  650. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  651. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  652. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  653. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  654. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  655. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  656. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  657. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  658. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  659. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  660. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  661. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  662. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  663. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  664. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  665. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  666. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  667. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  668. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/abap-CLvhMVsD.js +0 -0
  669. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/actionscript-3--17pq3dv.js +0 -0
  670. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ada-C5qYipkI.js +0 -0
  671. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/andromeeda-vGVdxbeo.js +0 -0
  672. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/angular-html-BKhkKBsm.js +0 -0
  673. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/angular-ts-CYPbMJCA.js +0 -0
  674. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/apache-U0d_L8uA.js +0 -0
  675. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/apex-CGTLDQj6.js +0 -0
  676. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/apl-D7bENxmy.js +0 -0
  677. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/applescript-CCn79oCD.js +0 -0
  678. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ara-4CJ0cIlV.js +0 -0
  679. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/arc-8BWbC-0s.js +0 -0
  680. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/array-BifhSqXX.js +0 -0
  681. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/asciidoc-DE70LPWp.js +0 -0
  682. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/asm-Cmm7eHzH.js +0 -0
  683. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/astro-B1l9MDUT.js +0 -0
  684. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/aurora-x-CDeNXAV0.js +0 -0
  685. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/awk-BWXHIvNe.js +0 -0
  686. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ayu-dark-DluEY0Gj.js +0 -0
  687. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ayu-light-C3h-C4tm.js +0 -0
  688. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ayu-mirage-Bqwy1Gya.js +0 -0
  689. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ballerina-B7ZEbQpA.js +0 -0
  690. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/bat-Bo4NYOV-.js +0 -0
  691. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/beancount-D-usSTwE.js +0 -0
  692. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/berry-DKpUyyne.js +0 -0
  693. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/bibtex-Ci_nEsc7.js +0 -0
  694. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/bicep-CUHmPFLl.js +0 -0
  695. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/bird2-C2hNVINV.js +0 -0
  696. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/blade-BlkqRXu6.js +0 -0
  697. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/bootstrap-BhLLvBaE.css +0 -0
  698. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/bsl-BkkzgIyY.js +0 -0
  699. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/c-PpPxyn8g.js +0 -0
  700. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/c3-CnJL0r0V.js +0 -0
  701. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cadence-CQ2zXKGN.js +0 -0
  702. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cairo-DLTphjLi.js +0 -0
  703. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-3VR1Za6u.js +0 -0
  704. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/catppuccin-latte-DwIHMF0Q.js +0 -0
  705. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DYnBP6_5.js +0 -0
  706. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-DYhrFGRu.js +0 -0
  707. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/character-entities-legacy-Wut6vMuj.js +0 -0
  708. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chevrons-up-down-Dwo0Il5v.js +0 -0
  709. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-C0kf5ycP.js +0 -0
  710. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-55IACEB6-QyFAFTWp.js +0 -0
  711. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-BSJP7CBP-DIpfLhEz.js +0 -0
  712. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-Cyuzqnbw.js +0 -0
  713. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-C9D6P7Uq.js +0 -0
  714. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-NNHCCRGN-DmZbXBJw.js +0 -0
  715. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-CyVdgm44.js +0 -0
  716. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-XPW4576I-ru3A962d.js +0 -0
  717. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/clarity-SemFz856.js +0 -0
  718. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/clojure-DqKBuwfJ.js +0 -0
  719. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cmake-Bj61d0ZC.js +0 -0
  720. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cobol-BoXxFQjh.js +0 -0
  721. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/codeowners-C8r90Shi.js +0 -0
  722. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/codeql-oeQT6MSM.js +0 -0
  723. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/coffee-B5TREocO.js +0 -0
  724. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/common-lisp-Cv5bFMCO.js +0 -0
  725. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/coq-BrsZFFmf.js +0 -0
  726. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-PjRvINHM.js +0 -0
  727. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cpp-CVIk4zoB.js +0 -0
  728. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/crystal-CvUuUt6_.js +0 -0
  729. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/csharp-Ct8U2NOr.js +0 -0
  730. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/css-D7o5g6xi.js +0 -0
  731. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/csv-Dx-8-gkx.js +0 -0
  732. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cue-CE9AQfxI.js +0 -0
  733. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cypher-ClKdZ_lG.js +0 -0
  734. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cytoscape.esm-jXPf2pm4.js +0 -0
  735. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/d-qD-0Kul2.js +0 -0
  736. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dagre-Uyq5yTtG.js +0 -0
  737. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dark-plus-Cs2F2srj.js +0 -0
  738. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dart-DkHntEIa.js +0 -0
  739. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dax-BkyTk9wS.js +0 -0
  740. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/defaultLocale-C8Fc0cco.js +0 -0
  741. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/desktop-Dlh5hvp9.js +0 -0
  742. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/diff-BDNflWRl.js +0 -0
  743. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/diff-Dvab7kiv.css +0 -0
  744. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/diff-woXpYk--.js +0 -0
  745. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dist-B7jLwIkG.js +0 -0
  746. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dist-D4B_Bs5p.js +0 -0
  747. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dist-reBDvVlc.js +0 -0
  748. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/docker-IyjqRm3v.js +0 -0
  749. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dotenv-_5a1GRtc.js +0 -0
  750. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dracula-BHWKrbxM.js +0 -0
  751. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dracula-soft-5eyTD99u.js +0 -0
  752. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dream-maker-DW3nJb8Q.js +0 -0
  753. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/edge-CmXZi-az.js +0 -0
  754. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/elixir-BoRIkjDi.js +0 -0
  755. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/elm-Cm7sFdI1.js +0 -0
  756. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9PiwqqW.js +0 -0
  757. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/erb-DuMAGb6i.js +0 -0
  758. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/erlang-Cphh6RMH.js +0 -0
  759. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/everforest-dark-sB-x3p7T.js +0 -0
  760. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/everforest-light-Df2xbC6M.js +0 -0
  761. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/fennel-DQxkIbk2.js +0 -0
  762. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/fish-BJitypiv.js +0 -0
  763. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/fluent-C03EYrpw.js +0 -0
  764. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-DEKoE2YW.js +0 -0
  765. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/fortran-free-form-CYNrtFtB.js +0 -0
  766. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/fsharp-D13ZGOAj.js +0 -0
  767. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gdresource-C0sCabJj.js +0 -0
  768. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gdscript-Cp2uCuqX.js +0 -0
  769. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gdshader-CBce3t8t.js +0 -0
  770. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/genie-CV2tkWYe.js +0 -0
  771. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gherkin-DExj1W_8.js +0 -0
  772. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/git-commit-BSykSTBG.js +0 -0
  773. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/git-rebase-D2tSwjJb.js +0 -0
  774. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/github-dark-C-LZuMrd.js +0 -0
  775. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/github-dark-default-DXG-b-1a.js +0 -0
  776. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-Bx1FflLF.js +0 -0
  777. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/github-dark-high-contrast-B_tTalzw.js +0 -0
  778. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/github-light-EUqPIrTm.js +0 -0
  779. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/github-light-default-BXViO-2h.js +0 -0
  780. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-B68TUdTA.js +0 -0
  781. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gleam-CSRkHgEL.js +0 -0
  782. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/glimmer-js--VVKNatA.js +0 -0
  783. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/glimmer-ts-Bfa_wiNC.js +0 -0
  784. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/glsl-MPwHyiXQ.js +0 -0
  785. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gn-ilITqXS6.js +0 -0
  786. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gnuplot-7GGW24-e.js +0 -0
  787. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/go-BJwz_mda.js +0 -0
  788. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/graphlib-C22s9MDV.js +0 -0
  789. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/graphql-NW854Khs.js +0 -0
  790. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/groovy-CacY0gHj.js +0 -0
  791. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-C820rvS2.js +0 -0
  792. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-BPjhmG05.js +0 -0
  793. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-MrdJrrXF.js +0 -0
  794. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-BC_s9l72.js +0 -0
  795. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-BAWPOn9u.js +0 -0
  796. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-BSMLrYjP.js +0 -0
  797. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/hack-CSl79E5u.js +0 -0
  798. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/haml-Dmb1YmHj.js +0 -0
  799. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/handlebars-Du8DtnRB.js +0 -0
  800. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/haskell-D8IpX4py.js +0 -0
  801. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/haxe-OTjmBuCE.js +0 -0
  802. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/hcl-Dh228itO.js +0 -0
  803. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/hjson-CxZEssPk.js +0 -0
  804. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/hlsl-Cvrh5tZx.js +0 -0
  805. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/horizon-CE9ld1lL.js +0 -0
  806. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/horizon-bright-Br1oVSNq.js +0 -0
  807. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/houston-CsvMBhTu.js +0 -0
  808. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/html-Kpl3bQKd.js +0 -0
  809. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/html-derivative-BEEWNZ8Y.js +0 -0
  810. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/http-HvMG3K54.js +0 -0
  811. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/hurl-CLh1t2ES.js +0 -0
  812. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/hxml-B0Qn7Nwc.js +0 -0
  813. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/hy-CZbG8q4J.js +0 -0
  814. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/imba-DsUTQ-LC.js +0 -0
  815. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ini-B5eOa1yu.js +0 -0
  816. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/init-D6jRqBbL.js +0 -0
  817. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  818. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  819. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  820. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  821. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  822. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  823. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  824. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/java-Cst_eZTE.js +0 -0
  825. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/javascript-i_rUTyCW.js +0 -0
  826. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jinja-CaXggA6f.js +0 -0
  827. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jison-D9Fg2JgN.js +0 -0
  828. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/json-DS5j4FfK.js +0 -0
  829. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/json5-BR5RXkoi.js +0 -0
  830. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jsonc-CYpm1nAK.js +0 -0
  831. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jsonl-CmCQp5Yx.js +0 -0
  832. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jsonnet-CJTPZ8u_.js +0 -0
  833. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jssm-DXw9l8Rf.js +0 -0
  834. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jsx-CFyhNHav.js +0 -0
  835. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jsx-runtime-wSvXh6gi.js +0 -0
  836. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/julia-R8NNmfP1.js +0 -0
  837. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/just-BhhHYlS8.js +0 -0
  838. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CXtmUGW6.js +0 -0
  839. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-BN08jTvb.js +0 -0
  840. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/kanagawa-wave-CTweb8Dz.js +0 -0
  841. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/katex-BGaDVET_.js +0 -0
  842. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/katex-BorAY7qD.css +0 -0
  843. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/kdl-CsD5j6eV.js +0 -0
  844. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/kotlin-DhhofPvG.js +0 -0
  845. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/kusto-BUv0MjJC.js +0 -0
  846. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/laserwave-C_8bwKvT.js +0 -0
  847. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/latex-D5k_uhWv.js +0 -0
  848. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/lean-CewbzKMR.js +0 -0
  849. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/less-DVTAwKKz.js +0 -0
  850. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/lib-BLxG8W6T.js +0 -0
  851. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/libesm-8-2luV-1.js +0 -0
  852. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/light-plus-DVQuIRkW.js +0 -0
  853. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/linear-BktLjFGX.js +0 -0
  854. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/liquid-Q0_hzjly.js +0 -0
  855. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/llvm-Cm23YOpf.js +0 -0
  856. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/log-BNLmms1o.js +0 -0
  857. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/logo-Cluzi2Zq.js +0 -0
  858. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/lua-VoGSg0xb.js +0 -0
  859. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/luau-CNKltnaQ.js +0 -0
  860. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/make-Dixweg8N.js +0 -0
  861. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/markdown-BYOwaDjH.js +0 -0
  862. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/marked.esm-DLdcrU5H.js +0 -0
  863. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/marko-D_aeUD__.js +0 -0
  864. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/material-theme-Bm3Qr25_.js +0 -0
  865. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/material-theme-darker-2IIEA8gg.js +0 -0
  866. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/material-theme-lighter-uhdI0v04.js +0 -0
  867. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CHQ94UKr.js +0 -0
  868. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/material-theme-palenight-B5W6OYN7.js +0 -0
  869. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/matlab-D7qyCx1q.js +0 -0
  870. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/mdc-BSifqehP.js +0 -0
  871. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/mdx-DQZ5AkYe.js +0 -0
  872. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/mermaid-Bk4SNUv9.js +0 -0
  873. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/min-dark-BSWPekZh.js +0 -0
  874. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/min-light-DDpmG2fV.js +0 -0
  875. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/mipsasm-BMqwQI7S.js +0 -0
  876. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/mojo-BgCJLMeH.js +0 -0
  877. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/monokai-CdkpiU2Y.js +0 -0
  878. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/moonbit-CaWjb8XO.js +0 -0
  879. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/move-B1IS1UjX.js +0 -0
  880. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/narrat-_X_XdTYD.js +0 -0
  881. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/nextflow-Bbiyy34d.js +0 -0
  882. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/nextflow-groovy-Dc_ddanL.js +0 -0
  883. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/nginx-CgHaWcsO.js +0 -0
  884. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/night-owl-DhmEMT88.js +0 -0
  885. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/night-owl-light-eJ-hLW7d.js +0 -0
  886. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/nim-BuixXxPS.js +0 -0
  887. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/nix-IvuFDN5E.js +0 -0
  888. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/nord-Cb4Vim4T.js +0 -0
  889. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/nushell-DcLAeLz5.js +0 -0
  890. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/objective-c-D1A_Heim.js +0 -0
  891. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/objective-cpp-BsSzOQcm.js +0 -0
  892. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ocaml-O90oeIOV.js +0 -0
  893. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/odin-B1RWQWA5.js +0 -0
  894. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/one-dark-pro-CLwyXe_n.js +0 -0
  895. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/one-light-D7Lr4KcI.js +0 -0
  896. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/openscad-BUDT5pXO.js +0 -0
  897. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ordinal-hYBb2elL.js +0 -0
  898. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/pascal-4ZHwLPI5.js +0 -0
  899. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/path-BWPyau1x.js +0 -0
  900. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/perl-BLMySlFJ.js +0 -0
  901. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/php-Czf_fybR.js +0 -0
  902. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/pkl-ot-7Btpt.js +0 -0
  903. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/plastic-DQwYfKfQ.js +0 -0
  904. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/plsql-DGHpHOYJ.js +0 -0
  905. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/po-BiJDBrnU.js +0 -0
  906. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/poimandres-DRFjx7u4.js +0 -0
  907. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/polar-C7UOKdEL.js +0 -0
  908. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/postcss-BXeXVLqQ.js +0 -0
  909. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/powerquery-DNMTfnFr.js +0 -0
  910. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/powershell-DshXNtvi.js +0 -0
  911. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/prisma-BsRQq5mF.js +0 -0
  912. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/prolog-iXnhIJG7.js +0 -0
  913. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/proto-DB4EqR-F.js +0 -0
  914. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/pug-CsZglf8T.js +0 -0
  915. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/puppet-CDv2pdJW.js +0 -0
  916. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/purescript-9MfHhQsQ.js +0 -0
  917. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/python-gzcpVVnB.js +0 -0
  918. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/qml-DcW_sT3t.js +0 -0
  919. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/qmldir-DCQb3MpD.js +0 -0
  920. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/qss-Fe1Jh2GI.js +0 -0
  921. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/r-D2d3McyU.js +0 -0
  922. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/racket-DcIDlBhZ.js +0 -0
  923. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/raku-B3gFvitq.js +0 -0
  924. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/razor-oFpUW61Z.js +0 -0
  925. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/red-CJ3rzSJv.js +0 -0
  926. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/reg-CRGYupPL.js +0 -0
  927. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/regexp-Bu0flJgP.js +0 -0
  928. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rel-BtDbiS_P.js +0 -0
  929. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/riscv-Ckw8ddFX.js +0 -0
  930. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ron-VUp2lXgN.js +0 -0
  931. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rose-pine-BthvhNj6.js +0 -0
  932. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-Dg85fqjY.js +0 -0
  933. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rose-pine-moon-hon4tzzS.js +0 -0
  934. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rosmsg-CAekHB0j.js +0 -0
  935. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rough.esm-CSKSodPl.js +0 -0
  936. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rst-U6Eu7ipE.js +0 -0
  937. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ruby-CUQsVT6d.js +0 -0
  938. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rust-Cfkwpbl8.js +0 -0
  939. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/sas-CNBFrLhc.js +0 -0
  940. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/sass-DXrisJhu.js +0 -0
  941. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/scala-DKOlJaKm.js +0 -0
  942. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/scheme-DQCgrYNe.js +0 -0
  943. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/scss-CPnU-uuv.js +0 -0
  944. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/sdbl-bTVj8UrX.js +0 -0
  945. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/shaderlab-TOUzSsQk.js +0 -0
  946. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/shellscript-BbTp1yjG.js +0 -0
  947. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/shellsession-BmAC8SMF.js +0 -0
  948. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/slack-dark-DnToyrRv.js +0 -0
  949. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/slack-ochin-B2OO5cIa.js +0 -0
  950. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/smalltalk-B16xEiuN.js +0 -0
  951. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/snazzy-light-4G7pJPwS.js +0 -0
  952. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/solarized-dark-DV17i1UV.js +0 -0
  953. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/solarized-light-DSh2HLQt.js +0 -0
  954. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/solidity-CKzVLygQ.js +0 -0
  955. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/soy-CdbyEXp6.js +0 -0
  956. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/space-separated-tokens-DpjE5PGy.js +0 -0
  957. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/sparql-D_iOobhT.js +0 -0
  958. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/splunk-BC2Px7Mm.js +0 -0
  959. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/sql-hpBkusIy.js +0 -0
  960. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/src-D-NMWEou.js +0 -0
  961. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ssh-config-BgfXC-Er.js +0 -0
  962. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/stata-DVbvk3qH.js +0 -0
  963. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/stylus-B6D30XZt.js +0 -0
  964. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/surrealql-DxccxuMd.js +0 -0
  965. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/svelte-DzNm5V2w.js +0 -0
  966. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/swift-DonLKvLd.js +0 -0
  967. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/synthwave-84-nFMaYfgc.js +0 -0
  968. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/system-verilog-DJ5XKQeo.js +0 -0
  969. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/systemd-BxMlprV5.js +0 -0
  970. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/talonscript-CohzipZa.js +0 -0
  971. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/tasl-DMoTqEGO.js +0 -0
  972. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/tcl-CZd0xW_V.js +0 -0
  973. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/templ-CsM0tTsw.js +0 -0
  974. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/terraform-DswuEJGm.js +0 -0
  975. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/tex-B0f_hYr8.js +0 -0
  976. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/tokyo-night-oM2G3aXe.js +0 -0
  977. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/toml-CcmNWLt0.js +0 -0
  978. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ts-tags-Bf-FGGvT.js +0 -0
  979. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/tsv-sltzmVWM.js +0 -0
  980. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/tsx-DFvk7AwW.js +0 -0
  981. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/turtle-ByJddavk.js +0 -0
  982. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/twig-VJ4-Ntm0.js +0 -0
  983. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/typescript-DHTLvXzV.js +0 -0
  984. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/typespec-B88KGewJ.js +0 -0
  985. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/typst-DI99ib-x.js +0 -0
  986. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/v-DETTlOr0.js +0 -0
  987. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/v4-DqR3yzBO.js +0 -0
  988. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vala-zf12oZj6.js +0 -0
  989. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vb-Djn5o6TS.js +0 -0
  990. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/verilog-CiiDBU1e.js +0 -0
  991. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vesper-D5bVUKB1.js +0 -0
  992. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vhdl-BroJfC0k.js +0 -0
  993. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/viml-DvXPmvsu.js +0 -0
  994. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vitesse-black-fwtXNY1n.js +0 -0
  995. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vitesse-dark-BZCL-v6S.js +0 -0
  996. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vitesse-light-VbXTXTou.js +0 -0
  997. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vue-D3dSYZKz.js +0 -0
  998. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vue-html-DQch_7VQ.js +0 -0
  999. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vue-vine-B67Dz05t.js +0 -0
  1000. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vyper-CgoNMtux.js +0 -0
  1001. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/wasm-BnjxR4X6.js +0 -0
  1002. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/wasm-ByWQv1Qj.js +0 -0
  1003. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/wenyan-C8pVoKbM.js +0 -0
  1004. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/wgsl-BsKzXJz4.js +0 -0
  1005. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/wikitext-ClFFjSW2.js +0 -0
  1006. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/wit-DdvCle-K.js +0 -0
  1007. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/wolfram-DLL8P-h_.js +0 -0
  1008. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/xml-C33zriiW.js +0 -0
  1009. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/xsl-BFS2wyMt.js +0 -0
  1010. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/yaml-w0rMsuN4.js +0 -0
  1011. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/zenscript-BnlCZFoB.js +0 -0
  1012. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/zig-CMLA9XwU.js +0 -0
  1013. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
  1014. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
  1015. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
  1016. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
  1017. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
  1018. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
  1019. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
  1020. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
  1021. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
  1022. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
  1023. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
  1024. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
  1025. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
  1026. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
  1027. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
  1028. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
  1029. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
  1030. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
  1031. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
  1032. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
  1033. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
  1034. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
  1035. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/install.ps1 +0 -0
  1036. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/install.sh +0 -0
  1037. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/logo.png +0 -0
  1038. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/store/__init__.py +0 -0
  1039. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/store/sessions.py +0 -0
  1040. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/__init__.py +0 -0
  1041. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/file.py +0 -0
  1042. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
  1043. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/protocol.py +0 -0
  1044. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/root_hub.py +0 -0
  1045. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/serde.py +0 -0
  1046. {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/server.py +0 -0
  1047. {pythinker_code-0.48.0 → pythinker_code-0.50.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.48.0
3
+ Version: 0.50.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,12 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
115
115
 
116
116
  ---
117
117
 
118
- ## 🆕 What's New in 0.48.0
118
+ ## 🆕 What's New in 0.50.0
119
119
 
120
- - **LSP code intelligence.** New `LSP` tool (go-to-definition, references, hover, symbols, call hierarchy) with plugin-backed language servers, session-scoped lifecycle, passive diagnostics after edits, and structured errors when a server lacks `implementationProvider`.
121
- - **TUI theme and streaming overhaul.** Centralized theme system (`/theme`), 25 Hz paced streaming, syntax-highlighted diff cards, report panel polish, and smoother interactive/non-interactive live views — no preamble ghosting, mid-stream scrollback flicker, or fossilized spinners during tool transitions.
122
- - **Proxy and tool-call hardening.** Tool results flatten for Anthropic-compatible proxies (fixes invisible GLM/z.ai outputs); `ToolSearch` is hidden from providers that cannot use deferred discovery; diff cards strip ANSI escapes; collapsed ReadFile cards show line counts and previews.
120
+ - **Safer silent updates.** The downloaded build is now staged beside the running executable and promoted at exit, instead of overwriting the live onefile bundle in place eliminating mid-session `zlib: incorrect header check` crashes after a background update.
121
+ - **Cleaner update notice.** The "Updated vX. Restart to apply." line renders below the prompt's bottom border, not inside the input area.
123
122
 
124
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.48.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
123
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.50.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
125
124
 
126
125
 
127
126
  ---
@@ -211,7 +210,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
211
210
 
212
211
  | Platform | Recommended install | Artifact source |
213
212
  |---|---|---|
214
- | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.48.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
213
+ | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.50.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
215
214
  | **<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
215
  | **<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
216
  | **🐳 Docker** | `docker run --rm -it ghcr.io/pythoughts-labs/pythinker-code` | GHCR multi-arch image |
@@ -239,7 +238,7 @@ pythinker # start the interactive TUI
239
238
 
240
239
  ### 🪟 Windows — native installer
241
240
 
242
- `PythinkerSetup-0.48.0.exe` is a signed* Inno Setup wizard. Installs per-user
241
+ `PythinkerSetup-0.50.0.exe` is a signed* Inno Setup wizard. Installs per-user
243
242
  into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
244
243
  PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
245
244
  the change. **No UAC prompt.**
@@ -250,13 +249,13 @@ irm https://pythinker.com/install.ps1 | iex
250
249
 
251
250
  # Or manually download the installer + checksum from the Releases page,
252
251
  # verify with Get-FileHash, then run:
253
- .\PythinkerSetup-0.48.0.exe
252
+ .\PythinkerSetup-0.50.0.exe
254
253
 
255
254
  # Open a fresh PowerShell
256
255
  pythinker --version
257
256
  ```
258
257
 
259
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.48.0.exe /ALLUSERS`
258
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.50.0.exe /ALLUSERS`
260
259
  installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
261
260
 
262
261
  **Upgrade:** `pythinker update` from inside the running app — it downloads
@@ -314,26 +313,26 @@ attached to every GitHub Release.
314
313
 
315
314
  ```sh
316
315
  # Debian / Ubuntu (x86_64)
317
- sudo dpkg -i pythinker-code_0.48.0_amd64.deb
316
+ sudo dpkg -i pythinker-code_0.50.0_amd64.deb
318
317
  sudo apt-get install -f # only if dpkg reports missing deps
319
318
 
320
319
  # Debian / Ubuntu (ARM64)
321
- sudo dpkg -i pythinker-code_0.48.0_arm64.deb
320
+ sudo dpkg -i pythinker-code_0.50.0_arm64.deb
322
321
 
323
322
  # Fedora / RHEL / openSUSE (x86_64)
324
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.48.0/pythinker-code-0.48.0.x86_64.rpm
325
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.48.0/pythinker-code-0.48.0.x86_64.rpm.sha256
326
- sha256sum -c pythinker-code-0.48.0.x86_64.rpm.sha256
323
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.x86_64.rpm
324
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.x86_64.rpm.sha256
325
+ sha256sum -c pythinker-code-0.50.0.x86_64.rpm.sha256
327
326
  # Fedora / RHEL:
328
- sudo dnf install ./pythinker-code-0.48.0.x86_64.rpm
327
+ sudo dnf install ./pythinker-code-0.50.0.x86_64.rpm
329
328
  # openSUSE:
330
- sudo zypper install ./pythinker-code-0.48.0.x86_64.rpm
329
+ sudo zypper install ./pythinker-code-0.50.0.x86_64.rpm
331
330
 
332
331
  # Fedora / RHEL (aarch64)
333
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.48.0/pythinker-code-0.48.0.aarch64.rpm
334
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.48.0/pythinker-code-0.48.0.aarch64.rpm.sha256
335
- sha256sum -c pythinker-code-0.48.0.aarch64.rpm.sha256
336
- sudo dnf install ./pythinker-code-0.48.0.aarch64.rpm
332
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.aarch64.rpm
333
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.aarch64.rpm.sha256
334
+ sha256sum -c pythinker-code-0.50.0.aarch64.rpm.sha256
335
+ sudo dnf install ./pythinker-code-0.50.0.aarch64.rpm
337
336
  ```
338
337
 
339
338
  Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
@@ -342,8 +341,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
342
341
  **Verify before install:**
343
342
 
344
343
  ```sh
345
- sha256sum -c pythinker-code_0.48.0_amd64.deb.sha256 # Debian/Ubuntu
346
- sha256sum -c pythinker-code-0.48.0.x86_64.rpm.sha256 # Fedora/RHEL
344
+ sha256sum -c pythinker-code_0.50.0_amd64.deb.sha256 # Debian/Ubuntu
345
+ sha256sum -c pythinker-code-0.50.0.x86_64.rpm.sha256 # Fedora/RHEL
347
346
  ```
348
347
 
349
348
  **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
@@ -50,13 +50,12 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
50
50
 
51
51
  ---
52
52
 
53
- ## 🆕 What's New in 0.48.0
53
+ ## 🆕 What's New in 0.50.0
54
54
 
55
- - **LSP code intelligence.** New `LSP` tool (go-to-definition, references, hover, symbols, call hierarchy) with plugin-backed language servers, session-scoped lifecycle, passive diagnostics after edits, and structured errors when a server lacks `implementationProvider`.
56
- - **TUI theme and streaming overhaul.** Centralized theme system (`/theme`), 25 Hz paced streaming, syntax-highlighted diff cards, report panel polish, and smoother interactive/non-interactive live views — no preamble ghosting, mid-stream scrollback flicker, or fossilized spinners during tool transitions.
57
- - **Proxy and tool-call hardening.** Tool results flatten for Anthropic-compatible proxies (fixes invisible GLM/z.ai outputs); `ToolSearch` is hidden from providers that cannot use deferred discovery; diff cards strip ANSI escapes; collapsed ReadFile cards show line counts and previews.
55
+ - **Safer silent updates.** The downloaded build is now staged beside the running executable and promoted at exit, instead of overwriting the live onefile bundle in place eliminating mid-session `zlib: incorrect header check` crashes after a background update.
56
+ - **Cleaner update notice.** The "Updated vX. Restart to apply." line renders below the prompt's bottom border, not inside the input area.
58
57
 
59
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.48.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
58
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.50.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
60
59
 
61
60
 
62
61
  ---
@@ -146,7 +145,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
146
145
 
147
146
  | Platform | Recommended install | Artifact source |
148
147
  |---|---|---|
149
- | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.48.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
148
+ | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.50.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
150
149
  | **<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
150
  | **<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
151
  | **🐳 Docker** | `docker run --rm -it ghcr.io/pythoughts-labs/pythinker-code` | GHCR multi-arch image |
@@ -174,7 +173,7 @@ pythinker # start the interactive TUI
174
173
 
175
174
  ### 🪟 Windows — native installer
176
175
 
177
- `PythinkerSetup-0.48.0.exe` is a signed* Inno Setup wizard. Installs per-user
176
+ `PythinkerSetup-0.50.0.exe` is a signed* Inno Setup wizard. Installs per-user
178
177
  into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
179
178
  PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
180
179
  the change. **No UAC prompt.**
@@ -185,13 +184,13 @@ irm https://pythinker.com/install.ps1 | iex
185
184
 
186
185
  # Or manually download the installer + checksum from the Releases page,
187
186
  # verify with Get-FileHash, then run:
188
- .\PythinkerSetup-0.48.0.exe
187
+ .\PythinkerSetup-0.50.0.exe
189
188
 
190
189
  # Open a fresh PowerShell
191
190
  pythinker --version
192
191
  ```
193
192
 
194
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.48.0.exe /ALLUSERS`
193
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.50.0.exe /ALLUSERS`
195
194
  installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
196
195
 
197
196
  **Upgrade:** `pythinker update` from inside the running app — it downloads
@@ -249,26 +248,26 @@ attached to every GitHub Release.
249
248
 
250
249
  ```sh
251
250
  # Debian / Ubuntu (x86_64)
252
- sudo dpkg -i pythinker-code_0.48.0_amd64.deb
251
+ sudo dpkg -i pythinker-code_0.50.0_amd64.deb
253
252
  sudo apt-get install -f # only if dpkg reports missing deps
254
253
 
255
254
  # Debian / Ubuntu (ARM64)
256
- sudo dpkg -i pythinker-code_0.48.0_arm64.deb
255
+ sudo dpkg -i pythinker-code_0.50.0_arm64.deb
257
256
 
258
257
  # Fedora / RHEL / openSUSE (x86_64)
259
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.48.0/pythinker-code-0.48.0.x86_64.rpm
260
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.48.0/pythinker-code-0.48.0.x86_64.rpm.sha256
261
- sha256sum -c pythinker-code-0.48.0.x86_64.rpm.sha256
258
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.x86_64.rpm
259
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.x86_64.rpm.sha256
260
+ sha256sum -c pythinker-code-0.50.0.x86_64.rpm.sha256
262
261
  # Fedora / RHEL:
263
- sudo dnf install ./pythinker-code-0.48.0.x86_64.rpm
262
+ sudo dnf install ./pythinker-code-0.50.0.x86_64.rpm
264
263
  # openSUSE:
265
- sudo zypper install ./pythinker-code-0.48.0.x86_64.rpm
264
+ sudo zypper install ./pythinker-code-0.50.0.x86_64.rpm
266
265
 
267
266
  # Fedora / RHEL (aarch64)
268
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.48.0/pythinker-code-0.48.0.aarch64.rpm
269
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.48.0/pythinker-code-0.48.0.aarch64.rpm.sha256
270
- sha256sum -c pythinker-code-0.48.0.aarch64.rpm.sha256
271
- sudo dnf install ./pythinker-code-0.48.0.aarch64.rpm
267
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.aarch64.rpm
268
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.aarch64.rpm.sha256
269
+ sha256sum -c pythinker-code-0.50.0.aarch64.rpm.sha256
270
+ sudo dnf install ./pythinker-code-0.50.0.aarch64.rpm
272
271
  ```
273
272
 
274
273
  Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
@@ -277,8 +276,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
277
276
  **Verify before install:**
278
277
 
279
278
  ```sh
280
- sha256sum -c pythinker-code_0.48.0_amd64.deb.sha256 # Debian/Ubuntu
281
- sha256sum -c pythinker-code-0.48.0.x86_64.rpm.sha256 # Fedora/RHEL
279
+ sha256sum -c pythinker-code_0.50.0_amd64.deb.sha256 # Debian/Ubuntu
280
+ sha256sum -c pythinker-code-0.50.0.x86_64.rpm.sha256 # Fedora/RHEL
282
281
  ```
283
282
 
284
283
  **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.48.0"
3
+ version = "0.50.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,37 @@ GitHub Releases page; `0.8.0` is the new starting line.
15
15
 
16
16
  ## Unreleased
17
17
 
18
+ ## 0.50.0 (2026-06-20)
19
+
20
+ - **Silent native updates no longer crash a running session.** The downloaded
21
+ build is now staged beside the running executable and swapped in at exit (it goes
22
+ live on the next launch), instead of overwriting the live onefile bundle in place.
23
+ Overwriting it mid-session corrupted later lazy imports with a
24
+ `zlib.error: incorrect header check`. A boundary guard also converts any residual
25
+ post-update archive-corruption crash into a clear "restart to apply" message.
26
+ - **Update notice renders below the input box.** The "Updated → vX. Restart to
27
+ apply." line now appears underneath the prompt's bottom border instead of inside
28
+ the input area.
29
+
30
+ ## 0.49.0 (2026-06-20)
31
+
32
+ - **Reduction ladder in the default agent prompt.** The agent now walks an explicit,
33
+ ordered ladder before writing code — does this need to exist at all, then the standard
34
+ library, a native platform or framework feature, an already-installed dependency, one
35
+ line, and only then the minimum custom code — so it reaches for the simplest working
36
+ solution by default. The same guidance is mirrored into the `/best-practices` profile,
37
+ and deliberate shortcuts with a known ceiling are flagged with a comment naming the
38
+ ceiling and the upgrade path. Input validation, error handling, security, and
39
+ accessibility are never traded away for fewer lines.
40
+ - **New `cleanup-audit` skill.** A read-only, whole-repo pass that ranks over-engineering
41
+ — what to delete, simplify, or replace with standard-library/platform equivalents — as
42
+ the repo-wide complement to the diff-scoped `pythinker review diff --mode deslopify`. It
43
+ applies no fixes and never proposes cutting validation, error handling, security, or
44
+ accessibility.
45
+ - **Fix: duplicate update notices at startup.** When a background install finishes
46
+ or a cached update is detected, the hint now renders only on the persistent
47
+ under-input line instead of also flashing as a footer toast.
48
+
18
49
  ## 0.48.0 (2026-06-17)
19
50
 
20
51
  - **Fix: tool outputs invisible on Anthropic-compatible proxies (GLM-5.2 via z.ai).**
@@ -149,7 +149,9 @@ ${PYTHINKER_SCRATCHPAD_SECTION}
149
149
 
150
150
  **Simplicity first — minimum code that solves the problem, nothing speculative.** No features beyond what was asked; no abstractions for single-use code; no unrequested configurability; no error handling for impossible scenarios — validate at boundaries only. If a 200-line draft could be 50 lines, rewrite it before showing it. Over-fragmentation is overcomplication too: don't scatter logic across tiny files or extra layers to satisfy a pattern — match the codebase's existing granularity. Self-check: *would a senior engineer call this over-engineered?* If yes, simplify.
151
151
 
152
- **Quality defaults** (unless project or domain rules override): focused, shallow, scannable functions with early exits over deep nesting; meaningful identifiers, no shadowing, the context's casing convention; avoid duplicate logic within a change without inventing broad abstractions for one-off repetition; comment only non-obvious algorithms, workarounds, business rules, and edge cases (`TODO:` for real debt; no self-evident comments; never add copyright or license headers unless requested); cohesive, testable modules; efficient data structures where they aid clarity or scale; wrap error-prone I/O, API, network, and resource operations with handling, timeouts/fallbacks, and cleanup; adopt stricter domain standards (e.g. MISRA-style C/C++) when relevant. Once correct, run the repo's formatter (up to 3 attempts); never add one where none exists.
152
+ **The reduction ladder walk it before writing code; stop at the first rung that holds.** (1) *Does this need to exist at all?* A speculative need is skipped, said so in one line. (2) *Does the standard library do it?* Use it. (3) *Does a native platform or framework feature cover it?* A database constraint over an app-level check, a built-in form control over a picker library, the language's own construct over a hand-rolled one — use it. (4) *Does a dependency already in the manifest solve it?* Use it; never add a new dependency for what a few lines cover. (5) *Can it be one line?* Make it one line. (6) *Only then* write the minimum code that works. When two rungs both hold, take the higher one and move on the ladder is a reflex, not a research project. None of this overrides the guards in this section: trust-boundary validation, error handling that prevents data loss, security, and accessibility stay in even at rung 5.
153
+
154
+ **Quality defaults** (unless project or domain rules override): focused, shallow, scannable functions with early exits over deep nesting; meaningful identifiers, no shadowing, the context's casing convention; avoid duplicate logic within a change without inventing broad abstractions for one-off repetition; comment only non-obvious algorithms, workarounds, business rules, edge cases, and deliberate simplifications whose ceiling matters — a coarse lock, an O(n²) scan, a naive heuristic — naming the ceiling and the upgrade path (`TODO:` for real debt; no self-evident comments; never add copyright or license headers unless requested); cohesive, testable modules; efficient data structures where they aid clarity or scale; wrap error-prone I/O, API, network, and resource operations with handling, timeouts/fallbacks, and cleanup; adopt stricter domain standards (e.g. MISRA-style C/C++) when relevant. Once correct, run the repo's formatter (up to 3 attempts); never add one where none exists.
153
155
 
154
156
  **Honest testing.** Verification per Rule 3, from the narrowest scope outward. Never game it: no weakened or deleted assertions, skipped tests, widened tolerances, overfitting to test cases, or mocking away the behavior under test. Keep tests deterministic — control time, randomness, and the network through the repo's existing patterns; never synchronize with sleeps.
155
157
 
@@ -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,
@@ -1310,6 +1347,17 @@ def pythinker(
1310
1347
  # ClickException includes the errors Typer knows how to render; don't
1311
1348
  # wrap them, or we'd lose the standard error UI and exit codes.
1312
1349
  raise
1350
+ if _is_post_update_bundle_corruption(exc):
1351
+ # A silent self-update replaced this running build on disk; lazy imports
1352
+ # from the stale archive now fail. This only resolves with a restart —
1353
+ # surface a clear, actionable message instead of a fatal traceback.
1354
+ logger.warning("Post-update bundle corruption detected; prompting restart")
1355
+ _emit_fatal_error(
1356
+ "A Pythinker update was installed during this session and the "
1357
+ "running build was replaced on disk.\n"
1358
+ "Please restart Pythinker to finish applying the update."
1359
+ )
1360
+ raise typer.Exit(code=1) from exc
1313
1361
  logger.exception("Fatal error when running CLI")
1314
1362
  if debug:
1315
1363
  import traceback
@@ -30,6 +30,7 @@ The user ran `/best-practices`. Engineering best practices are now in effect: ap
30
30
  - Never invent APIs. Verify every external symbol — function signatures, config keys, CLI flags, library methods — against the actual source, installed package, or type definitions before using it. If you cannot verify it, look it up; if you still cannot, say so instead of guessing.
31
31
  - Prefer the standard library and dependencies already in the manifest. A new dependency is a design decision: justify it (maintenance, license, size, transitive risk), verify the exact package name exists in the registry (hallucinated names are a typosquatting vector), pin it per repo convention, and modify lockfiles only through the package manager — never by hand.
32
32
  - Apply YAGNI: no speculative abstractions, flags, generality, or extension points the request does not need.
33
+ - Before writing code, walk the reduction ladder and stop at the first rung that holds: (1) does this need to exist at all (YAGNI) — skip it and say so; (2) does the standard library do it; (3) does a native platform or framework feature cover it (a database constraint over app code, a built-in control over a library); (4) does a dependency already in the manifest solve it — never add a new one for what a few lines cover; (5) can it be one line; (6) only then the minimum code that works. When two rungs both hold, take the higher one and move on. The guards in this profile — trust-boundary validation, data-loss handling, security, accessibility — are never traded away for fewer lines.
33
34
  - No placeholders in completed work: no TODO stubs, commented-out blocks, empty handler bodies, or mock data presented as a real integration.
34
35
  - Fail loudly per the codebase's conventions. Never swallow exceptions, downgrade errors to warnings, or return fabricated defaults to make a failure disappear.
35
36
  - Preserve backward compatibility by default. Search the integration surfaces your change touches — public APIs, CLI parameters, configuration loading, persisted state, session and wire formats, database schemas — and if a break is unavoidable, call it out and migrate or gate it.
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: cleanup-audit
3
+ description: Whole-repo audit for over-engineering and accidental complexity. Scans the entire codebase (not just a diff) and returns a ranked, read-only list of what to delete, simplify, or replace with standard-library or platform equivalents. Use when the user asks to "audit the codebase", "find bloat", "what can I delete", or wants a repo-wide simplification pass. For a diff-scoped pass use `pythinker review diff --mode deslopify` instead. One-shot report; applies no fixes.
4
+ ---
5
+
6
+ # Cleanup Audit
7
+
8
+ A read-only, whole-repo pass that hunts accidental complexity and over-engineering. The diff-scoped
9
+ version of this job already ships as `pythinker review diff --mode deslopify`; this skill is its
10
+ repo-wide complement — scan the whole tree, rank the biggest cut first.
11
+
12
+ Scope is complexity only. Correctness bugs, security holes, and performance belong to a normal
13
+ review or security pass — note them in one line if you trip over them, but do not chase them here.
14
+
15
+ ## What to hunt
16
+
17
+ - Dead code, unused flexibility, and speculative features no caller needs.
18
+ - Hand-rolled logic the standard library already ships — name the function that replaces it.
19
+ - A dependency (or hand-written code) doing what the language, runtime, or framework already does.
20
+ - Single-implementation interfaces, one-product factories, wrappers that only delegate, a module
21
+ that exports one trivial thing, dead flags and config nobody sets.
22
+ - The same logic spelled out long-hand where a shorter, equally clear form exists.
23
+
24
+ ## How to work
25
+
26
+ 1. Map before judging: read the tree, the manifest/lockfile, and entry points; use `Grep`/`Glob`
27
+ (or `LSP` for references and call hierarchy) to confirm a thing is actually unused before
28
+ proposing its deletion. A deletion proposed without checking callers is a guess.
29
+ 2. Rank findings biggest cut first.
30
+ 3. Apply nothing. This is a report.
31
+
32
+ ## Output
33
+
34
+ One line per finding, ranked, each tagged and citing a path:
35
+
36
+ - `delete:` — dead code / speculative feature. Replacement: nothing.
37
+ - `stdlib:` — hand-rolled thing the standard library ships. Name the function.
38
+ - `native:` — dependency or code doing what the platform/framework already does. Name the feature.
39
+ - `yagni:` — abstraction with one implementation, config nobody sets, layer with one caller.
40
+ - `shrink:` — same logic, fewer lines. Show the shorter form.
41
+
42
+ Format: `<tag> <what to cut>. <replacement>. [path:line]`
43
+ End with an estimate: `net: ~-<N> lines, -<M> deps possible.` Nothing to cut: `Lean already.`
44
+
45
+ ## Guardrails
46
+
47
+ Never propose cutting trust-boundary validation, error handling that prevents data loss, security
48
+ measures, or accessibility — minimal is not the same as unsafe. When a "simplification" would touch
49
+ one of those, leave it and say why. Verify each deletion candidate is truly unreferenced before
50
+ listing it; an audit that proposes deleting live code is worse than no audit.
@@ -2095,22 +2095,10 @@ class Shell:
2095
2095
  async def _auto_update(self) -> None:
2096
2096
  # Background-refresh the cached latest version (throttled); never blocks startup.
2097
2097
  await refresh_update_cache_if_due()
2098
- # Non-blocking shell notice based on the cached value.
2099
- notice = pending_update_notice()
2100
- if notice:
2101
- # Make version notices easy to see on macOS/Linux terminals too:
2102
- # put them at the front of the toast queue, keep them around long
2103
- # enough to survive startup redraws, and force a repaint if the
2104
- # prompt is already active.
2105
- toast(
2106
- notice,
2107
- topic="update",
2108
- duration=30.0,
2109
- immediate=True,
2110
- style="fg:ansibrightyellow bold",
2111
- )
2112
- if self._prompt_session is not None:
2113
- self._prompt_session.invalidate()
2098
+ # The persistent under-input line renders the cached update hint; refresh
2099
+ # it when the cache changes instead of duplicating the text as a toast.
2100
+ if pending_update_notice():
2101
+ self._refresh_update_notice_line()
2114
2102
 
2115
2103
  async def _silent_auto_update(self) -> None:
2116
2104
  """Install a newer release silently in the background at startup."""
@@ -2147,10 +2135,15 @@ class Shell:
2147
2135
  style="fg:ansiyellow",
2148
2136
  )
2149
2137
  return
2150
- self._update_toast(
2151
- self._installed_update_restart_notice(),
2152
- style="fg:ansibrightyellow bold",
2153
- )
2138
+ # The persistent under-input line (_append_update_notice) already renders
2139
+ # the restart message; a toast duplicates it on the footer's second row.
2140
+ self._refresh_update_notice_line()
2141
+
2142
+ def _refresh_update_notice_line(self) -> None:
2143
+ """Drop the update-notice memo and repaint so the footer picks up new text."""
2144
+ self._update_notice_cache = (0.0, None)
2145
+ if self._prompt_session is not None:
2146
+ self._prompt_session.invalidate()
2154
2147
 
2155
2148
  def _installed_update_smoke_check_failed(self) -> bool:
2156
2149
  status = read_update_status()
@@ -2210,8 +2203,8 @@ class Shell:
2210
2203
  if not target:
2211
2204
  return None
2212
2205
  # A release already installed this session needs a restart, not /update —
2213
- # keep this line in agreement with the install toast instead of telling
2214
- # the user to re-run an update that has already landed.
2206
+ # surface that here instead of telling the user to re-run an update that
2207
+ # has already landed.
2215
2208
  status = read_update_status()
2216
2209
  installed = (
2217
2210
  status is not None
@@ -2230,12 +2223,12 @@ class Shell:
2230
2223
  """Pick the startup update behavior and schedule it (non-blocking).
2231
2224
 
2232
2225
  - env kill-switch set → nothing (cache filters already suppress the
2233
- toast, matching today's hard-disable behavior).
2226
+ notice, matching today's hard-disable behavior).
2234
2227
  - enabled → silent background install.
2235
- - config-disabled OR source checkout → informational toast only
2236
- (`_auto_update`); self-suppresses for source checkouts because
2228
+ - config-disabled OR source checkout → refresh the persistent notice
2229
+ only (`_auto_update`); self-suppresses for source checkouts because
2237
2230
  `pending_update_notice()` returns None in that path.
2238
- - non-PythinkerSoul → same toast-only path (no runtime config to
2231
+ - non-PythinkerSoul → same notice-refresh path (no runtime config to
2239
2232
  consult), matching the prior unconditional `_auto_update` behavior.
2240
2233
  """
2241
2234
  if get_env_bool("PYTHINKER_CLI_NO_AUTO_UPDATE"):
@@ -3915,10 +3915,11 @@ 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 *below* the footer
3920
+ separator, so it renders underneath the prompt input box rather than
3921
+ inside it. Call this right after the separator rule. No-op when no update
3922
+ is pending; style-agnostic across both toolbar layouts."""
3922
3923
  provider = getattr(self, "_update_notice_provider", None)
3923
3924
  if provider is None:
3924
3925
  return
@@ -3930,7 +3931,7 @@ class CustomPromptSession:
3930
3931
  return
3931
3932
  tokens = _get_tui_tokens()
3932
3933
  style = f"fg:{tokens.warning or 'ansiyellow'} bold"
3933
- fragments[:0] = [(style, line), ("", "\n")]
3934
+ fragments.extend([(style, line), ("", "\n")])
3934
3935
 
3935
3936
  def _render_bottom_toolbar(self) -> FormattedText:
3936
3937
  if (
@@ -3954,9 +3955,9 @@ class CustomPromptSession:
3954
3955
  fragments: list[tuple[str, str]] = []
3955
3956
  tc = get_toolbar_colors()
3956
3957
 
3957
- self._prepend_update_notice(fragments, columns)
3958
3958
  fragments.append((self._prompt_separator_style(tc.separator), _prompt_rule(columns)))
3959
3959
  fragments.append(("", "\n"))
3960
+ self._append_update_notice(fragments, columns)
3960
3961
 
3961
3962
  remaining = columns
3962
3963
 
@@ -4185,9 +4186,9 @@ class CustomPromptSession:
4185
4186
  secondary_style = f"fg:{tokens.muted}"
4186
4187
 
4187
4188
  fragments: list[tuple[str, str]] = []
4188
- self._prepend_update_notice(fragments, columns)
4189
4189
  fragments.append((self._prompt_separator_style(tc.separator), _prompt_rule(columns)))
4190
4190
  fragments.append(("", "\n"))
4191
+ self._append_update_notice(fragments, columns)
4191
4192
 
4192
4193
  try:
4193
4194
  ctx = self._build_statusline_context(columns)
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import atexit
4
5
  import contextlib
5
6
  import os
6
7
  import platform
@@ -1075,6 +1076,57 @@ def _install_linux_package(asset: Path, package_kind: str) -> UpdateResult:
1075
1076
  return UpdateResult.UPDATED if result.returncode == 0 else UpdateResult.FAILED
1076
1077
 
1077
1078
 
1079
+ def staged_native_path() -> Path:
1080
+ """Side path next to the running executable where a downloaded native update is
1081
+ held until it is promoted into place. Deterministic so the orchestrator's smoke
1082
+ check and the exit-time promotion agree on the same file."""
1083
+ target = Path(sys.executable).resolve()
1084
+ return target.with_name(f".{target.name}.staged")
1085
+
1086
+
1087
+ def register_staged_native_promotion() -> None:
1088
+ """Arrange for the staged native binary to replace the running executable at
1089
+ process exit.
1090
+
1091
+ Swapping at exit — rather than in place mid-session — is the whole point: the
1092
+ running onefile build reads its Python archive lazily from ``sys.executable``,
1093
+ so overwriting that path while the process is alive corrupts later imports
1094
+ (``zlib.error: incorrect header check``). At exit no further imports happen, so
1095
+ the swap is safe, and the new binary goes live on the next launch — exactly what
1096
+ the "Updated → vX. Restart to apply." notice promises.
1097
+
1098
+ Registering more than once (e.g. a silent update plus a manual ``/update`` in the
1099
+ same session) is harmless: the handler no-ops once the staged file has been
1100
+ promoted, so any duplicate registration just runs a second no-op.
1101
+ """
1102
+ atexit.register(_promote_staged_native_update)
1103
+
1104
+
1105
+ def discard_staged_native_update() -> None:
1106
+ """Remove a staged binary that must not be promoted (e.g. it failed its smoke
1107
+ check). Fail-open: a leftover staged file is only ever promoted deliberately."""
1108
+ with contextlib.suppress(OSError):
1109
+ staged_native_path().unlink()
1110
+
1111
+
1112
+ def _promote_staged_native_update() -> None:
1113
+ # ponytail: known residual windows, both far smaller than the mid-session login
1114
+ # crash this replaces — (1) a hard kill (SIGKILL) skips atexit, so promotion
1115
+ # defers to the next clean exit (self-healing); (2) a first-time lazy import
1116
+ # during the rest of interpreter shutdown, after the swap below, could read
1117
+ # stale bytes. Closing both needs a detached post-exit swapper (the deferred
1118
+ # seamless-relaunch design); not built here.
1119
+ staged = staged_native_path()
1120
+ if not staged.is_file():
1121
+ return
1122
+ target = Path(sys.executable).resolve()
1123
+ try:
1124
+ os.replace(staged, target)
1125
+ except OSError:
1126
+ # Leave the staged binary in place; a later clean exit retries the swap.
1127
+ logger.exception("Failed to promote staged native update on exit:")
1128
+
1129
+
1078
1130
  def _install_native_archive(archive: Path) -> UpdateResult:
1079
1131
  target = Path(sys.executable).resolve()
1080
1132
  extract_dir = archive.parent / "extract"
@@ -1091,18 +1143,23 @@ def _install_native_archive(archive: Path) -> UpdateResult:
1091
1143
  logger.error("Native archive did not contain a pythinker executable")
1092
1144
  return UpdateResult.FAILED
1093
1145
 
1094
- replacement = target.with_name(f".{target.name}.new-{os.getpid()}")
1146
+ # Stage the new binary beside the running executable instead of overwriting it
1147
+ # in place. Promotion into `target` happens at process exit (see
1148
+ # register_staged_native_promotion), keeping the live build's on-disk archive
1149
+ # intact so mid-session lazy imports never read stale bytes.
1150
+ staged = staged_native_path()
1151
+ staging_tmp = target.with_name(f".{target.name}.new-{os.getpid()}")
1095
1152
  try:
1096
- shutil.copyfile(extracted, replacement)
1097
- replacement.chmod(target.stat().st_mode | 0o755)
1098
- os.replace(replacement, target)
1153
+ shutil.copyfile(extracted, staging_tmp)
1154
+ staging_tmp.chmod(target.stat().st_mode | 0o755)
1155
+ os.replace(staging_tmp, staged)
1099
1156
  (target.parent / ".pythinker-native").write_text(
1100
1157
  "pythinker-native-build\n", encoding="utf-8"
1101
1158
  )
1102
1159
  except OSError:
1103
- logger.exception("Failed to replace native executable:")
1160
+ logger.exception("Failed to stage native executable:")
1104
1161
  with contextlib.suppress(OSError):
1105
- replacement.unlink()
1162
+ staging_tmp.unlink()
1106
1163
  return UpdateResult.FAILED
1107
1164
  return UpdateResult.UPDATED
1108
1165