pythinker-code 0.31.0__tar.gz → 0.32.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 (859) hide show
  1. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/PKG-INFO +25 -26
  2. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/README.md +24 -25
  3. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/pyproject.toml +1 -1
  4. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/CHANGELOG.md +11 -0
  5. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/acp/session.py +1 -1
  6. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/__init__.py +12 -0
  7. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/config.py +9 -0
  8. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/scratchpad.py +43 -0
  9. pythinker_code-0.32.0/src/pythinker_code/session_cleanup.py +260 -0
  10. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/pythinkersoul.py +19 -7
  11. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/shell/__init__.py +6 -6
  12. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/print/__init__.py +1 -1
  13. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/__init__.py +1 -1
  14. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/pyinstaller.py +7 -5
  15. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/_baseUniq-DC1S-iCZ.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/_baseUniq-Bifyk8NN.js +1 -1
  16. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/arc-CNIxC9rp.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/arc-BYpkXSz8.js +1 -1
  17. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-D22AlBUK.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-CyKYl5gX.js +1 -1
  18. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-DVpSAL1I.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-CEgNKzwz.js +1 -1
  19. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-DY7MqqYI.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-BHjzrlC6.js +1 -1
  20. pythinker_code-0.32.0/src/pythinker_code/web/static/assets/channel-6SvD-Q3G.js +1 -0
  21. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-B_-G4pwz.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-DfkR0dZ9.js +1 -1
  22. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-B_k2a5Jq.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-BGiC5VZW.js +1 -1
  23. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-MBuDy8EG.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-DxVGxC1F.js +1 -1
  24. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-DfmDFpc4.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-zN0LfjGZ.js +1 -1
  25. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-C1QitF6h.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-BzWNV9cS.js +1 -1
  26. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-B8pwIVZJ.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-BHLGK8_b.js +1 -1
  27. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-BageYt4Z.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-Da0J0B84.js +1 -1
  28. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-DhaLY-N2.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-Ct8dBGJH.js +1 -1
  29. pythinker_code-0.32.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-D8_PjZVG.js +1 -0
  30. pythinker_code-0.32.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-D8_PjZVG.js +1 -0
  31. pythinker_code-0.32.0/src/pythinker_code/web/static/assets/clone-CFEh_EP3.js +1 -0
  32. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-CNl1SkHd.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-Cxm_b-b-.js +1 -1
  33. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-DhjvW-0t.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-C5xz2pZw.js +1 -1
  34. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/cytoscape.esm-BP8Niknm.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/cytoscape.esm-DCXCrMWk.js +1 -1
  35. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-BmhRJqGX.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-DNG-R8yA.js +1 -1
  36. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-B973QVta.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-CNOaVFaY.js +1 -1
  37. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-cZ4eUsCm.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-Bwwcc_vK.js +1 -1
  38. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-BvfODp16.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-DvnIsCVi.js +1 -1
  39. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-CK_SQro3.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-Dl05OpEj.js +1 -1
  40. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-BaBdXQpa.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-BltqvXtV.js +1 -1
  41. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-JygtVfFR.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-DL7PiVmE.js +1 -1
  42. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-DqHdVsF_.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-CH4ZKKZj.js +1 -1
  43. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/graph-CqNFO2CC.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/graph-B4Kzwv80.js +1 -1
  44. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/index--MUKtzM2.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/index-BkNQzVTK.js +1 -1
  45. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/index-DtuQ8kEJ.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/index-DJ8OfNNk.js +2 -2
  46. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/index-LuO0e-kY.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/index-Z_xsZ3W6.js +1 -1
  47. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-Cg2t3pTH.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-ZAfE1Ir5.js +1 -1
  48. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-D9UsLYjz.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-CRmMzq2d.js +1 -1
  49. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-B1ccdtFp.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-B8Li9_1d.js +1 -1
  50. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/layout-CWAKOsro.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/layout-DX5pYCeV.js +1 -1
  51. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/linear-Bi5qHtyA.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/linear-pptMzQ-K.js +1 -1
  52. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-CIhTmKgJ.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-b7xUvj9U.js +7 -7
  53. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/mermaid.core-BSyEijZn.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/mermaid.core-DCw3BYz7.js +5 -5
  54. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/min-DcfRBc53.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/min-tMI5897w.js +1 -1
  55. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-CwWyeU_z.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-C6aZL2vS.js +1 -1
  56. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-DFRPs9ex.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-vNbhzK3J.js +1 -1
  57. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-DZ11KGHj.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-bBv6bv7G.js +1 -1
  58. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-DgcpMAX5.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-CGSWL41c.js +1 -1
  59. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-C_VstXTy.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-fmgNCgCs.js +1 -1
  60. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-OQ6FDYjg.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-DuYLVv43.js +1 -1
  61. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-BlkYAfhC.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-DSpubNLv.js +1 -1
  62. pythinker_code-0.32.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-I3HpLmKV.js +1 -0
  63. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-v6F5SqKJ.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-_GniQiss.js +1 -1
  64. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-DxTEDpFb.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-FD_NWnVZ.js +1 -1
  65. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-C-t5auMI.js → pythinker_code-0.32.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-CWP4yJ_Q.js +1 -1
  66. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/index.html +1 -1
  67. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/wire/__init__.py +4 -1
  68. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/channel-DYd7h4UI.js +0 -1
  69. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-C4KNVG4M.js +0 -1
  70. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-C4KNVG4M.js +0 -1
  71. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/clone-Drzw88ja.js +0 -1
  72. pythinker_code-0.31.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-D-CmmJDB.js +0 -1
  73. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/LICENSE +0 -0
  74. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/NOTICE +0 -0
  75. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/__init__.py +0 -0
  76. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/__main__.py +0 -0
  77. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/acp/AGENTS.md +0 -0
  78. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/acp/__init__.py +0 -0
  79. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/acp/convert.py +0 -0
  80. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/acp/host.py +0 -0
  81. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/acp/mcp.py +0 -0
  82. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/acp/server.py +0 -0
  83. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/acp/tools.py +0 -0
  84. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/acp/types.py +0 -0
  85. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/acp/version.py +0 -0
  86. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/agents/default/agent.yaml +0 -0
  87. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/agents/default/code_reviewer.yaml +0 -0
  88. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/agents/default/coder.yaml +0 -0
  89. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/agents/default/debugger.yaml +0 -0
  90. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/agents/default/explore.yaml +0 -0
  91. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/agents/default/implementer.yaml +0 -0
  92. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/agents/default/judge.yaml +0 -0
  93. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/agents/default/plan.yaml +0 -0
  94. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/agents/default/review.yaml +0 -0
  95. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/agents/default/security_reviewer.yaml +0 -0
  96. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/agents/default/system.md +0 -0
  97. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/agents/default/verifier.yaml +0 -0
  98. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
  99. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/agentspec.py +0 -0
  100. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/app.py +0 -0
  101. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
  102. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/approval_runtime/models.py +0 -0
  103. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
  104. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/auth/__init__.py +0 -0
  105. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
  106. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/auth/browser_login_page.py +0 -0
  107. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/auth/deepseek.py +0 -0
  108. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/auth/github_feedback.py +0 -0
  109. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/auth/lm_studio.py +0 -0
  110. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/auth/minimax.py +0 -0
  111. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/auth/oauth.py +0 -0
  112. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/auth/ollama.py +0 -0
  113. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/auth/openai.py +0 -0
  114. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/auth/opencode_go.py +0 -0
  115. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/auth/openrouter.py +0 -0
  116. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/auth/platforms.py +0 -0
  117. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/background/__init__.py +0 -0
  118. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/background/agent_runner.py +0 -0
  119. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/background/ids.py +0 -0
  120. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/background/manager.py +0 -0
  121. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/background/models.py +0 -0
  122. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/background/store.py +0 -0
  123. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/background/summary.py +0 -0
  124. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/background/worker.py +0 -0
  125. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/__main__.py +0 -0
  126. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/_lazy_group.py +0 -0
  127. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/debug.py +0 -0
  128. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/export.py +0 -0
  129. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/info.py +0 -0
  130. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/mcp.py +0 -0
  131. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/plugin.py +0 -0
  132. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/review.py +0 -0
  133. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/secscan.py +0 -0
  134. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/security_scan.py +0 -0
  135. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/skill.py +0 -0
  136. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/toad.py +0 -0
  137. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/update.py +0 -0
  138. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/vis.py +0 -0
  139. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/cli/web.py +0 -0
  140. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/constant.py +0 -0
  141. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/events.py +0 -0
  142. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/exception.py +0 -0
  143. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/execution_profiles.py +0 -0
  144. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/extensions.py +0 -0
  145. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/feedback.py +0 -0
  146. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/feedback_repo.py +0 -0
  147. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/file_restore.py +0 -0
  148. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/hooks/__init__.py +0 -0
  149. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/hooks/config.py +0 -0
  150. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/hooks/engine.py +0 -0
  151. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/hooks/events.py +0 -0
  152. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/hooks/runner.py +0 -0
  153. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/llm.py +0 -0
  154. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/memory/__init__.py +0 -0
  155. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/memory/consolidation.py +0 -0
  156. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/memory/harvest.py +0 -0
  157. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/memory/recall.py +0 -0
  158. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/memory/recap.py +0 -0
  159. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/memory/retriever.py +0 -0
  160. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/memory/sanitize.py +0 -0
  161. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/metadata.py +0 -0
  162. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/native.py +0 -0
  163. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/notifications/__init__.py +0 -0
  164. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/notifications/llm.py +0 -0
  165. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/notifications/manager.py +0 -0
  166. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/notifications/models.py +0 -0
  167. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/notifications/notifier.py +0 -0
  168. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/notifications/store.py +0 -0
  169. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/notifications/wire.py +0 -0
  170. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/plugin/__init__.py +0 -0
  171. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/plugin/manager.py +0 -0
  172. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/plugin/tool.py +0 -0
  173. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/project_memory.py +0 -0
  174. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/prompt_templates.py +0 -0
  175. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/prompts/__init__.py +0 -0
  176. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/prompts/compact.md +0 -0
  177. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/prompts/init.md +0 -0
  178. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/py.typed +0 -0
  179. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/session.py +0 -0
  180. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/session_fork.py +0 -0
  181. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/session_recap.py +0 -0
  182. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/session_state.py +0 -0
  183. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/share.py +0 -0
  184. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skill/__init__.py +0 -0
  185. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
  186. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skill/flow/d2.py +0 -0
  187. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
  188. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skill/lockfile.py +0 -0
  189. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skills/check-impl-against-spec/SKILL.md +0 -0
  190. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skills/create-pr/SKILL.md +0 -0
  191. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skills/diagnose-ci-failures/SKILL.md +0 -0
  192. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skills/fix-errors/SKILL.md +0 -0
  193. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skills/implement-specs/SKILL.md +0 -0
  194. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skills/pr-walkthrough/SKILL.md +0 -0
  195. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
  196. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skills/reproduce-bug-report/SKILL.md +0 -0
  197. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skills/resolve-merge-conflicts/SKILL.md +0 -0
  198. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skills/review-pr/SKILL.md +0 -0
  199. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
  200. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skills/spec-driven-implementation/SKILL.md +0 -0
  201. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skills/write-product-spec/SKILL.md +0 -0
  202. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/skills/write-tech-spec/SKILL.md +0 -0
  203. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/__init__.py +0 -0
  204. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/agent.py +0 -0
  205. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/approval.py +0 -0
  206. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/btw.py +0 -0
  207. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/compaction.py +0 -0
  208. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/compaction_restore.py +0 -0
  209. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/context.py +0 -0
  210. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/deliberation.py +0 -0
  211. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/denwarenji.py +0 -0
  212. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/dynamic_injection.py +0 -0
  213. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
  214. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
  215. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
  216. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/message.py +0 -0
  217. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/permission.py +0 -0
  218. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/slash.py +0 -0
  219. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/soul/toolset.py +0 -0
  220. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/subagents/__init__.py +0 -0
  221. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/subagents/builder.py +0 -0
  222. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/subagents/core.py +0 -0
  223. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/subagents/discovery.py +0 -0
  224. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/subagents/git_context.py +0 -0
  225. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/subagents/models.py +0 -0
  226. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/subagents/output.py +0 -0
  227. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/subagents/registry.py +0 -0
  228. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/subagents/runner.py +0 -0
  229. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/subagents/store.py +0 -0
  230. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/telemetry/__init__.py +0 -0
  231. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/telemetry/config.py +0 -0
  232. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/telemetry/crash.py +0 -0
  233. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/telemetry/errors.py +0 -0
  234. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/telemetry/metrics.py +0 -0
  235. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/telemetry/otel.py +0 -0
  236. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/telemetry/sentry.py +0 -0
  237. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/telemetry/sink.py +0 -0
  238. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/thinking.py +0 -0
  239. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/AGENTS.md +0 -0
  240. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/__init__.py +0 -0
  241. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/agent/__init__.py +0 -0
  242. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/agent/description.md +0 -0
  243. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/ask_user/__init__.py +0 -0
  244. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
  245. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/background/__init__.py +0 -0
  246. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/background/handoff.md +0 -0
  247. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/background/input.md +0 -0
  248. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/background/list.md +0 -0
  249. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/background/output.md +0 -0
  250. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/background/stop.md +0 -0
  251. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/display.py +0 -0
  252. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
  253. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
  254. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/__init__.py +0 -0
  255. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/glob.md +0 -0
  256. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/glob.py +0 -0
  257. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/grep.md +0 -0
  258. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/grep_local.py +0 -0
  259. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
  260. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/read.md +0 -0
  261. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/read.py +0 -0
  262. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/read_media.md +0 -0
  263. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/read_media.py +0 -0
  264. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/replace.md +0 -0
  265. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/replace.py +0 -0
  266. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/utils.py +0 -0
  267. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/write.md +0 -0
  268. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/file/write.py +0 -0
  269. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/memory/__init__.py +0 -0
  270. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/memory/memory.md +0 -0
  271. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/plan/__init__.py +0 -0
  272. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/plan/description.md +0 -0
  273. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/plan/enter.py +0 -0
  274. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
  275. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/plan/handoff.py +0 -0
  276. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
  277. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/scratchpad/__init__.py +0 -0
  278. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/scratchpad/scratchpad_tool.md +0 -0
  279. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/shell/bash.md +0 -0
  280. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
  281. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/skill/__init__.py +0 -0
  282. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/skill/description.md +0 -0
  283. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/test.py +0 -0
  284. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/think/__init__.py +0 -0
  285. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/think/think.md +0 -0
  286. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
  287. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
  288. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/utils.py +0 -0
  289. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/web/__init__.py +0 -0
  290. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/web/_allowlist.py +0 -0
  291. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/web/fetch.md +0 -0
  292. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/web/fetch.py +0 -0
  293. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/web/search.md +0 -0
  294. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/tools/web/search.py +0 -0
  295. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/__init__.py +0 -0
  296. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
  297. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/print/visualize.py +0 -0
  298. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
  299. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
  300. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
  301. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
  302. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/diff.py +0 -0
  303. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/dynamic_border.py +0 -0
  304. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
  305. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
  306. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/markdown.py +0 -0
  307. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
  308. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/panel.py +0 -0
  309. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
  310. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/report.py +0 -0
  311. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
  312. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
  313. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
  314. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/console.py +0 -0
  315. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/debug.py +0 -0
  316. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/design_system.py +0 -0
  317. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/echo.py +0 -0
  318. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
  319. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/glyphs.py +0 -0
  320. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
  321. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
  322. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
  323. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
  324. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/motion.py +0 -0
  325. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
  326. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
  327. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/prompt.py +0 -0
  328. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/render_constants.py +0 -0
  329. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/replay.py +0 -0
  330. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/selector.py +0 -0
  331. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
  332. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
  333. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
  334. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
  335. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
  336. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
  337. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
  338. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
  339. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/setup.py +0 -0
  340. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/slash.py +0 -0
  341. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/spacing.py +0 -0
  342. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/spinner_words.py +0 -0
  343. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/startup.py +0 -0
  344. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
  345. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tips.py +0 -0
  346. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
  347. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/_file_diff.py +0 -0
  348. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -0
  349. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
  350. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
  351. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
  352. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
  353. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
  354. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
  355. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
  356. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
  357. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
  358. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
  359. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/skill.py +0 -0
  360. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
  361. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
  362. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -0
  363. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
  364. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/update.py +0 -0
  365. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/update_orchestrator.py +0 -0
  366. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/usage.py +0 -0
  367. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
  368. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
  369. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
  370. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
  371. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
  372. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
  373. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
  374. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
  375. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
  376. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
  377. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
  378. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
  379. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
  380. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/visualize/_activity_tree.py +0 -0
  381. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
  382. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +0 -0
  383. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
  384. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/visualize/_dialog_shell.py +0 -0
  385. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
  386. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +0 -0
  387. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +0 -0
  388. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
  389. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/visualize/_transcript.py +0 -0
  390. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
  391. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/terminal_capabilities.py +0 -0
  392. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/theme.py +0 -0
  393. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/ui/tui_config.py +0 -0
  394. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
  395. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/__init__.py +0 -0
  396. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/aiohttp.py +0 -0
  397. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/aioqueue.py +0 -0
  398. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/broadcast.py +0 -0
  399. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/changelog.py +0 -0
  400. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/clipboard.py +0 -0
  401. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/datetime.py +0 -0
  402. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/diff.py +0 -0
  403. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/editor.py +0 -0
  404. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/environment.py +0 -0
  405. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/envvar.py +0 -0
  406. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/export.py +0 -0
  407. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/file_filter.py +0 -0
  408. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/frontmatter.py +0 -0
  409. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/io.py +0 -0
  410. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/logging.py +0 -0
  411. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/media_tags.py +0 -0
  412. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/message.py +0 -0
  413. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/path.py +0 -0
  414. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/proctitle.py +0 -0
  415. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/proxy.py +0 -0
  416. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
  417. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/rich/columns.py +0 -0
  418. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/rich/diff_render.py +0 -0
  419. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
  420. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
  421. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
  422. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
  423. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/sensitive.py +0 -0
  424. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/server.py +0 -0
  425. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/signals.py +0 -0
  426. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/slashcmd.py +0 -0
  427. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/sleep_inhibitor.py +0 -0
  428. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/string.py +0 -0
  429. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
  430. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/term.py +0 -0
  431. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/utils/typing.py +0 -0
  432. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/__init__.py +0 -0
  433. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/api/__init__.py +0 -0
  434. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/api/sessions.py +0 -0
  435. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/api/statistics.py +0 -0
  436. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/api/system.py +0 -0
  437. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/app.py +0 -0
  438. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-CY1rtwrX.js +0 -0
  439. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/static/assets/index-DSRInNnm.css +0 -0
  440. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/static/assets/index-DgmTI2M_.js +0 -0
  441. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  442. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  443. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  444. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  445. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  446. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  447. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  448. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/vis/static/index.html +0 -0
  449. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/__init__.py +0 -0
  450. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/api/__init__.py +0 -0
  451. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/api/config.py +0 -0
  452. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/api/open_in.py +0 -0
  453. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/api/sessions.py +0 -0
  454. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/app.py +0 -0
  455. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/auth.py +0 -0
  456. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/models.py +0 -0
  457. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/runner/__init__.py +0 -0
  458. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/runner/messages.py +0 -0
  459. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/runner/process.py +0 -0
  460. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/runner/worker.py +0 -0
  461. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/_headers +0 -0
  462. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  463. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  464. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  465. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  466. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  467. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  468. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  469. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  470. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  471. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  472. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  473. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  474. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  475. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  476. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  477. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  478. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  479. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  480. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  481. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  482. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  483. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  484. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  485. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  486. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  487. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  488. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  489. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  490. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  491. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  492. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  493. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  494. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  495. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  496. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  497. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  498. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  499. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  500. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  501. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  502. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  503. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  504. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  505. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  506. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  507. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  508. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  509. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  510. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  511. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  512. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  513. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  514. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  515. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  516. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  517. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  518. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  519. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  520. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  521. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/abap-BdImnpbu.js +0 -0
  522. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +0 -0
  523. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/ada-bCR0ucgS.js +0 -0
  524. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +0 -0
  525. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +0 -0
  526. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +0 -0
  527. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/apache-Pmp26Uib.js +0 -0
  528. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/apex-D8_7TLub.js +0 -0
  529. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/apl-dKokRX4l.js +0 -0
  530. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/applescript-Co6uUVPk.js +0 -0
  531. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/ara-BRHolxvo.js +0 -0
  532. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +0 -0
  533. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/asm-D_Q5rh1f.js +0 -0
  534. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/astro-CbQHKStN.js +0 -0
  535. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +0 -0
  536. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/awk-DMzUqQB5.js +0 -0
  537. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +0 -0
  538. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +0 -0
  539. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/bat-BkioyH1T.js +0 -0
  540. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/beancount-k_qm7-4y.js +0 -0
  541. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/berry-uYugtg8r.js +0 -0
  542. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/bibtex-CHM0blh-.js +0 -0
  543. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/bicep-Bmn6On1c.js +0 -0
  544. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/blade-D4QpJJKB.js +0 -0
  545. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/bsl-BO_Y6i37.js +0 -0
  546. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/c-BIGW1oBm.js +0 -0
  547. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/c3-VCDPK7BO.js +0 -0
  548. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +0 -0
  549. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/cairo-KRGpt6FW.js +0 -0
  550. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
  551. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
  552. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
  553. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
  554. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/clarity-D53aC0YG.js +0 -0
  555. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/clojure-P80f7IUj.js +0 -0
  556. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/cmake-D1j8_8rp.js +0 -0
  557. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/cobol-nwyudZeR.js +0 -0
  558. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +0 -0
  559. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +0 -0
  560. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/coffee-Ch7k5sss.js +0 -0
  561. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +0 -0
  562. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/coq-DkFqJrB1.js +0 -0
  563. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/cpp-CofmeUqb.js +0 -0
  564. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/crystal-tKQVLTB8.js +0 -0
  565. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/csharp-K5feNrxe.js +0 -0
  566. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/css-DPfMkruS.js +0 -0
  567. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/csv-fuZLfV_i.js +0 -0
  568. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/cue-D82EKSYY.js +0 -0
  569. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/cypher-COkxafJQ.js +0 -0
  570. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/d-85-TOEBH.js +0 -0
  571. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +0 -0
  572. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/dart-CF10PKvl.js +0 -0
  573. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/dax-CEL-wOlO.js +0 -0
  574. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +0 -0
  575. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +0 -0
  576. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/diff-D97Zzqfu.js +0 -0
  577. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/docker-BcOcwvcX.js +0 -0
  578. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/dotenv-Da5cRb03.js +0 -0
  579. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/dracula-BzJJZx-M.js +0 -0
  580. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +0 -0
  581. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +0 -0
  582. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/edge-BkV0erSs.js +0 -0
  583. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/elixir-CDX3lj18.js +0 -0
  584. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/elm-DbKCFpqz.js +0 -0
  585. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +0 -0
  586. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/erb-BOJIQeun.js +0 -0
  587. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/erlang-DsQrWhSR.js +0 -0
  588. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +0 -0
  589. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +0 -0
  590. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/fennel-BYunw83y.js +0 -0
  591. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/fish-BvzEVeQv.js +0 -0
  592. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/fluent-C4IJs8-o.js +0 -0
  593. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
  594. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
  595. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +0 -0
  596. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +0 -0
  597. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +0 -0
  598. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/gdshader-DkwncUOv.js +0 -0
  599. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/genie-D0YGMca9.js +0 -0
  600. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +0 -0
  601. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +0 -0
  602. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +0 -0
  603. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/github-dark-DHJKELXO.js +0 -0
  604. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
  605. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
  606. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
  607. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/github-light-DAi9KRSo.js +0 -0
  608. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +0 -0
  609. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
  610. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/gleam-BspZqrRM.js +0 -0
  611. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
  612. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +0 -0
  613. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/glsl-DplSGwfg.js +0 -0
  614. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/gn-n2N0HUVH.js +0 -0
  615. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +0 -0
  616. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/go-Dn2_MT6a.js +0 -0
  617. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/graphql-ChdNCCLP.js +0 -0
  618. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/groovy-gcz8RCvz.js +0 -0
  619. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
  620. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
  621. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
  622. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
  623. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
  624. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
  625. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/hack-CaT9iCJl.js +0 -0
  626. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/haml-B8DHNrY2.js +0 -0
  627. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/handlebars-BL8al0AC.js +0 -0
  628. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/haskell-Df6bDoY_.js +0 -0
  629. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/haxe-CzTSHFRz.js +0 -0
  630. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/hcl-BWvSN4gD.js +0 -0
  631. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/hjson-D5-asLiD.js +0 -0
  632. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +0 -0
  633. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/houston-DnULxvSX.js +0 -0
  634. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/html-GMplVEZG.js +0 -0
  635. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +0 -0
  636. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/http-jrhK8wxY.js +0 -0
  637. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/hurl-irOxFIW8.js +0 -0
  638. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +0 -0
  639. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/hy-DFXneXwc.js +0 -0
  640. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/imba-DGztddWO.js +0 -0
  641. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/index-BpoLgcEt.js +0 -0
  642. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/index-CzV_vCfu.css +0 -0
  643. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/index-DI2oedCt.js +0 -0
  644. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/ini-BEwlwnbL.js +0 -0
  645. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/init-Gi6I4Gst.js +0 -0
  646. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  647. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  648. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  649. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  650. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  651. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  652. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  653. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/java-CylS5w8V.js +0 -0
  654. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/javascript-wDzz0qaB.js +0 -0
  655. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +0 -0
  656. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/jison-wvAkD_A8.js +0 -0
  657. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/json-Cp-IABpG.js +0 -0
  658. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/json5-C9tS-k6U.js +0 -0
  659. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/jsonc-Des-eS-w.js +0 -0
  660. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +0 -0
  661. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +0 -0
  662. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/jssm-C2t-YnRu.js +0 -0
  663. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/jsx-g9-lgVsj.js +0 -0
  664. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/julia-CxzCAyBv.js +0 -0
  665. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
  666. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
  667. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
  668. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/katex-D2lIc1rk.css +0 -0
  669. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/kdl-DV7GczEv.js +0 -0
  670. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +0 -0
  671. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/kusto-DZf3V79B.js +0 -0
  672. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/laserwave-DUszq2jm.js +0 -0
  673. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/latex-B4uzh10-.js +0 -0
  674. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/lean-BZvkOJ9d.js +0 -0
  675. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/less-B1dDrJ26.js +0 -0
  676. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +0 -0
  677. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/liquid-DYVedYrR.js +0 -0
  678. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/llvm-BtvRca6l.js +0 -0
  679. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/log-2UxHyX5q.js +0 -0
  680. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/logo-BtOb2qkB.js +0 -0
  681. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/lua-BbnMAYS6.js +0 -0
  682. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/luau-C-HG3fhB.js +0 -0
  683. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/make-CHLpvVh8.js +0 -0
  684. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/markdown-Cvjx9yec.js +0 -0
  685. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/marko-DZsq8hO1.js +0 -0
  686. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +0 -0
  687. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
  688. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
  689. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +0 -0
  690. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
  691. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/matlab-D7o27uSR.js +0 -0
  692. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/mdc-DUICxH0z.js +0 -0
  693. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +0 -0
  694. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-YVZJy7__.css +0 -0
  695. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +0 -0
  696. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/min-dark-CafNBF8u.js +0 -0
  697. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/min-light-CTRr51gU.js +0 -0
  698. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +0 -0
  699. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/mojo-B93PlW-d.js +0 -0
  700. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/monokai-D4h5O-jR.js +0 -0
  701. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/moonbit-Ba13S78F.js +0 -0
  702. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/move-Bu9oaDYs.js +0 -0
  703. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/narrat-DRg8JJMk.js +0 -0
  704. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +0 -0
  705. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/nginx-DknmC5AR.js +0 -0
  706. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/night-owl-C39BiMTA.js +0 -0
  707. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/nim-CVrawwO9.js +0 -0
  708. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/nix-CwoSXNpI.js +0 -0
  709. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/nord-Ddv68eIx.js +0 -0
  710. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/nushell-C-sUppwS.js +0 -0
  711. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +0 -0
  712. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +0 -0
  713. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +0 -0
  714. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
  715. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/one-light-PoHY5YXO.js +0 -0
  716. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/openscad-C4EeE6gA.js +0 -0
  717. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +0 -0
  718. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/pascal-D93ZcfNL.js +0 -0
  719. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/perl-C0TMdlhV.js +0 -0
  720. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/php-CDn_0X-4.js +0 -0
  721. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/pkl-u5AG7uiY.js +0 -0
  722. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/plastic-3e1v2bzS.js +0 -0
  723. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/plsql-ChMvpjG-.js +0 -0
  724. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/po-BTJTHyun.js +0 -0
  725. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +0 -0
  726. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/polar-C0HS_06l.js +0 -0
  727. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/postcss-CXtECtnM.js +0 -0
  728. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +0 -0
  729. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/powershell-Dpen1YoG.js +0 -0
  730. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/prisma-Dd19v3D-.js +0 -0
  731. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/prolog-CbFg5uaA.js +0 -0
  732. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/proto-C7zT0LnQ.js +0 -0
  733. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/pug-CGlum2m_.js +0 -0
  734. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/puppet-BMWR74SV.js +0 -0
  735. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/purescript-CklMAg4u.js +0 -0
  736. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/python-B6aJPvgy.js +0 -0
  737. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/qml-3beO22l8.js +0 -0
  738. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +0 -0
  739. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/qss-IeuSbFQv.js +0 -0
  740. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/r-Dspwwk_N.js +0 -0
  741. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/racket-BqYA7rlc.js +0 -0
  742. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/raku-DXvB9xmW.js +0 -0
  743. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/razor-C1TweQQi.js +0 -0
  744. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/red-bN70gL4F.js +0 -0
  745. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/reg-C-SQnVFl.js +0 -0
  746. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +0 -0
  747. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/rel-C3B-1QV4.js +0 -0
  748. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/riscv-BM1_JUlF.js +0 -0
  749. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
  750. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
  751. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +0 -0
  752. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +0 -0
  753. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/rst-B0xPkSld.js +0 -0
  754. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/ruby-BvKwtOVI.js +0 -0
  755. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/rust-B1yitclQ.js +0 -0
  756. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/sas-cz2c8ADy.js +0 -0
  757. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +0 -0
  758. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/scala-C151Ov-r.js +0 -0
  759. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/scheme-C98Dy4si.js +0 -0
  760. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/scss-OYdSNvt2.js +0 -0
  761. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +0 -0
  762. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
  763. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/shellscript-Yzrsuije.js +0 -0
  764. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/shellsession-BADoaaVG.js +0 -0
  765. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +0 -0
  766. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +0 -0
  767. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +0 -0
  768. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +0 -0
  769. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +0 -0
  770. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +0 -0
  771. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/solidity-rGO070M0.js +0 -0
  772. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/soy-Brmx7dQM.js +0 -0
  773. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/sparql-rVzFXLq3.js +0 -0
  774. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/splunk-BtCnVYZw.js +0 -0
  775. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/sql-BLtJtn59.js +0 -0
  776. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +0 -0
  777. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/stata-BH5u7GGu.js +0 -0
  778. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +0 -0
  779. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/svelte-zxCyuUbr.js +0 -0
  780. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/swift-Dg5xB15N.js +0 -0
  781. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +0 -0
  782. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +0 -0
  783. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/systemd-4A_iFExJ.js +0 -0
  784. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/talonscript-CkByrt1z.js +0 -0
  785. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/tasl-QIJgUcNo.js +0 -0
  786. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/tcl-dwOrl1Do.js +0 -0
  787. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/templ-W15q3VgB.js +0 -0
  788. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/terraform-BETggiCN.js +0 -0
  789. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/tex-CvyZ59Mk.js +0 -0
  790. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/tokyo-night-hegEt444.js +0 -0
  791. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/toml-vGWfd6FD.js +0 -0
  792. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +0 -0
  793. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/tsv-B_m7g4N7.js +0 -0
  794. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/tsx-COt5Ahok.js +0 -0
  795. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/turtle-BsS91CYL.js +0 -0
  796. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/twig-CO9l9SDP.js +0 -0
  797. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +0 -0
  798. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/typespec-BGHnOYBU.js +0 -0
  799. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/typst-DHCkPAjA.js +0 -0
  800. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/v-BcVCzyr7.js +0 -0
  801. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/vala-CsfeWuGM.js +0 -0
  802. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/vb-D17OF-Vu.js +0 -0
  803. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/verilog-BQ8w6xss.js +0 -0
  804. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/vesper-DU1UobuO.js +0 -0
  805. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +0 -0
  806. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/viml-CJc9bBzg.js +0 -0
  807. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
  808. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
  809. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +0 -0
  810. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/vue-DN_0RTcg.js +0 -0
  811. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +0 -0
  812. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +0 -0
  813. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/vyper-CDx5xZoG.js +0 -0
  814. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +0 -0
  815. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/wasm-MzD3tlZU.js +0 -0
  816. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/wenyan-BV7otONQ.js +0 -0
  817. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +0 -0
  818. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +0 -0
  819. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/wit-5i3qLPDT.js +0 -0
  820. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +0 -0
  821. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/xml-sdJ4AIDG.js +0 -0
  822. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/xsl-CtQFsRM5.js +0 -0
  823. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/yaml-Buea-lGh.js +0 -0
  824. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +0 -0
  825. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/assets/zig-VOosw3JB.js +0 -0
  826. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
  827. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
  828. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
  829. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
  830. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
  831. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
  832. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
  833. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
  834. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
  835. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
  836. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
  837. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
  838. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
  839. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
  840. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
  841. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
  842. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
  843. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
  844. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
  845. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
  846. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
  847. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
  848. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/install.ps1 +0 -0
  849. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/install.sh +0 -0
  850. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/static/logo.png +0 -0
  851. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/store/__init__.py +0 -0
  852. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/web/store/sessions.py +0 -0
  853. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/wire/file.py +0 -0
  854. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
  855. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/wire/protocol.py +0 -0
  856. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/wire/root_hub.py +0 -0
  857. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/wire/serde.py +0 -0
  858. {pythinker_code-0.31.0 → pythinker_code-0.32.0}/src/pythinker_code/wire/server.py +0 -0
  859. {pythinker_code-0.31.0 → pythinker_code-0.32.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.31.0
3
+ Version: 0.32.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
@@ -79,7 +79,7 @@ Description-Content-Type: text/markdown
79
79
  [![License: Apache-2.0](https://img.shields.io/badge/License-Apache--2.0-16a34a.svg?style=for-the-badge)](https://github.com/Pythoughts-labs/pythinker-code/blob/main/LICENSE)
80
80
  [![CI](https://img.shields.io/github/actions/workflow/status/Pythoughts-labs/pythinker-code/ci-pythinker-cli.yml?branch=main&label=CI&style=for-the-badge&logo=githubactions&logoColor=white)](https://github.com/Pythoughts-labs/pythinker-code/actions/workflows/ci-pythinker-cli.yml?query=branch%3Amain)
81
81
 
82
- [![PyPI downloads](https://assets.piptrends.com/get-last-month-downloads-badge/pythinker-code.svg)](https://piptrends.com/package/pythinker-code)
82
+ [![PyPI Downloads](https://static.pepy.tech/personalized-badge/pythinker-code?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads)](https://pepy.tech/projects/pythinker-code)
83
83
  [![Code style: Ruff](https://img.shields.io/badge/code%20style-ruff-f59e0b.svg?style=flat-square&logo=ruff&logoColor=white)](https://docs.astral.sh/ruff/)
84
84
  [![ACP ready](https://img.shields.io/badge/ACP-ready-7c3aed.svg?style=flat-square)](https://github.com/agentclientprotocol/agent-client-protocol)
85
85
  [![MCP tools](https://img.shields.io/badge/MCP-tools-0891b2.svg?style=flat-square)](https://modelcontextprotocol.io/)
@@ -115,15 +115,14 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
115
115
 
116
116
  ---
117
117
 
118
- ## 🆕 What's New in 0.31.0
118
+ ## 🆕 What's New in 0.32.0
119
119
 
120
- - **Release promotion no longer stalls when the Homebrew tap is broken.** The `promote-release` workflow now gates only on platform assets and PyPI; a lagging or broken Homebrew tap emits a warning annotation but no longer blocks the GitHub Release from reaching Latest.
121
- - **Calmer, theme-aligned TUI rendering.** Transcript, recap, and tool-header output now use theme-standardized activity colors, and Markdown tables render as a bordered grid (wide tables no longer collapse into a stacked-record list).
122
- - **Auto-mode tool approval fails closed when unattended.** In auto/non-interactive runs, actions still needing approval are denied with guidance instead of waiting indefinitely; the `auto_deliberate_destructive_actions` setting extends this backstop to interactive `--yolo` sessions.
123
- - **Yolo + auto mode hardened against silent over-reach.** Entering plan mode requires confirmation in interactive `--yolo` sessions; a new `--no-yolo` flag overrides yolo globally; resuming a yolo/auto session surfaces a startup warning.
124
- - **`pythinker review` validates finding evidence.** Reviewflow assembles prompts from a shared security-knowledge manifest and validates findings without failing the whole review on invalid ones.
120
+ - **`pythinker mcp add` no longer crashes on Windows and Linux native builds.** `copy_metadata()` replaces the fragile `collect_data_files()` approach in all three PyInstaller specs, so `fastmcp` and `mcp` dist-info are bundled and `importlib.metadata` resolves correctly in frozen binaries.
121
+ - **Pythinker work directories are automatically gitignored on startup.** `.pythinker/`, `.pythinker-review/`, and `.pythinker-review-flow/` are silently added to the project's `.gitignore` when the agent starts inside a git repo, keeping the working tree clean.
122
+ - **Old sessions and plan files are swept on startup.** Archives older than `session_retention_days` (default 30) are removed non-interactively at launch. Set `session_retention_days = 0` to disable.
123
+ - **Windows upgrade version display fix.** Inno Setup now wipes `_internal` before installing new files, so in-place upgrades no longer show a stale version number or re-trigger the update prompt.
125
124
 
126
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.31.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
125
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.32.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
127
126
 
128
127
 
129
128
  ---
@@ -213,7 +212,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
213
212
 
214
213
  | Platform | Recommended install | Artifact source |
215
214
  |---|---|---|
216
- | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.31.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
215
+ | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.32.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
217
216
  | **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> / <img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux">** | `curl -fsSL https://pythinker.com/install.sh \| bash` | native tarball from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
218
217
  | **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> — Homebrew** | `brew install Pythoughts-labs/pythinker/pythinker-code` | auto-published Homebrew tap |
219
218
  | **🐳 Docker** | `docker run --rm -it ghcr.io/pythoughts-labs/pythinker-code` | GHCR multi-arch image |
@@ -241,7 +240,7 @@ pythinker # start the interactive TUI
241
240
 
242
241
  ### 🪟 Windows — native installer
243
242
 
244
- `PythinkerSetup-0.31.0.exe` is a signed* Inno Setup wizard. Installs per-user
243
+ `PythinkerSetup-0.32.0.exe` is a signed* Inno Setup wizard. Installs per-user
245
244
  into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
246
245
  PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
247
246
  the change. **No UAC prompt.**
@@ -252,13 +251,13 @@ irm https://pythinker.com/install.ps1 | iex
252
251
 
253
252
  # Or manually download the installer + checksum from the Releases page,
254
253
  # verify with Get-FileHash, then run:
255
- .\PythinkerSetup-0.31.0.exe
254
+ .\PythinkerSetup-0.32.0.exe
256
255
 
257
256
  # Open a fresh PowerShell
258
257
  pythinker --version
259
258
  ```
260
259
 
261
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.31.0.exe /ALLUSERS`
260
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.32.0.exe /ALLUSERS`
262
261
  installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
263
262
 
264
263
  **Upgrade:** `pythinker update` from inside the running app — it downloads
@@ -309,26 +308,26 @@ attached to every GitHub Release.
309
308
 
310
309
  ```sh
311
310
  # Debian / Ubuntu (x86_64)
312
- sudo dpkg -i pythinker-code_0.31.0_amd64.deb
311
+ sudo dpkg -i pythinker-code_0.32.0_amd64.deb
313
312
  sudo apt-get install -f # only if dpkg reports missing deps
314
313
 
315
314
  # Debian / Ubuntu (ARM64)
316
- sudo dpkg -i pythinker-code_0.31.0_arm64.deb
315
+ sudo dpkg -i pythinker-code_0.32.0_arm64.deb
317
316
 
318
317
  # Fedora / RHEL / openSUSE (x86_64)
319
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.31.0/pythinker-code-0.31.0.x86_64.rpm
320
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.31.0/pythinker-code-0.31.0.x86_64.rpm.sha256
321
- sha256sum -c pythinker-code-0.31.0.x86_64.rpm.sha256
318
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.32.0/pythinker-code-0.32.0.x86_64.rpm
319
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.32.0/pythinker-code-0.32.0.x86_64.rpm.sha256
320
+ sha256sum -c pythinker-code-0.32.0.x86_64.rpm.sha256
322
321
  # Fedora / RHEL:
323
- sudo dnf install ./pythinker-code-0.31.0.x86_64.rpm
322
+ sudo dnf install ./pythinker-code-0.32.0.x86_64.rpm
324
323
  # openSUSE:
325
- sudo zypper install ./pythinker-code-0.31.0.x86_64.rpm
324
+ sudo zypper install ./pythinker-code-0.32.0.x86_64.rpm
326
325
 
327
326
  # Fedora / RHEL (aarch64)
328
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.31.0/pythinker-code-0.31.0.aarch64.rpm
329
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.31.0/pythinker-code-0.31.0.aarch64.rpm.sha256
330
- sha256sum -c pythinker-code-0.31.0.aarch64.rpm.sha256
331
- sudo dnf install ./pythinker-code-0.31.0.aarch64.rpm
327
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.32.0/pythinker-code-0.32.0.aarch64.rpm
328
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.32.0/pythinker-code-0.32.0.aarch64.rpm.sha256
329
+ sha256sum -c pythinker-code-0.32.0.aarch64.rpm.sha256
330
+ sudo dnf install ./pythinker-code-0.32.0.aarch64.rpm
332
331
  ```
333
332
 
334
333
  Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
@@ -337,8 +336,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
337
336
  **Verify before install:**
338
337
 
339
338
  ```sh
340
- sha256sum -c pythinker-code_0.31.0_amd64.deb.sha256 # Debian/Ubuntu
341
- sha256sum -c pythinker-code-0.31.0.x86_64.rpm.sha256 # Fedora/RHEL
339
+ sha256sum -c pythinker-code_0.32.0_amd64.deb.sha256 # Debian/Ubuntu
340
+ sha256sum -c pythinker-code-0.32.0.x86_64.rpm.sha256 # Fedora/RHEL
342
341
  ```
343
342
 
344
343
  **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
@@ -14,7 +14,7 @@
14
14
  [![License: Apache-2.0](https://img.shields.io/badge/License-Apache--2.0-16a34a.svg?style=for-the-badge)](https://github.com/Pythoughts-labs/pythinker-code/blob/main/LICENSE)
15
15
  [![CI](https://img.shields.io/github/actions/workflow/status/Pythoughts-labs/pythinker-code/ci-pythinker-cli.yml?branch=main&label=CI&style=for-the-badge&logo=githubactions&logoColor=white)](https://github.com/Pythoughts-labs/pythinker-code/actions/workflows/ci-pythinker-cli.yml?query=branch%3Amain)
16
16
 
17
- [![PyPI downloads](https://assets.piptrends.com/get-last-month-downloads-badge/pythinker-code.svg)](https://piptrends.com/package/pythinker-code)
17
+ [![PyPI Downloads](https://static.pepy.tech/personalized-badge/pythinker-code?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads)](https://pepy.tech/projects/pythinker-code)
18
18
  [![Code style: Ruff](https://img.shields.io/badge/code%20style-ruff-f59e0b.svg?style=flat-square&logo=ruff&logoColor=white)](https://docs.astral.sh/ruff/)
19
19
  [![ACP ready](https://img.shields.io/badge/ACP-ready-7c3aed.svg?style=flat-square)](https://github.com/agentclientprotocol/agent-client-protocol)
20
20
  [![MCP tools](https://img.shields.io/badge/MCP-tools-0891b2.svg?style=flat-square)](https://modelcontextprotocol.io/)
@@ -50,15 +50,14 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
50
50
 
51
51
  ---
52
52
 
53
- ## 🆕 What's New in 0.31.0
53
+ ## 🆕 What's New in 0.32.0
54
54
 
55
- - **Release promotion no longer stalls when the Homebrew tap is broken.** The `promote-release` workflow now gates only on platform assets and PyPI; a lagging or broken Homebrew tap emits a warning annotation but no longer blocks the GitHub Release from reaching Latest.
56
- - **Calmer, theme-aligned TUI rendering.** Transcript, recap, and tool-header output now use theme-standardized activity colors, and Markdown tables render as a bordered grid (wide tables no longer collapse into a stacked-record list).
57
- - **Auto-mode tool approval fails closed when unattended.** In auto/non-interactive runs, actions still needing approval are denied with guidance instead of waiting indefinitely; the `auto_deliberate_destructive_actions` setting extends this backstop to interactive `--yolo` sessions.
58
- - **Yolo + auto mode hardened against silent over-reach.** Entering plan mode requires confirmation in interactive `--yolo` sessions; a new `--no-yolo` flag overrides yolo globally; resuming a yolo/auto session surfaces a startup warning.
59
- - **`pythinker review` validates finding evidence.** Reviewflow assembles prompts from a shared security-knowledge manifest and validates findings without failing the whole review on invalid ones.
55
+ - **`pythinker mcp add` no longer crashes on Windows and Linux native builds.** `copy_metadata()` replaces the fragile `collect_data_files()` approach in all three PyInstaller specs, so `fastmcp` and `mcp` dist-info are bundled and `importlib.metadata` resolves correctly in frozen binaries.
56
+ - **Pythinker work directories are automatically gitignored on startup.** `.pythinker/`, `.pythinker-review/`, and `.pythinker-review-flow/` are silently added to the project's `.gitignore` when the agent starts inside a git repo, keeping the working tree clean.
57
+ - **Old sessions and plan files are swept on startup.** Archives older than `session_retention_days` (default 30) are removed non-interactively at launch. Set `session_retention_days = 0` to disable.
58
+ - **Windows upgrade version display fix.** Inno Setup now wipes `_internal` before installing new files, so in-place upgrades no longer show a stale version number or re-trigger the update prompt.
60
59
 
61
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.31.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
60
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.32.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
62
61
 
63
62
 
64
63
  ---
@@ -148,7 +147,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
148
147
 
149
148
  | Platform | Recommended install | Artifact source |
150
149
  |---|---|---|
151
- | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.31.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
150
+ | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.32.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
152
151
  | **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> / <img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux">** | `curl -fsSL https://pythinker.com/install.sh \| bash` | native tarball from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
153
152
  | **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> — Homebrew** | `brew install Pythoughts-labs/pythinker/pythinker-code` | auto-published Homebrew tap |
154
153
  | **🐳 Docker** | `docker run --rm -it ghcr.io/pythoughts-labs/pythinker-code` | GHCR multi-arch image |
@@ -176,7 +175,7 @@ pythinker # start the interactive TUI
176
175
 
177
176
  ### 🪟 Windows — native installer
178
177
 
179
- `PythinkerSetup-0.31.0.exe` is a signed* Inno Setup wizard. Installs per-user
178
+ `PythinkerSetup-0.32.0.exe` is a signed* Inno Setup wizard. Installs per-user
180
179
  into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
181
180
  PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
182
181
  the change. **No UAC prompt.**
@@ -187,13 +186,13 @@ irm https://pythinker.com/install.ps1 | iex
187
186
 
188
187
  # Or manually download the installer + checksum from the Releases page,
189
188
  # verify with Get-FileHash, then run:
190
- .\PythinkerSetup-0.31.0.exe
189
+ .\PythinkerSetup-0.32.0.exe
191
190
 
192
191
  # Open a fresh PowerShell
193
192
  pythinker --version
194
193
  ```
195
194
 
196
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.31.0.exe /ALLUSERS`
195
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.32.0.exe /ALLUSERS`
197
196
  installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
198
197
 
199
198
  **Upgrade:** `pythinker update` from inside the running app — it downloads
@@ -244,26 +243,26 @@ attached to every GitHub Release.
244
243
 
245
244
  ```sh
246
245
  # Debian / Ubuntu (x86_64)
247
- sudo dpkg -i pythinker-code_0.31.0_amd64.deb
246
+ sudo dpkg -i pythinker-code_0.32.0_amd64.deb
248
247
  sudo apt-get install -f # only if dpkg reports missing deps
249
248
 
250
249
  # Debian / Ubuntu (ARM64)
251
- sudo dpkg -i pythinker-code_0.31.0_arm64.deb
250
+ sudo dpkg -i pythinker-code_0.32.0_arm64.deb
252
251
 
253
252
  # Fedora / RHEL / openSUSE (x86_64)
254
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.31.0/pythinker-code-0.31.0.x86_64.rpm
255
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.31.0/pythinker-code-0.31.0.x86_64.rpm.sha256
256
- sha256sum -c pythinker-code-0.31.0.x86_64.rpm.sha256
253
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.32.0/pythinker-code-0.32.0.x86_64.rpm
254
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.32.0/pythinker-code-0.32.0.x86_64.rpm.sha256
255
+ sha256sum -c pythinker-code-0.32.0.x86_64.rpm.sha256
257
256
  # Fedora / RHEL:
258
- sudo dnf install ./pythinker-code-0.31.0.x86_64.rpm
257
+ sudo dnf install ./pythinker-code-0.32.0.x86_64.rpm
259
258
  # openSUSE:
260
- sudo zypper install ./pythinker-code-0.31.0.x86_64.rpm
259
+ sudo zypper install ./pythinker-code-0.32.0.x86_64.rpm
261
260
 
262
261
  # Fedora / RHEL (aarch64)
263
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.31.0/pythinker-code-0.31.0.aarch64.rpm
264
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.31.0/pythinker-code-0.31.0.aarch64.rpm.sha256
265
- sha256sum -c pythinker-code-0.31.0.aarch64.rpm.sha256
266
- sudo dnf install ./pythinker-code-0.31.0.aarch64.rpm
262
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.32.0/pythinker-code-0.32.0.aarch64.rpm
263
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.32.0/pythinker-code-0.32.0.aarch64.rpm.sha256
264
+ sha256sum -c pythinker-code-0.32.0.aarch64.rpm.sha256
265
+ sudo dnf install ./pythinker-code-0.32.0.aarch64.rpm
267
266
  ```
268
267
 
269
268
  Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
@@ -272,8 +271,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
272
271
  **Verify before install:**
273
272
 
274
273
  ```sh
275
- sha256sum -c pythinker-code_0.31.0_amd64.deb.sha256 # Debian/Ubuntu
276
- sha256sum -c pythinker-code-0.31.0.x86_64.rpm.sha256 # Fedora/RHEL
274
+ sha256sum -c pythinker-code_0.32.0_amd64.deb.sha256 # Debian/Ubuntu
275
+ sha256sum -c pythinker-code-0.32.0.x86_64.rpm.sha256 # Fedora/RHEL
277
276
  ```
278
277
 
279
278
  **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pythinker-code"
3
- version = "0.31.0"
3
+ version = "0.32.0"
4
4
  description = "Pythinker Code is your next CLI agent."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -15,6 +15,17 @@ GitHub Releases page; `0.8.0` is the new starting line.
15
15
 
16
16
  ## Unreleased
17
17
 
18
+ ## 0.32.0 (2026-06-03)
19
+
20
+ ### What changed in this release
21
+
22
+ - **`pythinker mcp add` no longer crashes on Windows and Linux native builds.** The PyInstaller specs were using `collect_data_files()` which silently omits the `fastmcp-*.dist-info/` sibling directory; fastmcp calls `importlib.metadata.version("fastmcp")` at import time, so every `mcp add` / `mcp list` invocation raised `PackageNotFoundError`. Switched all three specs (Windows installer, Linux installer, macOS/tarball) to `copy_metadata()` — the PyInstaller-standard hook for bundling dist-info.
23
+ - **Pythinker work directories are automatically gitignored on startup.** When the agent starts inside a git repository, `.pythinker/`, `.pythinker-review/`, and `.pythinker-review-flow/` are silently appended to the project's `.gitignore` if missing, preventing local agent state from making the working tree dirty.
24
+ - **Old sessions and plan files are swept on startup.** Archived session directories under `~/.pythinker/sessions/` and hero-name plan files under `~/.pythinker/plans/` older than `session_retention_days` (default 30) are removed non-interactively at startup. Set `session_retention_days = 0` to disable.
25
+ - **Windows upgrade version display fix.** In-place upgrades no longer show a stale version number or re-trigger the update prompt. Inno Setup now wipes `_internal` before installing new files, preventing old `dist-info` directories from accumulating and causing `importlib.metadata` to report the previous version.
26
+
27
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.32.0`, or use the native installer for your OS (see the README install table).
28
+
18
29
  ## 0.31.0 (2026-06-02)
19
30
 
20
31
  ### What changed in this release
@@ -215,7 +215,7 @@ class ACPSession:
215
215
  case _:
216
216
  pass
217
217
  except LLMNotSet as e:
218
- logger.exception("LLM not set:")
218
+ logger.warning("LLM not set — user has no provider configured")
219
219
  raise acp.RequestError.auth_required() from e
220
220
  except LLMNotSupported as e:
221
221
  logger.exception("LLM not supported:")
@@ -803,8 +803,20 @@ def pythinker(
803
803
  render_scratchpad_section,
804
804
  scratch_file_exists,
805
805
  )
806
+ from pythinker_code.session_cleanup import (
807
+ sweep_old_plans,
808
+ sweep_old_sessions,
809
+ sweep_stale_work_dirs,
810
+ )
806
811
 
807
812
  scratchpad_status = await ensure_git_excluded(work_dir)
813
+
814
+ # Sweep accumulated state on startup (best-effort, non-blocking).
815
+ # Mirrors Claude Code's cleanupPeriodDays=30 model.
816
+ _retention = config.session_retention_days if isinstance(config, Config) else 30
817
+ await asyncio.to_thread(sweep_old_sessions, _retention)
818
+ await asyncio.to_thread(sweep_old_plans, _retention)
819
+ await asyncio.to_thread(sweep_stale_work_dirs)
808
820
  scratch_exists_before_start = scratch_file_exists(work_dir)
809
821
  if scratchpad_status.available:
810
822
  session_source = "resume" if resumed else "startup"
@@ -497,6 +497,15 @@ class Config(BaseModel):
497
497
  "Enable anonymous telemetry to help improve pythinker-code. Set to false to opt out."
498
498
  ),
499
499
  )
500
+ session_retention_days: int = Field(
501
+ default=30,
502
+ ge=0,
503
+ description=(
504
+ "Archived session directories in ~/.pythinker/sessions/ older than this many days "
505
+ "are removed on startup. Plan files older than this many days are also pruned. "
506
+ "0 disables cleanup."
507
+ ),
508
+ )
500
509
 
501
510
  @model_validator(mode="after")
502
511
  def validate_model(self) -> Self:
@@ -32,6 +32,11 @@ SESSION_SCRATCH_DIR_REL_PATH = ".pythinker/scratch"
32
32
  SESSION_SCRATCH_IGNORE_PATTERN = f"{SESSION_SCRATCH_DIR_REL_PATH}/*.md"
33
33
  _SESSION_SCRATCH_IGNORE_SAMPLE = f"{SESSION_SCRATCH_DIR_REL_PATH}/session.md"
34
34
 
35
+ # Patterns written to the project .gitignore when the agent starts in a git repo.
36
+ # These directories are local-only agent state and must never be committed.
37
+ _GITIGNORE_ENTRIES = (".pythinker/", ".pythinker-review/", ".pythinker-review-flow/")
38
+ _GITIGNORE_SECTION_HEADER = "# pythinker — local agent state (do not commit)"
39
+
35
40
  StatusReason = Literal[
36
41
  "available_non_git",
37
42
  "available_git_ignored",
@@ -337,6 +342,9 @@ async def ensure_git_excluded(
337
342
  ignored=False,
338
343
  )
339
344
 
345
+ # Ensure pythinker work dirs are gitignored in the project before any files are created.
346
+ await _append_gitignore_entries(work_dir)
347
+
340
348
  for candidate in (SCRATCH_REL_PATH, _SESSION_SCRATCH_IGNORE_SAMPLE):
341
349
  tracked = await runner(["ls-files", "--error-unmatch", "--", candidate])
342
350
  if not tracked.ok:
@@ -429,6 +437,41 @@ def _exclude_lock(path: Path) -> Generator[None]:
429
437
  fh.close()
430
438
 
431
439
 
440
+ async def _append_gitignore_entries(work_dir: HostPath) -> None:
441
+ """Best-effort: append pythinker work-dir patterns to work_dir/.gitignore if missing.
442
+
443
+ Called once at agent startup to prevent pythinker's local state directories
444
+ from making the project's git working tree dirty. Never raises.
445
+ """
446
+ gitignore_path = Path(str(work_dir)) / ".gitignore"
447
+ try:
448
+ await with_retries(lambda: asyncio.to_thread(_write_gitignore_entries, gitignore_path))
449
+ except Exception:
450
+ logger.debug("scratchpad .gitignore update failed")
451
+
452
+
453
+ def _write_gitignore_entries(gitignore_path: Path) -> None:
454
+ try:
455
+ with _exclude_lock(gitignore_path):
456
+ existing = gitignore_path.read_text(encoding="utf-8") if gitignore_path.exists() else ""
457
+ existing_lines = {line.strip() for line in existing.splitlines()}
458
+ missing = [e for e in _GITIGNORE_ENTRIES if e not in existing_lines]
459
+ if not missing:
460
+ return
461
+ prefix = "" if not existing or existing.endswith("\n") else "\n"
462
+ with gitignore_path.open("a", encoding="utf-8") as fh:
463
+ if _GITIGNORE_SECTION_HEADER not in existing_lines:
464
+ fh.write(f"{prefix}{_GITIGNORE_SECTION_HEADER}\n")
465
+ elif prefix:
466
+ fh.write(prefix)
467
+ for entry in missing:
468
+ fh.write(f"{entry}\n")
469
+ except OSError as exc:
470
+ if is_transient_oserror(exc):
471
+ raise TransientScratchpadError(str(exc)) from exc
472
+ raise
473
+
474
+
432
475
  @contextlib.contextmanager
433
476
  def _scratch_file_lock(fh: TextIO) -> Generator[None]:
434
477
  """Best-effort advisory lock on the scratch file itself (no extra git file)."""
@@ -0,0 +1,260 @@
1
+ """Age-based cleanup for personal-scope session and plan state.
2
+
3
+ Runs at agent startup to keep ~/.pythinker/ from growing unboundedly.
4
+ Mirrors the design used by Claude Code (cleanupPeriodDays=30): on startup,
5
+ directories/files older than the retention threshold are removed if they are
6
+ safe to discard (archived sessions, old plan files).
7
+
8
+ Never raises — every error is logged at DEBUG level and silently skipped.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import contextlib
14
+ import shutil
15
+ import time
16
+ from hashlib import md5 as _md5
17
+ from pathlib import Path
18
+
19
+ from pythinker_code.utils.logging import logger
20
+
21
+ _SESSIONS_DIR_NAME = "sessions"
22
+ _PLANS_DIR_NAME = "plans"
23
+ _LOCAL_HOST = "local"
24
+
25
+
26
+ # ---------------------------------------------------------------------------
27
+ # Public sweep functions
28
+ # ---------------------------------------------------------------------------
29
+
30
+
31
+ def sweep_old_sessions(max_age_days: int, *, share_dir: Path | None = None) -> int:
32
+ """Remove archived session directories older than ``max_age_days`` days.
33
+
34
+ Only sessions explicitly marked ``archived=True`` in their ``state.json`` are
35
+ eligible. Active or unarchived sessions are never touched regardless of age.
36
+ Orphan directories (no ``state.json``) are removed if their mtime is old enough.
37
+
38
+ After removing a session directory the corresponding per-session scratchpad
39
+ file in the project's ``.pythinker/scratch/`` directory is also deleted
40
+ (best-effort; a missing project dir is silently skipped).
41
+
42
+ Returns the number of directories removed. Returns 0 when disabled (``max_age_days <= 0``).
43
+ """
44
+ if max_age_days <= 0:
45
+ return 0
46
+
47
+ from pythinker_code.share import get_share_dir
48
+
49
+ root = share_dir or get_share_dir()
50
+ sessions_root = root / _SESSIONS_DIR_NAME
51
+ if not sessions_root.is_dir():
52
+ return 0
53
+
54
+ cutoff = time.time() - max_age_days * 86_400.0
55
+ bucket_to_path = _load_bucket_path_map(root)
56
+ removed = 0
57
+
58
+ try:
59
+ buckets = list(sessions_root.iterdir())
60
+ except OSError:
61
+ return 0
62
+
63
+ for bucket in buckets:
64
+ if not bucket.is_dir():
65
+ continue
66
+ work_dir_path = bucket_to_path.get(bucket.name)
67
+ try:
68
+ session_dirs = list(bucket.iterdir())
69
+ except OSError:
70
+ continue
71
+ for session_dir in session_dirs:
72
+ if not session_dir.is_dir():
73
+ continue
74
+ try:
75
+ if _maybe_remove_session(session_dir, cutoff, work_dir_path=work_dir_path):
76
+ removed += 1
77
+ except Exception:
78
+ logger.debug("session_cleanup: skipping {d}", d=session_dir.name)
79
+
80
+ # Prune the bucket itself if it is now empty.
81
+ try:
82
+ if not any(bucket.iterdir()):
83
+ bucket.rmdir()
84
+ except OSError:
85
+ pass
86
+
87
+ if removed:
88
+ logger.debug("session_cleanup: removed {n} old archived session(s)", n=removed)
89
+ return removed
90
+
91
+
92
+ def sweep_old_plans(max_age_days: int, *, share_dir: Path | None = None) -> int:
93
+ """Remove plan markdown files older than ``max_age_days`` days.
94
+
95
+ Plan files are hero-name-slugged markdown files written to ~/.pythinker/plans/
96
+ for each planning session. They are ephemeral by nature and safe to prune once old.
97
+
98
+ Returns the number of files removed. Returns 0 when disabled (``max_age_days <= 0``).
99
+ """
100
+ if max_age_days <= 0:
101
+ return 0
102
+
103
+ from pythinker_code.share import get_share_dir
104
+
105
+ plans_dir = (share_dir or get_share_dir()) / _PLANS_DIR_NAME
106
+ if not plans_dir.is_dir():
107
+ return 0
108
+
109
+ cutoff = time.time() - max_age_days * 86_400.0
110
+ removed = 0
111
+
112
+ try:
113
+ plan_files = list(plans_dir.glob("*.md"))
114
+ except OSError:
115
+ return 0
116
+
117
+ for plan_file in plan_files:
118
+ try:
119
+ if plan_file.stat().st_mtime < cutoff:
120
+ plan_file.unlink(missing_ok=True)
121
+ removed += 1
122
+ except Exception:
123
+ logger.debug("session_cleanup: skipping plan {f}", f=plan_file.name)
124
+
125
+ if removed:
126
+ logger.debug("session_cleanup: removed {n} old plan file(s)", n=removed)
127
+ return removed
128
+
129
+
130
+ def sweep_stale_work_dirs(*, share_dir: Path | None = None) -> int:
131
+ """Prune pythinker.json entries for paths that no longer exist and have no sessions.
132
+
133
+ An entry is removed only when both conditions hold:
134
+ - The work directory path does not exist on disk.
135
+ - The corresponding sessions bucket directory is absent or empty.
136
+
137
+ This prevents data loss for projects that have been moved or temporarily
138
+ unmounted while sessions still exist.
139
+
140
+ Returns the number of entries pruned.
141
+ """
142
+ from pythinker_code.metadata import WorkDirMeta, load_metadata, save_metadata
143
+ from pythinker_code.share import get_share_dir
144
+
145
+ root = share_dir or get_share_dir()
146
+ sessions_root = root / _SESSIONS_DIR_NAME
147
+
148
+ try:
149
+ metadata = load_metadata()
150
+ except Exception:
151
+ return 0
152
+
153
+ keep: list[WorkDirMeta] = []
154
+ pruned = 0
155
+ for wd in metadata.work_dirs:
156
+ if Path(wd.path).exists():
157
+ keep.append(wd)
158
+ continue
159
+ try:
160
+ hash_ = _md5(wd.path.encode("utf-8"), usedforsecurity=False).hexdigest()
161
+ bucket_name = hash_ if wd.host == _LOCAL_HOST else f"{wd.host}_{hash_}"
162
+ bucket_dir = sessions_root / bucket_name
163
+ has_sessions = bucket_dir.is_dir() and any(bucket_dir.iterdir())
164
+ except Exception:
165
+ has_sessions = True # err on the side of keeping
166
+ if has_sessions:
167
+ keep.append(wd)
168
+ else:
169
+ pruned += 1
170
+
171
+ if pruned:
172
+ metadata.work_dirs = keep
173
+ try:
174
+ save_metadata(metadata)
175
+ logger.debug("session_cleanup: pruned {n} stale work_dir(s) from registry", n=pruned)
176
+ except Exception:
177
+ logger.debug("session_cleanup: failed to save pruned metadata")
178
+
179
+ return pruned
180
+
181
+
182
+ # ---------------------------------------------------------------------------
183
+ # Internal helpers
184
+ # ---------------------------------------------------------------------------
185
+
186
+
187
+ def _maybe_remove_session(
188
+ session_dir: Path, cutoff: float, *, work_dir_path: str | None = None
189
+ ) -> bool:
190
+ """Return True if the session directory was removed, False otherwise."""
191
+ from pythinker_code.session_state import load_session_state
192
+
193
+ state_file = session_dir / "state.json"
194
+
195
+ if not state_file.exists():
196
+ # Orphan dir with no state — safe to remove if old enough.
197
+ try:
198
+ if session_dir.stat().st_mtime < cutoff:
199
+ shutil.rmtree(session_dir, ignore_errors=True)
200
+ return True
201
+ except OSError:
202
+ pass
203
+ return False
204
+
205
+ state = load_session_state(session_dir)
206
+
207
+ if not state.archived:
208
+ return False
209
+
210
+ try:
211
+ reference: float = state.archived_at or state.wire_mtime or session_dir.stat().st_mtime
212
+ except OSError:
213
+ return False
214
+
215
+ if reference >= cutoff:
216
+ return False
217
+
218
+ shutil.rmtree(session_dir, ignore_errors=True)
219
+ if work_dir_path is not None:
220
+ _try_remove_scratchpad(work_dir_path, session_dir.name)
221
+ return True
222
+
223
+
224
+ def _try_remove_scratchpad(work_dir_path: str, session_uuid: str) -> None:
225
+ """Best-effort: delete the per-session scratchpad file for a removed session."""
226
+ scratch_dir = Path(work_dir_path) / ".pythinker" / "scratch"
227
+ if not scratch_dir.is_dir():
228
+ return
229
+ short_id = _session_short_id(session_uuid)
230
+ for f in scratch_dir.glob(f"{short_id}-*.md"):
231
+ with contextlib.suppress(OSError):
232
+ f.unlink(missing_ok=True)
233
+
234
+
235
+ def _session_short_id(session_uuid: str) -> str:
236
+ """Compute the 12-char slug used as the scratchpad filename prefix."""
237
+ text = "".join(c if c.isalnum() else "-" for c in session_uuid.lower())
238
+ while "--" in text:
239
+ text = text.replace("--", "-")
240
+ return text.strip("-")[:12].strip("-") or "session"
241
+
242
+
243
+ def _load_bucket_path_map(share_dir: Path) -> dict[str, str]:
244
+ """Return a mapping of sessions bucket directory name → work_dir path string."""
245
+ from pythinker_code.metadata import load_metadata
246
+
247
+ try:
248
+ metadata = load_metadata()
249
+ except Exception:
250
+ return {}
251
+
252
+ result: dict[str, str] = {}
253
+ for wd in metadata.work_dirs:
254
+ try:
255
+ hash_ = _md5(wd.path.encode("utf-8"), usedforsecurity=False).hexdigest()
256
+ bucket = hash_ if wd.host == _LOCAL_HOST else f"{wd.host}_{hash_}"
257
+ result[bucket] = wd.path
258
+ except Exception:
259
+ pass
260
+ return result