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.
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/PKG-INFO +36 -35
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/README.md +35 -34
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/pyproject.toml +1 -1
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/CHANGELOG.md +23 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/agent.yaml +2 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/code_reviewer.yaml +8 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/coder.yaml +1 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/plan.yaml +6 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/security_reviewer.yaml +9 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/system.md +33 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/app.py +7 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/__init__.py +14 -6
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/config.py +33 -0
- pythinker_code-0.20.0/src/pythinker_code/memory/__init__.py +1 -0
- pythinker_code-0.20.0/src/pythinker_code/memory/consolidation.py +115 -0
- pythinker_code-0.20.0/src/pythinker_code/memory/harvest.py +54 -0
- pythinker_code-0.20.0/src/pythinker_code/memory/recall.py +271 -0
- pythinker_code-0.20.0/src/pythinker_code/memory/recap.py +94 -0
- pythinker_code-0.20.0/src/pythinker_code/memory/retriever.py +113 -0
- pythinker_code-0.20.0/src/pythinker_code/memory/retriever_sqlite.py +42 -0
- pythinker_code-0.20.0/src/pythinker_code/memory/sanitize.py +22 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/native.py +19 -10
- pythinker_code-0.20.0/src/pythinker_code/project_memory.py +422 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/scratchpad.py +163 -1
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/agent.py +3 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/compaction.py +6 -2
- pythinker_code-0.20.0/src/pythinker_code/soul/dynamic_injection.py +211 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/pythinkersoul.py +66 -1
- pythinker_code-0.20.0/src/pythinker_code/tools/memory/__init__.py +60 -0
- pythinker_code-0.20.0/src/pythinker_code/tools/memory/memory.md +20 -0
- pythinker_code-0.20.0/src/pythinker_code/tools/scratchpad/__init__.py +65 -0
- pythinker_code-0.20.0/src/pythinker_code/tools/scratchpad/scratchpad_tool.md +8 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/__init__.py +8 -5
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/glyphs.py +5 -5
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/prompt.py +77 -3
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/slash.py +64 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/update.py +351 -36
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +5 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +41 -22
- 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
- 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
- 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
- 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
- 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
- pythinker_code-0.20.0/src/pythinker_code/web/static/assets/channel-CF2Oapph.js +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- pythinker_code-0.20.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-C93M7cGf.js +1 -0
- pythinker_code-0.20.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-C93M7cGf.js +1 -0
- pythinker_code-0.20.0/src/pythinker_code/web/static/assets/clone-dDvPvtYv.js +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- pythinker_code-0.20.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-DsjFfFnz.js +1 -0
- 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
- 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
- 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
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/index.html +1 -1
- pythinker_code-0.20.0/src/pythinker_code/web/static/install.ps1 +206 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/install.sh +124 -7
- pythinker_code-0.18.0/src/pythinker_code/soul/dynamic_injection.py +0 -84
- pythinker_code-0.18.0/src/pythinker_code/web/static/assets/channel-BEd858yH.js +0 -1
- pythinker_code-0.18.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-Crr9_YII.js +0 -1
- pythinker_code-0.18.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-Crr9_YII.js +0 -1
- pythinker_code-0.18.0/src/pythinker_code/web/static/assets/clone-Dfc-F2za.js +0 -1
- pythinker_code-0.18.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-KTWgI9rj.js +0 -1
- pythinker_code-0.18.0/src/pythinker_code/web/static/install.ps1 +0 -110
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/LICENSE +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/NOTICE +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/__main__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/AGENTS.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/convert.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/host.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/mcp.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/server.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/session.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/tools.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/types.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/acp/version.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/debugger.yaml +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/explore.yaml +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/implementer.yaml +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/review.yaml +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/verifier.yaml +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agentspec.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/approval_runtime/models.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/deepseek.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/github_feedback.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/lm_studio.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/minimax.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/oauth.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/ollama.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/openai.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/opencode_go.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/openrouter.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/auth/platforms.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/agent_runner.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/ids.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/manager.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/models.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/store.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/summary.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/background/worker.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/__main__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/_lazy_group.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/debug.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/export.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/info.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/mcp.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/plugin.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/review.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/secscan.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/security_scan.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/skill.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/toad.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/update.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/vis.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/cli/web.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/constant.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/events.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/exception.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/execution_profiles.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/extensions.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/file_restore.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/hooks/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/hooks/config.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/hooks/engine.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/hooks/events.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/hooks/runner.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/llm.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/metadata.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/notifications/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/notifications/llm.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/notifications/manager.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/notifications/models.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/notifications/notifier.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/notifications/store.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/notifications/wire.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/plugin/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/plugin/manager.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/plugin/tool.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/prompt_templates.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/prompts/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/prompts/compact.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/prompts/init.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/py.typed +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/session.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/session_fork.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/session_state.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/share.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skill/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skill/flow/d2.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skill/lockfile.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/check-impl-against-spec/SKILL.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/create-pr/SKILL.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/diagnose-ci-failures/SKILL.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/fix-errors/SKILL.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/implement-specs/SKILL.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/pr-walkthrough/SKILL.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/reproduce-bug-report/SKILL.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/resolve-merge-conflicts/SKILL.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/review-pr/SKILL.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/spec-driven-implementation/SKILL.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/write-product-spec/SKILL.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/skills/write-tech-spec/SKILL.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/approval.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/btw.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/compaction_restore.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/context.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/denwarenji.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/message.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/permission.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/slash.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/soul/toolset.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/builder.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/core.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/discovery.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/git_context.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/models.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/output.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/registry.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/runner.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/subagents/store.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/config.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/crash.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/errors.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/metrics.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/otel.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/sentry.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/telemetry/sink.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/AGENTS.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/agent/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/agent/description.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/ask_user/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/background/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/background/handoff.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/background/input.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/background/list.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/background/output.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/background/stop.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/display.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/glob.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/glob.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/grep.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/grep_local.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/read.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/read.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/read_media.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/read_media.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/replace.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/replace.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/utils.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/write.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/file/write.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/plan/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/plan/description.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/plan/enter.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/plan/handoff.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/shell/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/shell/bash.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/skill/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/skill/description.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/test.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/think/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/think/think.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/utils.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/web/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/web/fetch.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/web/fetch.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/web/search.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/tools/web/search.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/print/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/print/visualize.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/diff.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/dynamic_border.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/markdown.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/panel.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/console.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/debug.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/design_system.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/echo.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/motion.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/render_constants.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/replay.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selector.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/setup.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/spacing.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/spinner_words.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/startup.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tips.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/_file_diff.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_activity_tree.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_dialog_shell.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_transcript.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/theme.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/ui/tui_config.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/aiohttp.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/aioqueue.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/broadcast.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/changelog.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/clipboard.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/datetime.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/diff.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/editor.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/environment.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/envvar.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/export.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/file_filter.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/frontmatter.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/io.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/logging.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/media_tags.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/message.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/path.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/proctitle.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/proxy.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/rich/columns.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/rich/diff_render.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/sensitive.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/server.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/signals.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/slashcmd.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/sleep_inhibitor.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/string.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/term.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/utils/typing.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/api/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/api/sessions.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/api/statistics.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/api/system.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/app.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-CY1rtwrX.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/index-DSRInNnm.css +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/index-DgmTI2M_.js +0 -0
- {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
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- {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
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- {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
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/vis/static/index.html +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/api/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/api/config.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/api/open_in.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/api/sessions.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/app.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/auth.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/models.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/runner/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/runner/messages.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/runner/process.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/runner/worker.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/_headers +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/abap-BdImnpbu.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ada-bCR0ucgS.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/apache-Pmp26Uib.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/apex-D8_7TLub.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/apl-dKokRX4l.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/applescript-Co6uUVPk.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ara-BRHolxvo.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/asm-D_Q5rh1f.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/astro-CbQHKStN.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/awk-DMzUqQB5.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/bat-BkioyH1T.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/beancount-k_qm7-4y.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/berry-uYugtg8r.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/bibtex-CHM0blh-.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/bicep-Bmn6On1c.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/blade-D4QpJJKB.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/bsl-BO_Y6i37.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/c-BIGW1oBm.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/c3-VCDPK7BO.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/cairo-KRGpt6FW.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/clarity-D53aC0YG.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/clojure-P80f7IUj.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/cmake-D1j8_8rp.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/cobol-nwyudZeR.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/coffee-Ch7k5sss.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/coq-DkFqJrB1.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/cpp-CofmeUqb.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/crystal-tKQVLTB8.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/csharp-K5feNrxe.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/css-DPfMkruS.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/csv-fuZLfV_i.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/cue-D82EKSYY.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/cypher-COkxafJQ.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/d-85-TOEBH.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/dart-CF10PKvl.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/dax-CEL-wOlO.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/diff-D97Zzqfu.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/docker-BcOcwvcX.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/dotenv-Da5cRb03.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/dracula-BzJJZx-M.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/edge-BkV0erSs.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/elixir-CDX3lj18.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/elm-DbKCFpqz.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/erb-BOJIQeun.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/erlang-DsQrWhSR.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/fennel-BYunw83y.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/fish-BvzEVeQv.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/fluent-C4IJs8-o.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gdshader-DkwncUOv.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/genie-D0YGMca9.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/github-dark-DHJKELXO.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
- {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
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/github-light-DAi9KRSo.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gleam-BspZqrRM.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/glsl-DplSGwfg.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gn-n2N0HUVH.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/go-Dn2_MT6a.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/graphql-ChdNCCLP.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/groovy-gcz8RCvz.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/hack-CaT9iCJl.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/haml-B8DHNrY2.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/handlebars-BL8al0AC.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/haskell-Df6bDoY_.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/haxe-CzTSHFRz.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/hcl-BWvSN4gD.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/hjson-D5-asLiD.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/houston-DnULxvSX.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/html-GMplVEZG.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/http-jrhK8wxY.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/hurl-irOxFIW8.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/hy-DFXneXwc.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/imba-DGztddWO.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/index-BpoLgcEt.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/index-CzV_vCfu.css +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/index-DI2oedCt.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ini-BEwlwnbL.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/init-Gi6I4Gst.js +0 -0
- {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
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- {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
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- {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
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/java-CylS5w8V.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/javascript-wDzz0qaB.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/jison-wvAkD_A8.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/json-Cp-IABpG.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/json5-C9tS-k6U.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/jsonc-Des-eS-w.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/jssm-C2t-YnRu.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/jsx-g9-lgVsj.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/julia-CxzCAyBv.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/katex-D2lIc1rk.css +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/kdl-DV7GczEv.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/kusto-DZf3V79B.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/laserwave-DUszq2jm.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/latex-B4uzh10-.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/lean-BZvkOJ9d.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/less-B1dDrJ26.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/liquid-DYVedYrR.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/llvm-BtvRca6l.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/log-2UxHyX5q.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/logo-BtOb2qkB.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/lua-BbnMAYS6.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/luau-C-HG3fhB.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/make-CHLpvVh8.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/markdown-Cvjx9yec.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/marko-DZsq8hO1.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/matlab-D7o27uSR.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/mdc-DUICxH0z.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B2P5VJ9v.css +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/min-dark-CafNBF8u.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/min-light-CTRr51gU.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/mojo-B93PlW-d.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/monokai-D4h5O-jR.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/moonbit-Ba13S78F.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/move-Bu9oaDYs.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/narrat-DRg8JJMk.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/nginx-DknmC5AR.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/night-owl-C39BiMTA.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/nim-CVrawwO9.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/nix-CwoSXNpI.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/nord-Ddv68eIx.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/nushell-C-sUppwS.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/one-light-PoHY5YXO.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/openscad-C4EeE6gA.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/pascal-D93ZcfNL.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/perl-C0TMdlhV.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/php-CDn_0X-4.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/pkl-u5AG7uiY.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/plastic-3e1v2bzS.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/plsql-ChMvpjG-.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/po-BTJTHyun.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/polar-C0HS_06l.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/postcss-CXtECtnM.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/powershell-Dpen1YoG.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/prisma-Dd19v3D-.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/prolog-CbFg5uaA.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/proto-C7zT0LnQ.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/pug-CGlum2m_.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/puppet-BMWR74SV.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/purescript-CklMAg4u.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/python-B6aJPvgy.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/qml-3beO22l8.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/qss-IeuSbFQv.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/r-Dspwwk_N.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/racket-BqYA7rlc.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/raku-DXvB9xmW.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/razor-C1TweQQi.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/red-bN70gL4F.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/reg-C-SQnVFl.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/rel-C3B-1QV4.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/riscv-BM1_JUlF.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/rst-B0xPkSld.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ruby-BvKwtOVI.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/rust-B1yitclQ.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/sas-cz2c8ADy.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/scala-C151Ov-r.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/scheme-C98Dy4si.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/scss-OYdSNvt2.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/shellscript-Yzrsuije.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/shellsession-BADoaaVG.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/solidity-rGO070M0.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/soy-Brmx7dQM.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/sparql-rVzFXLq3.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/splunk-BtCnVYZw.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/sql-BLtJtn59.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/stata-BH5u7GGu.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/svelte-zxCyuUbr.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/swift-Dg5xB15N.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/systemd-4A_iFExJ.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/talonscript-CkByrt1z.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/tasl-QIJgUcNo.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/tcl-dwOrl1Do.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/templ-W15q3VgB.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/terraform-BETggiCN.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/tex-CvyZ59Mk.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/tokyo-night-hegEt444.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/toml-vGWfd6FD.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/tsv-B_m7g4N7.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/tsx-COt5Ahok.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/turtle-BsS91CYL.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/twig-CO9l9SDP.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/typespec-BGHnOYBU.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/typst-DHCkPAjA.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/v-BcVCzyr7.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vala-CsfeWuGM.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vb-D17OF-Vu.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/verilog-BQ8w6xss.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vesper-DU1UobuO.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/viml-CJc9bBzg.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vue-DN_0RTcg.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/vyper-CDx5xZoG.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/wasm-MzD3tlZU.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/wenyan-BV7otONQ.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/wit-5i3qLPDT.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/xml-sdJ4AIDG.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/xsl-CtQFsRM5.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/yaml-Buea-lGh.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/assets/zig-VOosw3JB.js +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
- {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
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/static/logo.png +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/store/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/web/store/sessions.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/wire/__init__.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/wire/file.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/wire/protocol.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/wire/root_hub.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/wire/serde.py +0 -0
- {pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/wire/server.py +0 -0
- {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.
|
|
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
|
[](https://github.com/mohamed-elkholy95/Pythinker-Code/blob/main/LICENSE)
|
|
80
80
|
[](https://github.com/mohamed-elkholy95/Pythinker-Code/actions/workflows/ci-pythinker-cli.yml?query=branch%3Amain)
|
|
81
81
|
|
|
82
|
-
[](https://piptrends.com/package/pythinker-code)
|
|
83
83
|
[](https://docs.astral.sh/ruff/)
|
|
84
84
|
[](https://github.com/agentclientprotocol/agent-client-protocol)
|
|
85
85
|
[](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.
|
|
118
|
+
## 🆕 What's New in 0.20.0
|
|
119
119
|
|
|
120
|
-
- **
|
|
121
|
-
- **
|
|
122
|
-
- **
|
|
123
|
-
- **
|
|
124
|
-
- **
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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**
|
|
288
|
-
|
|
289
|
-
`brew upgrade pythinker-code` always finds the
|
|
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.
|
|
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.
|
|
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.
|
|
316
|
-
curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.
|
|
317
|
-
sha256sum -c pythinker-code-0.
|
|
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.
|
|
320
|
+
sudo dnf install ./pythinker-code-0.20.0.x86_64.rpm
|
|
320
321
|
# openSUSE:
|
|
321
|
-
sudo zypper install ./pythinker-code-0.
|
|
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.
|
|
325
|
-
curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.
|
|
326
|
-
sha256sum -c pythinker-code-0.
|
|
327
|
-
sudo dnf install ./pythinker-code-0.
|
|
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.
|
|
337
|
-
sha256sum -c pythinker-code-0.
|
|
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.
|
|
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
|
|
389
|
-
| Linux / aarch64 | `pythinker
|
|
390
|
-
| Darwin / arm64 | `pythinker
|
|
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`.
|
|
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
|
[](https://github.com/mohamed-elkholy95/Pythinker-Code/blob/main/LICENSE)
|
|
15
15
|
[](https://github.com/mohamed-elkholy95/Pythinker-Code/actions/workflows/ci-pythinker-cli.yml?query=branch%3Amain)
|
|
16
16
|
|
|
17
|
-
[](https://piptrends.com/package/pythinker-code)
|
|
18
18
|
[](https://docs.astral.sh/ruff/)
|
|
19
19
|
[](https://github.com/agentclientprotocol/agent-client-protocol)
|
|
20
20
|
[](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.
|
|
53
|
+
## 🆕 What's New in 0.20.0
|
|
54
54
|
|
|
55
|
-
- **
|
|
56
|
-
- **
|
|
57
|
-
- **
|
|
58
|
-
- **
|
|
59
|
-
- **
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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**
|
|
223
|
-
|
|
224
|
-
`brew upgrade pythinker-code` always finds the
|
|
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.
|
|
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.
|
|
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.
|
|
251
|
-
curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.
|
|
252
|
-
sha256sum -c pythinker-code-0.
|
|
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.
|
|
255
|
+
sudo dnf install ./pythinker-code-0.20.0.x86_64.rpm
|
|
255
256
|
# openSUSE:
|
|
256
|
-
sudo zypper install ./pythinker-code-0.
|
|
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.
|
|
260
|
-
curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.
|
|
261
|
-
sha256sum -c pythinker-code-0.
|
|
262
|
-
sudo dnf install ./pythinker-code-0.
|
|
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.
|
|
272
|
-
sha256sum -c pythinker-code-0.
|
|
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.
|
|
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
|
|
324
|
-
| Linux / aarch64 | `pythinker
|
|
325
|
-
| Darwin / arm64 | `pythinker
|
|
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`.
|
|
329
|
-
no PyInstaller-built Intel Darwin binary is published.
|
|
330
|
+
`$PATH`.
|
|
330
331
|
|
|
331
332
|
**Uninstall:** `rm ~/.local/bin/pythinker`.
|
|
332
333
|
|
|
@@ -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
|
{pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/agent.yaml
RENAMED
|
@@ -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"
|
{pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/code_reviewer.yaml
RENAMED
|
@@ -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"
|
{pythinker_code-0.18.0 → pythinker_code-0.20.0}/src/pythinker_code/agents/default/coder.yaml
RENAMED
|
@@ -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
|
|
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)."""
|