pythinker-code 0.18.0__tar.gz → 0.20.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (849) hide show
  1. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/PKG-INFO +36 -35
  2. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/README.md +35 -34
  3. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/pyproject.toml +1 -1
  4. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/CHANGELOG.md +23 -0
  5. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/agent.yaml +2 -0
  6. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/code_reviewer.yaml +8 -0
  7. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/coder.yaml +1 -0
  8. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/plan.yaml +6 -0
  9. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/security_reviewer.yaml +9 -0
  10. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/system.md +33 -0
  11. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/app.py +7 -0
  12. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/__init__.py +14 -6
  13. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/config.py +33 -0
  14. pythinker_code-0.20.0/src/pythinker_code/memory/__init__.py +1 -0
  15. pythinker_code-0.20.0/src/pythinker_code/memory/consolidation.py +115 -0
  16. pythinker_code-0.20.0/src/pythinker_code/memory/harvest.py +54 -0
  17. pythinker_code-0.20.0/src/pythinker_code/memory/recall.py +271 -0
  18. pythinker_code-0.20.0/src/pythinker_code/memory/recap.py +94 -0
  19. pythinker_code-0.20.0/src/pythinker_code/memory/retriever.py +113 -0
  20. pythinker_code-0.20.0/src/pythinker_code/memory/retriever_sqlite.py +42 -0
  21. pythinker_code-0.20.0/src/pythinker_code/memory/sanitize.py +22 -0
  22. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/native.py +19 -10
  23. pythinker_code-0.20.0/src/pythinker_code/project_memory.py +422 -0
  24. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/scratchpad.py +163 -1
  25. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/agent.py +3 -0
  26. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/compaction.py +6 -2
  27. pythinker_code-0.20.0/src/pythinker_code/soul/dynamic_injection.py +211 -0
  28. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/pythinkersoul.py +66 -1
  29. pythinker_code-0.20.0/src/pythinker_code/tools/memory/__init__.py +60 -0
  30. pythinker_code-0.20.0/src/pythinker_code/tools/memory/memory.md +20 -0
  31. pythinker_code-0.20.0/src/pythinker_code/tools/scratchpad/__init__.py +65 -0
  32. pythinker_code-0.20.0/src/pythinker_code/tools/scratchpad/scratchpad_tool.md +8 -0
  33. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/__init__.py +8 -5
  34. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/glyphs.py +5 -5
  35. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/prompt.py +77 -3
  36. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/slash.py +64 -0
  37. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/update.py +351 -36
  38. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +5 -0
  39. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +41 -22
  40. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/_baseUniq-diyiadw5.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/_baseUniq-CANiGZCG.js +1 -1
  41. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/arc-C_-dPtYA.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/arc-CvIaVnQm.js +1 -1
  42. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-pe7jaN72.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-CqlXG7XT.js +1 -1
  43. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-DvNsLxaI.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-BabeMoB6.js +1 -1
  44. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-DOutQDwU.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-dBlrRfgx.js +1 -1
  45. pythinker_code-0.20.0/src/pythinker_code/web/static/assets/channel-CF2Oapph.js +1 -0
  46. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-CSkVLnTI.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-CPLVtfst.js +1 -1
  47. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-Sp6O21Fa.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-DI0qrZIK.js +1 -1
  48. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-HEkwgVVV.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-uLsl5Ty-.js +1 -1
  49. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-JBzEF4BM.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-Dp2AVO42.js +1 -1
  50. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-D7NzL_UD.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-CxaaA7-y.js +1 -1
  51. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-CFUUnKRn.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-C2yrDLY1.js +1 -1
  52. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-BFM8Zf86.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-CSDW0l06.js +1 -1
  53. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-BkppE9ae.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-Bd8ty8yy.js +1 -1
  54. pythinker_code-0.20.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-C93M7cGf.js +1 -0
  55. pythinker_code-0.20.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-C93M7cGf.js +1 -0
  56. pythinker_code-0.20.0/src/pythinker_code/web/static/assets/clone-dDvPvtYv.js +1 -0
  57. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-CmR8Cdcu.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-CCmghdXg.js +1 -1
  58. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-DAm3W4aX.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-CU0IxquU.js +1 -1
  59. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/cytoscape.esm-y1coXWUc.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/cytoscape.esm-w6ePliaJ.js +1 -1
  60. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-B0i4dUeh.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-CW7W2tVn.js +1 -1
  61. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-CpwOBk04.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-DqIOxVi2.js +1 -1
  62. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-BKdKDUAt.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-boIXSgbW.js +1 -1
  63. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-BWSTCXj5.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-CFfEzFm2.js +1 -1
  64. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-CJeB4CQf.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-B6LiEsYN.js +1 -1
  65. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-ChW3Nkg5.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-u-wnXAS9.js +1 -1
  66. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-BCYS-5Wi.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-BPIc-VfG.js +1 -1
  67. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-CibT-GPx.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-BmGb1VsG.js +1 -1
  68. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/graph-Bg8wdmyQ.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/graph-ktoWCMel.js +1 -1
  69. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/index-PSmqu2sC.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/index-CwzhEv0t.js +2 -2
  70. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/index-C-9Nx5Zv.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/index-Dr7W7MWE.js +1 -1
  71. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/index-Crd7puVX.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/index-NN-kPzcU.js +1 -1
  72. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-BZCKIRhX.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-D3astSCn.js +1 -1
  73. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-BIv2-5-D.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-B8_brgaL.js +1 -1
  74. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-BbXFbER0.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-B7-LXpwm.js +1 -1
  75. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/layout-Zmsvl1hy.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/layout-CuyswG9T.js +1 -1
  76. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/linear-BV_H68rk.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/linear-C6orbN1U.js +1 -1
  77. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-DVprBX-j.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-VTTiMxt4.js +7 -7
  78. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/mermaid.core-CR7QF1E3.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/mermaid.core-yfgON4Pp.js +5 -5
  79. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/min-Doa9BVeR.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/min-CHJlqZfl.js +1 -1
  80. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-DNQnYfPv.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-Duqs1dzk.js +1 -1
  81. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-DVqIhUw6.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-DSF8djMj.js +1 -1
  82. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-BuGgJuP-.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-CSDnO60q.js +1 -1
  83. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-DCQLUIxL.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-DubsSCd5.js +1 -1
  84. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-CSqLQRPC.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-Dxxi5tyW.js +1 -1
  85. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-B9es9563.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-ksTcf6JN.js +1 -1
  86. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-D6uJ4ieP.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-C4ZUitJ-.js +1 -1
  87. pythinker_code-0.20.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-DsjFfFnz.js +1 -0
  88. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-B1yc8-Ia.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-hlC8mQ8N.js +1 -1
  89. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-_HhSkYE5.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-BU-6PIF5.js +1 -1
  90. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-BUOOjSUz.js → pythinker_code-0.20.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-CxVpe5Df.js +1 -1
  91. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/index.html +1 -1
  92. pythinker_code-0.20.0/src/pythinker_code/web/static/install.ps1 +206 -0
  93. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/install.sh +124 -7
  94. pythinker_code-0.18.0/src/pythinker_code/soul/dynamic_injection.py +0 -84
  95. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/channel-BEd858yH.js +0 -1
  96. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-Crr9_YII.js +0 -1
  97. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-Crr9_YII.js +0 -1
  98. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/clone-Dfc-F2za.js +0 -1
  99. pythinker_code-0.18.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-KTWgI9rj.js +0 -1
  100. pythinker_code-0.18.0/src/pythinker_code/web/static/install.ps1 +0 -110
  101. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/LICENSE +0 -0
  102. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/NOTICE +0 -0
  103. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/__init__.py +0 -0
  104. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/__main__.py +0 -0
  105. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/AGENTS.md +0 -0
  106. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/__init__.py +0 -0
  107. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/convert.py +0 -0
  108. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/host.py +0 -0
  109. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/mcp.py +0 -0
  110. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/server.py +0 -0
  111. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/session.py +0 -0
  112. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/tools.py +0 -0
  113. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/types.py +0 -0
  114. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/version.py +0 -0
  115. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/debugger.yaml +0 -0
  116. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/explore.yaml +0 -0
  117. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/implementer.yaml +0 -0
  118. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/review.yaml +0 -0
  119. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/verifier.yaml +0 -0
  120. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
  121. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agentspec.py +0 -0
  122. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
  123. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/approval_runtime/models.py +0 -0
  124. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
  125. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/__init__.py +0 -0
  126. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
  127. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/deepseek.py +0 -0
  128. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/github_feedback.py +0 -0
  129. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/lm_studio.py +0 -0
  130. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/minimax.py +0 -0
  131. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/oauth.py +0 -0
  132. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/ollama.py +0 -0
  133. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/openai.py +0 -0
  134. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/opencode_go.py +0 -0
  135. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/openrouter.py +0 -0
  136. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/platforms.py +0 -0
  137. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/__init__.py +0 -0
  138. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/agent_runner.py +0 -0
  139. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/ids.py +0 -0
  140. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/manager.py +0 -0
  141. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/models.py +0 -0
  142. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/store.py +0 -0
  143. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/summary.py +0 -0
  144. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/worker.py +0 -0
  145. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/__main__.py +0 -0
  146. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/_lazy_group.py +0 -0
  147. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/debug.py +0 -0
  148. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/export.py +0 -0
  149. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/info.py +0 -0
  150. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/mcp.py +0 -0
  151. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/plugin.py +0 -0
  152. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/review.py +0 -0
  153. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/secscan.py +0 -0
  154. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/security_scan.py +0 -0
  155. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/skill.py +0 -0
  156. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/toad.py +0 -0
  157. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/update.py +0 -0
  158. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/vis.py +0 -0
  159. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/web.py +0 -0
  160. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/constant.py +0 -0
  161. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/events.py +0 -0
  162. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/exception.py +0 -0
  163. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/execution_profiles.py +0 -0
  164. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/extensions.py +0 -0
  165. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/file_restore.py +0 -0
  166. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/hooks/__init__.py +0 -0
  167. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/hooks/config.py +0 -0
  168. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/hooks/engine.py +0 -0
  169. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/hooks/events.py +0 -0
  170. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/hooks/runner.py +0 -0
  171. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/llm.py +0 -0
  172. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/metadata.py +0 -0
  173. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/notifications/__init__.py +0 -0
  174. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/notifications/llm.py +0 -0
  175. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/notifications/manager.py +0 -0
  176. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/notifications/models.py +0 -0
  177. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/notifications/notifier.py +0 -0
  178. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/notifications/store.py +0 -0
  179. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/notifications/wire.py +0 -0
  180. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/plugin/__init__.py +0 -0
  181. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/plugin/manager.py +0 -0
  182. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/plugin/tool.py +0 -0
  183. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/prompt_templates.py +0 -0
  184. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/prompts/__init__.py +0 -0
  185. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/prompts/compact.md +0 -0
  186. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/prompts/init.md +0 -0
  187. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/py.typed +0 -0
  188. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/session.py +0 -0
  189. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/session_fork.py +0 -0
  190. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/session_state.py +0 -0
  191. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/share.py +0 -0
  192. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skill/__init__.py +0 -0
  193. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
  194. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skill/flow/d2.py +0 -0
  195. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
  196. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skill/lockfile.py +0 -0
  197. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/check-impl-against-spec/SKILL.md +0 -0
  198. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/create-pr/SKILL.md +0 -0
  199. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/diagnose-ci-failures/SKILL.md +0 -0
  200. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/fix-errors/SKILL.md +0 -0
  201. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/implement-specs/SKILL.md +0 -0
  202. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/pr-walkthrough/SKILL.md +0 -0
  203. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
  204. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/reproduce-bug-report/SKILL.md +0 -0
  205. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/resolve-merge-conflicts/SKILL.md +0 -0
  206. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/review-pr/SKILL.md +0 -0
  207. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
  208. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/spec-driven-implementation/SKILL.md +0 -0
  209. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/write-product-spec/SKILL.md +0 -0
  210. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/write-tech-spec/SKILL.md +0 -0
  211. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/__init__.py +0 -0
  212. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/approval.py +0 -0
  213. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/btw.py +0 -0
  214. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/compaction_restore.py +0 -0
  215. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/context.py +0 -0
  216. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/denwarenji.py +0 -0
  217. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
  218. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
  219. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
  220. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/message.py +0 -0
  221. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/permission.py +0 -0
  222. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/slash.py +0 -0
  223. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/toolset.py +0 -0
  224. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/__init__.py +0 -0
  225. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/builder.py +0 -0
  226. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/core.py +0 -0
  227. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/discovery.py +0 -0
  228. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/git_context.py +0 -0
  229. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/models.py +0 -0
  230. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/output.py +0 -0
  231. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/registry.py +0 -0
  232. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/runner.py +0 -0
  233. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/store.py +0 -0
  234. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/__init__.py +0 -0
  235. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/config.py +0 -0
  236. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/crash.py +0 -0
  237. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/errors.py +0 -0
  238. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/metrics.py +0 -0
  239. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/otel.py +0 -0
  240. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/sentry.py +0 -0
  241. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/sink.py +0 -0
  242. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/AGENTS.md +0 -0
  243. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/__init__.py +0 -0
  244. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/agent/__init__.py +0 -0
  245. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/agent/description.md +0 -0
  246. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/ask_user/__init__.py +0 -0
  247. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
  248. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/background/__init__.py +0 -0
  249. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/background/handoff.md +0 -0
  250. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/background/input.md +0 -0
  251. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/background/list.md +0 -0
  252. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/background/output.md +0 -0
  253. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/background/stop.md +0 -0
  254. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/display.py +0 -0
  255. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
  256. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
  257. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/__init__.py +0 -0
  258. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/glob.md +0 -0
  259. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/glob.py +0 -0
  260. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/grep.md +0 -0
  261. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/grep_local.py +0 -0
  262. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
  263. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/read.md +0 -0
  264. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/read.py +0 -0
  265. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/read_media.md +0 -0
  266. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/read_media.py +0 -0
  267. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/replace.md +0 -0
  268. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/replace.py +0 -0
  269. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/utils.py +0 -0
  270. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/write.md +0 -0
  271. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/write.py +0 -0
  272. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/plan/__init__.py +0 -0
  273. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/plan/description.md +0 -0
  274. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/plan/enter.py +0 -0
  275. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
  276. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/plan/handoff.py +0 -0
  277. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
  278. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/shell/__init__.py +0 -0
  279. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/shell/bash.md +0 -0
  280. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
  281. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/skill/__init__.py +0 -0
  282. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/skill/description.md +0 -0
  283. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/test.py +0 -0
  284. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/think/__init__.py +0 -0
  285. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/think/think.md +0 -0
  286. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
  287. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
  288. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/utils.py +0 -0
  289. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/web/__init__.py +0 -0
  290. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/web/fetch.md +0 -0
  291. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/web/fetch.py +0 -0
  292. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/web/search.md +0 -0
  293. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/web/search.py +0 -0
  294. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/__init__.py +0 -0
  295. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
  296. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/print/__init__.py +0 -0
  297. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/print/visualize.py +0 -0
  298. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
  299. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
  300. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
  301. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
  302. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/diff.py +0 -0
  303. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/dynamic_border.py +0 -0
  304. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
  305. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
  306. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/markdown.py +0 -0
  307. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
  308. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/panel.py +0 -0
  309. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
  310. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
  311. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
  312. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
  313. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/console.py +0 -0
  314. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/debug.py +0 -0
  315. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/design_system.py +0 -0
  316. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/echo.py +0 -0
  317. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
  318. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
  319. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
  320. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
  321. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
  322. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/motion.py +0 -0
  323. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
  324. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
  325. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/render_constants.py +0 -0
  326. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/replay.py +0 -0
  327. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selector.py +0 -0
  328. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
  329. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
  330. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
  331. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
  332. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
  333. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
  334. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
  335. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
  336. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/setup.py +0 -0
  337. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/spacing.py +0 -0
  338. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/spinner_words.py +0 -0
  339. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/startup.py +0 -0
  340. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
  341. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tips.py +0 -0
  342. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
  343. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/_file_diff.py +0 -0
  344. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -0
  345. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
  346. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
  347. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
  348. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
  349. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
  350. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
  351. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
  352. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
  353. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
  354. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
  355. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
  356. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
  357. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -0
  358. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
  359. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage.py +0 -0
  360. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
  361. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
  362. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
  363. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
  364. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
  365. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
  366. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
  367. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
  368. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
  369. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
  370. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
  371. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
  372. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
  373. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_activity_tree.py +0 -0
  374. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
  375. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +0 -0
  376. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
  377. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_dialog_shell.py +0 -0
  378. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
  379. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
  380. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_transcript.py +0 -0
  381. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
  382. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/theme.py +0 -0
  383. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/tui_config.py +0 -0
  384. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
  385. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/__init__.py +0 -0
  386. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/aiohttp.py +0 -0
  387. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/aioqueue.py +0 -0
  388. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/broadcast.py +0 -0
  389. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/changelog.py +0 -0
  390. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/clipboard.py +0 -0
  391. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/datetime.py +0 -0
  392. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/diff.py +0 -0
  393. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/editor.py +0 -0
  394. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/environment.py +0 -0
  395. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/envvar.py +0 -0
  396. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/export.py +0 -0
  397. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/file_filter.py +0 -0
  398. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/frontmatter.py +0 -0
  399. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/io.py +0 -0
  400. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/logging.py +0 -0
  401. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/media_tags.py +0 -0
  402. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/message.py +0 -0
  403. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/path.py +0 -0
  404. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/proctitle.py +0 -0
  405. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/proxy.py +0 -0
  406. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
  407. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
  408. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/rich/columns.py +0 -0
  409. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/rich/diff_render.py +0 -0
  410. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
  411. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
  412. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
  413. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
  414. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/sensitive.py +0 -0
  415. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/server.py +0 -0
  416. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/signals.py +0 -0
  417. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/slashcmd.py +0 -0
  418. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/sleep_inhibitor.py +0 -0
  419. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/string.py +0 -0
  420. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
  421. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/term.py +0 -0
  422. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/typing.py +0 -0
  423. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/__init__.py +0 -0
  424. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/api/__init__.py +0 -0
  425. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/api/sessions.py +0 -0
  426. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/api/statistics.py +0 -0
  427. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/api/system.py +0 -0
  428. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/app.py +0 -0
  429. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-CY1rtwrX.js +0 -0
  430. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/index-DSRInNnm.css +0 -0
  431. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/index-DgmTI2M_.js +0 -0
  432. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  433. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  434. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  435. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  436. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  437. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  438. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  439. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/index.html +0 -0
  440. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/__init__.py +0 -0
  441. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/api/__init__.py +0 -0
  442. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/api/config.py +0 -0
  443. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/api/open_in.py +0 -0
  444. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/api/sessions.py +0 -0
  445. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/app.py +0 -0
  446. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/auth.py +0 -0
  447. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/models.py +0 -0
  448. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/runner/__init__.py +0 -0
  449. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/runner/messages.py +0 -0
  450. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/runner/process.py +0 -0
  451. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/runner/worker.py +0 -0
  452. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/_headers +0 -0
  453. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  454. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  455. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  456. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  457. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  458. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  459. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  460. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  461. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  462. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  463. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  464. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  465. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  466. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  467. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  468. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  469. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  470. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  471. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  472. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  473. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  474. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  475. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  476. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  477. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  478. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  479. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  480. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  481. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  482. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  483. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  484. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  485. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  486. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  487. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  488. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  489. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  490. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  491. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  492. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  493. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  494. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  495. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  496. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  497. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  498. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  499. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  500. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  501. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  502. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  503. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  504. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  505. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  506. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  507. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  508. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  509. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  510. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  511. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  512. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/abap-BdImnpbu.js +0 -0
  513. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +0 -0
  514. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ada-bCR0ucgS.js +0 -0
  515. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +0 -0
  516. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +0 -0
  517. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +0 -0
  518. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/apache-Pmp26Uib.js +0 -0
  519. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/apex-D8_7TLub.js +0 -0
  520. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/apl-dKokRX4l.js +0 -0
  521. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/applescript-Co6uUVPk.js +0 -0
  522. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ara-BRHolxvo.js +0 -0
  523. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +0 -0
  524. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/asm-D_Q5rh1f.js +0 -0
  525. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/astro-CbQHKStN.js +0 -0
  526. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +0 -0
  527. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/awk-DMzUqQB5.js +0 -0
  528. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +0 -0
  529. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +0 -0
  530. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/bat-BkioyH1T.js +0 -0
  531. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/beancount-k_qm7-4y.js +0 -0
  532. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/berry-uYugtg8r.js +0 -0
  533. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/bibtex-CHM0blh-.js +0 -0
  534. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/bicep-Bmn6On1c.js +0 -0
  535. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/blade-D4QpJJKB.js +0 -0
  536. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/bsl-BO_Y6i37.js +0 -0
  537. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/c-BIGW1oBm.js +0 -0
  538. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/c3-VCDPK7BO.js +0 -0
  539. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +0 -0
  540. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/cairo-KRGpt6FW.js +0 -0
  541. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
  542. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
  543. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
  544. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
  545. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/clarity-D53aC0YG.js +0 -0
  546. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/clojure-P80f7IUj.js +0 -0
  547. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/cmake-D1j8_8rp.js +0 -0
  548. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/cobol-nwyudZeR.js +0 -0
  549. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +0 -0
  550. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +0 -0
  551. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/coffee-Ch7k5sss.js +0 -0
  552. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +0 -0
  553. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/coq-DkFqJrB1.js +0 -0
  554. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/cpp-CofmeUqb.js +0 -0
  555. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/crystal-tKQVLTB8.js +0 -0
  556. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/csharp-K5feNrxe.js +0 -0
  557. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/css-DPfMkruS.js +0 -0
  558. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/csv-fuZLfV_i.js +0 -0
  559. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/cue-D82EKSYY.js +0 -0
  560. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/cypher-COkxafJQ.js +0 -0
  561. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/d-85-TOEBH.js +0 -0
  562. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +0 -0
  563. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/dart-CF10PKvl.js +0 -0
  564. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/dax-CEL-wOlO.js +0 -0
  565. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +0 -0
  566. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +0 -0
  567. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/diff-D97Zzqfu.js +0 -0
  568. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/docker-BcOcwvcX.js +0 -0
  569. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/dotenv-Da5cRb03.js +0 -0
  570. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/dracula-BzJJZx-M.js +0 -0
  571. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +0 -0
  572. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +0 -0
  573. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/edge-BkV0erSs.js +0 -0
  574. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/elixir-CDX3lj18.js +0 -0
  575. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/elm-DbKCFpqz.js +0 -0
  576. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +0 -0
  577. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/erb-BOJIQeun.js +0 -0
  578. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/erlang-DsQrWhSR.js +0 -0
  579. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +0 -0
  580. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +0 -0
  581. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/fennel-BYunw83y.js +0 -0
  582. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/fish-BvzEVeQv.js +0 -0
  583. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/fluent-C4IJs8-o.js +0 -0
  584. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
  585. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
  586. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +0 -0
  587. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +0 -0
  588. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +0 -0
  589. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gdshader-DkwncUOv.js +0 -0
  590. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/genie-D0YGMca9.js +0 -0
  591. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +0 -0
  592. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +0 -0
  593. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +0 -0
  594. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/github-dark-DHJKELXO.js +0 -0
  595. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
  596. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
  597. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
  598. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/github-light-DAi9KRSo.js +0 -0
  599. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +0 -0
  600. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
  601. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gleam-BspZqrRM.js +0 -0
  602. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
  603. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +0 -0
  604. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/glsl-DplSGwfg.js +0 -0
  605. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gn-n2N0HUVH.js +0 -0
  606. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +0 -0
  607. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/go-Dn2_MT6a.js +0 -0
  608. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/graphql-ChdNCCLP.js +0 -0
  609. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/groovy-gcz8RCvz.js +0 -0
  610. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
  611. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
  612. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
  613. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
  614. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
  615. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
  616. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/hack-CaT9iCJl.js +0 -0
  617. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/haml-B8DHNrY2.js +0 -0
  618. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/handlebars-BL8al0AC.js +0 -0
  619. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/haskell-Df6bDoY_.js +0 -0
  620. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/haxe-CzTSHFRz.js +0 -0
  621. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/hcl-BWvSN4gD.js +0 -0
  622. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/hjson-D5-asLiD.js +0 -0
  623. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +0 -0
  624. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/houston-DnULxvSX.js +0 -0
  625. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/html-GMplVEZG.js +0 -0
  626. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +0 -0
  627. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/http-jrhK8wxY.js +0 -0
  628. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/hurl-irOxFIW8.js +0 -0
  629. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +0 -0
  630. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/hy-DFXneXwc.js +0 -0
  631. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/imba-DGztddWO.js +0 -0
  632. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/index-BpoLgcEt.js +0 -0
  633. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/index-CzV_vCfu.css +0 -0
  634. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/index-DI2oedCt.js +0 -0
  635. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ini-BEwlwnbL.js +0 -0
  636. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/init-Gi6I4Gst.js +0 -0
  637. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  638. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  639. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  640. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  641. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  642. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  643. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  644. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/java-CylS5w8V.js +0 -0
  645. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/javascript-wDzz0qaB.js +0 -0
  646. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +0 -0
  647. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/jison-wvAkD_A8.js +0 -0
  648. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/json-Cp-IABpG.js +0 -0
  649. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/json5-C9tS-k6U.js +0 -0
  650. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/jsonc-Des-eS-w.js +0 -0
  651. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +0 -0
  652. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +0 -0
  653. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/jssm-C2t-YnRu.js +0 -0
  654. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/jsx-g9-lgVsj.js +0 -0
  655. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/julia-CxzCAyBv.js +0 -0
  656. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
  657. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
  658. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
  659. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/katex-D2lIc1rk.css +0 -0
  660. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/kdl-DV7GczEv.js +0 -0
  661. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +0 -0
  662. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/kusto-DZf3V79B.js +0 -0
  663. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/laserwave-DUszq2jm.js +0 -0
  664. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/latex-B4uzh10-.js +0 -0
  665. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/lean-BZvkOJ9d.js +0 -0
  666. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/less-B1dDrJ26.js +0 -0
  667. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +0 -0
  668. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/liquid-DYVedYrR.js +0 -0
  669. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/llvm-BtvRca6l.js +0 -0
  670. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/log-2UxHyX5q.js +0 -0
  671. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/logo-BtOb2qkB.js +0 -0
  672. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/lua-BbnMAYS6.js +0 -0
  673. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/luau-C-HG3fhB.js +0 -0
  674. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/make-CHLpvVh8.js +0 -0
  675. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/markdown-Cvjx9yec.js +0 -0
  676. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/marko-DZsq8hO1.js +0 -0
  677. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +0 -0
  678. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
  679. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
  680. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +0 -0
  681. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
  682. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/matlab-D7o27uSR.js +0 -0
  683. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/mdc-DUICxH0z.js +0 -0
  684. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +0 -0
  685. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B2P5VJ9v.css +0 -0
  686. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +0 -0
  687. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/min-dark-CafNBF8u.js +0 -0
  688. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/min-light-CTRr51gU.js +0 -0
  689. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +0 -0
  690. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/mojo-B93PlW-d.js +0 -0
  691. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/monokai-D4h5O-jR.js +0 -0
  692. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/moonbit-Ba13S78F.js +0 -0
  693. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/move-Bu9oaDYs.js +0 -0
  694. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/narrat-DRg8JJMk.js +0 -0
  695. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +0 -0
  696. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/nginx-DknmC5AR.js +0 -0
  697. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/night-owl-C39BiMTA.js +0 -0
  698. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/nim-CVrawwO9.js +0 -0
  699. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/nix-CwoSXNpI.js +0 -0
  700. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/nord-Ddv68eIx.js +0 -0
  701. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/nushell-C-sUppwS.js +0 -0
  702. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +0 -0
  703. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +0 -0
  704. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +0 -0
  705. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
  706. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/one-light-PoHY5YXO.js +0 -0
  707. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/openscad-C4EeE6gA.js +0 -0
  708. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +0 -0
  709. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/pascal-D93ZcfNL.js +0 -0
  710. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/perl-C0TMdlhV.js +0 -0
  711. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/php-CDn_0X-4.js +0 -0
  712. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/pkl-u5AG7uiY.js +0 -0
  713. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/plastic-3e1v2bzS.js +0 -0
  714. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/plsql-ChMvpjG-.js +0 -0
  715. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/po-BTJTHyun.js +0 -0
  716. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +0 -0
  717. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/polar-C0HS_06l.js +0 -0
  718. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/postcss-CXtECtnM.js +0 -0
  719. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +0 -0
  720. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/powershell-Dpen1YoG.js +0 -0
  721. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/prisma-Dd19v3D-.js +0 -0
  722. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/prolog-CbFg5uaA.js +0 -0
  723. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/proto-C7zT0LnQ.js +0 -0
  724. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/pug-CGlum2m_.js +0 -0
  725. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/puppet-BMWR74SV.js +0 -0
  726. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/purescript-CklMAg4u.js +0 -0
  727. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/python-B6aJPvgy.js +0 -0
  728. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/qml-3beO22l8.js +0 -0
  729. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +0 -0
  730. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/qss-IeuSbFQv.js +0 -0
  731. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/r-Dspwwk_N.js +0 -0
  732. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/racket-BqYA7rlc.js +0 -0
  733. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/raku-DXvB9xmW.js +0 -0
  734. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/razor-C1TweQQi.js +0 -0
  735. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/red-bN70gL4F.js +0 -0
  736. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/reg-C-SQnVFl.js +0 -0
  737. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +0 -0
  738. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/rel-C3B-1QV4.js +0 -0
  739. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/riscv-BM1_JUlF.js +0 -0
  740. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
  741. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
  742. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +0 -0
  743. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +0 -0
  744. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/rst-B0xPkSld.js +0 -0
  745. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ruby-BvKwtOVI.js +0 -0
  746. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/rust-B1yitclQ.js +0 -0
  747. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/sas-cz2c8ADy.js +0 -0
  748. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +0 -0
  749. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/scala-C151Ov-r.js +0 -0
  750. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/scheme-C98Dy4si.js +0 -0
  751. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/scss-OYdSNvt2.js +0 -0
  752. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +0 -0
  753. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
  754. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/shellscript-Yzrsuije.js +0 -0
  755. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/shellsession-BADoaaVG.js +0 -0
  756. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +0 -0
  757. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +0 -0
  758. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +0 -0
  759. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +0 -0
  760. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +0 -0
  761. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +0 -0
  762. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/solidity-rGO070M0.js +0 -0
  763. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/soy-Brmx7dQM.js +0 -0
  764. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/sparql-rVzFXLq3.js +0 -0
  765. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/splunk-BtCnVYZw.js +0 -0
  766. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/sql-BLtJtn59.js +0 -0
  767. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +0 -0
  768. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/stata-BH5u7GGu.js +0 -0
  769. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +0 -0
  770. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/svelte-zxCyuUbr.js +0 -0
  771. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/swift-Dg5xB15N.js +0 -0
  772. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +0 -0
  773. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +0 -0
  774. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/systemd-4A_iFExJ.js +0 -0
  775. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/talonscript-CkByrt1z.js +0 -0
  776. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/tasl-QIJgUcNo.js +0 -0
  777. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/tcl-dwOrl1Do.js +0 -0
  778. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/templ-W15q3VgB.js +0 -0
  779. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/terraform-BETggiCN.js +0 -0
  780. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/tex-CvyZ59Mk.js +0 -0
  781. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/tokyo-night-hegEt444.js +0 -0
  782. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/toml-vGWfd6FD.js +0 -0
  783. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +0 -0
  784. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/tsv-B_m7g4N7.js +0 -0
  785. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/tsx-COt5Ahok.js +0 -0
  786. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/turtle-BsS91CYL.js +0 -0
  787. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/twig-CO9l9SDP.js +0 -0
  788. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +0 -0
  789. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/typespec-BGHnOYBU.js +0 -0
  790. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/typst-DHCkPAjA.js +0 -0
  791. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/v-BcVCzyr7.js +0 -0
  792. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vala-CsfeWuGM.js +0 -0
  793. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vb-D17OF-Vu.js +0 -0
  794. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/verilog-BQ8w6xss.js +0 -0
  795. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vesper-DU1UobuO.js +0 -0
  796. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +0 -0
  797. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/viml-CJc9bBzg.js +0 -0
  798. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
  799. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
  800. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +0 -0
  801. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vue-DN_0RTcg.js +0 -0
  802. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +0 -0
  803. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +0 -0
  804. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vyper-CDx5xZoG.js +0 -0
  805. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +0 -0
  806. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/wasm-MzD3tlZU.js +0 -0
  807. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/wenyan-BV7otONQ.js +0 -0
  808. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +0 -0
  809. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +0 -0
  810. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/wit-5i3qLPDT.js +0 -0
  811. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +0 -0
  812. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/xml-sdJ4AIDG.js +0 -0
  813. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/xsl-CtQFsRM5.js +0 -0
  814. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/yaml-Buea-lGh.js +0 -0
  815. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +0 -0
  816. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/zig-VOosw3JB.js +0 -0
  817. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
  818. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
  819. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
  820. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
  821. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
  822. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
  823. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
  824. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
  825. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
  826. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
  827. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
  828. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
  829. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
  830. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
  831. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
  832. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
  833. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
  834. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
  835. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
  836. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
  837. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
  838. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
  839. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/logo.png +0 -0
  840. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/store/__init__.py +0 -0
  841. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/store/sessions.py +0 -0
  842. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/wire/__init__.py +0 -0
  843. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/wire/file.py +0 -0
  844. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
  845. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/wire/protocol.py +0 -0
  846. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/wire/root_hub.py +0 -0
  847. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/wire/serde.py +0 -0
  848. {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/wire/server.py +0 -0
  849. {pythinker_code-0.18.0 → pythinker_code-0.20.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.18.0
3
+ Version: 0.20.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/mohamed-elkholy95/Pythinker-Code/blob/main/LICENSE)
80
80
  [![CI](https://img.shields.io/github/actions/workflow/status/mohamed-elkholy95/Pythinker-Code/ci-pythinker-cli.yml?branch=main&label=CI&style=for-the-badge&logo=githubactions&logoColor=white)](https://github.com/mohamed-elkholy95/Pythinker-Code/actions/workflows/ci-pythinker-cli.yml?query=branch%3Amain)
81
81
 
82
- [![Downloads](https://img.shields.io/pepy/dt/pythinker-code?cacheSeconds=300)](https://pepy.tech/projects/pythinker-code)
82
+ [![PyPI downloads](https://assets.piptrends.com/get-last-month-downloads-badge/pythinker-code.svg)](https://piptrends.com/package/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,15 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
115
115
 
116
116
  ---
117
117
 
118
- ## 🆕 What's New in 0.18.0
118
+ ## 🆕 What's New in 0.20.0
119
119
 
120
- - **Live subagent activity streaming.** Subagent tool calls now stream live into the transcript, with safe pending headers for in-flight tool calls, new transcript progress events, and a unified shimmer animation across active-work labels so long-running exploration stays legible.
121
- - **Smarter delegation and orchestration.** A Context-First Orchestration Protocol guides the default agent, specialist subagents receive prompt packets for single-objective delegation plus evidence and verification gates, and overflow RunAgents children are deferred instead of hard-failing.
122
- - **Calmer, more resilient TUI.** In-flight and singular Ask payloads no longer flash an invalid badge, MCP startup status is cleaner, and shell rendering and MCP guidance are refined.
123
- - **Sturdier configuration handling.** Incompatible legacy JSON config is now preserved instead of being silently reset to defaults.
124
- - **Security and shell hardening.** The security scan and shell execution paths were hardened against unexpected input.
120
+ - **Ranked recall injection and Scratchpad working memory.** The memory subsystem gains a dependency-free lexical retriever, ranked recall injection replacing the previous verbatim memory dump, and a new root-only `Scratchpad` tool that lets the agent record structured notes across tool calls during a session.
121
+ - **Full memory lifecycle: Phases B–D.** A unified injection bus re-arms recall on every Memory or Scratchpad write (Phase B), session-end episodic recaps are harvested before compaction into a per-project journal (Phase C, off by default), and an approval-gated inbox consolidation flow (`/memory inbox`) proposes—but never auto-applies—memory merges (Phase D).
122
+ - **Context-aware and web-fresh agent subagents.** Code-reviewer, security-reviewer, coder, and plan specialists now mandate a context7-first / web-fallback freshness check before scoring third-party findings or writing against a library. The system prompt gains a Granular Todo discipline and an Engineering Discipline section.
123
+ - **Memory robustness hardening.** Compaction harvest failures are now isolated per-phase, inbox JSON-parse errors log and skip instead of dropping silently, and the recall injection bus uses a knapsack budget that continues filling with lower-priority candidates after a high-priority slot overflows.
124
+ - **Animated robot logo in all native installers.** The curl-bash and PowerShell native installers now display a Tetris-style animated robot-head logo on supported terminals, with a static fallback for CI, `NO_COLOR`, or `PYTHINKER_NO_ANIMATION=1`.
125
125
 
126
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.18.0`, or use the native installer for your platform from the [Releases page](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest).
126
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.20.0`, or use the native installer for your platform from the [Releases page](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest).
127
127
 
128
128
 
129
129
  ---
@@ -213,7 +213,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
213
213
 
214
214
  | Platform | Recommended install | Artifact source |
215
215
  |---|---|---|
216
- | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.18.0.exe` from [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
216
+ | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.20.0.exe` from [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
217
217
  | **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> / <img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux">** | `curl -fsSL https://pythinker.com/install.sh \| bash` | native tarball from [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
218
218
  | **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> — Homebrew** | `brew install mohamed-elkholy95/pythinker/pythinker-code` | auto-published Homebrew tap |
219
219
  | **<img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux"> — system package** | Download the `.deb` or `.rpm` for your distro below | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
@@ -238,7 +238,7 @@ pythinker # start the interactive TUI
238
238
 
239
239
  ### 🪟 Windows — native installer
240
240
 
241
- `PythinkerSetup-0.18.0.exe` is a signed* Inno Setup wizard. Installs per-user
241
+ `PythinkerSetup-0.20.0.exe` is a signed* Inno Setup wizard. Installs per-user
242
242
  into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
243
243
  PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
244
244
  the change. **No UAC prompt.**
@@ -249,13 +249,13 @@ irm https://pythinker.com/install.ps1 | iex
249
249
 
250
250
  # Or manually download the installer + checksum from the Releases page,
251
251
  # verify with Get-FileHash, then run:
252
- .\PythinkerSetup-0.18.0.exe
252
+ .\PythinkerSetup-0.20.0.exe
253
253
 
254
254
  # Open a fresh PowerShell
255
255
  pythinker --version
256
256
  ```
257
257
 
258
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.18.0.exe /ALLUSERS`
258
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.20.0.exe /ALLUSERS`
259
259
  installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
260
260
 
261
261
  **Upgrade:** `pythinker update` from inside the running app — it downloads
@@ -284,9 +284,10 @@ which pythinker # -> /opt/homebrew/bin/pythinker (Apple Silicon)
284
284
  # or /usr/local/bin/pythinker (Intel)
285
285
  ```
286
286
 
287
- Works on **Apple Silicon and Intel** brew picks the right Python build for
288
- you. The tap auto-publishes a fresh formula on every Pythinker release, so
289
- `brew upgrade pythinker-code` always finds the latest version.
287
+ Works on **Apple Silicon and Intel** from the same native GitHub Release
288
+ tarballs used by the curl installer. The tap auto-publishes a fresh formula on
289
+ every Pythinker release, so `brew upgrade pythinker-code` always finds the
290
+ latest version.
290
291
 
291
292
  **Upgrade:** `brew upgrade pythinker-code` (Homebrew packages don't
292
293
  auto-update; run this whenever you want the latest).
@@ -305,26 +306,26 @@ attached to every GitHub Release.
305
306
 
306
307
  ```sh
307
308
  # Debian / Ubuntu (x86_64)
308
- sudo dpkg -i pythinker-code_0.18.0_amd64.deb
309
+ sudo dpkg -i pythinker-code_0.20.0_amd64.deb
309
310
  sudo apt-get install -f # only if dpkg reports missing deps
310
311
 
311
312
  # Debian / Ubuntu (ARM64)
312
- sudo dpkg -i pythinker-code_0.18.0_arm64.deb
313
+ sudo dpkg -i pythinker-code_0.20.0_arm64.deb
313
314
 
314
315
  # Fedora / RHEL / openSUSE (x86_64)
315
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.18.0/pythinker-code-0.18.0.x86_64.rpm
316
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.18.0/pythinker-code-0.18.0.x86_64.rpm.sha256
317
- sha256sum -c pythinker-code-0.18.0.x86_64.rpm.sha256
316
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.20.0/pythinker-code-0.20.0.x86_64.rpm
317
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.20.0/pythinker-code-0.20.0.x86_64.rpm.sha256
318
+ sha256sum -c pythinker-code-0.20.0.x86_64.rpm.sha256
318
319
  # Fedora / RHEL:
319
- sudo dnf install ./pythinker-code-0.18.0.x86_64.rpm
320
+ sudo dnf install ./pythinker-code-0.20.0.x86_64.rpm
320
321
  # openSUSE:
321
- sudo zypper install ./pythinker-code-0.18.0.x86_64.rpm
322
+ sudo zypper install ./pythinker-code-0.20.0.x86_64.rpm
322
323
 
323
324
  # Fedora / RHEL (aarch64)
324
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.18.0/pythinker-code-0.18.0.aarch64.rpm
325
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.18.0/pythinker-code-0.18.0.aarch64.rpm.sha256
326
- sha256sum -c pythinker-code-0.18.0.aarch64.rpm.sha256
327
- sudo dnf install ./pythinker-code-0.18.0.aarch64.rpm
325
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.20.0/pythinker-code-0.20.0.aarch64.rpm
326
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.20.0/pythinker-code-0.20.0.aarch64.rpm.sha256
327
+ sha256sum -c pythinker-code-0.20.0.aarch64.rpm.sha256
328
+ sudo dnf install ./pythinker-code-0.20.0.aarch64.rpm
328
329
  ```
329
330
 
330
331
  Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
@@ -333,8 +334,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
333
334
  **Verify before install:**
334
335
 
335
336
  ```sh
336
- sha256sum -c pythinker-code_0.18.0_amd64.deb.sha256 # Debian/Ubuntu
337
- sha256sum -c pythinker-code-0.18.0.x86_64.rpm.sha256 # Fedora/RHEL
337
+ sha256sum -c pythinker-code_0.20.0_amd64.deb.sha256 # Debian/Ubuntu
338
+ sha256sum -c pythinker-code-0.20.0.x86_64.rpm.sha256 # Fedora/RHEL
338
339
  ```
339
340
 
340
341
  **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
@@ -364,7 +365,7 @@ at `~/.local/bin/pythinker`.
364
365
  curl -fsSL https://pythinker.com/install.sh | bash
365
366
 
366
367
  # Pin a specific version
367
- curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.18.0
368
+ curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.20.0
368
369
 
369
370
  # Custom prefix (defaults to $HOME/.local)
370
371
  curl -fsSL https://pythinker.com/install.sh | bash -s -- --prefix /opt/pythinker
@@ -385,13 +386,13 @@ Supported targets:
385
386
 
386
387
  | `uname -s / -m` | Tarball asset |
387
388
  |---|---|
388
- | Linux / x86_64 | `pythinker-0.18.0-x86_64-unknown-linux-gnu.tar.gz` |
389
- | Linux / aarch64 | `pythinker-0.18.0-aarch64-unknown-linux-gnu.tar.gz` |
390
- | Darwin / arm64 | `pythinker-0.18.0-aarch64-apple-darwin.tar.gz` |
389
+ | Linux / x86_64 | `pythinker-<version>-x86_64-unknown-linux-gnu.tar.gz` |
390
+ | Linux / aarch64 | `pythinker-<version>-aarch64-unknown-linux-gnu.tar.gz` |
391
+ | Darwin / arm64 | `pythinker-<version>-aarch64-apple-darwin.tar.gz` |
392
+ | Darwin / x86_64 | `pythinker-<version>-x86_64-apple-darwin.tar.gz` |
391
393
 
392
394
  The script prints PATH guidance if `~/.local/bin` isn't already on your
393
- `$PATH`. Intel macOS users — use Homebrew or `pip install pythinker-code`;
394
- no PyInstaller-built Intel Darwin binary is published.
395
+ `$PATH`.
395
396
 
396
397
  **Uninstall:** `rm ~/.local/bin/pythinker`.
397
398
 
@@ -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/mohamed-elkholy95/Pythinker-Code/blob/main/LICENSE)
15
15
  [![CI](https://img.shields.io/github/actions/workflow/status/mohamed-elkholy95/Pythinker-Code/ci-pythinker-cli.yml?branch=main&label=CI&style=for-the-badge&logo=githubactions&logoColor=white)](https://github.com/mohamed-elkholy95/Pythinker-Code/actions/workflows/ci-pythinker-cli.yml?query=branch%3Amain)
16
16
 
17
- [![Downloads](https://img.shields.io/pepy/dt/pythinker-code?cacheSeconds=300)](https://pepy.tech/projects/pythinker-code)
17
+ [![PyPI downloads](https://assets.piptrends.com/get-last-month-downloads-badge/pythinker-code.svg)](https://piptrends.com/package/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,15 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
50
50
 
51
51
  ---
52
52
 
53
- ## 🆕 What's New in 0.18.0
53
+ ## 🆕 What's New in 0.20.0
54
54
 
55
- - **Live subagent activity streaming.** Subagent tool calls now stream live into the transcript, with safe pending headers for in-flight tool calls, new transcript progress events, and a unified shimmer animation across active-work labels so long-running exploration stays legible.
56
- - **Smarter delegation and orchestration.** A Context-First Orchestration Protocol guides the default agent, specialist subagents receive prompt packets for single-objective delegation plus evidence and verification gates, and overflow RunAgents children are deferred instead of hard-failing.
57
- - **Calmer, more resilient TUI.** In-flight and singular Ask payloads no longer flash an invalid badge, MCP startup status is cleaner, and shell rendering and MCP guidance are refined.
58
- - **Sturdier configuration handling.** Incompatible legacy JSON config is now preserved instead of being silently reset to defaults.
59
- - **Security and shell hardening.** The security scan and shell execution paths were hardened against unexpected input.
55
+ - **Ranked recall injection and Scratchpad working memory.** The memory subsystem gains a dependency-free lexical retriever, ranked recall injection replacing the previous verbatim memory dump, and a new root-only `Scratchpad` tool that lets the agent record structured notes across tool calls during a session.
56
+ - **Full memory lifecycle: Phases B–D.** A unified injection bus re-arms recall on every Memory or Scratchpad write (Phase B), session-end episodic recaps are harvested before compaction into a per-project journal (Phase C, off by default), and an approval-gated inbox consolidation flow (`/memory inbox`) proposes—but never auto-applies—memory merges (Phase D).
57
+ - **Context-aware and web-fresh agent subagents.** Code-reviewer, security-reviewer, coder, and plan specialists now mandate a context7-first / web-fallback freshness check before scoring third-party findings or writing against a library. The system prompt gains a Granular Todo discipline and an Engineering Discipline section.
58
+ - **Memory robustness hardening.** Compaction harvest failures are now isolated per-phase, inbox JSON-parse errors log and skip instead of dropping silently, and the recall injection bus uses a knapsack budget that continues filling with lower-priority candidates after a high-priority slot overflows.
59
+ - **Animated robot logo in all native installers.** The curl-bash and PowerShell native installers now display a Tetris-style animated robot-head logo on supported terminals, with a static fallback for CI, `NO_COLOR`, or `PYTHINKER_NO_ANIMATION=1`.
60
60
 
61
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.18.0`, or use the native installer for your platform from the [Releases page](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest).
61
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.20.0`, or use the native installer for your platform from the [Releases page](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest).
62
62
 
63
63
 
64
64
  ---
@@ -148,7 +148,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
148
148
 
149
149
  | Platform | Recommended install | Artifact source |
150
150
  |---|---|---|
151
- | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.18.0.exe` from [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
151
+ | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.20.0.exe` from [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
152
152
  | **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> / <img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux">** | `curl -fsSL https://pythinker.com/install.sh \| bash` | native tarball from [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
153
153
  | **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> — Homebrew** | `brew install mohamed-elkholy95/pythinker/pythinker-code` | auto-published Homebrew tap |
154
154
  | **<img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux"> — system package** | Download the `.deb` or `.rpm` for your distro below | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
@@ -173,7 +173,7 @@ pythinker # start the interactive TUI
173
173
 
174
174
  ### 🪟 Windows — native installer
175
175
 
176
- `PythinkerSetup-0.18.0.exe` is a signed* Inno Setup wizard. Installs per-user
176
+ `PythinkerSetup-0.20.0.exe` is a signed* Inno Setup wizard. Installs per-user
177
177
  into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
178
178
  PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
179
179
  the change. **No UAC prompt.**
@@ -184,13 +184,13 @@ irm https://pythinker.com/install.ps1 | iex
184
184
 
185
185
  # Or manually download the installer + checksum from the Releases page,
186
186
  # verify with Get-FileHash, then run:
187
- .\PythinkerSetup-0.18.0.exe
187
+ .\PythinkerSetup-0.20.0.exe
188
188
 
189
189
  # Open a fresh PowerShell
190
190
  pythinker --version
191
191
  ```
192
192
 
193
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.18.0.exe /ALLUSERS`
193
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.20.0.exe /ALLUSERS`
194
194
  installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
195
195
 
196
196
  **Upgrade:** `pythinker update` from inside the running app — it downloads
@@ -219,9 +219,10 @@ which pythinker # -> /opt/homebrew/bin/pythinker (Apple Silicon)
219
219
  # or /usr/local/bin/pythinker (Intel)
220
220
  ```
221
221
 
222
- Works on **Apple Silicon and Intel** brew picks the right Python build for
223
- you. The tap auto-publishes a fresh formula on every Pythinker release, so
224
- `brew upgrade pythinker-code` always finds the latest version.
222
+ Works on **Apple Silicon and Intel** from the same native GitHub Release
223
+ tarballs used by the curl installer. The tap auto-publishes a fresh formula on
224
+ every Pythinker release, so `brew upgrade pythinker-code` always finds the
225
+ latest version.
225
226
 
226
227
  **Upgrade:** `brew upgrade pythinker-code` (Homebrew packages don't
227
228
  auto-update; run this whenever you want the latest).
@@ -240,26 +241,26 @@ attached to every GitHub Release.
240
241
 
241
242
  ```sh
242
243
  # Debian / Ubuntu (x86_64)
243
- sudo dpkg -i pythinker-code_0.18.0_amd64.deb
244
+ sudo dpkg -i pythinker-code_0.20.0_amd64.deb
244
245
  sudo apt-get install -f # only if dpkg reports missing deps
245
246
 
246
247
  # Debian / Ubuntu (ARM64)
247
- sudo dpkg -i pythinker-code_0.18.0_arm64.deb
248
+ sudo dpkg -i pythinker-code_0.20.0_arm64.deb
248
249
 
249
250
  # Fedora / RHEL / openSUSE (x86_64)
250
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.18.0/pythinker-code-0.18.0.x86_64.rpm
251
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.18.0/pythinker-code-0.18.0.x86_64.rpm.sha256
252
- sha256sum -c pythinker-code-0.18.0.x86_64.rpm.sha256
251
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.20.0/pythinker-code-0.20.0.x86_64.rpm
252
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.20.0/pythinker-code-0.20.0.x86_64.rpm.sha256
253
+ sha256sum -c pythinker-code-0.20.0.x86_64.rpm.sha256
253
254
  # Fedora / RHEL:
254
- sudo dnf install ./pythinker-code-0.18.0.x86_64.rpm
255
+ sudo dnf install ./pythinker-code-0.20.0.x86_64.rpm
255
256
  # openSUSE:
256
- sudo zypper install ./pythinker-code-0.18.0.x86_64.rpm
257
+ sudo zypper install ./pythinker-code-0.20.0.x86_64.rpm
257
258
 
258
259
  # Fedora / RHEL (aarch64)
259
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.18.0/pythinker-code-0.18.0.aarch64.rpm
260
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.18.0/pythinker-code-0.18.0.aarch64.rpm.sha256
261
- sha256sum -c pythinker-code-0.18.0.aarch64.rpm.sha256
262
- sudo dnf install ./pythinker-code-0.18.0.aarch64.rpm
260
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.20.0/pythinker-code-0.20.0.aarch64.rpm
261
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.20.0/pythinker-code-0.20.0.aarch64.rpm.sha256
262
+ sha256sum -c pythinker-code-0.20.0.aarch64.rpm.sha256
263
+ sudo dnf install ./pythinker-code-0.20.0.aarch64.rpm
263
264
  ```
264
265
 
265
266
  Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
@@ -268,8 +269,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
268
269
  **Verify before install:**
269
270
 
270
271
  ```sh
271
- sha256sum -c pythinker-code_0.18.0_amd64.deb.sha256 # Debian/Ubuntu
272
- sha256sum -c pythinker-code-0.18.0.x86_64.rpm.sha256 # Fedora/RHEL
272
+ sha256sum -c pythinker-code_0.20.0_amd64.deb.sha256 # Debian/Ubuntu
273
+ sha256sum -c pythinker-code-0.20.0.x86_64.rpm.sha256 # Fedora/RHEL
273
274
  ```
274
275
 
275
276
  **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
@@ -299,7 +300,7 @@ at `~/.local/bin/pythinker`.
299
300
  curl -fsSL https://pythinker.com/install.sh | bash
300
301
 
301
302
  # Pin a specific version
302
- curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.18.0
303
+ curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.20.0
303
304
 
304
305
  # Custom prefix (defaults to $HOME/.local)
305
306
  curl -fsSL https://pythinker.com/install.sh | bash -s -- --prefix /opt/pythinker
@@ -320,13 +321,13 @@ Supported targets:
320
321
 
321
322
  | `uname -s / -m` | Tarball asset |
322
323
  |---|---|
323
- | Linux / x86_64 | `pythinker-0.18.0-x86_64-unknown-linux-gnu.tar.gz` |
324
- | Linux / aarch64 | `pythinker-0.18.0-aarch64-unknown-linux-gnu.tar.gz` |
325
- | Darwin / arm64 | `pythinker-0.18.0-aarch64-apple-darwin.tar.gz` |
324
+ | Linux / x86_64 | `pythinker-<version>-x86_64-unknown-linux-gnu.tar.gz` |
325
+ | Linux / aarch64 | `pythinker-<version>-aarch64-unknown-linux-gnu.tar.gz` |
326
+ | Darwin / arm64 | `pythinker-<version>-aarch64-apple-darwin.tar.gz` |
327
+ | Darwin / x86_64 | `pythinker-<version>-x86_64-apple-darwin.tar.gz` |
326
328
 
327
329
  The script prints PATH guidance if `~/.local/bin` isn't already on your
328
- `$PATH`. Intel macOS users — use Homebrew or `pip install pythinker-code`;
329
- no PyInstaller-built Intel Darwin binary is published.
330
+ `$PATH`.
330
331
 
331
332
  **Uninstall:** `rm ~/.local/bin/pythinker`.
332
333
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pythinker-code"
3
- version = "0.18.0"
3
+ version = "0.20.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,29 @@ GitHub Releases page; `0.8.0` is the new starting line.
15
15
 
16
16
  ## Unreleased
17
17
 
18
+ ## 0.20.0 (2026-05-28)
19
+
20
+ ### What changed in this release
21
+
22
+ - **Ranked recall injection and Scratchpad working memory.** The memory subsystem gains a dependency-free lexical retriever, ranked recall injection replacing the previous verbatim memory dump, and a new root-only `Scratchpad` tool that lets the agent record structured notes across tool calls during a session.
23
+ - **Full memory lifecycle: Phases B–D.** A unified injection bus re-arms recall on every Memory or Scratchpad write (Phase B), session-end episodic recaps are harvested before compaction into a per-project journal (Phase C, off by default), and an approval-gated inbox consolidation flow (`/memory inbox`) proposes—but never auto-applies—memory merges (Phase D).
24
+ - **Context-aware and web-fresh agent subagents.** Code-reviewer, security-reviewer, coder, and plan specialists now mandate a context7-first / web-fallback freshness check before scoring third-party findings or writing against a library. The system prompt gains a Granular Todo discipline (one in-progress sub-todo per dispatched subagent) and an Engineering Discipline section.
25
+ - **Memory robustness hardening.** Compaction harvest failures are now isolated per-phase (a broken prepare step no longer silently cancels recall), inbox JSON-parse errors log and skip instead of dropping silently, and the recall injection bus uses a knapsack budget that continues filling with lower-priority candidates after a high-priority slot overflows.
26
+ - **Animated robot logo in all native installers.** The curl-bash and PowerShell native installers now display a Tetris-style animated robot-head logo on supported terminals, with a static fallback for CI, `NO_COLOR`, dumb-term, or `PYTHINKER_NO_ANIMATION=1`.
27
+
28
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.20.0`, or use the native installer for your OS (see the README install table).
29
+
30
+ ## 0.19.0 (2026-05-27)
31
+
32
+ ### What changed in this release
33
+
34
+ - **Central per-project agent memory.** Pythinker now keeps a durable per-project memory (`MEMORY.md` / `USER.md`) under `~/.pythinker/projects/<key>/memory/`, written through a new root-only `Memory` tool with content guards and secret-shape detection, recalled into the root agent's first wakeup prompt within a bounded budget, and inspectable with the new `/memory` command.
35
+ - **Non-blocking update flow.** The blocking pre-start update prompt is replaced by a cached, no-network startup notice plus a triggerable `/update` command, and the native Windows installer now waits on the launching process before swapping files and cleans up its staged installer.
36
+ - **Fully native Homebrew formula.** Brew installs are generated from the same GitHub Release tarballs as the curl installer (including macOS Intel native assets), so they no longer depend on PyPI virtualenv resources.
37
+ - **Release pipeline hardening.** TestPyPI publishing is now non-blocking and publish steps carry timeouts, so a transient staging flake no longer fails a release.
38
+
39
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.19.0`, or use the native installer for your OS (see the README install table).
40
+
18
41
  ## 0.18.0 (2026-05-27)
19
42
 
20
43
  ### What changed in this release
@@ -12,6 +12,8 @@ agent:
12
12
  # - "pythinker_code.tools.think:Think"
13
13
  - "pythinker_code.tools.ask_user:AskUserQuestion"
14
14
  - "pythinker_code.tools.todo:SetTodoList"
15
+ - "pythinker_code.tools.memory:Memory"
16
+ - "pythinker_code.tools.scratchpad:Scratchpad"
15
17
  - "pythinker_code.tools.shell:Shell"
16
18
  - "pythinker_code.tools.background:TaskList"
17
19
  - "pythinker_code.tools.background:TaskOutput"
@@ -23,6 +23,12 @@ agent:
23
23
  - Build a review context packet: base ref/diff scope, changed behavior, likely tests, user-visible impact, and validation evidence.
24
24
  - Flag only issues introduced or made reachable by the diff.
25
25
  - Prefer no finding over vague speculation. Every finding must cite concrete evidence and a failure mode.
26
+
27
+ Freshness check (run BEFORE flagging third-party library or framework misuse):
28
+ - For every third-party API, SDK call, framework primitive, or "best practice" the diff turns on, verify the current canonical usage. Prefer a context7 MCP query (e.g. `mcp__context7__query-docs` with the library id) when registered with the parent runtime; otherwise use `SearchWeb` to locate the official documentation and `FetchURL` to read the current page.
29
+ - Do NOT flag "deprecated", "removed", "wrong API", or "missing parameter" purely from training-cutoff memory. Either verify against the live docs and cite the URL in EVIDENCE, or downgrade the finding to RISKS with a "needs verification" note.
30
+ - The freshness check is itself read-only and bounded — one or two fetches per load-bearing finding is enough; do not crawl.
31
+ - Skip the check for purely internal-codebase findings (logic, scope, project conventions); it applies only to third-party-surface claims.
26
32
  - Do not request tests unless they cover a distinct behavior or risk introduced by the change.
27
33
  - Treat V0 robustness suggestions as future work unless they risk correctness, security, data loss, or persistent hangs.
28
34
  - For user-visible UI/behavior changes, check whether screenshots, GIFs, videos, or equivalent visual evidence are present; if absent, request that evidence as a blocking review concern.
@@ -48,6 +54,8 @@ agent:
48
54
  - "pythinker_code.tools.file:ReadFile"
49
55
  - "pythinker_code.tools.file:Grep"
50
56
  - "pythinker_code.tools.skill:ReadSkill"
57
+ - "pythinker_code.tools.web:SearchWeb"
58
+ - "pythinker_code.tools.web:FetchURL"
51
59
  exclude_tools:
52
60
  - "pythinker_code.tools.file:WriteFile"
53
61
  - "pythinker_code.tools.file:StrReplaceFile"
@@ -14,6 +14,7 @@ agent:
14
14
 
15
15
  Implementation method:
16
16
  - Before editing, read the target files and confirm the line ranges/patterns you will change.
17
+ - Before writing against a third-party library, SDK, cloud service, or framework, pull its current API docs first. Prefer a context7 MCP query (e.g. `mcp__context7__query-docs` with the library id) when registered with the parent runtime; otherwise use `SearchWeb` to find the official docs and `FetchURL` to read the current page. Do NOT write API calls from training-cutoff memory for surfaces that move (LLM SDKs, cloud SDKs, web frameworks, ORM/migration tools, anything < 2 years old). Cite the doc URL or context7 result in EVIDENCE.
17
18
  - Prefer StrReplaceFile for narrow changes; use WriteFile only for new files or intentional full rewrites.
18
19
  - Add or update tests when the brief requires behavior changes and the project has relevant tests.
19
20
  - After edits, inspect the diff/changed files for scope creep, TODOs/placeholders, import mistakes, and logic mismatches.
@@ -21,6 +21,12 @@ agent:
21
21
  - For every task, include artifacts to change, acceptance criteria, suggested specialist (`explore`, `implementer`, `review`, `security-reviewer`, `debugger`, `verifier`), and the smallest verification command/check.
22
22
  - Call out risks, blockers, migration/backward-compatibility concerns, and test gaps.
23
23
 
24
+ Library/API freshness (run BEFORE recommending an external dependency or API surface):
25
+ - For every third-party library, SDK, framework, or cloud service the plan turns on (new dep, version bump, non-trivial API surface, security-sensitive primitive), pull the current docs first. Prefer a context7 MCP query (e.g. `mcp__context7__query-docs` with the library id) when registered with the parent runtime; otherwise use `SearchWeb` to find the official docs and `FetchURL` to read the current page.
26
+ - Do NOT plan around an API from training-cutoff memory if it has moved (LLM SDKs, cloud SDKs, web frameworks, ORM/migration tools). Verify the call shape, supported versions, and any documented migration path.
27
+ - Cite the doc reference inline next to the task that depends on it, in EVIDENCE.
28
+ - When the freshness check changes the plan (e.g. an API was removed, a new auth flow is mandated), call it out in RISKS as a constraint the implementer must honor.
29
+
24
30
  Ground the plan in evidence. Read enough files to avoid guessing, name the trade-offs, and choose one path with a reason. Each step should name the artifact it changes and the verification that proves it worked. Order steps by dependency first, then by risk reduced per effort.
25
31
 
26
32
  Final response contract:
@@ -22,6 +22,13 @@ agent:
22
22
  - Check graceful degradation, observability/logging, recovery behavior, structured result/status correctness, and approval/policy mismatches when they affect security posture.
23
23
  - Translate JSON output into the structured response block below.
24
24
 
25
+ Latest advisory pull (run BEFORE finalizing severity):
26
+ - Identify every third-party surface in the diff: dependencies (pyproject/requirements/lock), SDK calls, framework primitives, crypto/auth helpers, network/serialization libs.
27
+ - For each surface, pull current advisories and release notes. Prefer a context7 MCP query (e.g. `mcp__context7__query-docs` with the library id) when registered with the parent runtime; otherwise use `SearchWeb` for the latest CVE/GHSA/security-advisory bulletin and `FetchURL` for the canonical advisory text.
28
+ - Never cite a CVE, GHSA id, or "X is patched in vY" claim from memory alone — verify against the live advisory body. If the network is unavailable, omit the citation and record it under RISKS as a coverage gap.
29
+ - For framework-specific threat patterns, the reference is `blackbox/pythinker-security-scanner` (especially `docs/supported-tech.md` threat highlights and `packages/scanner/src/matchers/`). Cross-check the diff against the relevant tech tag's highlights.
30
+ - Web fetches must be evidence, not chatter: cite the URL inline in EVIDENCE when a finding turns on a current advisory.
31
+
25
32
  Final response contract:
26
33
  ### SUMMARY
27
34
  One paragraph: number and severity of security findings, what the parent should fix first.
@@ -39,6 +46,8 @@ agent:
39
46
  - "pythinker_code.tools.shell:Shell"
40
47
  - "pythinker_code.tools.file:ReadFile"
41
48
  - "pythinker_code.tools.file:Grep"
49
+ - "pythinker_code.tools.web:SearchWeb"
50
+ - "pythinker_code.tools.web:FetchURL"
42
51
  exclude_tools:
43
52
  - "pythinker_code.tools.file:WriteFile"
44
53
  - "pythinker_code.tools.file:StrReplaceFile"
@@ -39,6 +39,37 @@ For any codebase, architecture, debugging, security, performance, planning, or "
39
39
 
40
40
  **Professional handoff format:** For substantial tasks, keep a visible plan/todo and structure work as `context -> assessment -> plan -> execution -> verification -> residual risks`. Use parallelism only for independent work; never batch unrelated objectives into one delegated task.
41
41
 
42
+ # Engineering Discipline
43
+
44
+ These principles govern every engineering response. They override speed: a slow right answer beats a fast wrong one.
45
+
46
+ **1. Think before coding — don't assume, don't hide confusion, surface tradeoffs.**
47
+ - State your assumptions explicitly before implementing. If uncertain, ask.
48
+ - If the request admits multiple interpretations, present them — don't pick one silently.
49
+ - If a simpler approach exists than what the user proposed, say so before building the complex one. Push back when warranted.
50
+ - If something is unclear, stop. Name what's confusing. Ask one focused question.
51
+ - Clarifying questions belong **before** implementation, not after mistakes.
52
+
53
+ **2. Simplicity first — minimum code that solves the problem, nothing speculative.**
54
+ - No features beyond what was asked.
55
+ - No abstractions for single-use code.
56
+ - No "flexibility" or "configurability" that wasn't requested.
57
+ - No error handling for impossible scenarios; validate at boundaries only.
58
+ - If a 200-line draft could be 50 lines, rewrite it before showing it.
59
+ - Self-check: *"Would a senior engineer call this overcomplicated?"* If yes, simplify.
60
+
61
+ **3. Goal-driven execution — define success criteria, then loop until verified.**
62
+ - Transform vague tasks into verifiable goals before writing code:
63
+ - "Add validation" → "Write tests for invalid inputs, then make them pass."
64
+ - "Fix the bug" → "Write a test that reproduces it, then make it pass."
65
+ - "Refactor X" → "Ensure tests pass before and after; behavior identical."
66
+ - "Make it faster" → "Benchmark current, set target, prove improvement on same inputs."
67
+ - For multi-step work, state the plan inline as `Step → verify: check`, then execute against it.
68
+ - "It compiles" is not verification. "It type-checks" is not verification. Verification is a passing test, a working repro, or a deterministic command that confirms the intended behavior.
69
+ - Don't claim done without proof. If verification can't run, say so explicitly under BLOCKERS instead of asserting success.
70
+
71
+ These principles are working if: diffs contain only requested changes, fewer rewrites land because of overcomplication, and clarifying questions appear before the first edit rather than after the first mistake.
72
+
42
73
  # Prompt and Tool Use
43
74
 
44
75
  The user's messages may contain questions and/or task descriptions in natural language, code snippets, logs, file paths, or other forms of information. Read them, understand them and do what the user requested. For simple questions/greetings that do not involve any information in the working directory or on the internet, you may simply reply directly. For anything else, default to taking action with tools. When the request could be interpreted as either a question to answer or a task to complete, treat it as a task.
@@ -59,6 +90,8 @@ For any non-trivial request, decompose before acting:
59
90
 
60
91
  - Preview the terrain first: scan the directory structure, file headers, and relevant module boundaries before choosing an implementation path.
61
92
  - Use `SetTodoList` for multi-step work so the user can see the active plan and progress.
93
+ - **Granular todos, not umbrella todos.** Each todo must name a single concrete deliverable a human can recognize as "this part is done." Avoid umbrella titles like "Determine X" or "Investigate Y" that cover hours of parallel work — they freeze the progress UI while real work happens underneath. If a single todo would stay `in_progress` for more than ~3 minutes, it is too coarse: split it before launching work.
94
+ - **One todo per dispatched child.** When you launch `RunAgents` with N children, the visible todo list MUST contain one in_progress sub-todo per child (or per independent objective the batch covers) **before** the batch starts. Update each sub-todo to `done` as that child returns — do not wait for the whole batch to finish to flip a single umbrella todo. Same rule applies to multiple parallel `Agent` calls in the same turn.
62
95
  - Split broad work into independent chunks; use parallel tool calls or focused subagents for chunks that do not depend on each other.
63
96
  - For large codebase scans, start with indexes/graphs and targeted searches; avoid one vague repo-wide subagent prompt. If using background agents for thorough exploration, set a realistic explicit timeout and keep scopes narrow. If agents time out, do not repeat the same broad launch; summarize partial evidence, run targeted direct scans, and resume or relaunch narrower agents only when useful.
64
97
  - Re-read the plan after each phase and adjust it when new evidence changes the approach.
@@ -345,6 +345,13 @@ class PythinkerCLI:
345
345
 
346
346
  soul = PythinkerSoul(agent, context=context)
347
347
 
348
+ from pythinker_code.memory.recall import RecallInjectionProvider
349
+ from pythinker_code.project_memory import ProjectMemoryStore
350
+
351
+ soul.add_injection_provider(
352
+ RecallInjectionProvider(ProjectMemoryStore(session.work_dir), session)
353
+ )
354
+
348
355
  # Activate plan mode if requested (for new sessions or --plan flag)
349
356
  if plan_mode and not soul.plan_mode:
350
357
  await soul.set_plan_mode_from_manual(True)
@@ -907,7 +907,20 @@ def pythinker(
907
907
  # Session scratchpads are retained as compact history for future recall.
908
908
  # ``cleanup_scratchpad`` is kept for call-site compatibility but no longer
909
909
  # triggers automatic deletion after a successful run.
910
- _ = cleanup_scratchpad, exit_code
910
+ _ = cleanup_scratchpad
911
+ if exit_code == ExitCode.SUCCESS and getattr(
912
+ getattr(config, "memory", None), "journal_recaps", False
913
+ ):
914
+ with contextlib.suppress(Exception):
915
+ from pythinker_code.memory.recap import build_session_recap
916
+ from pythinker_code.project_memory import ProjectMemoryStore
917
+
918
+ recap = build_session_recap(
919
+ state=last_session.state,
920
+ session_id=last_session.id,
921
+ request=last_session.title,
922
+ )
923
+ await ProjectMemoryStore(last_session.work_dir).append_journal(recap)
911
924
  _print_resume_hint(last_session)
912
925
  if last_session.is_empty():
913
926
  # Always clean up empty sessions regardless of exit code
@@ -987,11 +1000,6 @@ def pythinker(
987
1000
  await _delete_empty_session(_latest_created_session)
988
1001
  raise
989
1002
 
990
- if ui == "shell" and prompt is None:
991
- from pythinker_code.ui.shell.update import prompt_pre_start_update
992
-
993
- asyncio.run(prompt_pre_start_update())
994
-
995
1003
  if _picker_mode:
996
1004
  from prompt_toolkit.shortcuts.choice_input import ChoiceInput
997
1005
  from rich.console import Console
@@ -135,6 +135,38 @@ class NotificationConfig(BaseModel):
135
135
  claim_stale_after_ms: int = Field(default=15_000, ge=1000)
136
136
 
137
137
 
138
+ class MemoryConfig(BaseModel):
139
+ """Context- and memory-aware agent configuration."""
140
+
141
+ lexical_recall: bool = Field(
142
+ default=True,
143
+ description="Use relevance-ranked lexical recall instead of verbatim project memory.",
144
+ )
145
+ injection_bus: bool = Field(
146
+ default=True,
147
+ description="Budget dynamic prompt injections through the injection bus.",
148
+ )
149
+ injection_ceiling_tokens: int = Field(
150
+ default=2048,
151
+ ge=256,
152
+ description="Maximum total tokens reserved for dynamic prompt injections.",
153
+ )
154
+ harvest_on_compaction: bool = Field(
155
+ default=False,
156
+ description=(
157
+ "Persist safe decisions/blockers/next steps before compaction discards history."
158
+ ),
159
+ )
160
+ journal_recaps: bool = Field(
161
+ default=False,
162
+ description="Write stable-schema JOURNAL.md session recap blocks.",
163
+ )
164
+ consolidation: bool = Field(
165
+ default=False,
166
+ description="Enable approval-gated memory inbox consolidation helpers.",
167
+ )
168
+
169
+
138
170
  class PythinkerAISearchConfig(BaseModel):
139
171
  """Pythinker AI Search configuration."""
140
172
 
@@ -324,6 +356,7 @@ class Config(BaseModel):
324
356
  default_factory=NotificationConfig, description="Notification configuration"
325
357
  )
326
358
  services: Services = Field(default_factory=Services, description="Services configuration")
359
+ memory: MemoryConfig = Field(default_factory=MemoryConfig, description="Memory configuration")
327
360
  feedback: FeedbackConfig = Field(
328
361
  default_factory=FeedbackConfig,
329
362
  description="User-submitted feedback endpoint configuration",
@@ -0,0 +1 @@
1
+ """Context- & memory-aware agent subsystem (retrieval, recall, sanitization)."""