pythinker-code 0.48.0__tar.gz → 0.50.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/PKG-INFO +22 -23
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/README.md +21 -22
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/pyproject.toml +1 -1
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/CHANGELOG.md +31 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/system.md +3 -1
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/__init__.py +48 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/best_practices.md +1 -0
- pythinker_code-0.50.0/src/pythinker_code/skills/cleanup-audit/SKILL.md +50 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/__init__.py +19 -26
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/prompt.py +8 -7
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/update.py +63 -6
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/update_orchestrator.py +31 -1
- pythinker_code-0.50.0/src/pythinker_code/web/static/assets/architecture-7EHR7CIX-CiJci_kb.js +1 -0
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/architectureDiagram-3BPJPVTR-CUrUO6PZ.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/architectureDiagram-3BPJPVTR-BtlQ9wMo.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/blockDiagram-GPEHLZMM-DqqZRSB4.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/blockDiagram-GPEHLZMM-pChzMWgu.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/bootstrap-rCQM9IPn.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/bootstrap-BFeiSQNA.js +5 -5
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/c4Diagram-AAUBKEIU-Ddtgkgc0.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/c4Diagram-AAUBKEIU-B0VtZ4LT.js +1 -1
- pythinker_code-0.50.0/src/pythinker_code/web/static/assets/channel-2cmWmtiR.js +1 -0
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-2J33WTMH-Cu1UEa0U.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-2J33WTMH-zlKMk14A.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-3OPIFGDE-BvW09x34.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-3OPIFGDE-DDoUJziC.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-5ZQYHXKU-DFAbJYk3.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-5ZQYHXKU-BVGDalrl.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-727SXJPM-g-KAHCVh.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-727SXJPM-B40eBuzy.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-AQP2D5EJ-BdbLq_iV.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-AQP2D5EJ-Bjy9cEcL.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-CSCIHK7Q-BbQDo5W4.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-CSCIHK7Q-wEnjLHCK.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-JAPRZBRM-DX3Z6-Ej.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-JAPRZBRM-D7mf7095.js +4 -4
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-KSCS5N6A-DRzsy3KH.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-KSCS5N6A-B8C4Qo3S.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-L5ZTLDWV-AhJH6S-7.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-L5ZTLDWV-B6zR5vOT.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-LZXEDZCA-C3_yAZ2Q.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-LZXEDZCA-E3COZolu.js +2 -2
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-ND2GUHAM-DrT8t-co.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-ND2GUHAM-BMUb9pNq.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-NZK2D7GU-BW0obcBx.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-NZK2D7GU-lue24LQy.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-O5CBEL6O-9x-5dTLa.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-O5CBEL6O-DZnhYM8W.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/chunk-WU5MYG2G-BrTKnUCb.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/chunk-WU5MYG2G-Cs_Jps3h.js +1 -1
- pythinker_code-0.50.0/src/pythinker_code/web/static/assets/classDiagram-4FO5ZUOK-Bss_rOtf.js +1 -0
- pythinker_code-0.50.0/src/pythinker_code/web/static/assets/classDiagram-v2-Q7XG4LA2-Bss_rOtf.js +1 -0
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-D4iBD2uo.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-DaJkz64F.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/dagre-BM42HDAG-CwbOB22m.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/dagre-BM42HDAG-D_p-zlC5.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/diagram-2AECGRRQ-BH2GdvZS.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/diagram-2AECGRRQ-CRfkF_rs.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/diagram-5GNKFQAL-04zLB7n6.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/diagram-5GNKFQAL-CBiaQLBW.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/diagram-KO2AKTUF-BoaneL5m.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/diagram-KO2AKTUF-Dmvj9htg.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/diagram-LMA3HP47-DmhpyRJr.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/diagram-LMA3HP47-Ch0BqHT8.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/diagram-OG6HWLK6-C4UMdCZA.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/diagram-OG6HWLK6-B2o6fWB6.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/dist-C3gosr9x.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/dist-CGayAiNU.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/erDiagram-TEJ5UH35-coUNnf5j.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/erDiagram-TEJ5UH35-DlA5Xc3P.js +1 -1
- pythinker_code-0.50.0/src/pythinker_code/web/static/assets/eventmodeling-FCH6USID-94_6GtjE.js +1 -0
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/flowDiagram-I6XJVG4X-CXdKW96G.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/flowDiagram-I6XJVG4X-kUWABNTK.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/ganttDiagram-6RSMTGT7-DideiVAp.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/ganttDiagram-6RSMTGT7-YX6-BoSq.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/gitGraph-WXDBUCRP-DUyPd8kP.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/gitGraph-WXDBUCRP-C5UlYMXv.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/gitGraphDiagram-PVQCEYII-brm3T9Uk.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/gitGraphDiagram-PVQCEYII-DuBE87Qy.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/index-1kmjAkaL.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/index-BMV1Ud3J.js +2 -2
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/info-J43DQDTF-CuqVhZPe.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/info-J43DQDTF-DVQzXsUk.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/infoDiagram-5YYISTIA-CB4vGN6v.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/infoDiagram-5YYISTIA-DLBRYCxD.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/ishikawaDiagram-YF4QCWOH-Cc2CInct.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/ishikawaDiagram-YF4QCWOH-BbEtfJML.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/journeyDiagram-JHISSGLW-sixbjax3.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/journeyDiagram-JHISSGLW-B-8ADsM8.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/kanban-definition-UN3LZRKU-BkWpYweG.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/kanban-definition-UN3LZRKU-DfsCNzSd.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/line-DG62C0sI.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/line-DkTdvYY0.js +1 -1
- pythinker_code-0.50.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-otzZqrpj.js +1 -0
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/mermaid-parser.core-DtG8m5J_.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/mermaid-parser.core-MA0k1ZCT.js +2 -2
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/mermaid.core-CYVEwgHE.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/mermaid.core-acFcYxBT.js +3 -3
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/mindmap-definition-RKZ34NQL-DGLQlQ-3.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/mindmap-definition-RKZ34NQL-BGBf4V3D.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/packet-YPE3B663-DSyfxZQu.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/packet-YPE3B663-D7dp38ZY.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/pie-LRSECV5Y-DU6kZ_2f.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/pie-LRSECV5Y-BQu4CDOE.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/pieDiagram-4H26LBE5-CRh8dmNJ.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/pieDiagram-4H26LBE5-B7rhR3x4.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/quadrantDiagram-W4KKPZXB-B_SHSaSa.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/quadrantDiagram-W4KKPZXB-Bt28YYzI.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/radar-GUYGQ44K-DMglnwpK.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/radar-GUYGQ44K-BNCJkAg0.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/requirementDiagram-4Y6WPE33-BsVz5N3I.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/requirementDiagram-4Y6WPE33-BLkwlWmt.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/sankeyDiagram-5OEKKPKP-Bpr_uqrj.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/sankeyDiagram-5OEKKPKP-lPWBpzo-.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/sequenceDiagram-3UESZ5HK-DM9m6PO5.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/sequenceDiagram-3UESZ5HK-TYMLWnFf.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/stateDiagram-AJRCARHV-DZ0VJ_MH.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/stateDiagram-AJRCARHV-DSPmGaVQ.js +1 -1
- pythinker_code-0.50.0/src/pythinker_code/web/static/assets/stateDiagram-v2-BHNVJYJU-C6UIoI0l.js +1 -0
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/timeline-definition-PNZ67QCA-D_uBSLDu.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/timeline-definition-PNZ67QCA-CvP_yVPz.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/treeView-BLDUP644-DeKJ4uCa.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/treeView-BLDUP644-CJQwlV6p.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/treemap-LRROVOQU-CiGjpvUt.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/treemap-LRROVOQU-C3lHTEMi.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/vennDiagram-CIIHVFJN-BZTVj6zw.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/vennDiagram-CIIHVFJN-Br1IKWOD.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/wardley-L42UT6IY-DNmNjaYq.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/wardley-L42UT6IY-CYgdmfE4.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/wardleyDiagram-YWT4CUSO-Bo7PoGMZ.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/wardleyDiagram-YWT4CUSO-Cb_9nYBc.js +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/xychartDiagram-2RQKCTM6-BilotHsD.js → pythinker_code-0.50.0/src/pythinker_code/web/static/assets/xychartDiagram-2RQKCTM6-CIdBR3kz.js +1 -1
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/index.html +1 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/architecture-7EHR7CIX-BYamRjh1.js +0 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/channel-DcWGAel6.js +0 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/classDiagram-4FO5ZUOK-nzIv4cHs.js +0 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/classDiagram-v2-Q7XG4LA2-nzIv4cHs.js +0 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/eventmodeling-FCH6USID-DPqNL9oG.js +0 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B9_T5lZN.js +0 -1
- pythinker_code-0.48.0/src/pythinker_code/web/static/assets/stateDiagram-v2-BHNVJYJU-vN6RgvSr.js +0 -1
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/LICENSE +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/NOTICE +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/__main__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/AGENTS.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/convert.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/host.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/mcp.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/server.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/session.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/tools.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/types.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/acp/version.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/agent.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/ask.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/code_reviewer.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/coder.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/debug.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/debugger.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/explore.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/implementer.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/judge.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/plan.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/planner.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/review.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/scout.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/security_reviewer.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/default/verifier.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/agentspec.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/app.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/approval_runtime/models.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/alibaba.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/browser_login_page.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/deepseek.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/github_feedback.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/kimi.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/lm_studio.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/minimax.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/moonshot.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/oauth.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/ollama.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/_shared.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/browser_flow.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/catalog.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/config_apply.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/constants.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/login.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/models.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openai/oauth_client.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/opencode_go.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/openrouter.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/platforms.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/auth/z_ai.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/agent_runner.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/ids.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/manager.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/models.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/store.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/summary.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/background/worker.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/__main__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/_lazy_group.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/dashboard.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/debug.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/export.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/info.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/mcp.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/plugin.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/review.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/secscan.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/security_scan.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/skill.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/system_prompt.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/toad.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/update.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/cli/web.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/config.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/constant.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/api/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/api/sessions.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/api/statistics.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/api/system.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/app.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/highlighted-body-OFNGDK62-BxVUIXn9.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/index-DAN_VzOP.css +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/index-DYyxzHPY.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/assets/mermaid-GHXKKRXX-BR6KjYwB.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/dashboard/static/index.html +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/events.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/exception.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/execution_profiles.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/extensions.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/feedback.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/feedback_repo.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/file_restore.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/hooks/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/hooks/config.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/hooks/engine.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/hooks/events.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/hooks/runner.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/llm.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/client.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/diagnostics.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/framing.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/instance.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/manager.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/plugin_servers.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/protocol.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/recommend.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/lsp/service.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/memory/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/memory/consolidation.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/memory/harvest.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/memory/recall.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/memory/recap.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/memory/retriever.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/memory/sanitize.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/metadata.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/models_dev.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/native.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/notifications/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/notifications/llm.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/notifications/manager.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/notifications/models.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/notifications/notifier.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/notifications/store.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/notifications/wire.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/artifacts.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/dependency.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/directories.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/install.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/installed.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/integration.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/loader.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/manager.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/manifest.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/marketplace.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/options.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/policy.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/plugin/tool.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/project_memory.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/project_trust.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompt_templates.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/compact.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/goal_continuation.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/goal_set.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/goal_wrap_up.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/init.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/learn.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/py.typed +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/scratchpad.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/session.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/session_cleanup.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/session_fork.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/session_recap.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/session_state.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/share.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skill/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skill/flow/d2.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skill/lockfile.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/agent-creator/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/check-impl-against-spec/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/create-pr/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/customize-pythinker/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/designer-skill/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/diagnose-ci-failures/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/fix-errors/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/implement-specs/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/pr-walkthrough/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/reproduce-bug-report/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/resolve-merge-conflicts/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/review-pr/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/spec-driven-implementation/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/write-product-spec/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/skills/write-tech-spec/SKILL.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/agent.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/api_errors.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/approval.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/btw.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/compaction.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/compaction_restore.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/context.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/deliberation.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/denwarenji.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injection.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/agent_list.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/git_status.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/goal_mode.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/inline_commands.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/lsp_diagnostics.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/model_defense.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/orchestration.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/permissions_state.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/flow_runner.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/live_tokens.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/message.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/permission.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/pythinkersoul.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/slash.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/soul/toolset.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/builder.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/codenames.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/core.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/discovery.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/git_context.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/models.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/output.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/registry.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/runner.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/store.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/usage.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/subagents/worktree.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/config.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/crash.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/errors.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/metrics.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/names.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/otel.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/sentry.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/telemetry/sink.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/thinking.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/AGENTS.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/agent/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/agent/description.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/ask_user/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/background/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/background/handoff.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/background/input.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/background/list.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/background/output.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/background/stop.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/display.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/glob.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/glob.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/grep.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/grep_local.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/read.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/read.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/read_media.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/read_media.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/replace.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/replace.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/utils.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/write.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/file/write.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/goal/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/goal/update_goal.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/lsp/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/lsp/formatters.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/lsp/schemas.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/lsp/symbol_context.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/lsp/tool.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/lsp/tool.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/mcp_resource/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/mcp_resource/list_description.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/mcp_resource/prompt_description.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/mcp_resource/read_description.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/memory/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/memory/memory.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/memory/routing_guard.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/plan/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/plan/description.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/plan/enter.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/plan/handoff.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/progress/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/progress/description.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/recall/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/recall/description.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/scratchpad/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/scratchpad/scratchpad_tool.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/shell/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/shell/bash.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/skill/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/skill/_mcp_bridge.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/skill/description.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/suggest/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/suggest/description.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/test.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/think/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/think/think.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/tool_search/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/tool_search/tool_search.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/utils.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/web/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/web/_allowlist.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/web/fetch.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/web/fetch.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/web/search.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/web/search.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/worktree/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/worktree/enter_worktree.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/tools/worktree/exit_worktree.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/color_utils.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/print/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/print/visualize.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/diff.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/dynamic_border.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/markdown.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/panel.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/report.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/report_prose_blocks.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/report_update.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/console.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/debug.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/design_system.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/echo.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/glyphs.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/markdown/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/markdown/audit.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/markdown/elements.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/markdown/fences.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/markdown/normalizers.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/markdown/renderer.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/markdown/streaming.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/motion.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/render_constants.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/replay.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selector.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/code_theme.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/setup.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/slash.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/spacing.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/spinner_words.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/startup.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/stats.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/stats_collector.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/stats_pricing.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/statusline.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/sync_output.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tips.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/_file_diff.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/lsp.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/mcp_resource.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/memory.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/read_media.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/skill.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/smart_search.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/tool_search.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/worktree.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_activity.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/alibaba.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_activity_tree.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_dialog_shell.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_diff_live.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_transcript.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/terminal_background.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/terminal_capabilities.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/adapters/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/adapters/markdown.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/adapters/task_browser.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/capabilities.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/palettes.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/pythinker_themes.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/registry.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/resolver.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/theme/spec.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/ui/tui_config.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/update_policy.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/aiohttp.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/aioqueue.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/artifacts.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/broadcast.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/changelog.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/clipboard.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/datetime.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/diff.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/editor.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/environment.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/envvar.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/export.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/file_filter.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/file_read_cache.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/frontmatter.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/gitignore.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/io.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/logging.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/mcp_names.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/media_limits.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/media_tags.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/message.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/path.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/proctitle.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/proxy.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/rich/columns.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/rich/diff_render.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/sensitive.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/server.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/signals.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/slashcmd.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/sleep_inhibitor.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/string.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/term.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/trust.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/utils/typing.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/api/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/api/config.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/api/open_in.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/api/sessions.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/app.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/auth.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/models.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/runner/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/runner/messages.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/runner/process.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/runner/worker.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/_headers +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/abap-CLvhMVsD.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/actionscript-3--17pq3dv.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ada-C5qYipkI.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/andromeeda-vGVdxbeo.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/angular-html-BKhkKBsm.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/angular-ts-CYPbMJCA.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/apache-U0d_L8uA.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/apex-CGTLDQj6.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/apl-D7bENxmy.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/applescript-CCn79oCD.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ara-4CJ0cIlV.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/arc-8BWbC-0s.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/array-BifhSqXX.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/asciidoc-DE70LPWp.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/asm-Cmm7eHzH.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/astro-B1l9MDUT.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/aurora-x-CDeNXAV0.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/awk-BWXHIvNe.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ayu-dark-DluEY0Gj.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ayu-light-C3h-C4tm.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ayu-mirage-Bqwy1Gya.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ballerina-B7ZEbQpA.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/bat-Bo4NYOV-.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/beancount-D-usSTwE.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/berry-DKpUyyne.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/bibtex-Ci_nEsc7.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/bicep-CUHmPFLl.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/bird2-C2hNVINV.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/blade-BlkqRXu6.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/bootstrap-BhLLvBaE.css +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/bsl-BkkzgIyY.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/c-PpPxyn8g.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/c3-CnJL0r0V.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cadence-CQ2zXKGN.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cairo-DLTphjLi.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-3VR1Za6u.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/catppuccin-latte-DwIHMF0Q.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DYnBP6_5.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-DYhrFGRu.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/character-entities-legacy-Wut6vMuj.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chevrons-up-down-Dwo0Il5v.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-C0kf5ycP.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-55IACEB6-QyFAFTWp.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-BSJP7CBP-DIpfLhEz.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-Cyuzqnbw.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-C9D6P7Uq.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-NNHCCRGN-DmZbXBJw.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-CyVdgm44.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/chunk-XPW4576I-ru3A962d.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/clarity-SemFz856.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/clojure-DqKBuwfJ.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cmake-Bj61d0ZC.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cobol-BoXxFQjh.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/codeowners-C8r90Shi.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/codeql-oeQT6MSM.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/coffee-B5TREocO.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/common-lisp-Cv5bFMCO.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/coq-BrsZFFmf.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-PjRvINHM.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cpp-CVIk4zoB.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/crystal-CvUuUt6_.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/csharp-Ct8U2NOr.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/css-D7o5g6xi.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/csv-Dx-8-gkx.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cue-CE9AQfxI.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cypher-ClKdZ_lG.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/cytoscape.esm-jXPf2pm4.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/d-qD-0Kul2.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dagre-Uyq5yTtG.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dark-plus-Cs2F2srj.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dart-DkHntEIa.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dax-BkyTk9wS.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/defaultLocale-C8Fc0cco.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/desktop-Dlh5hvp9.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/diff-BDNflWRl.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/diff-Dvab7kiv.css +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/diff-woXpYk--.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dist-B7jLwIkG.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dist-D4B_Bs5p.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dist-reBDvVlc.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/docker-IyjqRm3v.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dotenv-_5a1GRtc.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dracula-BHWKrbxM.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dracula-soft-5eyTD99u.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/dream-maker-DW3nJb8Q.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/edge-CmXZi-az.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/elixir-BoRIkjDi.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/elm-Cm7sFdI1.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9PiwqqW.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/erb-DuMAGb6i.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/erlang-Cphh6RMH.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/everforest-dark-sB-x3p7T.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/everforest-light-Df2xbC6M.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/fennel-DQxkIbk2.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/fish-BJitypiv.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/fluent-C03EYrpw.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-DEKoE2YW.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/fortran-free-form-CYNrtFtB.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/fsharp-D13ZGOAj.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gdresource-C0sCabJj.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gdscript-Cp2uCuqX.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gdshader-CBce3t8t.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/genie-CV2tkWYe.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gherkin-DExj1W_8.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/git-commit-BSykSTBG.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/git-rebase-D2tSwjJb.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/github-dark-C-LZuMrd.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/github-dark-default-DXG-b-1a.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-Bx1FflLF.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/github-dark-high-contrast-B_tTalzw.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/github-light-EUqPIrTm.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/github-light-default-BXViO-2h.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-B68TUdTA.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gleam-CSRkHgEL.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/glimmer-js--VVKNatA.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/glimmer-ts-Bfa_wiNC.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/glsl-MPwHyiXQ.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gn-ilITqXS6.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gnuplot-7GGW24-e.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/go-BJwz_mda.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/graphlib-C22s9MDV.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/graphql-NW854Khs.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/groovy-CacY0gHj.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-C820rvS2.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-BPjhmG05.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-MrdJrrXF.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-BC_s9l72.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-BAWPOn9u.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-BSMLrYjP.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/hack-CSl79E5u.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/haml-Dmb1YmHj.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/handlebars-Du8DtnRB.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/haskell-D8IpX4py.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/haxe-OTjmBuCE.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/hcl-Dh228itO.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/hjson-CxZEssPk.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/hlsl-Cvrh5tZx.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/horizon-CE9ld1lL.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/horizon-bright-Br1oVSNq.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/houston-CsvMBhTu.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/html-Kpl3bQKd.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/html-derivative-BEEWNZ8Y.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/http-HvMG3K54.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/hurl-CLh1t2ES.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/hxml-B0Qn7Nwc.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/hy-CZbG8q4J.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/imba-DsUTQ-LC.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ini-B5eOa1yu.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/init-D6jRqBbL.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/java-Cst_eZTE.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/javascript-i_rUTyCW.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jinja-CaXggA6f.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jison-D9Fg2JgN.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/json-DS5j4FfK.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/json5-BR5RXkoi.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jsonc-CYpm1nAK.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jsonl-CmCQp5Yx.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jsonnet-CJTPZ8u_.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jssm-DXw9l8Rf.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jsx-CFyhNHav.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/jsx-runtime-wSvXh6gi.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/julia-R8NNmfP1.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/just-BhhHYlS8.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CXtmUGW6.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-BN08jTvb.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/kanagawa-wave-CTweb8Dz.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/katex-BGaDVET_.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/katex-BorAY7qD.css +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/kdl-CsD5j6eV.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/kotlin-DhhofPvG.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/kusto-BUv0MjJC.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/laserwave-C_8bwKvT.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/latex-D5k_uhWv.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/lean-CewbzKMR.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/less-DVTAwKKz.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/lib-BLxG8W6T.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/libesm-8-2luV-1.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/light-plus-DVQuIRkW.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/linear-BktLjFGX.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/liquid-Q0_hzjly.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/llvm-Cm23YOpf.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/log-BNLmms1o.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/logo-Cluzi2Zq.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/lua-VoGSg0xb.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/luau-CNKltnaQ.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/make-Dixweg8N.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/markdown-BYOwaDjH.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/marked.esm-DLdcrU5H.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/marko-D_aeUD__.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/material-theme-Bm3Qr25_.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/material-theme-darker-2IIEA8gg.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/material-theme-lighter-uhdI0v04.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CHQ94UKr.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/material-theme-palenight-B5W6OYN7.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/matlab-D7qyCx1q.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/mdc-BSifqehP.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/mdx-DQZ5AkYe.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/mermaid-Bk4SNUv9.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/min-dark-BSWPekZh.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/min-light-DDpmG2fV.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/mipsasm-BMqwQI7S.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/mojo-BgCJLMeH.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/monokai-CdkpiU2Y.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/moonbit-CaWjb8XO.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/move-B1IS1UjX.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/narrat-_X_XdTYD.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/nextflow-Bbiyy34d.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/nextflow-groovy-Dc_ddanL.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/nginx-CgHaWcsO.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/night-owl-DhmEMT88.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/night-owl-light-eJ-hLW7d.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/nim-BuixXxPS.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/nix-IvuFDN5E.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/nord-Cb4Vim4T.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/nushell-DcLAeLz5.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/objective-c-D1A_Heim.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/objective-cpp-BsSzOQcm.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ocaml-O90oeIOV.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/odin-B1RWQWA5.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/one-dark-pro-CLwyXe_n.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/one-light-D7Lr4KcI.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/openscad-BUDT5pXO.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ordinal-hYBb2elL.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/pascal-4ZHwLPI5.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/path-BWPyau1x.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/perl-BLMySlFJ.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/php-Czf_fybR.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/pkl-ot-7Btpt.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/plastic-DQwYfKfQ.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/plsql-DGHpHOYJ.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/po-BiJDBrnU.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/poimandres-DRFjx7u4.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/polar-C7UOKdEL.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/postcss-BXeXVLqQ.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/powerquery-DNMTfnFr.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/powershell-DshXNtvi.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/prisma-BsRQq5mF.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/prolog-iXnhIJG7.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/proto-DB4EqR-F.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/pug-CsZglf8T.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/puppet-CDv2pdJW.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/purescript-9MfHhQsQ.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/python-gzcpVVnB.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/qml-DcW_sT3t.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/qmldir-DCQb3MpD.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/qss-Fe1Jh2GI.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/r-D2d3McyU.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/racket-DcIDlBhZ.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/raku-B3gFvitq.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/razor-oFpUW61Z.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/red-CJ3rzSJv.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/reg-CRGYupPL.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/regexp-Bu0flJgP.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rel-BtDbiS_P.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/riscv-Ckw8ddFX.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ron-VUp2lXgN.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rose-pine-BthvhNj6.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-Dg85fqjY.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rose-pine-moon-hon4tzzS.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rosmsg-CAekHB0j.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rough.esm-CSKSodPl.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rst-U6Eu7ipE.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ruby-CUQsVT6d.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/rust-Cfkwpbl8.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/sas-CNBFrLhc.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/sass-DXrisJhu.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/scala-DKOlJaKm.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/scheme-DQCgrYNe.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/scss-CPnU-uuv.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/sdbl-bTVj8UrX.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/shaderlab-TOUzSsQk.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/shellscript-BbTp1yjG.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/shellsession-BmAC8SMF.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/slack-dark-DnToyrRv.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/slack-ochin-B2OO5cIa.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/smalltalk-B16xEiuN.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/snazzy-light-4G7pJPwS.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/solarized-dark-DV17i1UV.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/solarized-light-DSh2HLQt.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/solidity-CKzVLygQ.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/soy-CdbyEXp6.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/space-separated-tokens-DpjE5PGy.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/sparql-D_iOobhT.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/splunk-BC2Px7Mm.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/sql-hpBkusIy.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/src-D-NMWEou.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ssh-config-BgfXC-Er.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/stata-DVbvk3qH.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/stylus-B6D30XZt.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/surrealql-DxccxuMd.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/svelte-DzNm5V2w.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/swift-DonLKvLd.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/synthwave-84-nFMaYfgc.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/system-verilog-DJ5XKQeo.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/systemd-BxMlprV5.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/talonscript-CohzipZa.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/tasl-DMoTqEGO.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/tcl-CZd0xW_V.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/templ-CsM0tTsw.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/terraform-DswuEJGm.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/tex-B0f_hYr8.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/tokyo-night-oM2G3aXe.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/toml-CcmNWLt0.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/ts-tags-Bf-FGGvT.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/tsv-sltzmVWM.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/tsx-DFvk7AwW.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/turtle-ByJddavk.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/twig-VJ4-Ntm0.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/typescript-DHTLvXzV.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/typespec-B88KGewJ.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/typst-DI99ib-x.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/v-DETTlOr0.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/v4-DqR3yzBO.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vala-zf12oZj6.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vb-Djn5o6TS.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/verilog-CiiDBU1e.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vesper-D5bVUKB1.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vhdl-BroJfC0k.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/viml-DvXPmvsu.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vitesse-black-fwtXNY1n.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vitesse-dark-BZCL-v6S.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vitesse-light-VbXTXTou.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vue-D3dSYZKz.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vue-html-DQch_7VQ.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vue-vine-B67Dz05t.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/vyper-CgoNMtux.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/wasm-BnjxR4X6.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/wasm-ByWQv1Qj.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/wenyan-C8pVoKbM.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/wgsl-BsKzXJz4.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/wikitext-ClFFjSW2.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/wit-DdvCle-K.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/wolfram-DLL8P-h_.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/xml-C33zriiW.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/xsl-BFS2wyMt.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/yaml-w0rMsuN4.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/zenscript-BnlCZFoB.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/assets/zig-CMLA9XwU.js +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/install.ps1 +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/install.sh +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/static/logo.png +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/store/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/web/store/sessions.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/__init__.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/file.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/protocol.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/root_hub.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/serde.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/server.py +0 -0
- {pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/wire/types.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pythinker-code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.50.0
|
|
4
4
|
Summary: Pythinker — an agentic CLI developed by Pythoughts-labs.
|
|
5
5
|
Keywords: cli,agent,ai,coding-assistant,llm,claude,openai,terminal
|
|
6
6
|
Author: Pythoughts-labs
|
|
@@ -115,13 +115,12 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
|
|
|
115
115
|
|
|
116
116
|
---
|
|
117
117
|
|
|
118
|
-
## 🆕 What's New in 0.
|
|
118
|
+
## 🆕 What's New in 0.50.0
|
|
119
119
|
|
|
120
|
-
- **
|
|
121
|
-
- **
|
|
122
|
-
- **Proxy and tool-call hardening.** Tool results flatten for Anthropic-compatible proxies (fixes invisible GLM/z.ai outputs); `ToolSearch` is hidden from providers that cannot use deferred discovery; diff cards strip ANSI escapes; collapsed ReadFile cards show line counts and previews.
|
|
120
|
+
- **Safer silent updates.** The downloaded build is now staged beside the running executable and promoted at exit, instead of overwriting the live onefile bundle in place — eliminating mid-session `zlib: incorrect header check` crashes after a background update.
|
|
121
|
+
- **Cleaner update notice.** The "Updated → vX. Restart to apply." line renders below the prompt's bottom border, not inside the input area.
|
|
123
122
|
|
|
124
|
-
Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.
|
|
123
|
+
Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.50.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
|
|
125
124
|
|
|
126
125
|
|
|
127
126
|
---
|
|
@@ -211,7 +210,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
|
|
|
211
210
|
|
|
212
211
|
| Platform | Recommended install | Artifact source |
|
|
213
212
|
|---|---|---|
|
|
214
|
-
| **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.
|
|
213
|
+
| **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.50.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
|
|
215
214
|
| **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> / <img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux">** | `curl -fsSL https://pythinker.com/install.sh \| bash` | native tarball from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
|
|
216
215
|
| **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> — Homebrew** | `brew install Pythoughts-labs/pythinker/pythinker-code` | auto-published Homebrew tap |
|
|
217
216
|
| **🐳 Docker** | `docker run --rm -it ghcr.io/pythoughts-labs/pythinker-code` | GHCR multi-arch image |
|
|
@@ -239,7 +238,7 @@ pythinker # start the interactive TUI
|
|
|
239
238
|
|
|
240
239
|
### 🪟 Windows — native installer
|
|
241
240
|
|
|
242
|
-
`PythinkerSetup-0.
|
|
241
|
+
`PythinkerSetup-0.50.0.exe` is a signed* Inno Setup wizard. Installs per-user
|
|
243
242
|
into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
|
|
244
243
|
PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
|
|
245
244
|
the change. **No UAC prompt.**
|
|
@@ -250,13 +249,13 @@ irm https://pythinker.com/install.ps1 | iex
|
|
|
250
249
|
|
|
251
250
|
# Or manually download the installer + checksum from the Releases page,
|
|
252
251
|
# verify with Get-FileHash, then run:
|
|
253
|
-
.\PythinkerSetup-0.
|
|
252
|
+
.\PythinkerSetup-0.50.0.exe
|
|
254
253
|
|
|
255
254
|
# Open a fresh PowerShell
|
|
256
255
|
pythinker --version
|
|
257
256
|
```
|
|
258
257
|
|
|
259
|
-
**Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.
|
|
258
|
+
**Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.50.0.exe /ALLUSERS`
|
|
260
259
|
installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
|
|
261
260
|
|
|
262
261
|
**Upgrade:** `pythinker update` from inside the running app — it downloads
|
|
@@ -314,26 +313,26 @@ attached to every GitHub Release.
|
|
|
314
313
|
|
|
315
314
|
```sh
|
|
316
315
|
# Debian / Ubuntu (x86_64)
|
|
317
|
-
sudo dpkg -i pythinker-code_0.
|
|
316
|
+
sudo dpkg -i pythinker-code_0.50.0_amd64.deb
|
|
318
317
|
sudo apt-get install -f # only if dpkg reports missing deps
|
|
319
318
|
|
|
320
319
|
# Debian / Ubuntu (ARM64)
|
|
321
|
-
sudo dpkg -i pythinker-code_0.
|
|
320
|
+
sudo dpkg -i pythinker-code_0.50.0_arm64.deb
|
|
322
321
|
|
|
323
322
|
# Fedora / RHEL / openSUSE (x86_64)
|
|
324
|
-
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.
|
|
325
|
-
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.
|
|
326
|
-
sha256sum -c pythinker-code-0.
|
|
323
|
+
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.x86_64.rpm
|
|
324
|
+
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.x86_64.rpm.sha256
|
|
325
|
+
sha256sum -c pythinker-code-0.50.0.x86_64.rpm.sha256
|
|
327
326
|
# Fedora / RHEL:
|
|
328
|
-
sudo dnf install ./pythinker-code-0.
|
|
327
|
+
sudo dnf install ./pythinker-code-0.50.0.x86_64.rpm
|
|
329
328
|
# openSUSE:
|
|
330
|
-
sudo zypper install ./pythinker-code-0.
|
|
329
|
+
sudo zypper install ./pythinker-code-0.50.0.x86_64.rpm
|
|
331
330
|
|
|
332
331
|
# Fedora / RHEL (aarch64)
|
|
333
|
-
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.
|
|
334
|
-
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.
|
|
335
|
-
sha256sum -c pythinker-code-0.
|
|
336
|
-
sudo dnf install ./pythinker-code-0.
|
|
332
|
+
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.aarch64.rpm
|
|
333
|
+
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.aarch64.rpm.sha256
|
|
334
|
+
sha256sum -c pythinker-code-0.50.0.aarch64.rpm.sha256
|
|
335
|
+
sudo dnf install ./pythinker-code-0.50.0.aarch64.rpm
|
|
337
336
|
```
|
|
338
337
|
|
|
339
338
|
Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
|
|
@@ -342,8 +341,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
|
|
|
342
341
|
**Verify before install:**
|
|
343
342
|
|
|
344
343
|
```sh
|
|
345
|
-
sha256sum -c pythinker-code_0.
|
|
346
|
-
sha256sum -c pythinker-code-0.
|
|
344
|
+
sha256sum -c pythinker-code_0.50.0_amd64.deb.sha256 # Debian/Ubuntu
|
|
345
|
+
sha256sum -c pythinker-code-0.50.0.x86_64.rpm.sha256 # Fedora/RHEL
|
|
347
346
|
```
|
|
348
347
|
|
|
349
348
|
**Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
|
|
@@ -50,13 +50,12 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
|
|
|
50
50
|
|
|
51
51
|
---
|
|
52
52
|
|
|
53
|
-
## 🆕 What's New in 0.
|
|
53
|
+
## 🆕 What's New in 0.50.0
|
|
54
54
|
|
|
55
|
-
- **
|
|
56
|
-
- **
|
|
57
|
-
- **Proxy and tool-call hardening.** Tool results flatten for Anthropic-compatible proxies (fixes invisible GLM/z.ai outputs); `ToolSearch` is hidden from providers that cannot use deferred discovery; diff cards strip ANSI escapes; collapsed ReadFile cards show line counts and previews.
|
|
55
|
+
- **Safer silent updates.** The downloaded build is now staged beside the running executable and promoted at exit, instead of overwriting the live onefile bundle in place — eliminating mid-session `zlib: incorrect header check` crashes after a background update.
|
|
56
|
+
- **Cleaner update notice.** The "Updated → vX. Restart to apply." line renders below the prompt's bottom border, not inside the input area.
|
|
58
57
|
|
|
59
|
-
Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.
|
|
58
|
+
Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.50.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
|
|
60
59
|
|
|
61
60
|
|
|
62
61
|
---
|
|
@@ -146,7 +145,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
|
|
|
146
145
|
|
|
147
146
|
| Platform | Recommended install | Artifact source |
|
|
148
147
|
|---|---|---|
|
|
149
|
-
| **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.
|
|
148
|
+
| **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.50.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
|
|
150
149
|
| **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> / <img src="https://img.shields.io/badge/-Linux-FCC624?style=flat-square&logo=linux&logoColor=black" alt="Linux">** | `curl -fsSL https://pythinker.com/install.sh \| bash` | native tarball from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
|
|
151
150
|
| **<img src="https://img.shields.io/badge/-macOS-000000?style=flat-square&logo=apple&logoColor=white" alt="macOS"> — Homebrew** | `brew install Pythoughts-labs/pythinker/pythinker-code` | auto-published Homebrew tap |
|
|
152
151
|
| **🐳 Docker** | `docker run --rm -it ghcr.io/pythoughts-labs/pythinker-code` | GHCR multi-arch image |
|
|
@@ -174,7 +173,7 @@ pythinker # start the interactive TUI
|
|
|
174
173
|
|
|
175
174
|
### 🪟 Windows — native installer
|
|
176
175
|
|
|
177
|
-
`PythinkerSetup-0.
|
|
176
|
+
`PythinkerSetup-0.50.0.exe` is a signed* Inno Setup wizard. Installs per-user
|
|
178
177
|
into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
|
|
179
178
|
PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
|
|
180
179
|
the change. **No UAC prompt.**
|
|
@@ -185,13 +184,13 @@ irm https://pythinker.com/install.ps1 | iex
|
|
|
185
184
|
|
|
186
185
|
# Or manually download the installer + checksum from the Releases page,
|
|
187
186
|
# verify with Get-FileHash, then run:
|
|
188
|
-
.\PythinkerSetup-0.
|
|
187
|
+
.\PythinkerSetup-0.50.0.exe
|
|
189
188
|
|
|
190
189
|
# Open a fresh PowerShell
|
|
191
190
|
pythinker --version
|
|
192
191
|
```
|
|
193
192
|
|
|
194
|
-
**Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.
|
|
193
|
+
**Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.50.0.exe /ALLUSERS`
|
|
195
194
|
installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
|
|
196
195
|
|
|
197
196
|
**Upgrade:** `pythinker update` from inside the running app — it downloads
|
|
@@ -249,26 +248,26 @@ attached to every GitHub Release.
|
|
|
249
248
|
|
|
250
249
|
```sh
|
|
251
250
|
# Debian / Ubuntu (x86_64)
|
|
252
|
-
sudo dpkg -i pythinker-code_0.
|
|
251
|
+
sudo dpkg -i pythinker-code_0.50.0_amd64.deb
|
|
253
252
|
sudo apt-get install -f # only if dpkg reports missing deps
|
|
254
253
|
|
|
255
254
|
# Debian / Ubuntu (ARM64)
|
|
256
|
-
sudo dpkg -i pythinker-code_0.
|
|
255
|
+
sudo dpkg -i pythinker-code_0.50.0_arm64.deb
|
|
257
256
|
|
|
258
257
|
# Fedora / RHEL / openSUSE (x86_64)
|
|
259
|
-
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.
|
|
260
|
-
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.
|
|
261
|
-
sha256sum -c pythinker-code-0.
|
|
258
|
+
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.x86_64.rpm
|
|
259
|
+
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.x86_64.rpm.sha256
|
|
260
|
+
sha256sum -c pythinker-code-0.50.0.x86_64.rpm.sha256
|
|
262
261
|
# Fedora / RHEL:
|
|
263
|
-
sudo dnf install ./pythinker-code-0.
|
|
262
|
+
sudo dnf install ./pythinker-code-0.50.0.x86_64.rpm
|
|
264
263
|
# openSUSE:
|
|
265
|
-
sudo zypper install ./pythinker-code-0.
|
|
264
|
+
sudo zypper install ./pythinker-code-0.50.0.x86_64.rpm
|
|
266
265
|
|
|
267
266
|
# Fedora / RHEL (aarch64)
|
|
268
|
-
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.
|
|
269
|
-
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.
|
|
270
|
-
sha256sum -c pythinker-code-0.
|
|
271
|
-
sudo dnf install ./pythinker-code-0.
|
|
267
|
+
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.aarch64.rpm
|
|
268
|
+
curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.50.0/pythinker-code-0.50.0.aarch64.rpm.sha256
|
|
269
|
+
sha256sum -c pythinker-code-0.50.0.aarch64.rpm.sha256
|
|
270
|
+
sudo dnf install ./pythinker-code-0.50.0.aarch64.rpm
|
|
272
271
|
```
|
|
273
272
|
|
|
274
273
|
Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
|
|
@@ -277,8 +276,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
|
|
|
277
276
|
**Verify before install:**
|
|
278
277
|
|
|
279
278
|
```sh
|
|
280
|
-
sha256sum -c pythinker-code_0.
|
|
281
|
-
sha256sum -c pythinker-code-0.
|
|
279
|
+
sha256sum -c pythinker-code_0.50.0_amd64.deb.sha256 # Debian/Ubuntu
|
|
280
|
+
sha256sum -c pythinker-code-0.50.0.x86_64.rpm.sha256 # Fedora/RHEL
|
|
282
281
|
```
|
|
283
282
|
|
|
284
283
|
**Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
|
|
@@ -15,6 +15,37 @@ GitHub Releases page; `0.8.0` is the new starting line.
|
|
|
15
15
|
|
|
16
16
|
## Unreleased
|
|
17
17
|
|
|
18
|
+
## 0.50.0 (2026-06-20)
|
|
19
|
+
|
|
20
|
+
- **Silent native updates no longer crash a running session.** The downloaded
|
|
21
|
+
build is now staged beside the running executable and swapped in at exit (it goes
|
|
22
|
+
live on the next launch), instead of overwriting the live onefile bundle in place.
|
|
23
|
+
Overwriting it mid-session corrupted later lazy imports with a
|
|
24
|
+
`zlib.error: incorrect header check`. A boundary guard also converts any residual
|
|
25
|
+
post-update archive-corruption crash into a clear "restart to apply" message.
|
|
26
|
+
- **Update notice renders below the input box.** The "Updated → vX. Restart to
|
|
27
|
+
apply." line now appears underneath the prompt's bottom border instead of inside
|
|
28
|
+
the input area.
|
|
29
|
+
|
|
30
|
+
## 0.49.0 (2026-06-20)
|
|
31
|
+
|
|
32
|
+
- **Reduction ladder in the default agent prompt.** The agent now walks an explicit,
|
|
33
|
+
ordered ladder before writing code — does this need to exist at all, then the standard
|
|
34
|
+
library, a native platform or framework feature, an already-installed dependency, one
|
|
35
|
+
line, and only then the minimum custom code — so it reaches for the simplest working
|
|
36
|
+
solution by default. The same guidance is mirrored into the `/best-practices` profile,
|
|
37
|
+
and deliberate shortcuts with a known ceiling are flagged with a comment naming the
|
|
38
|
+
ceiling and the upgrade path. Input validation, error handling, security, and
|
|
39
|
+
accessibility are never traded away for fewer lines.
|
|
40
|
+
- **New `cleanup-audit` skill.** A read-only, whole-repo pass that ranks over-engineering
|
|
41
|
+
— what to delete, simplify, or replace with standard-library/platform equivalents — as
|
|
42
|
+
the repo-wide complement to the diff-scoped `pythinker review diff --mode deslopify`. It
|
|
43
|
+
applies no fixes and never proposes cutting validation, error handling, security, or
|
|
44
|
+
accessibility.
|
|
45
|
+
- **Fix: duplicate update notices at startup.** When a background install finishes
|
|
46
|
+
or a cached update is detected, the hint now renders only on the persistent
|
|
47
|
+
under-input line instead of also flashing as a footer toast.
|
|
48
|
+
|
|
18
49
|
## 0.48.0 (2026-06-17)
|
|
19
50
|
|
|
20
51
|
- **Fix: tool outputs invisible on Anthropic-compatible proxies (GLM-5.2 via z.ai).**
|
|
@@ -149,7 +149,9 @@ ${PYTHINKER_SCRATCHPAD_SECTION}
|
|
|
149
149
|
|
|
150
150
|
**Simplicity first — minimum code that solves the problem, nothing speculative.** No features beyond what was asked; no abstractions for single-use code; no unrequested configurability; no error handling for impossible scenarios — validate at boundaries only. If a 200-line draft could be 50 lines, rewrite it before showing it. Over-fragmentation is overcomplication too: don't scatter logic across tiny files or extra layers to satisfy a pattern — match the codebase's existing granularity. Self-check: *would a senior engineer call this over-engineered?* If yes, simplify.
|
|
151
151
|
|
|
152
|
-
**
|
|
152
|
+
**The reduction ladder — walk it before writing code; stop at the first rung that holds.** (1) *Does this need to exist at all?* A speculative need is skipped, said so in one line. (2) *Does the standard library do it?* Use it. (3) *Does a native platform or framework feature cover it?* A database constraint over an app-level check, a built-in form control over a picker library, the language's own construct over a hand-rolled one — use it. (4) *Does a dependency already in the manifest solve it?* Use it; never add a new dependency for what a few lines cover. (5) *Can it be one line?* Make it one line. (6) *Only then* write the minimum code that works. When two rungs both hold, take the higher one and move on — the ladder is a reflex, not a research project. None of this overrides the guards in this section: trust-boundary validation, error handling that prevents data loss, security, and accessibility stay in even at rung 5.
|
|
153
|
+
|
|
154
|
+
**Quality defaults** (unless project or domain rules override): focused, shallow, scannable functions with early exits over deep nesting; meaningful identifiers, no shadowing, the context's casing convention; avoid duplicate logic within a change without inventing broad abstractions for one-off repetition; comment only non-obvious algorithms, workarounds, business rules, edge cases, and deliberate simplifications whose ceiling matters — a coarse lock, an O(n²) scan, a naive heuristic — naming the ceiling and the upgrade path (`TODO:` for real debt; no self-evident comments; never add copyright or license headers unless requested); cohesive, testable modules; efficient data structures where they aid clarity or scale; wrap error-prone I/O, API, network, and resource operations with handling, timeouts/fallbacks, and cleanup; adopt stricter domain standards (e.g. MISRA-style C/C++) when relevant. Once correct, run the repo's formatter (up to 3 attempts); never add one where none exists.
|
|
153
155
|
|
|
154
156
|
**Honest testing.** Verification per Rule 3, from the narrowest scope outward. Never game it: no weakened or deleted assertions, skipped tests, widened tolerances, overfitting to test cases, or mocking away the behavior under test. Keep tests deterministic — control time, randomness, and the network through the repo's existing patterns; never synchronize with sleeps.
|
|
155
157
|
|
|
@@ -333,6 +333,43 @@ def _version_callback(value: bool) -> None:
|
|
|
333
333
|
raise typer.Exit()
|
|
334
334
|
|
|
335
335
|
|
|
336
|
+
def _is_post_update_bundle_corruption(exc: BaseException) -> bool:
|
|
337
|
+
"""True when a frozen build's archive read failed mid-session.
|
|
338
|
+
|
|
339
|
+
This is the signature of a silent self-update having replaced the running
|
|
340
|
+
bundle on disk (see ``_install_native_archive``): the old process keeps
|
|
341
|
+
running, and the next not-yet-loaded lazy import reads from the now-stale
|
|
342
|
+
on-disk archive and raises ``zlib.error: incorrect header check``.
|
|
343
|
+
|
|
344
|
+
Gated on the PyInstaller ``sys.frozen`` marker so source / pip installs (which
|
|
345
|
+
never self-replace this way) are unaffected, and narrowed to the documented
|
|
346
|
+
corruption message (``incorrect header check``) so an unrelated decompression
|
|
347
|
+
failure elsewhere on a frozen build is *not* misclassified as a stale bundle and
|
|
348
|
+
masked behind a restart-only message. The zlib error class is matched by
|
|
349
|
+
``__module__``/``__name__`` rather than ``isinstance`` so the handler never
|
|
350
|
+
imports ``zlib`` from a possibly-corrupted archive — ``sys`` is a C built-in and
|
|
351
|
+
is always safe to import. The cause/context chain is walked with a cycle guard so
|
|
352
|
+
a self-referential chain can't spin.
|
|
353
|
+
"""
|
|
354
|
+
import sys
|
|
355
|
+
|
|
356
|
+
if not getattr(sys, "frozen", False):
|
|
357
|
+
return False
|
|
358
|
+
seen: set[int] = set()
|
|
359
|
+
current: BaseException | None = exc
|
|
360
|
+
while current is not None and id(current) not in seen:
|
|
361
|
+
seen.add(id(current))
|
|
362
|
+
cls = type(current)
|
|
363
|
+
if (
|
|
364
|
+
cls.__module__ == "zlib"
|
|
365
|
+
and cls.__name__ == "error"
|
|
366
|
+
and "incorrect header check" in str(current).lower()
|
|
367
|
+
):
|
|
368
|
+
return True
|
|
369
|
+
current = current.__cause__ or current.__context__
|
|
370
|
+
return False
|
|
371
|
+
|
|
372
|
+
|
|
336
373
|
@cli.callback(invoke_without_command=True)
|
|
337
374
|
def pythinker(
|
|
338
375
|
ctx: typer.Context,
|
|
@@ -1310,6 +1347,17 @@ def pythinker(
|
|
|
1310
1347
|
# ClickException includes the errors Typer knows how to render; don't
|
|
1311
1348
|
# wrap them, or we'd lose the standard error UI and exit codes.
|
|
1312
1349
|
raise
|
|
1350
|
+
if _is_post_update_bundle_corruption(exc):
|
|
1351
|
+
# A silent self-update replaced this running build on disk; lazy imports
|
|
1352
|
+
# from the stale archive now fail. This only resolves with a restart —
|
|
1353
|
+
# surface a clear, actionable message instead of a fatal traceback.
|
|
1354
|
+
logger.warning("Post-update bundle corruption detected; prompting restart")
|
|
1355
|
+
_emit_fatal_error(
|
|
1356
|
+
"A Pythinker update was installed during this session and the "
|
|
1357
|
+
"running build was replaced on disk.\n"
|
|
1358
|
+
"Please restart Pythinker to finish applying the update."
|
|
1359
|
+
)
|
|
1360
|
+
raise typer.Exit(code=1) from exc
|
|
1313
1361
|
logger.exception("Fatal error when running CLI")
|
|
1314
1362
|
if debug:
|
|
1315
1363
|
import traceback
|
{pythinker_code-0.48.0 → pythinker_code-0.50.0}/src/pythinker_code/prompts/best_practices.md
RENAMED
|
@@ -30,6 +30,7 @@ The user ran `/best-practices`. Engineering best practices are now in effect: ap
|
|
|
30
30
|
- Never invent APIs. Verify every external symbol — function signatures, config keys, CLI flags, library methods — against the actual source, installed package, or type definitions before using it. If you cannot verify it, look it up; if you still cannot, say so instead of guessing.
|
|
31
31
|
- Prefer the standard library and dependencies already in the manifest. A new dependency is a design decision: justify it (maintenance, license, size, transitive risk), verify the exact package name exists in the registry (hallucinated names are a typosquatting vector), pin it per repo convention, and modify lockfiles only through the package manager — never by hand.
|
|
32
32
|
- Apply YAGNI: no speculative abstractions, flags, generality, or extension points the request does not need.
|
|
33
|
+
- Before writing code, walk the reduction ladder and stop at the first rung that holds: (1) does this need to exist at all (YAGNI) — skip it and say so; (2) does the standard library do it; (3) does a native platform or framework feature cover it (a database constraint over app code, a built-in control over a library); (4) does a dependency already in the manifest solve it — never add a new one for what a few lines cover; (5) can it be one line; (6) only then the minimum code that works. When two rungs both hold, take the higher one and move on. The guards in this profile — trust-boundary validation, data-loss handling, security, accessibility — are never traded away for fewer lines.
|
|
33
34
|
- No placeholders in completed work: no TODO stubs, commented-out blocks, empty handler bodies, or mock data presented as a real integration.
|
|
34
35
|
- Fail loudly per the codebase's conventions. Never swallow exceptions, downgrade errors to warnings, or return fabricated defaults to make a failure disappear.
|
|
35
36
|
- Preserve backward compatibility by default. Search the integration surfaces your change touches — public APIs, CLI parameters, configuration loading, persisted state, session and wire formats, database schemas — and if a break is unavoidable, call it out and migrate or gate it.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cleanup-audit
|
|
3
|
+
description: Whole-repo audit for over-engineering and accidental complexity. Scans the entire codebase (not just a diff) and returns a ranked, read-only list of what to delete, simplify, or replace with standard-library or platform equivalents. Use when the user asks to "audit the codebase", "find bloat", "what can I delete", or wants a repo-wide simplification pass. For a diff-scoped pass use `pythinker review diff --mode deslopify` instead. One-shot report; applies no fixes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Cleanup Audit
|
|
7
|
+
|
|
8
|
+
A read-only, whole-repo pass that hunts accidental complexity and over-engineering. The diff-scoped
|
|
9
|
+
version of this job already ships as `pythinker review diff --mode deslopify`; this skill is its
|
|
10
|
+
repo-wide complement — scan the whole tree, rank the biggest cut first.
|
|
11
|
+
|
|
12
|
+
Scope is complexity only. Correctness bugs, security holes, and performance belong to a normal
|
|
13
|
+
review or security pass — note them in one line if you trip over them, but do not chase them here.
|
|
14
|
+
|
|
15
|
+
## What to hunt
|
|
16
|
+
|
|
17
|
+
- Dead code, unused flexibility, and speculative features no caller needs.
|
|
18
|
+
- Hand-rolled logic the standard library already ships — name the function that replaces it.
|
|
19
|
+
- A dependency (or hand-written code) doing what the language, runtime, or framework already does.
|
|
20
|
+
- Single-implementation interfaces, one-product factories, wrappers that only delegate, a module
|
|
21
|
+
that exports one trivial thing, dead flags and config nobody sets.
|
|
22
|
+
- The same logic spelled out long-hand where a shorter, equally clear form exists.
|
|
23
|
+
|
|
24
|
+
## How to work
|
|
25
|
+
|
|
26
|
+
1. Map before judging: read the tree, the manifest/lockfile, and entry points; use `Grep`/`Glob`
|
|
27
|
+
(or `LSP` for references and call hierarchy) to confirm a thing is actually unused before
|
|
28
|
+
proposing its deletion. A deletion proposed without checking callers is a guess.
|
|
29
|
+
2. Rank findings biggest cut first.
|
|
30
|
+
3. Apply nothing. This is a report.
|
|
31
|
+
|
|
32
|
+
## Output
|
|
33
|
+
|
|
34
|
+
One line per finding, ranked, each tagged and citing a path:
|
|
35
|
+
|
|
36
|
+
- `delete:` — dead code / speculative feature. Replacement: nothing.
|
|
37
|
+
- `stdlib:` — hand-rolled thing the standard library ships. Name the function.
|
|
38
|
+
- `native:` — dependency or code doing what the platform/framework already does. Name the feature.
|
|
39
|
+
- `yagni:` — abstraction with one implementation, config nobody sets, layer with one caller.
|
|
40
|
+
- `shrink:` — same logic, fewer lines. Show the shorter form.
|
|
41
|
+
|
|
42
|
+
Format: `<tag> <what to cut>. <replacement>. [path:line]`
|
|
43
|
+
End with an estimate: `net: ~-<N> lines, -<M> deps possible.` Nothing to cut: `Lean already.`
|
|
44
|
+
|
|
45
|
+
## Guardrails
|
|
46
|
+
|
|
47
|
+
Never propose cutting trust-boundary validation, error handling that prevents data loss, security
|
|
48
|
+
measures, or accessibility — minimal is not the same as unsafe. When a "simplification" would touch
|
|
49
|
+
one of those, leave it and say why. Verify each deletion candidate is truly unreferenced before
|
|
50
|
+
listing it; an audit that proposes deleting live code is worse than no audit.
|
|
@@ -2095,22 +2095,10 @@ class Shell:
|
|
|
2095
2095
|
async def _auto_update(self) -> None:
|
|
2096
2096
|
# Background-refresh the cached latest version (throttled); never blocks startup.
|
|
2097
2097
|
await refresh_update_cache_if_due()
|
|
2098
|
-
#
|
|
2099
|
-
|
|
2100
|
-
if
|
|
2101
|
-
|
|
2102
|
-
# put them at the front of the toast queue, keep them around long
|
|
2103
|
-
# enough to survive startup redraws, and force a repaint if the
|
|
2104
|
-
# prompt is already active.
|
|
2105
|
-
toast(
|
|
2106
|
-
notice,
|
|
2107
|
-
topic="update",
|
|
2108
|
-
duration=30.0,
|
|
2109
|
-
immediate=True,
|
|
2110
|
-
style="fg:ansibrightyellow bold",
|
|
2111
|
-
)
|
|
2112
|
-
if self._prompt_session is not None:
|
|
2113
|
-
self._prompt_session.invalidate()
|
|
2098
|
+
# The persistent under-input line renders the cached update hint; refresh
|
|
2099
|
+
# it when the cache changes instead of duplicating the text as a toast.
|
|
2100
|
+
if pending_update_notice():
|
|
2101
|
+
self._refresh_update_notice_line()
|
|
2114
2102
|
|
|
2115
2103
|
async def _silent_auto_update(self) -> None:
|
|
2116
2104
|
"""Install a newer release silently in the background at startup."""
|
|
@@ -2147,10 +2135,15 @@ class Shell:
|
|
|
2147
2135
|
style="fg:ansiyellow",
|
|
2148
2136
|
)
|
|
2149
2137
|
return
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2138
|
+
# The persistent under-input line (_append_update_notice) already renders
|
|
2139
|
+
# the restart message; a toast duplicates it on the footer's second row.
|
|
2140
|
+
self._refresh_update_notice_line()
|
|
2141
|
+
|
|
2142
|
+
def _refresh_update_notice_line(self) -> None:
|
|
2143
|
+
"""Drop the update-notice memo and repaint so the footer picks up new text."""
|
|
2144
|
+
self._update_notice_cache = (0.0, None)
|
|
2145
|
+
if self._prompt_session is not None:
|
|
2146
|
+
self._prompt_session.invalidate()
|
|
2154
2147
|
|
|
2155
2148
|
def _installed_update_smoke_check_failed(self) -> bool:
|
|
2156
2149
|
status = read_update_status()
|
|
@@ -2210,8 +2203,8 @@ class Shell:
|
|
|
2210
2203
|
if not target:
|
|
2211
2204
|
return None
|
|
2212
2205
|
# A release already installed this session needs a restart, not /update —
|
|
2213
|
-
#
|
|
2214
|
-
#
|
|
2206
|
+
# surface that here instead of telling the user to re-run an update that
|
|
2207
|
+
# has already landed.
|
|
2215
2208
|
status = read_update_status()
|
|
2216
2209
|
installed = (
|
|
2217
2210
|
status is not None
|
|
@@ -2230,12 +2223,12 @@ class Shell:
|
|
|
2230
2223
|
"""Pick the startup update behavior and schedule it (non-blocking).
|
|
2231
2224
|
|
|
2232
2225
|
- env kill-switch set → nothing (cache filters already suppress the
|
|
2233
|
-
|
|
2226
|
+
notice, matching today's hard-disable behavior).
|
|
2234
2227
|
- enabled → silent background install.
|
|
2235
|
-
- config-disabled OR source checkout →
|
|
2236
|
-
(`_auto_update`); self-suppresses for source checkouts because
|
|
2228
|
+
- config-disabled OR source checkout → refresh the persistent notice
|
|
2229
|
+
only (`_auto_update`); self-suppresses for source checkouts because
|
|
2237
2230
|
`pending_update_notice()` returns None in that path.
|
|
2238
|
-
- non-PythinkerSoul → same
|
|
2231
|
+
- non-PythinkerSoul → same notice-refresh path (no runtime config to
|
|
2239
2232
|
consult), matching the prior unconditional `_auto_update` behavior.
|
|
2240
2233
|
"""
|
|
2241
2234
|
if get_env_bool("PYTHINKER_CLI_NO_AUTO_UPDATE"):
|
|
@@ -3915,10 +3915,11 @@ class CustomPromptSession:
|
|
|
3915
3915
|
error=exc,
|
|
3916
3916
|
)
|
|
3917
3917
|
|
|
3918
|
-
def
|
|
3919
|
-
"""
|
|
3920
|
-
separator, so it renders
|
|
3921
|
-
|
|
3918
|
+
def _append_update_notice(self, fragments: list[tuple[str, str]], columns: int) -> None:
|
|
3919
|
+
"""Append a persistent yellow 'update available' line *below* the footer
|
|
3920
|
+
separator, so it renders underneath the prompt input box rather than
|
|
3921
|
+
inside it. Call this right after the separator rule. No-op when no update
|
|
3922
|
+
is pending; style-agnostic across both toolbar layouts."""
|
|
3922
3923
|
provider = getattr(self, "_update_notice_provider", None)
|
|
3923
3924
|
if provider is None:
|
|
3924
3925
|
return
|
|
@@ -3930,7 +3931,7 @@ class CustomPromptSession:
|
|
|
3930
3931
|
return
|
|
3931
3932
|
tokens = _get_tui_tokens()
|
|
3932
3933
|
style = f"fg:{tokens.warning or 'ansiyellow'} bold"
|
|
3933
|
-
fragments[
|
|
3934
|
+
fragments.extend([(style, line), ("", "\n")])
|
|
3934
3935
|
|
|
3935
3936
|
def _render_bottom_toolbar(self) -> FormattedText:
|
|
3936
3937
|
if (
|
|
@@ -3954,9 +3955,9 @@ class CustomPromptSession:
|
|
|
3954
3955
|
fragments: list[tuple[str, str]] = []
|
|
3955
3956
|
tc = get_toolbar_colors()
|
|
3956
3957
|
|
|
3957
|
-
self._prepend_update_notice(fragments, columns)
|
|
3958
3958
|
fragments.append((self._prompt_separator_style(tc.separator), _prompt_rule(columns)))
|
|
3959
3959
|
fragments.append(("", "\n"))
|
|
3960
|
+
self._append_update_notice(fragments, columns)
|
|
3960
3961
|
|
|
3961
3962
|
remaining = columns
|
|
3962
3963
|
|
|
@@ -4185,9 +4186,9 @@ class CustomPromptSession:
|
|
|
4185
4186
|
secondary_style = f"fg:{tokens.muted}"
|
|
4186
4187
|
|
|
4187
4188
|
fragments: list[tuple[str, str]] = []
|
|
4188
|
-
self._prepend_update_notice(fragments, columns)
|
|
4189
4189
|
fragments.append((self._prompt_separator_style(tc.separator), _prompt_rule(columns)))
|
|
4190
4190
|
fragments.append(("", "\n"))
|
|
4191
|
+
self._append_update_notice(fragments, columns)
|
|
4191
4192
|
|
|
4192
4193
|
try:
|
|
4193
4194
|
ctx = self._build_statusline_context(columns)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
+
import atexit
|
|
4
5
|
import contextlib
|
|
5
6
|
import os
|
|
6
7
|
import platform
|
|
@@ -1075,6 +1076,57 @@ def _install_linux_package(asset: Path, package_kind: str) -> UpdateResult:
|
|
|
1075
1076
|
return UpdateResult.UPDATED if result.returncode == 0 else UpdateResult.FAILED
|
|
1076
1077
|
|
|
1077
1078
|
|
|
1079
|
+
def staged_native_path() -> Path:
|
|
1080
|
+
"""Side path next to the running executable where a downloaded native update is
|
|
1081
|
+
held until it is promoted into place. Deterministic so the orchestrator's smoke
|
|
1082
|
+
check and the exit-time promotion agree on the same file."""
|
|
1083
|
+
target = Path(sys.executable).resolve()
|
|
1084
|
+
return target.with_name(f".{target.name}.staged")
|
|
1085
|
+
|
|
1086
|
+
|
|
1087
|
+
def register_staged_native_promotion() -> None:
|
|
1088
|
+
"""Arrange for the staged native binary to replace the running executable at
|
|
1089
|
+
process exit.
|
|
1090
|
+
|
|
1091
|
+
Swapping at exit — rather than in place mid-session — is the whole point: the
|
|
1092
|
+
running onefile build reads its Python archive lazily from ``sys.executable``,
|
|
1093
|
+
so overwriting that path while the process is alive corrupts later imports
|
|
1094
|
+
(``zlib.error: incorrect header check``). At exit no further imports happen, so
|
|
1095
|
+
the swap is safe, and the new binary goes live on the next launch — exactly what
|
|
1096
|
+
the "Updated → vX. Restart to apply." notice promises.
|
|
1097
|
+
|
|
1098
|
+
Registering more than once (e.g. a silent update plus a manual ``/update`` in the
|
|
1099
|
+
same session) is harmless: the handler no-ops once the staged file has been
|
|
1100
|
+
promoted, so any duplicate registration just runs a second no-op.
|
|
1101
|
+
"""
|
|
1102
|
+
atexit.register(_promote_staged_native_update)
|
|
1103
|
+
|
|
1104
|
+
|
|
1105
|
+
def discard_staged_native_update() -> None:
|
|
1106
|
+
"""Remove a staged binary that must not be promoted (e.g. it failed its smoke
|
|
1107
|
+
check). Fail-open: a leftover staged file is only ever promoted deliberately."""
|
|
1108
|
+
with contextlib.suppress(OSError):
|
|
1109
|
+
staged_native_path().unlink()
|
|
1110
|
+
|
|
1111
|
+
|
|
1112
|
+
def _promote_staged_native_update() -> None:
|
|
1113
|
+
# ponytail: known residual windows, both far smaller than the mid-session login
|
|
1114
|
+
# crash this replaces — (1) a hard kill (SIGKILL) skips atexit, so promotion
|
|
1115
|
+
# defers to the next clean exit (self-healing); (2) a first-time lazy import
|
|
1116
|
+
# during the rest of interpreter shutdown, after the swap below, could read
|
|
1117
|
+
# stale bytes. Closing both needs a detached post-exit swapper (the deferred
|
|
1118
|
+
# seamless-relaunch design); not built here.
|
|
1119
|
+
staged = staged_native_path()
|
|
1120
|
+
if not staged.is_file():
|
|
1121
|
+
return
|
|
1122
|
+
target = Path(sys.executable).resolve()
|
|
1123
|
+
try:
|
|
1124
|
+
os.replace(staged, target)
|
|
1125
|
+
except OSError:
|
|
1126
|
+
# Leave the staged binary in place; a later clean exit retries the swap.
|
|
1127
|
+
logger.exception("Failed to promote staged native update on exit:")
|
|
1128
|
+
|
|
1129
|
+
|
|
1078
1130
|
def _install_native_archive(archive: Path) -> UpdateResult:
|
|
1079
1131
|
target = Path(sys.executable).resolve()
|
|
1080
1132
|
extract_dir = archive.parent / "extract"
|
|
@@ -1091,18 +1143,23 @@ def _install_native_archive(archive: Path) -> UpdateResult:
|
|
|
1091
1143
|
logger.error("Native archive did not contain a pythinker executable")
|
|
1092
1144
|
return UpdateResult.FAILED
|
|
1093
1145
|
|
|
1094
|
-
|
|
1146
|
+
# Stage the new binary beside the running executable instead of overwriting it
|
|
1147
|
+
# in place. Promotion into `target` happens at process exit (see
|
|
1148
|
+
# register_staged_native_promotion), keeping the live build's on-disk archive
|
|
1149
|
+
# intact so mid-session lazy imports never read stale bytes.
|
|
1150
|
+
staged = staged_native_path()
|
|
1151
|
+
staging_tmp = target.with_name(f".{target.name}.new-{os.getpid()}")
|
|
1095
1152
|
try:
|
|
1096
|
-
shutil.copyfile(extracted,
|
|
1097
|
-
|
|
1098
|
-
os.replace(
|
|
1153
|
+
shutil.copyfile(extracted, staging_tmp)
|
|
1154
|
+
staging_tmp.chmod(target.stat().st_mode | 0o755)
|
|
1155
|
+
os.replace(staging_tmp, staged)
|
|
1099
1156
|
(target.parent / ".pythinker-native").write_text(
|
|
1100
1157
|
"pythinker-native-build\n", encoding="utf-8"
|
|
1101
1158
|
)
|
|
1102
1159
|
except OSError:
|
|
1103
|
-
logger.exception("Failed to
|
|
1160
|
+
logger.exception("Failed to stage native executable:")
|
|
1104
1161
|
with contextlib.suppress(OSError):
|
|
1105
|
-
|
|
1162
|
+
staging_tmp.unlink()
|
|
1106
1163
|
return UpdateResult.FAILED
|
|
1107
1164
|
return UpdateResult.UPDATED
|
|
1108
1165
|
|