pythinker-code 0.24.0__tar.gz → 0.25.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 (851) hide show
  1. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/PKG-INFO +28 -27
  2. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/README.md +26 -25
  3. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/pyproject.toml +14 -2
  4. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/CHANGELOG.md +14 -0
  5. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/agents/default/code_reviewer.yaml +1 -0
  6. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/agents/default/debugger.yaml +1 -0
  7. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/agents/default/security_reviewer.yaml +1 -0
  8. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/agents/default/system.md +25 -1
  9. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/auth/github_feedback.py +3 -2
  10. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/auth/oauth.py +3 -2
  11. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/auth/openai.py +3 -2
  12. pythinker_code-0.25.0/src/pythinker_code/auth/opencode_go.py +357 -0
  13. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/background/agent_runner.py +26 -18
  14. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/background/manager.py +283 -103
  15. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/background/store.py +81 -0
  16. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/background/worker.py +52 -2
  17. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/__init__.py +31 -0
  18. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/mcp.py +1 -1
  19. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/config.py +44 -0
  20. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/scratchpad.py +76 -14
  21. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/pythinkersoul.py +67 -0
  22. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/toolset.py +1 -1
  23. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/agent/__init__.py +5 -0
  24. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/background/output.md +1 -0
  25. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/grep_local.py +20 -4
  26. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/todo/__init__.py +12 -1
  27. pythinker_code-0.25.0/src/pythinker_code/tools/web/_allowlist.py +27 -0
  28. pythinker_code-0.25.0/src/pythinker_code/tools/web/fetch.md +1 -0
  29. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/web/fetch.py +101 -42
  30. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/web/search.md +1 -1
  31. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/web/search.py +23 -0
  32. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/print/visualize.py +15 -1
  33. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/__init__.py +68 -11
  34. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/markdown.py +169 -1
  35. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/messages.py +2 -1
  36. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/render_utils.py +26 -9
  37. pythinker_code-0.25.0/src/pythinker_code/ui/shell/components/report.py +275 -0
  38. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/settings_list.py +16 -4
  39. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/glyphs.py +11 -8
  40. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/motion.py +9 -6
  41. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/prompt.py +5 -6
  42. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/selector.py +16 -5
  43. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/slash.py +11 -191
  44. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +2 -2
  45. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +24 -1
  46. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +3 -2
  47. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +4 -4
  48. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/term.py +29 -0
  49. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/_baseUniq-xke532Oy.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/_baseUniq-BETuyuSd.js +1 -1
  50. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/arc-CegJbAFP.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/arc-9aCOI9DB.js +1 -1
  51. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-gRgnu-gr.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-purnwxgj.js +1 -1
  52. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-Dg5w_2Yh.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-CWJkQ8lw.js +1 -1
  53. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-CCef5OiF.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-CNLtpYDT.js +1 -1
  54. pythinker_code-0.25.0/src/pythinker_code/web/static/assets/channel-BZrJ1_EH.js +1 -0
  55. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-EgaX5uMv.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-CxMQKWPK.js +1 -1
  56. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-DxrhgIEt.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-B-Sjvo9Q.js +1 -1
  57. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-CQVqjkPw.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-CAxNHDi-.js +1 -1
  58. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-CB92ALDq.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-efzZlF1X.js +1 -1
  59. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-Dx0SG_k_.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-CLE-PgkS.js +1 -1
  60. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-CPf0eYoM.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-DzeBoua8.js +1 -1
  61. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-CCzKoWw1.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-DWiNjSHn.js +1 -1
  62. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-DRcEkhpm.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-UYL3QrRr.js +1 -1
  63. pythinker_code-0.25.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-DmBruagE.js +1 -0
  64. pythinker_code-0.25.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-DmBruagE.js +1 -0
  65. pythinker_code-0.25.0/src/pythinker_code/web/static/assets/clone-x4PiU-uh.js +1 -0
  66. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-B9Gx7wfK.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-2PObM5Ub.js +1 -1
  67. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-Bk_TZfTb.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-BzG7eohs.js +1 -1
  68. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/cytoscape.esm-BHcnjk-H.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/cytoscape.esm-D8GEO0BE.js +1 -1
  69. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-Crkbecci.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-Dq4xiUtL.js +1 -1
  70. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-CZZA6AcG.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-DFC71d2h.js +1 -1
  71. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-Cl9Bn4z0.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-Te_SRUeO.js +1 -1
  72. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-Cfd515FT.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-BiSlcy8L.js +1 -1
  73. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-bKIec5rn.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-CduNSzrC.js +1 -1
  74. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-QpAOui2R.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-CtFMWQpr.js +1 -1
  75. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-9b-6k-Ce.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-Cl1hY2iv.js +1 -1
  76. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-1jsNU7Xj.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-iPKWpJ0a.js +1 -1
  77. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/graph-BpD9mq1e.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/graph-DFyiQ_iC.js +1 -1
  78. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/index-CcDfQ78O.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/index-ClOjNFIa.js +2 -2
  79. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/index-DOqWBZxx.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/index-Dfd6WqqI.js +1 -1
  80. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/index-JGsigFy8.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/index-v6n3kvtp.js +1 -1
  81. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-DDG7tF9O.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-DZcQqQGx.js +1 -1
  82. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-CbGNODS3.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-BJsGiEDw.js +1 -1
  83. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-C-9k-K2F.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-DYD8Cc2b.js +1 -1
  84. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/layout-C_z0jB06.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/layout-KNAe020y.js +1 -1
  85. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/linear-BvpHbFJ9.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/linear-F-ASHo5W.js +1 -1
  86. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-BQYgOUUq.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-BPp7ITVn.js +7 -7
  87. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/mermaid.core-BJL5GYve.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/mermaid.core-DguUuNI2.js +5 -5
  88. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/min-BEcwyy0D.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/min-CtILYf0e.js +1 -1
  89. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-DGJ3sluz.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-Cz5GuDHV.js +1 -1
  90. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-CopVB6-T.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-BZoqT-q3.js +1 -1
  91. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-BdniBu5I.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-xckz1CKJ.js +1 -1
  92. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-_-TE819T.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-TQ3Cky43.js +1 -1
  93. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-Q0nhrVAc.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-C0fe9iOM.js +1 -1
  94. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-CM9YS9lz.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-BRw2gAdM.js +1 -1
  95. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-CN07f0ow.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-DT4CUX8-.js +1 -1
  96. pythinker_code-0.25.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-DoANuOAR.js +1 -0
  97. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-BLVxjxj5.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-CsLQ1mau.js +1 -1
  98. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-DkxAx6_v.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-BbC_5Wbj.js +1 -1
  99. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-r872XVoE.js → pythinker_code-0.25.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-Ce0W0nFs.js +1 -1
  100. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/index.html +1 -1
  101. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/install.ps1 +1 -1
  102. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/install.sh +1 -1
  103. pythinker_code-0.24.0/src/pythinker_code/auth/opencode_go.py +0 -203
  104. pythinker_code-0.24.0/src/pythinker_code/tools/web/fetch.md +0 -1
  105. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/channel-D_mnrgqH.js +0 -1
  106. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-CitTAFHx.js +0 -1
  107. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-CitTAFHx.js +0 -1
  108. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/clone-Bz9PJd84.js +0 -1
  109. pythinker_code-0.24.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-Cdl7WqDO.js +0 -1
  110. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/LICENSE +0 -0
  111. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/NOTICE +0 -0
  112. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/__init__.py +0 -0
  113. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/__main__.py +0 -0
  114. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/acp/AGENTS.md +0 -0
  115. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/acp/__init__.py +0 -0
  116. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/acp/convert.py +0 -0
  117. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/acp/host.py +0 -0
  118. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/acp/mcp.py +0 -0
  119. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/acp/server.py +0 -0
  120. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/acp/session.py +0 -0
  121. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/acp/tools.py +0 -0
  122. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/acp/types.py +0 -0
  123. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/acp/version.py +0 -0
  124. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/agents/default/agent.yaml +0 -0
  125. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/agents/default/coder.yaml +1 -1
  126. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/agents/default/explore.yaml +1 -1
  127. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/agents/default/implementer.yaml +1 -1
  128. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/agents/default/plan.yaml +1 -1
  129. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/agents/default/review.yaml +1 -1
  130. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/agents/default/verifier.yaml +1 -1
  131. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
  132. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/agentspec.py +0 -0
  133. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/app.py +0 -0
  134. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
  135. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/approval_runtime/models.py +0 -0
  136. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
  137. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/auth/__init__.py +0 -0
  138. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
  139. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/auth/deepseek.py +0 -0
  140. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/auth/lm_studio.py +0 -0
  141. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/auth/minimax.py +0 -0
  142. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/auth/ollama.py +0 -0
  143. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/auth/openrouter.py +0 -0
  144. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/auth/platforms.py +0 -0
  145. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/background/__init__.py +0 -0
  146. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/background/ids.py +0 -0
  147. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/background/models.py +0 -0
  148. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/background/summary.py +0 -0
  149. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/__main__.py +0 -0
  150. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/_lazy_group.py +0 -0
  151. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/debug.py +0 -0
  152. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/export.py +0 -0
  153. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/info.py +0 -0
  154. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/plugin.py +0 -0
  155. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/review.py +0 -0
  156. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/secscan.py +0 -0
  157. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/security_scan.py +0 -0
  158. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/skill.py +0 -0
  159. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/toad.py +0 -0
  160. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/update.py +0 -0
  161. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/vis.py +0 -0
  162. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/cli/web.py +0 -0
  163. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/constant.py +0 -0
  164. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/events.py +0 -0
  165. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/exception.py +0 -0
  166. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/execution_profiles.py +0 -0
  167. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/extensions.py +0 -0
  168. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/file_restore.py +0 -0
  169. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/hooks/__init__.py +0 -0
  170. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/hooks/config.py +0 -0
  171. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/hooks/engine.py +0 -0
  172. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/hooks/events.py +0 -0
  173. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/hooks/runner.py +0 -0
  174. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/llm.py +0 -0
  175. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/memory/__init__.py +0 -0
  176. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/memory/consolidation.py +0 -0
  177. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/memory/harvest.py +0 -0
  178. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/memory/recall.py +0 -0
  179. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/memory/recap.py +0 -0
  180. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/memory/retriever.py +0 -0
  181. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/memory/retriever_sqlite.py +0 -0
  182. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/memory/sanitize.py +0 -0
  183. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/metadata.py +0 -0
  184. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/native.py +0 -0
  185. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/notifications/__init__.py +0 -0
  186. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/notifications/llm.py +0 -0
  187. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/notifications/manager.py +0 -0
  188. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/notifications/models.py +0 -0
  189. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/notifications/notifier.py +0 -0
  190. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/notifications/store.py +0 -0
  191. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/notifications/wire.py +0 -0
  192. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/plugin/__init__.py +0 -0
  193. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/plugin/manager.py +0 -0
  194. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/plugin/tool.py +0 -0
  195. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/project_memory.py +0 -0
  196. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/prompt_templates.py +0 -0
  197. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/prompts/__init__.py +0 -0
  198. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/prompts/compact.md +0 -0
  199. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/prompts/init.md +0 -0
  200. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/py.typed +0 -0
  201. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/session.py +0 -0
  202. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/session_fork.py +0 -0
  203. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/session_state.py +0 -0
  204. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/share.py +0 -0
  205. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skill/__init__.py +0 -0
  206. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
  207. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skill/flow/d2.py +0 -0
  208. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
  209. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skill/lockfile.py +0 -0
  210. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skills/check-impl-against-spec/SKILL.md +0 -0
  211. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skills/create-pr/SKILL.md +0 -0
  212. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skills/diagnose-ci-failures/SKILL.md +0 -0
  213. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skills/fix-errors/SKILL.md +0 -0
  214. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skills/implement-specs/SKILL.md +0 -0
  215. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skills/pr-walkthrough/SKILL.md +0 -0
  216. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
  217. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skills/reproduce-bug-report/SKILL.md +0 -0
  218. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skills/resolve-merge-conflicts/SKILL.md +0 -0
  219. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skills/review-pr/SKILL.md +0 -0
  220. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
  221. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skills/spec-driven-implementation/SKILL.md +0 -0
  222. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skills/write-product-spec/SKILL.md +0 -0
  223. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/skills/write-tech-spec/SKILL.md +0 -0
  224. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/__init__.py +0 -0
  225. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/agent.py +0 -0
  226. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/approval.py +0 -0
  227. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/btw.py +0 -0
  228. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/compaction.py +0 -0
  229. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/compaction_restore.py +0 -0
  230. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/context.py +0 -0
  231. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/denwarenji.py +0 -0
  232. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/dynamic_injection.py +0 -0
  233. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
  234. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
  235. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
  236. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/message.py +0 -0
  237. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/permission.py +0 -0
  238. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/soul/slash.py +0 -0
  239. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/subagents/__init__.py +0 -0
  240. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/subagents/builder.py +0 -0
  241. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/subagents/core.py +0 -0
  242. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/subagents/discovery.py +0 -0
  243. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/subagents/git_context.py +0 -0
  244. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/subagents/models.py +0 -0
  245. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/subagents/output.py +0 -0
  246. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/subagents/registry.py +0 -0
  247. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/subagents/runner.py +0 -0
  248. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/subagents/store.py +0 -0
  249. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/telemetry/__init__.py +0 -0
  250. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/telemetry/config.py +0 -0
  251. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/telemetry/crash.py +0 -0
  252. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/telemetry/errors.py +0 -0
  253. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/telemetry/metrics.py +0 -0
  254. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/telemetry/otel.py +0 -0
  255. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/telemetry/sentry.py +0 -0
  256. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/telemetry/sink.py +0 -0
  257. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/AGENTS.md +0 -0
  258. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/__init__.py +0 -0
  259. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/agent/description.md +0 -0
  260. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/ask_user/__init__.py +0 -0
  261. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
  262. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/background/__init__.py +0 -0
  263. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/background/handoff.md +0 -0
  264. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/background/input.md +0 -0
  265. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/background/list.md +0 -0
  266. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/background/stop.md +0 -0
  267. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/display.py +0 -0
  268. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
  269. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
  270. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/__init__.py +0 -0
  271. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/glob.md +0 -0
  272. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/glob.py +0 -0
  273. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/grep.md +0 -0
  274. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
  275. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/read.md +0 -0
  276. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/read.py +0 -0
  277. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/read_media.md +0 -0
  278. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/read_media.py +0 -0
  279. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/replace.md +0 -0
  280. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/replace.py +0 -0
  281. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/utils.py +0 -0
  282. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/write.md +0 -0
  283. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/file/write.py +0 -0
  284. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/memory/__init__.py +0 -0
  285. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/memory/memory.md +0 -0
  286. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/plan/__init__.py +0 -0
  287. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/plan/description.md +0 -0
  288. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/plan/enter.py +0 -0
  289. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
  290. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/plan/handoff.py +0 -0
  291. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
  292. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/scratchpad/__init__.py +0 -0
  293. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/scratchpad/scratchpad_tool.md +0 -0
  294. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/shell/__init__.py +0 -0
  295. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/shell/bash.md +0 -0
  296. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
  297. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/skill/__init__.py +0 -0
  298. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/skill/description.md +0 -0
  299. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/test.py +0 -0
  300. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/think/__init__.py +0 -0
  301. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/think/think.md +0 -0
  302. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
  303. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/utils.py +0 -0
  304. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/tools/web/__init__.py +0 -0
  305. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/__init__.py +0 -0
  306. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
  307. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/print/__init__.py +0 -0
  308. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
  309. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
  310. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
  311. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
  312. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/diff.py +0 -0
  313. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/dynamic_border.py +0 -0
  314. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
  315. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
  316. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/panel.py +0 -0
  317. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
  318. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
  319. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/console.py +0 -0
  320. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/debug.py +0 -0
  321. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/design_system.py +0 -0
  322. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/echo.py +0 -0
  323. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
  324. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
  325. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
  326. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
  327. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
  328. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
  329. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
  330. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/render_constants.py +0 -0
  331. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/replay.py +0 -0
  332. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
  333. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
  334. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
  335. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
  336. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
  337. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
  338. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
  339. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
  340. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/setup.py +0 -0
  341. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/spacing.py +0 -0
  342. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/spinner_words.py +0 -0
  343. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/startup.py +0 -0
  344. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
  345. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tips.py +0 -0
  346. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
  347. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/_file_diff.py +0 -0
  348. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
  349. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
  350. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
  351. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
  352. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
  353. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
  354. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
  355. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
  356. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
  357. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
  358. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
  359. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
  360. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
  361. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/update.py +0 -0
  362. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/usage.py +0 -0
  363. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
  364. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
  365. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
  366. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
  367. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
  368. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
  369. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
  370. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
  371. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
  372. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
  373. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
  374. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
  375. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
  376. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/visualize/_activity_tree.py +0 -0
  377. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
  378. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
  379. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/visualize/_dialog_shell.py +0 -0
  380. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
  381. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +0 -0
  382. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
  383. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/visualize/_transcript.py +0 -0
  384. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
  385. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/theme.py +0 -0
  386. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/ui/tui_config.py +0 -0
  387. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
  388. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/__init__.py +0 -0
  389. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/aiohttp.py +0 -0
  390. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/aioqueue.py +0 -0
  391. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/broadcast.py +0 -0
  392. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/changelog.py +0 -0
  393. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/clipboard.py +0 -0
  394. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/datetime.py +0 -0
  395. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/diff.py +0 -0
  396. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/editor.py +0 -0
  397. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/environment.py +0 -0
  398. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/envvar.py +0 -0
  399. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/export.py +0 -0
  400. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/file_filter.py +0 -0
  401. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/frontmatter.py +0 -0
  402. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/io.py +0 -0
  403. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/logging.py +0 -0
  404. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/media_tags.py +0 -0
  405. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/message.py +0 -0
  406. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/path.py +0 -0
  407. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/proctitle.py +0 -0
  408. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/proxy.py +0 -0
  409. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
  410. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
  411. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/rich/columns.py +0 -0
  412. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/rich/diff_render.py +0 -0
  413. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
  414. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
  415. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
  416. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
  417. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/sensitive.py +0 -0
  418. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/server.py +0 -0
  419. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/signals.py +0 -0
  420. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/slashcmd.py +0 -0
  421. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/sleep_inhibitor.py +0 -0
  422. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/string.py +0 -0
  423. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
  424. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/utils/typing.py +0 -0
  425. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/__init__.py +0 -0
  426. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/api/__init__.py +0 -0
  427. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/api/sessions.py +0 -0
  428. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/api/statistics.py +0 -0
  429. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/api/system.py +0 -0
  430. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/app.py +0 -0
  431. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-CY1rtwrX.js +0 -0
  432. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/static/assets/index-DSRInNnm.css +0 -0
  433. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/static/assets/index-DgmTI2M_.js +0 -0
  434. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  435. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  436. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  437. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  438. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  439. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  440. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  441. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/vis/static/index.html +0 -0
  442. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/__init__.py +0 -0
  443. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/api/__init__.py +0 -0
  444. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/api/config.py +0 -0
  445. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/api/open_in.py +0 -0
  446. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/api/sessions.py +0 -0
  447. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/app.py +0 -0
  448. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/auth.py +0 -0
  449. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/models.py +0 -0
  450. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/runner/__init__.py +0 -0
  451. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/runner/messages.py +0 -0
  452. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/runner/process.py +0 -0
  453. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/runner/worker.py +0 -0
  454. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/_headers +0 -0
  455. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  456. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  457. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  458. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  459. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  460. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  461. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  462. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  463. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  464. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  465. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  466. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  467. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  468. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  469. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  470. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  471. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  472. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  473. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  474. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  475. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  476. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  477. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  478. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  479. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  480. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  481. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  482. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  483. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  484. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  485. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  486. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  487. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  488. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  489. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  490. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  491. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  492. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  493. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  494. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  495. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  496. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  497. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  498. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  499. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  500. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  501. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  502. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  503. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  504. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  505. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  506. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  507. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  508. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  509. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  510. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  511. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  512. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  513. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  514. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/abap-BdImnpbu.js +0 -0
  515. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +0 -0
  516. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/ada-bCR0ucgS.js +0 -0
  517. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +0 -0
  518. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +0 -0
  519. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +0 -0
  520. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/apache-Pmp26Uib.js +0 -0
  521. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/apex-D8_7TLub.js +0 -0
  522. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/apl-dKokRX4l.js +0 -0
  523. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/applescript-Co6uUVPk.js +0 -0
  524. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/ara-BRHolxvo.js +0 -0
  525. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +0 -0
  526. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/asm-D_Q5rh1f.js +0 -0
  527. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/astro-CbQHKStN.js +0 -0
  528. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +0 -0
  529. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/awk-DMzUqQB5.js +0 -0
  530. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +0 -0
  531. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +0 -0
  532. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/bat-BkioyH1T.js +0 -0
  533. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/beancount-k_qm7-4y.js +0 -0
  534. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/berry-uYugtg8r.js +0 -0
  535. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/bibtex-CHM0blh-.js +0 -0
  536. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/bicep-Bmn6On1c.js +0 -0
  537. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/blade-D4QpJJKB.js +0 -0
  538. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/bsl-BO_Y6i37.js +0 -0
  539. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/c-BIGW1oBm.js +0 -0
  540. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/c3-VCDPK7BO.js +0 -0
  541. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +0 -0
  542. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/cairo-KRGpt6FW.js +0 -0
  543. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
  544. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
  545. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
  546. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
  547. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/clarity-D53aC0YG.js +0 -0
  548. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/clojure-P80f7IUj.js +0 -0
  549. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/cmake-D1j8_8rp.js +0 -0
  550. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/cobol-nwyudZeR.js +0 -0
  551. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +0 -0
  552. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +0 -0
  553. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/coffee-Ch7k5sss.js +0 -0
  554. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +0 -0
  555. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/coq-DkFqJrB1.js +0 -0
  556. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/cpp-CofmeUqb.js +0 -0
  557. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/crystal-tKQVLTB8.js +0 -0
  558. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/csharp-K5feNrxe.js +0 -0
  559. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/css-DPfMkruS.js +0 -0
  560. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/csv-fuZLfV_i.js +0 -0
  561. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/cue-D82EKSYY.js +0 -0
  562. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/cypher-COkxafJQ.js +0 -0
  563. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/d-85-TOEBH.js +0 -0
  564. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +0 -0
  565. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/dart-CF10PKvl.js +0 -0
  566. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/dax-CEL-wOlO.js +0 -0
  567. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +0 -0
  568. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +0 -0
  569. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/diff-D97Zzqfu.js +0 -0
  570. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/docker-BcOcwvcX.js +0 -0
  571. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/dotenv-Da5cRb03.js +0 -0
  572. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/dracula-BzJJZx-M.js +0 -0
  573. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +0 -0
  574. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +0 -0
  575. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/edge-BkV0erSs.js +0 -0
  576. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/elixir-CDX3lj18.js +0 -0
  577. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/elm-DbKCFpqz.js +0 -0
  578. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +0 -0
  579. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/erb-BOJIQeun.js +0 -0
  580. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/erlang-DsQrWhSR.js +0 -0
  581. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +0 -0
  582. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +0 -0
  583. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/fennel-BYunw83y.js +0 -0
  584. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/fish-BvzEVeQv.js +0 -0
  585. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/fluent-C4IJs8-o.js +0 -0
  586. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
  587. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
  588. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +0 -0
  589. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +0 -0
  590. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +0 -0
  591. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/gdshader-DkwncUOv.js +0 -0
  592. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/genie-D0YGMca9.js +0 -0
  593. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +0 -0
  594. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +0 -0
  595. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +0 -0
  596. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/github-dark-DHJKELXO.js +0 -0
  597. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
  598. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
  599. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
  600. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/github-light-DAi9KRSo.js +0 -0
  601. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +0 -0
  602. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
  603. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/gleam-BspZqrRM.js +0 -0
  604. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
  605. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +0 -0
  606. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/glsl-DplSGwfg.js +0 -0
  607. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/gn-n2N0HUVH.js +0 -0
  608. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +0 -0
  609. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/go-Dn2_MT6a.js +0 -0
  610. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/graphql-ChdNCCLP.js +0 -0
  611. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/groovy-gcz8RCvz.js +0 -0
  612. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
  613. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
  614. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
  615. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
  616. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
  617. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
  618. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/hack-CaT9iCJl.js +0 -0
  619. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/haml-B8DHNrY2.js +0 -0
  620. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/handlebars-BL8al0AC.js +0 -0
  621. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/haskell-Df6bDoY_.js +0 -0
  622. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/haxe-CzTSHFRz.js +0 -0
  623. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/hcl-BWvSN4gD.js +0 -0
  624. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/hjson-D5-asLiD.js +0 -0
  625. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +0 -0
  626. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/houston-DnULxvSX.js +0 -0
  627. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/html-GMplVEZG.js +0 -0
  628. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +0 -0
  629. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/http-jrhK8wxY.js +0 -0
  630. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/hurl-irOxFIW8.js +0 -0
  631. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +0 -0
  632. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/hy-DFXneXwc.js +0 -0
  633. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/imba-DGztddWO.js +0 -0
  634. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/index-BpoLgcEt.js +0 -0
  635. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/index-CzV_vCfu.css +0 -0
  636. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/index-DI2oedCt.js +0 -0
  637. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/ini-BEwlwnbL.js +0 -0
  638. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/init-Gi6I4Gst.js +0 -0
  639. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  640. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  641. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  642. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  643. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  644. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  645. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  646. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/java-CylS5w8V.js +0 -0
  647. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/javascript-wDzz0qaB.js +0 -0
  648. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +0 -0
  649. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/jison-wvAkD_A8.js +0 -0
  650. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/json-Cp-IABpG.js +0 -0
  651. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/json5-C9tS-k6U.js +0 -0
  652. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/jsonc-Des-eS-w.js +0 -0
  653. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +0 -0
  654. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +0 -0
  655. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/jssm-C2t-YnRu.js +0 -0
  656. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/jsx-g9-lgVsj.js +0 -0
  657. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/julia-CxzCAyBv.js +0 -0
  658. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
  659. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
  660. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
  661. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/katex-D2lIc1rk.css +0 -0
  662. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/kdl-DV7GczEv.js +0 -0
  663. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +0 -0
  664. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/kusto-DZf3V79B.js +0 -0
  665. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/laserwave-DUszq2jm.js +0 -0
  666. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/latex-B4uzh10-.js +0 -0
  667. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/lean-BZvkOJ9d.js +0 -0
  668. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/less-B1dDrJ26.js +0 -0
  669. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +0 -0
  670. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/liquid-DYVedYrR.js +0 -0
  671. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/llvm-BtvRca6l.js +0 -0
  672. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/log-2UxHyX5q.js +0 -0
  673. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/logo-BtOb2qkB.js +0 -0
  674. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/lua-BbnMAYS6.js +0 -0
  675. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/luau-C-HG3fhB.js +0 -0
  676. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/make-CHLpvVh8.js +0 -0
  677. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/markdown-Cvjx9yec.js +0 -0
  678. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/marko-DZsq8hO1.js +0 -0
  679. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +0 -0
  680. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
  681. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
  682. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +0 -0
  683. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
  684. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/matlab-D7o27uSR.js +0 -0
  685. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/mdc-DUICxH0z.js +0 -0
  686. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +0 -0
  687. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B2P5VJ9v.css +0 -0
  688. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +0 -0
  689. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/min-dark-CafNBF8u.js +0 -0
  690. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/min-light-CTRr51gU.js +0 -0
  691. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +0 -0
  692. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/mojo-B93PlW-d.js +0 -0
  693. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/monokai-D4h5O-jR.js +0 -0
  694. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/moonbit-Ba13S78F.js +0 -0
  695. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/move-Bu9oaDYs.js +0 -0
  696. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/narrat-DRg8JJMk.js +0 -0
  697. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +0 -0
  698. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/nginx-DknmC5AR.js +0 -0
  699. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/night-owl-C39BiMTA.js +0 -0
  700. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/nim-CVrawwO9.js +0 -0
  701. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/nix-CwoSXNpI.js +0 -0
  702. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/nord-Ddv68eIx.js +0 -0
  703. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/nushell-C-sUppwS.js +0 -0
  704. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +0 -0
  705. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +0 -0
  706. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +0 -0
  707. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
  708. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/one-light-PoHY5YXO.js +0 -0
  709. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/openscad-C4EeE6gA.js +0 -0
  710. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +0 -0
  711. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/pascal-D93ZcfNL.js +0 -0
  712. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/perl-C0TMdlhV.js +0 -0
  713. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/php-CDn_0X-4.js +0 -0
  714. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/pkl-u5AG7uiY.js +0 -0
  715. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/plastic-3e1v2bzS.js +0 -0
  716. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/plsql-ChMvpjG-.js +0 -0
  717. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/po-BTJTHyun.js +0 -0
  718. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +0 -0
  719. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/polar-C0HS_06l.js +0 -0
  720. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/postcss-CXtECtnM.js +0 -0
  721. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +0 -0
  722. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/powershell-Dpen1YoG.js +0 -0
  723. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/prisma-Dd19v3D-.js +0 -0
  724. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/prolog-CbFg5uaA.js +0 -0
  725. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/proto-C7zT0LnQ.js +0 -0
  726. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/pug-CGlum2m_.js +0 -0
  727. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/puppet-BMWR74SV.js +0 -0
  728. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/purescript-CklMAg4u.js +0 -0
  729. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/python-B6aJPvgy.js +0 -0
  730. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/qml-3beO22l8.js +0 -0
  731. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +0 -0
  732. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/qss-IeuSbFQv.js +0 -0
  733. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/r-Dspwwk_N.js +0 -0
  734. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/racket-BqYA7rlc.js +0 -0
  735. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/raku-DXvB9xmW.js +0 -0
  736. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/razor-C1TweQQi.js +0 -0
  737. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/red-bN70gL4F.js +0 -0
  738. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/reg-C-SQnVFl.js +0 -0
  739. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +0 -0
  740. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/rel-C3B-1QV4.js +0 -0
  741. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/riscv-BM1_JUlF.js +0 -0
  742. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
  743. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
  744. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +0 -0
  745. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +0 -0
  746. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/rst-B0xPkSld.js +0 -0
  747. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/ruby-BvKwtOVI.js +0 -0
  748. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/rust-B1yitclQ.js +0 -0
  749. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/sas-cz2c8ADy.js +0 -0
  750. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +0 -0
  751. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/scala-C151Ov-r.js +0 -0
  752. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/scheme-C98Dy4si.js +0 -0
  753. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/scss-OYdSNvt2.js +0 -0
  754. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +0 -0
  755. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
  756. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/shellscript-Yzrsuije.js +0 -0
  757. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/shellsession-BADoaaVG.js +0 -0
  758. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +0 -0
  759. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +0 -0
  760. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +0 -0
  761. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +0 -0
  762. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +0 -0
  763. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +0 -0
  764. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/solidity-rGO070M0.js +0 -0
  765. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/soy-Brmx7dQM.js +0 -0
  766. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/sparql-rVzFXLq3.js +0 -0
  767. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/splunk-BtCnVYZw.js +0 -0
  768. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/sql-BLtJtn59.js +0 -0
  769. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +0 -0
  770. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/stata-BH5u7GGu.js +0 -0
  771. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +0 -0
  772. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/svelte-zxCyuUbr.js +0 -0
  773. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/swift-Dg5xB15N.js +0 -0
  774. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +0 -0
  775. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +0 -0
  776. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/systemd-4A_iFExJ.js +0 -0
  777. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/talonscript-CkByrt1z.js +0 -0
  778. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/tasl-QIJgUcNo.js +0 -0
  779. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/tcl-dwOrl1Do.js +0 -0
  780. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/templ-W15q3VgB.js +0 -0
  781. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/terraform-BETggiCN.js +0 -0
  782. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/tex-CvyZ59Mk.js +0 -0
  783. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/tokyo-night-hegEt444.js +0 -0
  784. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/toml-vGWfd6FD.js +0 -0
  785. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +0 -0
  786. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/tsv-B_m7g4N7.js +0 -0
  787. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/tsx-COt5Ahok.js +0 -0
  788. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/turtle-BsS91CYL.js +0 -0
  789. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/twig-CO9l9SDP.js +0 -0
  790. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +0 -0
  791. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/typespec-BGHnOYBU.js +0 -0
  792. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/typst-DHCkPAjA.js +0 -0
  793. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/v-BcVCzyr7.js +0 -0
  794. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/vala-CsfeWuGM.js +0 -0
  795. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/vb-D17OF-Vu.js +0 -0
  796. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/verilog-BQ8w6xss.js +0 -0
  797. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/vesper-DU1UobuO.js +0 -0
  798. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +0 -0
  799. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/viml-CJc9bBzg.js +0 -0
  800. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
  801. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
  802. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +0 -0
  803. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/vue-DN_0RTcg.js +0 -0
  804. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +0 -0
  805. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +0 -0
  806. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/vyper-CDx5xZoG.js +0 -0
  807. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +0 -0
  808. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/wasm-MzD3tlZU.js +0 -0
  809. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/wenyan-BV7otONQ.js +0 -0
  810. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +0 -0
  811. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +0 -0
  812. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/wit-5i3qLPDT.js +0 -0
  813. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +0 -0
  814. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/xml-sdJ4AIDG.js +0 -0
  815. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/xsl-CtQFsRM5.js +0 -0
  816. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/yaml-Buea-lGh.js +0 -0
  817. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +0 -0
  818. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/assets/zig-VOosw3JB.js +0 -0
  819. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
  820. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
  821. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
  822. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
  823. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
  824. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
  825. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
  826. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
  827. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
  828. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
  829. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
  830. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
  831. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
  832. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
  833. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
  834. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
  835. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
  836. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
  837. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
  838. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
  839. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
  840. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
  841. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/static/logo.png +0 -0
  842. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/store/__init__.py +0 -0
  843. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/web/store/sessions.py +0 -0
  844. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/wire/__init__.py +0 -0
  845. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/wire/file.py +0 -0
  846. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
  847. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/wire/protocol.py +0 -0
  848. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/wire/root_hub.py +0 -0
  849. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/wire/serde.py +0 -0
  850. {pythinker_code-0.24.0 → pythinker_code-0.25.0}/src/pythinker_code/wire/server.py +0 -0
  851. {pythinker_code-0.24.0 → pythinker_code-0.25.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.24.0
3
+ Version: 0.25.0
4
4
  Summary: Pythinker Code is your next CLI agent.
5
5
  Keywords: cli,agent,ai,coding-assistant,llm,claude,openai,terminal
6
6
  Author: Mohamed Elkholy
@@ -28,7 +28,7 @@ Requires-Dist: loguru>=0.6.0,<0.7
28
28
  Requires-Dist: prompt-toolkit==3.0.52
29
29
  Requires-Dist: pillow==12.2.0
30
30
  Requires-Dist: pyyaml==6.0.3
31
- Requires-Dist: rich==14.2.0
31
+ Requires-Dist: rich==15.0.0
32
32
  Requires-Dist: certifi>=2025.10.5
33
33
  Requires-Dist: click==8.3.0
34
34
  Requires-Dist: pyperclip==1.11.0
@@ -115,15 +115,16 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
115
115
 
116
116
  ---
117
117
 
118
- ## 🆕 What's New in 0.24.0
118
+ ## 🆕 What's New in 0.25.0
119
119
 
120
- - **Update prompt is now wired and highlighted.** The blocking 4-choice update menu was defined but never invoked users only ever saw the passive toast. It now runs before the auto-update path in every interactive session, and the status-line notice renders in bold bright-yellow.
121
- - **Complete native installer `Fetch` fix.** The `.exe`, `.deb`, and `.rpm` builds now bundle both `trafilatura` and `justext` data files so `Fetch` no longer crashes with `FileNotFoundError` on stoplists in native installs. PyPI / `pip install` was unaffected.
122
- - **Atomic "latest" release gating.** `/releases/latest` is no longer flipped until every platform asset is attached, preventing the in-app updater from serving a partially-built release.
123
- - **Smarter `/update` command.** Gets a fresh PyPI version and verifies the platform binary exists on the release before initiating a native upgrade.
124
- - **Repository transferred to TechMatrix-labs.** All URLs now point to `github.com/TechMatrix-labs/pythinker-code`.
120
+ - **`Fetch` re-checks every redirect hop against the SSRF guard.** Redirects were followed without re-validating the destination, so a public URL could redirect to a link-local address (e.g. a cloud metadata endpoint) and slip past the guard. Every hop is now re-validated, closing the public→link-local bypass.
121
+ - **Web domain allowlist for `Fetch` and `Search`.** Set `web.allowed_domains` to restrict which hosts the web tools may reach `Fetch` (every redirect hop included) and `Search` reject anything off the list. Leave it unset to keep web access unrestricted.
122
+ - **Crash-consistent background tasks.** Task state is serialised under a cross-process lock, terminal updates route through a single finalizer, and recovery reconciles records left divergent by a crash or kill without clobbering a live agent. Bash output is capped (default 50 MiB), kills escalate SIGTERM→SIGKILL, and aged terminal tasks are pruned (default 7 days).
123
+ - **Calmer TUI with live tool feedback.** Tool calls show a "preparing" row during approval, stream shell output as a running tail, and render a live Markdown preview as the model writes. The todo list no longer renders twice mid-turn, links open through a detached launcher, and the terminal is restored to a sane state on `SIGTERM`/`SIGQUIT` and at exit.
124
+ - **Steadier agent loop.** The model is nudged when a turn ends on a bare statement of intent, steered away from blocking on one background task while siblings run, and a `SetTodoList` whose todos arrive as a JSON string is parsed transparently instead of failing validation.
125
+ - **Unified report rendering.** Code review, verify, and security-review output share one standardized renderer, including `report` blocks emitted by skills and agents.
125
126
 
126
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.24.0`, or use the native installer for your platform from the [Releases page](https://github.com/TechMatrix-labs/pythinker-code/releases/latest).
127
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.25.0`, or use the native installer for your platform from the [Releases page](https://github.com/TechMatrix-labs/pythinker-code/releases/latest).
127
128
 
128
129
 
129
130
  ---
@@ -213,7 +214,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
213
214
 
214
215
  | Platform | Recommended install | Artifact source |
215
216
  |---|---|---|
216
- | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.24.0.exe` from [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
217
+ | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.25.0.exe` from [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
217
218
  | **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> / <img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux">** | `curl -fsSL https://pythinker.com/install.sh \| bash` | native tarball from [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
218
219
  | **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> — Homebrew** | `brew install TechMatrix-labs/pythinker/pythinker-code` | auto-published Homebrew tap |
219
220
  | **<img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux"> — system package** | Download the `.deb` or `.rpm` for your distro below | [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
@@ -238,7 +239,7 @@ pythinker # start the interactive TUI
238
239
 
239
240
  ### 🪟 Windows — native installer
240
241
 
241
- `PythinkerSetup-0.24.0.exe` is a signed* Inno Setup wizard. Installs per-user
242
+ `PythinkerSetup-0.25.0.exe` is a signed* Inno Setup wizard. Installs per-user
242
243
  into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
243
244
  PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
244
245
  the change. **No UAC prompt.**
@@ -249,13 +250,13 @@ irm https://pythinker.com/install.ps1 | iex
249
250
 
250
251
  # Or manually download the installer + checksum from the Releases page,
251
252
  # verify with Get-FileHash, then run:
252
- .\PythinkerSetup-0.24.0.exe
253
+ .\PythinkerSetup-0.25.0.exe
253
254
 
254
255
  # Open a fresh PowerShell
255
256
  pythinker --version
256
257
  ```
257
258
 
258
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.24.0.exe /ALLUSERS`
259
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.25.0.exe /ALLUSERS`
259
260
  installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
260
261
 
261
262
  **Upgrade:** `pythinker update` from inside the running app — it downloads
@@ -306,26 +307,26 @@ attached to every GitHub Release.
306
307
 
307
308
  ```sh
308
309
  # Debian / Ubuntu (x86_64)
309
- sudo dpkg -i pythinker-code_0.24.0_amd64.deb
310
+ sudo dpkg -i pythinker-code_0.25.0_amd64.deb
310
311
  sudo apt-get install -f # only if dpkg reports missing deps
311
312
 
312
313
  # Debian / Ubuntu (ARM64)
313
- sudo dpkg -i pythinker-code_0.24.0_arm64.deb
314
+ sudo dpkg -i pythinker-code_0.25.0_arm64.deb
314
315
 
315
316
  # Fedora / RHEL / openSUSE (x86_64)
316
- curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.24.0/pythinker-code-0.24.0.x86_64.rpm
317
- curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.24.0/pythinker-code-0.24.0.x86_64.rpm.sha256
318
- sha256sum -c pythinker-code-0.24.0.x86_64.rpm.sha256
317
+ curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.25.0/pythinker-code-0.25.0.x86_64.rpm
318
+ curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.25.0/pythinker-code-0.25.0.x86_64.rpm.sha256
319
+ sha256sum -c pythinker-code-0.25.0.x86_64.rpm.sha256
319
320
  # Fedora / RHEL:
320
- sudo dnf install ./pythinker-code-0.24.0.x86_64.rpm
321
+ sudo dnf install ./pythinker-code-0.25.0.x86_64.rpm
321
322
  # openSUSE:
322
- sudo zypper install ./pythinker-code-0.24.0.x86_64.rpm
323
+ sudo zypper install ./pythinker-code-0.25.0.x86_64.rpm
323
324
 
324
325
  # Fedora / RHEL (aarch64)
325
- curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.24.0/pythinker-code-0.24.0.aarch64.rpm
326
- curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.24.0/pythinker-code-0.24.0.aarch64.rpm.sha256
327
- sha256sum -c pythinker-code-0.24.0.aarch64.rpm.sha256
328
- sudo dnf install ./pythinker-code-0.24.0.aarch64.rpm
326
+ curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.25.0/pythinker-code-0.25.0.aarch64.rpm
327
+ curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.25.0/pythinker-code-0.25.0.aarch64.rpm.sha256
328
+ sha256sum -c pythinker-code-0.25.0.aarch64.rpm.sha256
329
+ sudo dnf install ./pythinker-code-0.25.0.aarch64.rpm
329
330
  ```
330
331
 
331
332
  Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
@@ -334,8 +335,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
334
335
  **Verify before install:**
335
336
 
336
337
  ```sh
337
- sha256sum -c pythinker-code_0.24.0_amd64.deb.sha256 # Debian/Ubuntu
338
- sha256sum -c pythinker-code-0.24.0.x86_64.rpm.sha256 # Fedora/RHEL
338
+ sha256sum -c pythinker-code_0.25.0_amd64.deb.sha256 # Debian/Ubuntu
339
+ sha256sum -c pythinker-code-0.25.0.x86_64.rpm.sha256 # Fedora/RHEL
339
340
  ```
340
341
 
341
342
  **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
@@ -365,7 +366,7 @@ at `~/.local/bin/pythinker`.
365
366
  curl -fsSL https://pythinker.com/install.sh | bash
366
367
 
367
368
  # Pin a specific version
368
- curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.24.0
369
+ curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.25.0
369
370
 
370
371
  # Custom prefix (defaults to $HOME/.local)
371
372
  curl -fsSL https://pythinker.com/install.sh | bash -s -- --prefix /opt/pythinker
@@ -50,15 +50,16 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
50
50
 
51
51
  ---
52
52
 
53
- ## 🆕 What's New in 0.24.0
53
+ ## 🆕 What's New in 0.25.0
54
54
 
55
- - **Update prompt is now wired and highlighted.** The blocking 4-choice update menu was defined but never invoked users only ever saw the passive toast. It now runs before the auto-update path in every interactive session, and the status-line notice renders in bold bright-yellow.
56
- - **Complete native installer `Fetch` fix.** The `.exe`, `.deb`, and `.rpm` builds now bundle both `trafilatura` and `justext` data files so `Fetch` no longer crashes with `FileNotFoundError` on stoplists in native installs. PyPI / `pip install` was unaffected.
57
- - **Atomic "latest" release gating.** `/releases/latest` is no longer flipped until every platform asset is attached, preventing the in-app updater from serving a partially-built release.
58
- - **Smarter `/update` command.** Gets a fresh PyPI version and verifies the platform binary exists on the release before initiating a native upgrade.
59
- - **Repository transferred to TechMatrix-labs.** All URLs now point to `github.com/TechMatrix-labs/pythinker-code`.
55
+ - **`Fetch` re-checks every redirect hop against the SSRF guard.** Redirects were followed without re-validating the destination, so a public URL could redirect to a link-local address (e.g. a cloud metadata endpoint) and slip past the guard. Every hop is now re-validated, closing the public→link-local bypass.
56
+ - **Web domain allowlist for `Fetch` and `Search`.** Set `web.allowed_domains` to restrict which hosts the web tools may reach `Fetch` (every redirect hop included) and `Search` reject anything off the list. Leave it unset to keep web access unrestricted.
57
+ - **Crash-consistent background tasks.** Task state is serialised under a cross-process lock, terminal updates route through a single finalizer, and recovery reconciles records left divergent by a crash or kill without clobbering a live agent. Bash output is capped (default 50 MiB), kills escalate SIGTERM→SIGKILL, and aged terminal tasks are pruned (default 7 days).
58
+ - **Calmer TUI with live tool feedback.** Tool calls show a "preparing" row during approval, stream shell output as a running tail, and render a live Markdown preview as the model writes. The todo list no longer renders twice mid-turn, links open through a detached launcher, and the terminal is restored to a sane state on `SIGTERM`/`SIGQUIT` and at exit.
59
+ - **Steadier agent loop.** The model is nudged when a turn ends on a bare statement of intent, steered away from blocking on one background task while siblings run, and a `SetTodoList` whose todos arrive as a JSON string is parsed transparently instead of failing validation.
60
+ - **Unified report rendering.** Code review, verify, and security-review output share one standardized renderer, including `report` blocks emitted by skills and agents.
60
61
 
61
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.24.0`, or use the native installer for your platform from the [Releases page](https://github.com/TechMatrix-labs/pythinker-code/releases/latest).
62
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.25.0`, or use the native installer for your platform from the [Releases page](https://github.com/TechMatrix-labs/pythinker-code/releases/latest).
62
63
 
63
64
 
64
65
  ---
@@ -148,7 +149,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
148
149
 
149
150
  | Platform | Recommended install | Artifact source |
150
151
  |---|---|---|
151
- | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.24.0.exe` from [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
152
+ | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.25.0.exe` from [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
152
153
  | **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> / <img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux">** | `curl -fsSL https://pythinker.com/install.sh \| bash` | native tarball from [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
153
154
  | **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> — Homebrew** | `brew install TechMatrix-labs/pythinker/pythinker-code` | auto-published Homebrew tap |
154
155
  | **<img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux"> — system package** | Download the `.deb` or `.rpm` for your distro below | [Releases](https://github.com/TechMatrix-labs/pythinker-code/releases/latest) |
@@ -173,7 +174,7 @@ pythinker # start the interactive TUI
173
174
 
174
175
  ### 🪟 Windows — native installer
175
176
 
176
- `PythinkerSetup-0.24.0.exe` is a signed* Inno Setup wizard. Installs per-user
177
+ `PythinkerSetup-0.25.0.exe` is a signed* Inno Setup wizard. Installs per-user
177
178
  into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
178
179
  PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
179
180
  the change. **No UAC prompt.**
@@ -184,13 +185,13 @@ irm https://pythinker.com/install.ps1 | iex
184
185
 
185
186
  # Or manually download the installer + checksum from the Releases page,
186
187
  # verify with Get-FileHash, then run:
187
- .\PythinkerSetup-0.24.0.exe
188
+ .\PythinkerSetup-0.25.0.exe
188
189
 
189
190
  # Open a fresh PowerShell
190
191
  pythinker --version
191
192
  ```
192
193
 
193
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.24.0.exe /ALLUSERS`
194
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.25.0.exe /ALLUSERS`
194
195
  installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
195
196
 
196
197
  **Upgrade:** `pythinker update` from inside the running app — it downloads
@@ -241,26 +242,26 @@ attached to every GitHub Release.
241
242
 
242
243
  ```sh
243
244
  # Debian / Ubuntu (x86_64)
244
- sudo dpkg -i pythinker-code_0.24.0_amd64.deb
245
+ sudo dpkg -i pythinker-code_0.25.0_amd64.deb
245
246
  sudo apt-get install -f # only if dpkg reports missing deps
246
247
 
247
248
  # Debian / Ubuntu (ARM64)
248
- sudo dpkg -i pythinker-code_0.24.0_arm64.deb
249
+ sudo dpkg -i pythinker-code_0.25.0_arm64.deb
249
250
 
250
251
  # Fedora / RHEL / openSUSE (x86_64)
251
- curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.24.0/pythinker-code-0.24.0.x86_64.rpm
252
- curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.24.0/pythinker-code-0.24.0.x86_64.rpm.sha256
253
- sha256sum -c pythinker-code-0.24.0.x86_64.rpm.sha256
252
+ curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.25.0/pythinker-code-0.25.0.x86_64.rpm
253
+ curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.25.0/pythinker-code-0.25.0.x86_64.rpm.sha256
254
+ sha256sum -c pythinker-code-0.25.0.x86_64.rpm.sha256
254
255
  # Fedora / RHEL:
255
- sudo dnf install ./pythinker-code-0.24.0.x86_64.rpm
256
+ sudo dnf install ./pythinker-code-0.25.0.x86_64.rpm
256
257
  # openSUSE:
257
- sudo zypper install ./pythinker-code-0.24.0.x86_64.rpm
258
+ sudo zypper install ./pythinker-code-0.25.0.x86_64.rpm
258
259
 
259
260
  # Fedora / RHEL (aarch64)
260
- curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.24.0/pythinker-code-0.24.0.aarch64.rpm
261
- curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.24.0/pythinker-code-0.24.0.aarch64.rpm.sha256
262
- sha256sum -c pythinker-code-0.24.0.aarch64.rpm.sha256
263
- sudo dnf install ./pythinker-code-0.24.0.aarch64.rpm
261
+ curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.25.0/pythinker-code-0.25.0.aarch64.rpm
262
+ curl -LO https://github.com/TechMatrix-labs/pythinker-code/releases/download/v0.25.0/pythinker-code-0.25.0.aarch64.rpm.sha256
263
+ sha256sum -c pythinker-code-0.25.0.aarch64.rpm.sha256
264
+ sudo dnf install ./pythinker-code-0.25.0.aarch64.rpm
264
265
  ```
265
266
 
266
267
  Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
@@ -269,8 +270,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
269
270
  **Verify before install:**
270
271
 
271
272
  ```sh
272
- sha256sum -c pythinker-code_0.24.0_amd64.deb.sha256 # Debian/Ubuntu
273
- sha256sum -c pythinker-code-0.24.0.x86_64.rpm.sha256 # Fedora/RHEL
273
+ sha256sum -c pythinker-code_0.25.0_amd64.deb.sha256 # Debian/Ubuntu
274
+ sha256sum -c pythinker-code-0.25.0.x86_64.rpm.sha256 # Fedora/RHEL
274
275
  ```
275
276
 
276
277
  **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
@@ -300,7 +301,7 @@ at `~/.local/bin/pythinker`.
300
301
  curl -fsSL https://pythinker.com/install.sh | bash
301
302
 
302
303
  # Pin a specific version
303
- curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.24.0
304
+ curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.25.0
304
305
 
305
306
  # Custom prefix (defaults to $HOME/.local)
306
307
  curl -fsSL https://pythinker.com/install.sh | bash -s -- --prefix /opt/pythinker
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pythinker-code"
3
- version = "0.24.0"
3
+ version = "0.25.0"
4
4
  description = "Pythinker Code is your next CLI agent."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -32,7 +32,7 @@ dependencies = [
32
32
  "prompt-toolkit==3.0.52",
33
33
  "pillow==12.2.0",
34
34
  "pyyaml==6.0.3",
35
- "rich==14.2.0",
35
+ "rich==15.0.0",
36
36
  "certifi>=2025.10.5",
37
37
  "click==8.3.0",
38
38
  "pyperclip==1.11.0",
@@ -175,4 +175,16 @@ reviewr = "reviewr"
175
175
  fnd = "fnd"
176
176
  edn = "edn"
177
177
  Encrypter = "Encrypter"
178
+ # Hex session IDs (e.g. 06ba6c38) contain "ba".
179
+ ba = "ba"
178
180
  uest = "uest"
181
+ # Verb stems in the unfinished-intent detection regex (soul/pythinkersoul.py)
182
+ # match word prefixes ("prepar" → prepare/preparing); kept as bare stems on
183
+ # purpose so they cover every inflection.
184
+ prepar = "prepar"
185
+ generat = "generat"
186
+ provid = "provid"
187
+ updat = "updat"
188
+ examin = "examin"
189
+ continu = "continu"
190
+
@@ -15,6 +15,20 @@ GitHub Releases page; `0.8.0` is the new starting line.
15
15
 
16
16
  ## Unreleased
17
17
 
18
+ ## 0.25.0 (2026-05-29)
19
+
20
+ ### What changed in this release
21
+
22
+ - **`Fetch` now re-checks every redirect hop against the SSRF guard.** Redirects were followed without re-validating the destination, so a public URL could redirect to a link-local address (e.g. a cloud metadata endpoint) and slip past the guard that only inspected the original URL. Redirects are now followed manually and every hop is re-validated, closing the public→link-local bypass.
23
+ - **Web domain allowlist for `Fetch` and `Search`.** A new `web.allowed_domains` config option restricts which hosts the web tools may reach. When set, `Fetch` (including every redirect hop) and `Search` reject any host outside the list; leave it unset to keep web access unrestricted.
24
+ - **Crash-consistent background tasks.** Task and agent-task state is now serialised under a cross-process per-task lock, so a worker heartbeat landing mid-update is no longer lost. Every terminal agent-task update routes through a single finalizer that writes the authoritative runtime first, and recovery reconciles records left divergent by a crash or kill without ever clobbering a live agent. Bash task output is capped (default 50 MiB) so a chatty task cannot exhaust disk, terminated processes get a SIGTERM→SIGKILL fallback, and aged terminal task directories are pruned (default 7 days).
25
+ - **Calmer, more reliable TUI.** The todo list no longer renders twice during an in-flight turn, OAuth and feedback links open through a detached browser launcher so browser output cannot corrupt the terminal or steal key presses, and the terminal is restored to a sane state on `SIGTERM`/`SIGQUIT` and at exit.
26
+ - **Live tool-execution feedback.** Tool calls now show a calm "preparing" row during approval and hooks, switch to a live status once execution starts, and stream shell `stdout`/`stderr` as a running tail before the final result lands. The composing assistant block renders a live Markdown preview as the model writes, code blocks gain clearer framing, and the active spinner uses smoother braille dots.
27
+ - **Steadier agent loop.** The model is nudged once when a turn ends on a bare statement of intent with no tool call, steered away from blocking on a single background task while siblings are still running, and a `SetTodoList` call whose todos arrive as a JSON-encoded string is now parsed transparently instead of failing validation.
28
+ - **Unified report rendering.** Code review, verify, and security-review output now share one standardized, muted report renderer — including `report` blocks emitted by skills and agents; a malformed block falls back to ordinary markdown rather than being swallowed.
29
+
30
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.25.0`, or use the native installer for your OS (see the README install table).
31
+
18
32
  ## 0.24.0 (2026-05-28)
19
33
 
20
34
  ### What changed in this release
@@ -51,6 +51,7 @@ agent:
51
51
  Use to run a read-only diff-focused code review or code-reviewr-derived PR artifact workflow on the current branch.
52
52
  allowed_tools:
53
53
  - "pythinker_code.tools.shell:Shell"
54
+ - "pythinker_code.tools.todo:SetTodoList"
54
55
  - "pythinker_code.tools.file:ReadFile"
55
56
  - "pythinker_code.tools.file:Grep"
56
57
  - "pythinker_code.tools.skill:ReadSkill"
@@ -36,6 +36,7 @@ agent:
36
36
  Use for failing tests, stack traces, runtime errors, flaky failures, or debugging requests where root cause should be found before editing code.
37
37
  allowed_tools:
38
38
  - "pythinker_code.tools.shell:Shell"
39
+ - "pythinker_code.tools.todo:SetTodoList"
39
40
  - "pythinker_code.tools.file:ReadFile"
40
41
  - "pythinker_code.tools.file:Grep"
41
42
  exclude_tools:
@@ -44,6 +44,7 @@ agent:
44
44
  Use to run a diff-only security review on the current branch. Can run in parallel with `code-reviewer`.
45
45
  allowed_tools:
46
46
  - "pythinker_code.tools.shell:Shell"
47
+ - "pythinker_code.tools.todo:SetTodoList"
47
48
  - "pythinker_code.tools.file:ReadFile"
48
49
  - "pythinker_code.tools.file:Grep"
49
50
  - "pythinker_code.tools.web:SearchWeb"
@@ -39,6 +39,21 @@ For any codebase, architecture, debugging, security, performance, planning, or "
39
39
 
40
40
  **Professional handoff format:** For substantial tasks, keep a visible plan/todo and structure work as `context -> assessment -> plan -> execution -> verification -> residual risks`. Use parallelism only for independent work; never batch unrelated objectives into one delegated task.
41
41
 
42
+ **Report format (severity-scored findings):** When you present a code review, security audit, or any other set of severity-scored findings to the user, emit it as a single fenced ` ```report ` block containing JSON — the shell renders it as a clean, consistently styled report (and degrades to a plain code block elsewhere). Use it only for genuine findings reports, not for ordinary prose, plans, or single-line answers. Schema:
43
+
44
+ ```report
45
+ {
46
+ "title": "Code Review Results",
47
+ "scope": "one-line context, e.g. files/area reviewed",
48
+ "findings": [
49
+ {"title": "short headline", "severity": "critical|high|medium|low|info", "location": "path:line-range", "body": "what and why, with the suggested fix"}
50
+ ],
51
+ "note": "optional closing 'most actionable' line"
52
+ }
53
+ ```
54
+
55
+ `title` is required; `scope`, `note`, `location`, and `body` are optional. `severity` must be one of the five listed values. Order does not matter — the renderer groups by severity (critical first) and derives the summary tally. Put narrative prose outside the block, before or after it.
56
+
42
57
  # Engineering Discipline
43
58
 
44
59
  These principles govern every engineering response. They override speed: a slow right answer beats a fast wrong one.
@@ -173,7 +188,7 @@ The operating environment is not in a sandbox. Any actions you do will immediate
173
188
 
174
189
  ## Date and Time
175
190
 
176
- The current date and time in ISO format is `${PYTHINKER_NOW}`. This is only a reference for you when searching the web, or checking file modification time, etc. If you need the exact time, use Shell tool with proper command.
191
+ The current date and time in ISO format is `${PYTHINKER_NOW}`. Treat this as the authoritative present — it reflects the real "now", which is later than your training data suggests. Anchor all reasoning about the current date, the year, recency, and what counts as the "latest" version or release to `${PYTHINKER_NOW}`; do not fall back on an earlier year you might assume from training. Use it as your reference when searching the web or checking file modification times. If you need the exact time, use the Shell tool with a proper command.
177
192
 
178
193
  ## Working Directory
179
194
 
@@ -246,6 +261,15 @@ Identify the skills that are likely to be useful for the tasks you are currently
246
261
 
247
262
  Only read skill details when needed to conserve the context window.
248
263
 
264
+ # Output Formatting
265
+
266
+ Your responses are rendered as Markdown in a terminal. Emit well-formed Markdown so it renders cleanly:
267
+
268
+ - **Tables:** put the header row on its own line, the `|---|---|` delimiter row on the immediately following line (no blank line between them), and one row per line. Never glue a table onto adjacent prose (e.g. `Findings| Col |`) and never cram multiple rows onto one line. Leave a blank line before and after the table.
269
+ - Prefer a short bullet list over a table when there are only a few items or any cell is long; reserve tables for genuinely tabular data with short cells.
270
+ - **Code fences are for code only.** Use triple-backtick blocks tagged with a language (for example, `python` or `toml`) solely for source, config, or commands — one snippet per block. Never wrap a prose report, finding list, checklist, or ASCII box in a fence to align or frame it; write it as normal Markdown (headings, bullets, tables) so it renders cleanly.
271
+ - **Status icons sparingly.** A check/cross/dot can mark a single headline result, but do not prefix every line with one. Use plain words for severity and outcomes (e.g. `High`, `PASS`, `0 findings`). The terminal renders icons as calm monochrome glyphs only outside code fences — another reason not to box reports.
272
+
249
273
  # Ultimate Reminders
250
274
 
251
275
  At any time, you should be HELPFUL, CONCISE, and ACCURATE. Be thorough in your actions — test what you build, verify what you change — not in your explanations.
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import time
5
- import webbrowser
6
5
  from dataclasses import dataclass
7
6
  from typing import Any, cast
8
7
 
@@ -150,7 +149,9 @@ async def login_github_feedback(
150
149
  )
151
150
  if open_browser:
152
151
  try:
153
- webbrowser.open(auth.verification_uri)
152
+ from pythinker_code.utils.term import open_url_in_browser
153
+
154
+ open_url_in_browser(auth.verification_uri)
154
155
  except Exception as exc:
155
156
  logger.warning("Failed to open browser: {error}", error=exc)
156
157
  yield OAuthEvent("waiting", "Waiting for GitHub authorization...")
@@ -10,7 +10,6 @@ import sys
10
10
  import tempfile
11
11
  import time
12
12
  import uuid
13
- import webbrowser
14
13
  from collections.abc import AsyncGenerator, AsyncIterator
15
14
  from contextlib import asynccontextmanager, suppress
16
15
  from dataclasses import dataclass
@@ -660,7 +659,9 @@ async def login_pythinker_code(
660
659
  )
661
660
  if open_browser:
662
661
  try:
663
- webbrowser.open(auth.verification_uri_complete)
662
+ from pythinker_code.utils.term import open_url_in_browser
663
+
664
+ open_url_in_browser(auth.verification_uri_complete)
664
665
  except Exception as exc:
665
666
  logger.warning("Failed to open browser: {error}", error=exc)
666
667
 
@@ -7,7 +7,6 @@ import hashlib
7
7
  import json
8
8
  import secrets
9
9
  import time
10
- import webbrowser
11
10
  from collections.abc import AsyncIterator
12
11
  from dataclasses import dataclass
13
12
  from typing import Any, cast
@@ -329,7 +328,9 @@ async def _wait_for_browser_code(open_browser: bool = True) -> tuple[str, str, s
329
328
 
330
329
  auth_url = _build_authorize_url(redirect_uri=redirect_uri, pkce=pkce, state=state)
331
330
  if open_browser:
332
- webbrowser.open(auth_url)
331
+ from pythinker_code.utils.term import open_url_in_browser
332
+
333
+ open_url_in_browser(auth_url)
333
334
 
334
335
  try:
335
336
  code, error = await asyncio.wait_for(result, timeout=15 * 60)