pythinker-code 0.40.0__tar.gz → 0.40.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (899) hide show
  1. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/PKG-INFO +22 -27
  2. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/README.md +21 -26
  3. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/pyproject.toml +1 -1
  4. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/CHANGELOG.md +7 -0
  5. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/pyinstaller.py +23 -0
  6. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/server.py +74 -7
  7. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/app.py +13 -1
  8. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/app.py +18 -2
  9. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/arc-MQTDjwio.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/arc-CCwEpTut.js +1 -1
  10. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/architectureDiagram-3BPJPVTR-BqN3OxUJ.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/architectureDiagram-3BPJPVTR-B2I1FV0L.js +1 -1
  11. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/blockDiagram-GPEHLZMM-CMztCjci.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/blockDiagram-GPEHLZMM-DjB7MpAq.js +1 -1
  12. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/c4Diagram-AAUBKEIU-Dq1Pc1Mw.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/c4Diagram-AAUBKEIU-8W6Q9fal.js +1 -1
  13. pythinker_code-0.40.1/src/pythinker_code/web/static/assets/channel-BixmdygP.js +1 -0
  14. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/chunk-2J33WTMH-DbusC1Ve.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/chunk-2J33WTMH-mHrmTNuF.js +1 -1
  15. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-DVbLNrf0.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-CaSbQmrO.js +1 -1
  16. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-CcKr9tY-.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/chunk-55IACEB6-DS2mNMHf.js +1 -1
  17. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/chunk-727SXJPM-DOYrQUON.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/chunk-727SXJPM-dvwQ03gg.js +1 -1
  18. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/chunk-AQP2D5EJ-CykvUqMW.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/chunk-AQP2D5EJ-16WQcU0f.js +1 -1
  19. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-F2yB9bch.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-DHU37rGy.js +1 -1
  20. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/chunk-ND2GUHAM-aEfupnnT.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/chunk-ND2GUHAM-zAUEevhe.js +1 -1
  21. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-COCRUGgS.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-BZDkHabl.js +1 -1
  22. pythinker_code-0.40.1/src/pythinker_code/web/static/assets/classDiagram-4FO5ZUOK-abRBdx9C.js +1 -0
  23. pythinker_code-0.40.1/src/pythinker_code/web/static/assets/classDiagram-v2-Q7XG4LA2-abRBdx9C.js +1 -0
  24. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-r2sjeDVa.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-DhSPjzQ2.js +1 -1
  25. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-yAYW0P9S.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-Cl9YHimz.js +1 -1
  26. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/cytoscape.esm-1WKRPAW0.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/cytoscape.esm-CTcJOrsw.js +1 -1
  27. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/dagre-BM42HDAG-C5em8HPP.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/dagre-BM42HDAG-C5e2KEop.js +1 -1
  28. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/diagram-2AECGRRQ-Bd3KKZ8u.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/diagram-2AECGRRQ-CcPdj6aZ.js +1 -1
  29. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/diagram-5GNKFQAL-Dt_dHA9y.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/diagram-5GNKFQAL-Bu6H27Z4.js +1 -1
  30. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/diagram-KO2AKTUF-M0tAqTvo.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/diagram-KO2AKTUF-Cc-bapDN.js +1 -1
  31. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/diagram-LMA3HP47-Divrqptn.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/diagram-LMA3HP47-B0_MMOrV.js +1 -1
  32. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/diagram-OG6HWLK6-DNIbLtWN.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/diagram-OG6HWLK6-Bz2qPK_D.js +1 -1
  33. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/erDiagram-TEJ5UH35-cBShhD-s.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/erDiagram-TEJ5UH35-ChEyHw4e.js +1 -1
  34. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/flowDiagram-I6XJVG4X-6vAx1uAh.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/flowDiagram-I6XJVG4X-DmJ7GTOY.js +1 -1
  35. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/ganttDiagram-6RSMTGT7-C3oeY7jF.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/ganttDiagram-6RSMTGT7-J45DFSdx.js +1 -1
  36. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/gitGraphDiagram-PVQCEYII-DTJocgS7.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/gitGraphDiagram-PVQCEYII-ClQ-yJya.js +1 -1
  37. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/graph-C6_r3a27.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/graph-BFejNkpu.js +1 -1
  38. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/index-qgssP-3h.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/index--Y0eLMjq.js +1 -1
  39. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/index-Dc28Td6n.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/index-CFNdtT3u.js +2 -2
  40. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/index-jVtGM95M.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/index-D6c-tncZ.js +1 -1
  41. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/infoDiagram-5YYISTIA--cEj6EVi.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/infoDiagram-5YYISTIA-BEejj5fX.js +1 -1
  42. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/ishikawaDiagram-YF4QCWOH-DFH395qA.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/ishikawaDiagram-YF4QCWOH-BQXS7nPV.js +1 -1
  43. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/journeyDiagram-JHISSGLW-2uNoB-QQ.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/journeyDiagram-JHISSGLW-Bx4jExB-.js +1 -1
  44. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/kanban-definition-UN3LZRKU-DshTzSsY.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/kanban-definition-UN3LZRKU-pdPxPIXQ.js +1 -1
  45. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/layout-DRCfV3Ae.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/layout-CW3o9v0t.js +1 -1
  46. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/linear-DPuY3v76.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/linear-DPUdhU3D.js +1 -1
  47. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-DSe1rE_W.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-CuI6s5cP.js +7 -7
  48. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/mermaid.core-DvJHNXLd.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/mermaid.core-C1dKLTYx.js +5 -5
  49. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/mindmap-definition-RKZ34NQL-Cka8Qliw.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/mindmap-definition-RKZ34NQL-BfBkbOlY.js +1 -1
  50. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/pieDiagram-4H26LBE5-CxhP4FwV.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/pieDiagram-4H26LBE5-CA7evwXR.js +1 -1
  51. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/quadrantDiagram-W4KKPZXB-LaZXrjYX.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/quadrantDiagram-W4KKPZXB-Bl-0mvk1.js +1 -1
  52. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/requirementDiagram-4Y6WPE33-CPf-gvBe.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/requirementDiagram-4Y6WPE33-DCPvgUC0.js +1 -1
  53. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/sankeyDiagram-5OEKKPKP-B1enq0ei.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/sankeyDiagram-5OEKKPKP-C_ehiFJX.js +1 -1
  54. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/sequenceDiagram-3UESZ5HK-C_vYuvEz.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/sequenceDiagram-3UESZ5HK-BI7Oqnz6.js +1 -1
  55. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/stateDiagram-AJRCARHV-2HsOiVl4.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/stateDiagram-AJRCARHV-BJ7uKx5a.js +1 -1
  56. pythinker_code-0.40.1/src/pythinker_code/web/static/assets/stateDiagram-v2-BHNVJYJU-By4ZVUsp.js +1 -0
  57. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/timeline-definition-PNZ67QCA-B3AmWKAr.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/timeline-definition-PNZ67QCA-D3u6luDJ.js +1 -1
  58. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/vennDiagram-CIIHVFJN-7l-ARFi_.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/vennDiagram-CIIHVFJN-Cbat7L3i.js +1 -1
  59. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/wardley-L42UT6IY-uEmqCztb.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/wardley-L42UT6IY-DAJr01gG.js +1 -1
  60. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/wardleyDiagram-YWT4CUSO-BAxfjJZ9.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/wardleyDiagram-YWT4CUSO-_QrkCHDi.js +1 -1
  61. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/xychartDiagram-2RQKCTM6-BuQEeVWq.js → pythinker_code-0.40.1/src/pythinker_code/web/static/assets/xychartDiagram-2RQKCTM6-DfppOp-O.js +1 -1
  62. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/index.html +1 -1
  63. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/channel-qhDswtuY.js +0 -1
  64. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/classDiagram-4FO5ZUOK-DWUBaPvT.js +0 -1
  65. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/classDiagram-v2-Q7XG4LA2-DWUBaPvT.js +0 -1
  66. pythinker_code-0.40.0/src/pythinker_code/web/static/assets/stateDiagram-v2-BHNVJYJU-JvJCuBAS.js +0 -1
  67. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/LICENSE +0 -0
  68. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/NOTICE +0 -0
  69. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/__init__.py +0 -0
  70. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/__main__.py +0 -0
  71. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/acp/AGENTS.md +0 -0
  72. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/acp/__init__.py +0 -0
  73. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/acp/convert.py +0 -0
  74. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/acp/host.py +0 -0
  75. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/acp/mcp.py +0 -0
  76. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/acp/server.py +0 -0
  77. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/acp/session.py +0 -0
  78. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/acp/tools.py +0 -0
  79. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/acp/types.py +0 -0
  80. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/acp/version.py +0 -0
  81. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/agent.yaml +0 -0
  82. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/ask.yaml +0 -0
  83. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/code_reviewer.yaml +0 -0
  84. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/coder.yaml +0 -0
  85. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/debug.yaml +0 -0
  86. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/debugger.yaml +0 -0
  87. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/explore.yaml +0 -0
  88. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/implementer.yaml +0 -0
  89. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/judge.yaml +0 -0
  90. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/plan.yaml +0 -0
  91. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/planner.yaml +0 -0
  92. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/review.yaml +0 -0
  93. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/scout.yaml +0 -0
  94. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/security_reviewer.yaml +0 -0
  95. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/system.md +0 -0
  96. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/default/verifier.yaml +0 -0
  97. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
  98. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/agentspec.py +0 -0
  99. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/app.py +0 -0
  100. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/approval_runtime/__init__.py +0 -0
  101. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/approval_runtime/models.py +0 -0
  102. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/approval_runtime/runtime.py +0 -0
  103. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/__init__.py +0 -0
  104. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/alibaba.py +0 -0
  105. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/anthropic_direct.py +0 -0
  106. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/browser_login_page.py +0 -0
  107. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/deepseek.py +0 -0
  108. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/github_feedback.py +0 -0
  109. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/lm_studio.py +0 -0
  110. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/minimax.py +0 -0
  111. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/moonshot.py +0 -0
  112. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/oauth.py +0 -0
  113. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/ollama.py +0 -0
  114. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/openai/__init__.py +0 -0
  115. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/openai/_shared.py +0 -0
  116. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/openai/browser_flow.py +0 -0
  117. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/openai/catalog.py +0 -0
  118. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/openai/config_apply.py +0 -0
  119. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/openai/constants.py +0 -0
  120. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/openai/login.py +0 -0
  121. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/openai/models.py +0 -0
  122. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/openai/oauth_client.py +0 -0
  123. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/opencode_go.py +0 -0
  124. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/openrouter.py +0 -0
  125. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/platforms.py +0 -0
  126. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/auth/z_ai.py +0 -0
  127. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/background/__init__.py +0 -0
  128. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/background/agent_runner.py +0 -0
  129. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/background/ids.py +0 -0
  130. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/background/manager.py +0 -0
  131. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/background/models.py +0 -0
  132. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/background/store.py +0 -0
  133. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/background/summary.py +0 -0
  134. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/background/worker.py +0 -0
  135. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/__init__.py +0 -0
  136. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/__main__.py +0 -0
  137. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/_lazy_group.py +0 -0
  138. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/debug.py +0 -0
  139. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/export.py +0 -0
  140. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/info.py +0 -0
  141. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/mcp.py +0 -0
  142. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/plugin.py +0 -0
  143. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/review.py +0 -0
  144. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/secscan.py +0 -0
  145. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/security_scan.py +0 -0
  146. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/skill.py +0 -0
  147. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/toad.py +0 -0
  148. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/update.py +0 -0
  149. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/vis.py +0 -0
  150. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/cli/web.py +0 -0
  151. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/config.py +0 -0
  152. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/constant.py +0 -0
  153. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/events.py +0 -0
  154. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/exception.py +0 -0
  155. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/execution_profiles.py +0 -0
  156. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/extensions.py +0 -0
  157. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/feedback.py +0 -0
  158. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/feedback_repo.py +0 -0
  159. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/file_restore.py +0 -0
  160. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/hooks/__init__.py +0 -0
  161. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/hooks/config.py +0 -0
  162. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/hooks/engine.py +0 -0
  163. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/hooks/events.py +0 -0
  164. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/hooks/runner.py +0 -0
  165. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/llm.py +0 -0
  166. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/memory/__init__.py +0 -0
  167. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/memory/consolidation.py +0 -0
  168. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/memory/harvest.py +0 -0
  169. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/memory/recall.py +0 -0
  170. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/memory/recap.py +0 -0
  171. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/memory/retriever.py +0 -0
  172. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/memory/sanitize.py +0 -0
  173. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/metadata.py +0 -0
  174. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/models_dev.py +0 -0
  175. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/native.py +0 -0
  176. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/notifications/__init__.py +0 -0
  177. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/notifications/llm.py +0 -0
  178. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/notifications/manager.py +0 -0
  179. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/notifications/models.py +0 -0
  180. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/notifications/notifier.py +0 -0
  181. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/notifications/store.py +0 -0
  182. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/notifications/wire.py +0 -0
  183. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/plugin/__init__.py +0 -0
  184. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/plugin/manager.py +0 -0
  185. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/plugin/tool.py +0 -0
  186. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/project_memory.py +0 -0
  187. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/prompt_templates.py +0 -0
  188. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/prompts/__init__.py +0 -0
  189. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/prompts/compact.md +0 -0
  190. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/prompts/init.md +0 -0
  191. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/py.typed +0 -0
  192. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/scratchpad.py +0 -0
  193. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/session.py +0 -0
  194. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/session_cleanup.py +0 -0
  195. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/session_fork.py +0 -0
  196. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/session_recap.py +0 -0
  197. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/session_state.py +0 -0
  198. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/share.py +0 -0
  199. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skill/__init__.py +0 -0
  200. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skill/flow/__init__.py +0 -0
  201. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skill/flow/d2.py +0 -0
  202. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skill/flow/mermaid.py +0 -0
  203. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skill/lockfile.py +0 -0
  204. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/agent-creator/SKILL.md +0 -0
  205. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/check-impl-against-spec/SKILL.md +0 -0
  206. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/create-pr/SKILL.md +0 -0
  207. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/customize-pythinker/SKILL.md +0 -0
  208. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/diagnose-ci-failures/SKILL.md +0 -0
  209. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/fix-errors/SKILL.md +0 -0
  210. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/implement-specs/SKILL.md +0 -0
  211. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/pr-walkthrough/SKILL.md +0 -0
  212. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
  213. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/reproduce-bug-report/SKILL.md +0 -0
  214. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/resolve-merge-conflicts/SKILL.md +0 -0
  215. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/review-pr/SKILL.md +0 -0
  216. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
  217. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/spec-driven-implementation/SKILL.md +0 -0
  218. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/write-product-spec/SKILL.md +0 -0
  219. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/skills/write-tech-spec/SKILL.md +0 -0
  220. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/__init__.py +0 -0
  221. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/agent.py +0 -0
  222. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/approval.py +0 -0
  223. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/btw.py +0 -0
  224. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/compaction.py +0 -0
  225. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/compaction_restore.py +0 -0
  226. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/context.py +0 -0
  227. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/deliberation.py +0 -0
  228. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/denwarenji.py +0 -0
  229. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/dynamic_injection.py +0 -0
  230. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
  231. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
  232. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/dynamic_injections/model_defense.py +0 -0
  233. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
  234. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/flow_runner.py +0 -0
  235. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/message.py +0 -0
  236. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/permission.py +0 -0
  237. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/pythinkersoul.py +0 -0
  238. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/slash.py +0 -0
  239. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/soul/toolset.py +0 -0
  240. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/subagents/__init__.py +0 -0
  241. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/subagents/builder.py +0 -0
  242. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/subagents/core.py +0 -0
  243. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/subagents/discovery.py +0 -0
  244. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/subagents/git_context.py +0 -0
  245. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/subagents/models.py +0 -0
  246. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/subagents/output.py +0 -0
  247. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/subagents/registry.py +0 -0
  248. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/subagents/runner.py +0 -0
  249. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/subagents/store.py +0 -0
  250. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/subagents/usage.py +0 -0
  251. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/telemetry/__init__.py +0 -0
  252. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/telemetry/config.py +0 -0
  253. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/telemetry/crash.py +0 -0
  254. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/telemetry/errors.py +0 -0
  255. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/telemetry/metrics.py +0 -0
  256. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/telemetry/otel.py +0 -0
  257. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/telemetry/sentry.py +0 -0
  258. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/telemetry/sink.py +0 -0
  259. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/thinking.py +0 -0
  260. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/AGENTS.md +0 -0
  261. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/__init__.py +0 -0
  262. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/agent/__init__.py +0 -0
  263. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/agent/description.md +0 -0
  264. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/ask_user/__init__.py +0 -0
  265. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/ask_user/description.md +0 -0
  266. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/background/__init__.py +0 -0
  267. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/background/handoff.md +0 -0
  268. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/background/input.md +0 -0
  269. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/background/list.md +0 -0
  270. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/background/output.md +0 -0
  271. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/background/stop.md +0 -0
  272. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/display.py +0 -0
  273. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/dmail/__init__.py +0 -0
  274. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/dmail/dmail.md +0 -0
  275. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/__init__.py +0 -0
  276. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/glob.md +0 -0
  277. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/glob.py +0 -0
  278. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/grep.md +0 -0
  279. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/grep_local.py +0 -0
  280. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/plan_mode.py +0 -0
  281. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/read.md +0 -0
  282. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/read.py +0 -0
  283. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/read_media.md +0 -0
  284. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/read_media.py +0 -0
  285. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/replace.md +0 -0
  286. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/replace.py +0 -0
  287. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/utils.py +0 -0
  288. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/write.md +0 -0
  289. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/file/write.py +0 -0
  290. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/mcp_resource/__init__.py +0 -0
  291. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/mcp_resource/list_description.md +0 -0
  292. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/mcp_resource/read_description.md +0 -0
  293. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/memory/__init__.py +0 -0
  294. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/memory/memory.md +0 -0
  295. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/plan/__init__.py +0 -0
  296. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/plan/description.md +0 -0
  297. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/plan/enter.py +0 -0
  298. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/plan/enter_description.md +0 -0
  299. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/plan/handoff.py +0 -0
  300. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/plan/heroes.py +0 -0
  301. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/progress/__init__.py +0 -0
  302. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/progress/description.md +0 -0
  303. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/recall/__init__.py +0 -0
  304. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/recall/description.md +0 -0
  305. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/scratchpad/__init__.py +0 -0
  306. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/scratchpad/scratchpad_tool.md +0 -0
  307. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/shell/__init__.py +0 -0
  308. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/shell/bash.md +0 -0
  309. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/shell/powershell.md +0 -0
  310. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/skill/__init__.py +0 -0
  311. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/skill/description.md +0 -0
  312. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/suggest/__init__.py +0 -0
  313. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/suggest/description.md +0 -0
  314. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/test.py +0 -0
  315. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/think/__init__.py +0 -0
  316. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/think/think.md +0 -0
  317. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/todo/__init__.py +0 -0
  318. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
  319. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/utils.py +0 -0
  320. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/web/__init__.py +0 -0
  321. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/web/_allowlist.py +0 -0
  322. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/web/fetch.md +0 -0
  323. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/web/fetch.py +0 -0
  324. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/web/search.md +0 -0
  325. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/tools/web/search.py +0 -0
  326. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/__init__.py +0 -0
  327. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/acp/__init__.py +0 -0
  328. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/color_utils.py +0 -0
  329. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/print/__init__.py +0 -0
  330. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/print/visualize.py +0 -0
  331. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/__init__.py +0 -0
  332. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
  333. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/base.py +0 -0
  334. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
  335. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
  336. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/diff.py +0 -0
  337. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/dynamic_border.py +0 -0
  338. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/footer.py +0 -0
  339. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
  340. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/markdown.py +0 -0
  341. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/messages.py +0 -0
  342. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/panel.py +0 -0
  343. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
  344. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/report.py +0 -0
  345. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
  346. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
  347. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
  348. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/console.py +0 -0
  349. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/debug.py +0 -0
  350. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/design_system.py +0 -0
  351. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/echo.py +0 -0
  352. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/export_import.py +0 -0
  353. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/glyphs.py +0 -0
  354. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/keyboard.py +0 -0
  355. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/keymap.py +0 -0
  356. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
  357. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/model_picker.py +0 -0
  358. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/motion.py +0 -0
  359. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/oauth.py +0 -0
  360. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/placeholders.py +0 -0
  361. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/prompt.py +0 -0
  362. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/render_constants.py +0 -0
  363. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/replay.py +0 -0
  364. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/selector.py +0 -0
  365. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
  366. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
  367. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
  368. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
  369. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
  370. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
  371. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
  372. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/session_picker.py +0 -0
  373. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/setup.py +0 -0
  374. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/slash.py +0 -0
  375. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/spacing.py +0 -0
  376. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/spinner_words.py +0 -0
  377. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/startup.py +0 -0
  378. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/stats.py +0 -0
  379. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/stats_collector.py +0 -0
  380. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/stats_pricing.py +0 -0
  381. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/task_browser.py +0 -0
  382. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tips.py +0 -0
  383. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
  384. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/_file_diff.py +0 -0
  385. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -0
  386. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
  387. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
  388. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
  389. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
  390. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
  391. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
  392. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
  393. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
  394. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
  395. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
  396. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/skill.py +0 -0
  397. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
  398. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
  399. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -0
  400. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
  401. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/update.py +0 -0
  402. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/update_orchestrator.py +0 -0
  403. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/usage.py +0 -0
  404. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
  405. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/usage_adapters/alibaba.py +0 -0
  406. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
  407. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
  408. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
  409. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
  410. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
  411. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
  412. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
  413. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
  414. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
  415. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
  416. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/usage_render.py +0 -0
  417. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
  418. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/visualize/_activity_tree.py +0 -0
  419. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
  420. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/visualize/_blocks.py +0 -0
  421. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
  422. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/visualize/_dialog_shell.py +0 -0
  423. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
  424. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/visualize/_interactive.py +0 -0
  425. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/visualize/_live_view.py +0 -0
  426. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
  427. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/visualize/_transcript.py +0 -0
  428. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
  429. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/terminal_background.py +0 -0
  430. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/terminal_capabilities.py +0 -0
  431. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/theme.py +0 -0
  432. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/ui/tui_config.py +0 -0
  433. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
  434. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/__init__.py +0 -0
  435. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/aiohttp.py +0 -0
  436. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/aioqueue.py +0 -0
  437. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/artifacts.py +0 -0
  438. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/broadcast.py +0 -0
  439. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/changelog.py +0 -0
  440. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/clipboard.py +0 -0
  441. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/datetime.py +0 -0
  442. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/diff.py +0 -0
  443. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/editor.py +0 -0
  444. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/environment.py +0 -0
  445. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/envvar.py +0 -0
  446. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/export.py +0 -0
  447. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/file_filter.py +0 -0
  448. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/frontmatter.py +0 -0
  449. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/gitignore.py +0 -0
  450. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/io.py +0 -0
  451. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/logging.py +0 -0
  452. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/media_tags.py +0 -0
  453. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/message.py +0 -0
  454. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/path.py +0 -0
  455. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/proctitle.py +0 -0
  456. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/proxy.py +0 -0
  457. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/rich/__init__.py +0 -0
  458. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/rich/columns.py +0 -0
  459. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/rich/diff_render.py +0 -0
  460. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/rich/markdown.py +0 -0
  461. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
  462. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
  463. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/rich/syntax.py +0 -0
  464. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/sensitive.py +0 -0
  465. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/signals.py +0 -0
  466. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/slashcmd.py +0 -0
  467. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/sleep_inhibitor.py +0 -0
  468. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/string.py +0 -0
  469. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/subprocess_env.py +0 -0
  470. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/term.py +0 -0
  471. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/trust.py +0 -0
  472. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/utils/typing.py +0 -0
  473. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/__init__.py +0 -0
  474. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/api/__init__.py +0 -0
  475. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/api/sessions.py +0 -0
  476. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/api/statistics.py +0 -0
  477. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/api/system.py +0 -0
  478. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-CY1rtwrX.js +0 -0
  479. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/static/assets/index-DSRInNnm.css +0 -0
  480. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/static/assets/index-DgmTI2M_.js +0 -0
  481. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  482. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  483. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  484. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  485. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  486. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  487. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  488. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/vis/static/index.html +0 -0
  489. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/__init__.py +0 -0
  490. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/api/__init__.py +0 -0
  491. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/api/config.py +0 -0
  492. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/api/open_in.py +0 -0
  493. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/api/sessions.py +0 -0
  494. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/auth.py +0 -0
  495. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/models.py +0 -0
  496. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/runner/__init__.py +0 -0
  497. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/runner/messages.py +0 -0
  498. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/runner/process.py +0 -0
  499. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/runner/worker.py +0 -0
  500. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/_headers +0 -0
  501. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  502. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  503. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  504. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  505. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  506. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  507. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  508. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  509. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  510. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  511. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  512. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  513. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  514. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  515. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  516. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  517. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  518. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  519. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  520. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  521. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  522. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  523. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  524. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  525. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  526. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  527. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  528. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  529. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  530. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  531. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  532. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  533. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  534. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  535. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  536. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  537. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  538. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  539. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  540. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  541. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  542. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  543. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  544. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  545. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  546. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  547. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  548. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  549. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  550. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  551. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  552. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  553. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  554. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  555. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  556. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  557. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  558. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  559. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  560. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/abap-BdImnpbu.js +0 -0
  561. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +0 -0
  562. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/ada-bCR0ucgS.js +0 -0
  563. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +0 -0
  564. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +0 -0
  565. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +0 -0
  566. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/apache-Pmp26Uib.js +0 -0
  567. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/apex-D8_7TLub.js +0 -0
  568. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/apl-dKokRX4l.js +0 -0
  569. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/applescript-Co6uUVPk.js +0 -0
  570. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/ara-BRHolxvo.js +0 -0
  571. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +0 -0
  572. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/asm-D_Q5rh1f.js +0 -0
  573. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/astro-CbQHKStN.js +0 -0
  574. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +0 -0
  575. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/awk-DMzUqQB5.js +0 -0
  576. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +0 -0
  577. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +0 -0
  578. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/bat-BkioyH1T.js +0 -0
  579. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/beancount-k_qm7-4y.js +0 -0
  580. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/berry-uYugtg8r.js +0 -0
  581. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/bibtex-CHM0blh-.js +0 -0
  582. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/bicep-Bmn6On1c.js +0 -0
  583. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/blade-D4QpJJKB.js +0 -0
  584. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/bsl-BO_Y6i37.js +0 -0
  585. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/c-BIGW1oBm.js +0 -0
  586. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/c3-VCDPK7BO.js +0 -0
  587. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +0 -0
  588. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/cairo-KRGpt6FW.js +0 -0
  589. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
  590. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
  591. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
  592. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
  593. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/clarity-D53aC0YG.js +0 -0
  594. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/clojure-P80f7IUj.js +0 -0
  595. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/cmake-D1j8_8rp.js +0 -0
  596. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/cobol-nwyudZeR.js +0 -0
  597. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +0 -0
  598. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +0 -0
  599. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/coffee-Ch7k5sss.js +0 -0
  600. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +0 -0
  601. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/coq-DkFqJrB1.js +0 -0
  602. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/cpp-CofmeUqb.js +0 -0
  603. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/crystal-tKQVLTB8.js +0 -0
  604. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/csharp-K5feNrxe.js +0 -0
  605. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/css-DPfMkruS.js +0 -0
  606. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/csv-fuZLfV_i.js +0 -0
  607. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/cue-D82EKSYY.js +0 -0
  608. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/cypher-COkxafJQ.js +0 -0
  609. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/d-85-TOEBH.js +0 -0
  610. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +0 -0
  611. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/dart-CF10PKvl.js +0 -0
  612. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/dax-CEL-wOlO.js +0 -0
  613. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +0 -0
  614. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +0 -0
  615. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/diff-D97Zzqfu.js +0 -0
  616. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/docker-BcOcwvcX.js +0 -0
  617. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/dotenv-Da5cRb03.js +0 -0
  618. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/dracula-BzJJZx-M.js +0 -0
  619. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +0 -0
  620. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +0 -0
  621. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/edge-BkV0erSs.js +0 -0
  622. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/elixir-CDX3lj18.js +0 -0
  623. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/elm-DbKCFpqz.js +0 -0
  624. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +0 -0
  625. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/erb-BOJIQeun.js +0 -0
  626. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/erlang-DsQrWhSR.js +0 -0
  627. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +0 -0
  628. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +0 -0
  629. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/fennel-BYunw83y.js +0 -0
  630. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/fish-BvzEVeQv.js +0 -0
  631. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/fluent-C4IJs8-o.js +0 -0
  632. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
  633. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
  634. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +0 -0
  635. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +0 -0
  636. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +0 -0
  637. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/gdshader-DkwncUOv.js +0 -0
  638. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/genie-D0YGMca9.js +0 -0
  639. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +0 -0
  640. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +0 -0
  641. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +0 -0
  642. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/github-dark-DHJKELXO.js +0 -0
  643. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
  644. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
  645. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
  646. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/github-light-DAi9KRSo.js +0 -0
  647. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +0 -0
  648. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
  649. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/gleam-BspZqrRM.js +0 -0
  650. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
  651. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +0 -0
  652. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/glsl-DplSGwfg.js +0 -0
  653. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/gn-n2N0HUVH.js +0 -0
  654. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +0 -0
  655. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/go-Dn2_MT6a.js +0 -0
  656. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/graphql-ChdNCCLP.js +0 -0
  657. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/groovy-gcz8RCvz.js +0 -0
  658. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
  659. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
  660. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
  661. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
  662. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
  663. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
  664. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/hack-CaT9iCJl.js +0 -0
  665. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/haml-B8DHNrY2.js +0 -0
  666. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/handlebars-BL8al0AC.js +0 -0
  667. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/haskell-Df6bDoY_.js +0 -0
  668. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/haxe-CzTSHFRz.js +0 -0
  669. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/hcl-BWvSN4gD.js +0 -0
  670. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/hjson-D5-asLiD.js +0 -0
  671. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +0 -0
  672. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/houston-DnULxvSX.js +0 -0
  673. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/html-GMplVEZG.js +0 -0
  674. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +0 -0
  675. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/http-jrhK8wxY.js +0 -0
  676. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/hurl-irOxFIW8.js +0 -0
  677. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +0 -0
  678. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/hy-DFXneXwc.js +0 -0
  679. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/imba-DGztddWO.js +0 -0
  680. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/index-BpoLgcEt.js +0 -0
  681. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/index-CzV_vCfu.css +0 -0
  682. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/index-DI2oedCt.js +0 -0
  683. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/ini-BEwlwnbL.js +0 -0
  684. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/init-Gi6I4Gst.js +0 -0
  685. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  686. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  687. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  688. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  689. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  690. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  691. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  692. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/java-CylS5w8V.js +0 -0
  693. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/javascript-wDzz0qaB.js +0 -0
  694. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +0 -0
  695. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/jison-wvAkD_A8.js +0 -0
  696. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/json-Cp-IABpG.js +0 -0
  697. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/json5-C9tS-k6U.js +0 -0
  698. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/jsonc-Des-eS-w.js +0 -0
  699. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +0 -0
  700. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +0 -0
  701. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/jssm-C2t-YnRu.js +0 -0
  702. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/jsx-g9-lgVsj.js +0 -0
  703. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/julia-CxzCAyBv.js +0 -0
  704. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
  705. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
  706. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
  707. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/katex-D2lIc1rk.css +0 -0
  708. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/kdl-DV7GczEv.js +0 -0
  709. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +0 -0
  710. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/kusto-DZf3V79B.js +0 -0
  711. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/laserwave-DUszq2jm.js +0 -0
  712. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/latex-B4uzh10-.js +0 -0
  713. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/lean-BZvkOJ9d.js +0 -0
  714. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/less-B1dDrJ26.js +0 -0
  715. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +0 -0
  716. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/liquid-DYVedYrR.js +0 -0
  717. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/llvm-BtvRca6l.js +0 -0
  718. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/log-2UxHyX5q.js +0 -0
  719. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/logo-BtOb2qkB.js +0 -0
  720. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/lua-BbnMAYS6.js +0 -0
  721. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/luau-C-HG3fhB.js +0 -0
  722. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/make-CHLpvVh8.js +0 -0
  723. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/markdown-Cvjx9yec.js +0 -0
  724. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/marko-DZsq8hO1.js +0 -0
  725. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +0 -0
  726. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
  727. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
  728. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +0 -0
  729. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
  730. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/matlab-D7o27uSR.js +0 -0
  731. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/mdc-DUICxH0z.js +0 -0
  732. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +0 -0
  733. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-YVZJy7__.css +0 -0
  734. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +0 -0
  735. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/min-dark-CafNBF8u.js +0 -0
  736. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/min-light-CTRr51gU.js +0 -0
  737. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +0 -0
  738. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/mojo-B93PlW-d.js +0 -0
  739. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/monokai-D4h5O-jR.js +0 -0
  740. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/moonbit-Ba13S78F.js +0 -0
  741. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/move-Bu9oaDYs.js +0 -0
  742. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/narrat-DRg8JJMk.js +0 -0
  743. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +0 -0
  744. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/nginx-DknmC5AR.js +0 -0
  745. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/night-owl-C39BiMTA.js +0 -0
  746. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/nim-CVrawwO9.js +0 -0
  747. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/nix-CwoSXNpI.js +0 -0
  748. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/nord-Ddv68eIx.js +0 -0
  749. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/nushell-C-sUppwS.js +0 -0
  750. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +0 -0
  751. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +0 -0
  752. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +0 -0
  753. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
  754. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/one-light-PoHY5YXO.js +0 -0
  755. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/openscad-C4EeE6gA.js +0 -0
  756. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +0 -0
  757. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/pascal-D93ZcfNL.js +0 -0
  758. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/perl-C0TMdlhV.js +0 -0
  759. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/php-CDn_0X-4.js +0 -0
  760. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/pkl-u5AG7uiY.js +0 -0
  761. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/plastic-3e1v2bzS.js +0 -0
  762. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/plsql-ChMvpjG-.js +0 -0
  763. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/po-BTJTHyun.js +0 -0
  764. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +0 -0
  765. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/polar-C0HS_06l.js +0 -0
  766. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/postcss-CXtECtnM.js +0 -0
  767. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +0 -0
  768. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/powershell-Dpen1YoG.js +0 -0
  769. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/prisma-Dd19v3D-.js +0 -0
  770. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/prolog-CbFg5uaA.js +0 -0
  771. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/proto-C7zT0LnQ.js +0 -0
  772. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/pug-CGlum2m_.js +0 -0
  773. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/puppet-BMWR74SV.js +0 -0
  774. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/purescript-CklMAg4u.js +0 -0
  775. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/python-B6aJPvgy.js +0 -0
  776. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/qml-3beO22l8.js +0 -0
  777. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +0 -0
  778. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/qss-IeuSbFQv.js +0 -0
  779. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/r-Dspwwk_N.js +0 -0
  780. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/racket-BqYA7rlc.js +0 -0
  781. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/raku-DXvB9xmW.js +0 -0
  782. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/razor-C1TweQQi.js +0 -0
  783. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/red-bN70gL4F.js +0 -0
  784. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/reg-C-SQnVFl.js +0 -0
  785. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +0 -0
  786. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/rel-C3B-1QV4.js +0 -0
  787. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/riscv-BM1_JUlF.js +0 -0
  788. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
  789. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
  790. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +0 -0
  791. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +0 -0
  792. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/rst-B0xPkSld.js +0 -0
  793. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/ruby-BvKwtOVI.js +0 -0
  794. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/rust-B1yitclQ.js +0 -0
  795. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/sas-cz2c8ADy.js +0 -0
  796. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +0 -0
  797. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/scala-C151Ov-r.js +0 -0
  798. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/scheme-C98Dy4si.js +0 -0
  799. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/scss-OYdSNvt2.js +0 -0
  800. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +0 -0
  801. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
  802. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/shellscript-Yzrsuije.js +0 -0
  803. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/shellsession-BADoaaVG.js +0 -0
  804. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +0 -0
  805. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +0 -0
  806. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +0 -0
  807. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +0 -0
  808. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +0 -0
  809. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +0 -0
  810. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/solidity-rGO070M0.js +0 -0
  811. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/soy-Brmx7dQM.js +0 -0
  812. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/sparql-rVzFXLq3.js +0 -0
  813. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/splunk-BtCnVYZw.js +0 -0
  814. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/sql-BLtJtn59.js +0 -0
  815. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +0 -0
  816. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/stata-BH5u7GGu.js +0 -0
  817. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +0 -0
  818. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/svelte-zxCyuUbr.js +0 -0
  819. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/swift-Dg5xB15N.js +0 -0
  820. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +0 -0
  821. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +0 -0
  822. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/systemd-4A_iFExJ.js +0 -0
  823. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/talonscript-CkByrt1z.js +0 -0
  824. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/tasl-QIJgUcNo.js +0 -0
  825. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/tcl-dwOrl1Do.js +0 -0
  826. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/templ-W15q3VgB.js +0 -0
  827. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/terraform-BETggiCN.js +0 -0
  828. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/tex-CvyZ59Mk.js +0 -0
  829. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/tokyo-night-hegEt444.js +0 -0
  830. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/toml-vGWfd6FD.js +0 -0
  831. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +0 -0
  832. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/tsv-B_m7g4N7.js +0 -0
  833. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/tsx-COt5Ahok.js +0 -0
  834. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/turtle-BsS91CYL.js +0 -0
  835. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/twig-CO9l9SDP.js +0 -0
  836. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +0 -0
  837. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/typespec-BGHnOYBU.js +0 -0
  838. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/typst-DHCkPAjA.js +0 -0
  839. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/v-BcVCzyr7.js +0 -0
  840. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/vala-CsfeWuGM.js +0 -0
  841. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/vb-D17OF-Vu.js +0 -0
  842. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/verilog-BQ8w6xss.js +0 -0
  843. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/vesper-DU1UobuO.js +0 -0
  844. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +0 -0
  845. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/viml-CJc9bBzg.js +0 -0
  846. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
  847. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
  848. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +0 -0
  849. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/vue-DN_0RTcg.js +0 -0
  850. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +0 -0
  851. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +0 -0
  852. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/vyper-CDx5xZoG.js +0 -0
  853. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +0 -0
  854. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/wasm-MzD3tlZU.js +0 -0
  855. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/wenyan-BV7otONQ.js +0 -0
  856. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +0 -0
  857. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +0 -0
  858. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/wit-5i3qLPDT.js +0 -0
  859. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +0 -0
  860. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/xml-sdJ4AIDG.js +0 -0
  861. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/xsl-CtQFsRM5.js +0 -0
  862. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/yaml-Buea-lGh.js +0 -0
  863. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +0 -0
  864. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/assets/zig-VOosw3JB.js +0 -0
  865. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
  866. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
  867. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
  868. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
  869. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
  870. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
  871. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
  872. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
  873. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
  874. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
  875. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
  876. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
  877. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
  878. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
  879. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
  880. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
  881. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
  882. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
  883. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/icon.svg +0 -0
  884. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/logo.png +0 -0
  885. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
  886. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/brand/robots.txt +0 -0
  887. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/install.ps1 +0 -0
  888. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/install.sh +0 -0
  889. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/static/logo.png +0 -0
  890. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/store/__init__.py +0 -0
  891. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/web/store/sessions.py +0 -0
  892. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/wire/__init__.py +0 -0
  893. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/wire/file.py +0 -0
  894. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/wire/jsonrpc.py +0 -0
  895. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/wire/protocol.py +0 -0
  896. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/wire/root_hub.py +0 -0
  897. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/wire/serde.py +0 -0
  898. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/src/pythinker_code/wire/server.py +0 -0
  899. {pythinker_code-0.40.0 → pythinker_code-0.40.1}/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.40.0
3
+ Version: 0.40.1
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,17 +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.40.0
118
+ ## 🆕 What's New in 0.40.1
119
119
 
120
- - **Alibaba: plan-key routing fixed, live model discovery, and `qwen3.7-plus` default.** Token Plan keys (`sk-sp-`, `sk-tok-`, `sk-ws-`) now route to the correct endpoint `sk-sp-` was previously sent to the Coding Plan host, causing 401s. Model discovery no longer filters to a hardcoded allowlist; every chat model the endpoint returns now appears, so Token Plan users see the full multi-vendor set (Qwen, DeepSeek, GLM, Kimi, MiniMax). First-login default is `qwen3.7-plus`.
121
- - **Qwen3.x models always-thinking on both Alibaba plans.** Qwen3.x/3.7 models carry the `always_thinking` capability on Alibaba Model Studio and OpenCode Go plans no effort dial, no top-border label.
122
- - **Web: same-origin WebSockets, synced version banner, and token bootstrap fix.** An empty allowed-origin list no longer rejects all WebSocket connections with a 403; the UI banner prefers the version the running backend reports; the initial auth-token race is resolved. `ESC` reliably clears only turn-spawned background tasks.
123
- - **Security, correctness, and multi-instance hardening.** Permission gate closes awk-pipe and `xargs -L N` shell-out bypasses. Glob enforces workspace boundary via resolved symlinks. Multi-instance sessions use a per-session writer lock; the shared metadata index uses locked read-modify-write; JSONL appenders repair torn final lines. OAuth refresh carries lifetime forward on missing `expires_in`.
124
- - **Thinking effort: single top-right label, input border stays neutral.** The border no longer recolors per effort level. Effort is shown once as a level-colored dot+label flushed to the right of the input's top border, hidden for always-thinking and non-thinking models.
125
- - **TUI refinements and agent prompt overhaul.** Adaptive terminal-background probe, unified todo renderer, elapsed/tokens/t-s status line, consistent diff palette. All default agent prompts restructured with Mission / Hard Constraints / Workflow / Output Contract sections.
126
- - **Breaking: `pythinker web` / `pythinker vis` host flag is now `-H`.** `-h` is now a help alias. Scripts using `-h 0.0.0.0` must switch to `-H <ip>` or `--host <ip>`.
120
+ - **Windows/Linux native installers: web UI no longer 404s on `/`.** The installer CI froze the app without building the gitignored web/vis frontend bundles, so `pythinker web` opened a browser onto `GET /?token=… 404 Not Found`. Both installer workflows now build the bundles before PyInstaller (matching the PyPI release flow pip/wheel installs were never affected), every PyInstaller spec refuses to freeze when the bundles are missing, and a build that still lacks them serves an explanatory 503 page instead of a bare 404.
121
+ - **Startup banner renders on legacy Windows consoles.** `pythinker web` / `pythinker vis` now honor the existing ASCII-glyph detection with width-preserving fallbacks and degrade per line instead of crashing when the output stream rejects Unicode (e.g. PowerShell with cp1252).
127
122
 
128
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.40.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
123
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.40.1`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
129
124
 
130
125
 
131
126
  ---
@@ -215,7 +210,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
215
210
 
216
211
  | Platform | Recommended install | Artifact source |
217
212
  |---|---|---|
218
- | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.40.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
213
+ | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.40.1.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
219
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) |
220
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 |
221
216
  | **🐳 Docker** | `docker run --rm -it ghcr.io/pythoughts-labs/pythinker-code` | GHCR multi-arch image |
@@ -243,7 +238,7 @@ pythinker # start the interactive TUI
243
238
 
244
239
  ### 🪟 Windows — native installer
245
240
 
246
- `PythinkerSetup-0.40.0.exe` is a signed* Inno Setup wizard. Installs per-user
241
+ `PythinkerSetup-0.40.1.exe` is a signed* Inno Setup wizard. Installs per-user
247
242
  into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
248
243
  PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
249
244
  the change. **No UAC prompt.**
@@ -254,13 +249,13 @@ irm https://pythinker.com/install.ps1 | iex
254
249
 
255
250
  # Or manually download the installer + checksum from the Releases page,
256
251
  # verify with Get-FileHash, then run:
257
- .\PythinkerSetup-0.40.0.exe
252
+ .\PythinkerSetup-0.40.1.exe
258
253
 
259
254
  # Open a fresh PowerShell
260
255
  pythinker --version
261
256
  ```
262
257
 
263
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.40.0.exe /ALLUSERS`
258
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.40.1.exe /ALLUSERS`
264
259
  installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
265
260
 
266
261
  **Upgrade:** `pythinker update` from inside the running app — it downloads
@@ -311,26 +306,26 @@ attached to every GitHub Release.
311
306
 
312
307
  ```sh
313
308
  # Debian / Ubuntu (x86_64)
314
- sudo dpkg -i pythinker-code_0.40.0_amd64.deb
309
+ sudo dpkg -i pythinker-code_0.40.1_amd64.deb
315
310
  sudo apt-get install -f # only if dpkg reports missing deps
316
311
 
317
312
  # Debian / Ubuntu (ARM64)
318
- sudo dpkg -i pythinker-code_0.40.0_arm64.deb
313
+ sudo dpkg -i pythinker-code_0.40.1_arm64.deb
319
314
 
320
315
  # Fedora / RHEL / openSUSE (x86_64)
321
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.0/pythinker-code-0.40.0.x86_64.rpm
322
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.0/pythinker-code-0.40.0.x86_64.rpm.sha256
323
- sha256sum -c pythinker-code-0.40.0.x86_64.rpm.sha256
316
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.1/pythinker-code-0.40.1.x86_64.rpm
317
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.1/pythinker-code-0.40.1.x86_64.rpm.sha256
318
+ sha256sum -c pythinker-code-0.40.1.x86_64.rpm.sha256
324
319
  # Fedora / RHEL:
325
- sudo dnf install ./pythinker-code-0.40.0.x86_64.rpm
320
+ sudo dnf install ./pythinker-code-0.40.1.x86_64.rpm
326
321
  # openSUSE:
327
- sudo zypper install ./pythinker-code-0.40.0.x86_64.rpm
322
+ sudo zypper install ./pythinker-code-0.40.1.x86_64.rpm
328
323
 
329
324
  # Fedora / RHEL (aarch64)
330
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.0/pythinker-code-0.40.0.aarch64.rpm
331
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.0/pythinker-code-0.40.0.aarch64.rpm.sha256
332
- sha256sum -c pythinker-code-0.40.0.aarch64.rpm.sha256
333
- sudo dnf install ./pythinker-code-0.40.0.aarch64.rpm
325
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.1/pythinker-code-0.40.1.aarch64.rpm
326
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.1/pythinker-code-0.40.1.aarch64.rpm.sha256
327
+ sha256sum -c pythinker-code-0.40.1.aarch64.rpm.sha256
328
+ sudo dnf install ./pythinker-code-0.40.1.aarch64.rpm
334
329
  ```
335
330
 
336
331
  Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
@@ -339,8 +334,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
339
334
  **Verify before install:**
340
335
 
341
336
  ```sh
342
- sha256sum -c pythinker-code_0.40.0_amd64.deb.sha256 # Debian/Ubuntu
343
- sha256sum -c pythinker-code-0.40.0.x86_64.rpm.sha256 # Fedora/RHEL
337
+ sha256sum -c pythinker-code_0.40.1_amd64.deb.sha256 # Debian/Ubuntu
338
+ sha256sum -c pythinker-code-0.40.1.x86_64.rpm.sha256 # Fedora/RHEL
344
339
  ```
345
340
 
346
341
  **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
@@ -50,17 +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.40.0
53
+ ## 🆕 What's New in 0.40.1
54
54
 
55
- - **Alibaba: plan-key routing fixed, live model discovery, and `qwen3.7-plus` default.** Token Plan keys (`sk-sp-`, `sk-tok-`, `sk-ws-`) now route to the correct endpoint `sk-sp-` was previously sent to the Coding Plan host, causing 401s. Model discovery no longer filters to a hardcoded allowlist; every chat model the endpoint returns now appears, so Token Plan users see the full multi-vendor set (Qwen, DeepSeek, GLM, Kimi, MiniMax). First-login default is `qwen3.7-plus`.
56
- - **Qwen3.x models always-thinking on both Alibaba plans.** Qwen3.x/3.7 models carry the `always_thinking` capability on Alibaba Model Studio and OpenCode Go plans no effort dial, no top-border label.
57
- - **Web: same-origin WebSockets, synced version banner, and token bootstrap fix.** An empty allowed-origin list no longer rejects all WebSocket connections with a 403; the UI banner prefers the version the running backend reports; the initial auth-token race is resolved. `ESC` reliably clears only turn-spawned background tasks.
58
- - **Security, correctness, and multi-instance hardening.** Permission gate closes awk-pipe and `xargs -L N` shell-out bypasses. Glob enforces workspace boundary via resolved symlinks. Multi-instance sessions use a per-session writer lock; the shared metadata index uses locked read-modify-write; JSONL appenders repair torn final lines. OAuth refresh carries lifetime forward on missing `expires_in`.
59
- - **Thinking effort: single top-right label, input border stays neutral.** The border no longer recolors per effort level. Effort is shown once as a level-colored dot+label flushed to the right of the input's top border, hidden for always-thinking and non-thinking models.
60
- - **TUI refinements and agent prompt overhaul.** Adaptive terminal-background probe, unified todo renderer, elapsed/tokens/t-s status line, consistent diff palette. All default agent prompts restructured with Mission / Hard Constraints / Workflow / Output Contract sections.
61
- - **Breaking: `pythinker web` / `pythinker vis` host flag is now `-H`.** `-h` is now a help alias. Scripts using `-h 0.0.0.0` must switch to `-H <ip>` or `--host <ip>`.
55
+ - **Windows/Linux native installers: web UI no longer 404s on `/`.** The installer CI froze the app without building the gitignored web/vis frontend bundles, so `pythinker web` opened a browser onto `GET /?token=… 404 Not Found`. Both installer workflows now build the bundles before PyInstaller (matching the PyPI release flow pip/wheel installs were never affected), every PyInstaller spec refuses to freeze when the bundles are missing, and a build that still lacks them serves an explanatory 503 page instead of a bare 404.
56
+ - **Startup banner renders on legacy Windows consoles.** `pythinker web` / `pythinker vis` now honor the existing ASCII-glyph detection with width-preserving fallbacks and degrade per line instead of crashing when the output stream rejects Unicode (e.g. PowerShell with cp1252).
62
57
 
63
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.40.0`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
58
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.40.1`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
64
59
 
65
60
 
66
61
  ---
@@ -150,7 +145,7 @@ matches your OS — no Python, Node, or `uv` prerequisite.
150
145
 
151
146
  | Platform | Recommended install | Artifact source |
152
147
  |---|---|---|
153
- | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.40.0.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
148
+ | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | `PythinkerSetup-0.40.1.exe` from [Releases](https://github.com/Pythoughts-labs/pythinker-code/releases/latest) |
154
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) |
155
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 |
156
151
  | **🐳 Docker** | `docker run --rm -it ghcr.io/pythoughts-labs/pythinker-code` | GHCR multi-arch image |
@@ -178,7 +173,7 @@ pythinker # start the interactive TUI
178
173
 
179
174
  ### 🪟 Windows — native installer
180
175
 
181
- `PythinkerSetup-0.40.0.exe` is a signed* Inno Setup wizard. Installs per-user
176
+ `PythinkerSetup-0.40.1.exe` is a signed* Inno Setup wizard. Installs per-user
182
177
  into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
183
178
  PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
184
179
  the change. **No UAC prompt.**
@@ -189,13 +184,13 @@ irm https://pythinker.com/install.ps1 | iex
189
184
 
190
185
  # Or manually download the installer + checksum from the Releases page,
191
186
  # verify with Get-FileHash, then run:
192
- .\PythinkerSetup-0.40.0.exe
187
+ .\PythinkerSetup-0.40.1.exe
193
188
 
194
189
  # Open a fresh PowerShell
195
190
  pythinker --version
196
191
  ```
197
192
 
198
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.40.0.exe /ALLUSERS`
193
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.40.1.exe /ALLUSERS`
199
194
  installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
200
195
 
201
196
  **Upgrade:** `pythinker update` from inside the running app — it downloads
@@ -246,26 +241,26 @@ attached to every GitHub Release.
246
241
 
247
242
  ```sh
248
243
  # Debian / Ubuntu (x86_64)
249
- sudo dpkg -i pythinker-code_0.40.0_amd64.deb
244
+ sudo dpkg -i pythinker-code_0.40.1_amd64.deb
250
245
  sudo apt-get install -f # only if dpkg reports missing deps
251
246
 
252
247
  # Debian / Ubuntu (ARM64)
253
- sudo dpkg -i pythinker-code_0.40.0_arm64.deb
248
+ sudo dpkg -i pythinker-code_0.40.1_arm64.deb
254
249
 
255
250
  # Fedora / RHEL / openSUSE (x86_64)
256
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.0/pythinker-code-0.40.0.x86_64.rpm
257
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.0/pythinker-code-0.40.0.x86_64.rpm.sha256
258
- sha256sum -c pythinker-code-0.40.0.x86_64.rpm.sha256
251
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.1/pythinker-code-0.40.1.x86_64.rpm
252
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.1/pythinker-code-0.40.1.x86_64.rpm.sha256
253
+ sha256sum -c pythinker-code-0.40.1.x86_64.rpm.sha256
259
254
  # Fedora / RHEL:
260
- sudo dnf install ./pythinker-code-0.40.0.x86_64.rpm
255
+ sudo dnf install ./pythinker-code-0.40.1.x86_64.rpm
261
256
  # openSUSE:
262
- sudo zypper install ./pythinker-code-0.40.0.x86_64.rpm
257
+ sudo zypper install ./pythinker-code-0.40.1.x86_64.rpm
263
258
 
264
259
  # Fedora / RHEL (aarch64)
265
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.0/pythinker-code-0.40.0.aarch64.rpm
266
- curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.0/pythinker-code-0.40.0.aarch64.rpm.sha256
267
- sha256sum -c pythinker-code-0.40.0.aarch64.rpm.sha256
268
- sudo dnf install ./pythinker-code-0.40.0.aarch64.rpm
260
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.1/pythinker-code-0.40.1.aarch64.rpm
261
+ curl -LO https://github.com/Pythoughts-labs/pythinker-code/releases/download/v0.40.1/pythinker-code-0.40.1.aarch64.rpm.sha256
262
+ sha256sum -c pythinker-code-0.40.1.aarch64.rpm.sha256
263
+ sudo dnf install ./pythinker-code-0.40.1.aarch64.rpm
269
264
  ```
270
265
 
271
266
  Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
@@ -274,8 +269,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
274
269
  **Verify before install:**
275
270
 
276
271
  ```sh
277
- sha256sum -c pythinker-code_0.40.0_amd64.deb.sha256 # Debian/Ubuntu
278
- sha256sum -c pythinker-code-0.40.0.x86_64.rpm.sha256 # Fedora/RHEL
272
+ sha256sum -c pythinker-code_0.40.1_amd64.deb.sha256 # Debian/Ubuntu
273
+ sha256sum -c pythinker-code-0.40.1.x86_64.rpm.sha256 # Fedora/RHEL
279
274
  ```
280
275
 
281
276
  **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pythinker-code"
3
- version = "0.40.0"
3
+ version = "0.40.1"
4
4
  description = "Pythinker — an agentic CLI developed by Pythoughts-labs."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -15,6 +15,13 @@ GitHub Releases page; `0.8.0` is the new starting line.
15
15
 
16
16
  ## Unreleased
17
17
 
18
+ ## 0.40.1 (2026-06-10)
19
+
20
+ - **Windows/Linux native installers: web UI no longer 404s on `/`.** The installer CI froze the app without building the gitignored web/vis frontend bundles, so `pythinker web` opened a browser onto `GET /?token=… → 404 Not Found`. Both installer workflows now build the bundles before PyInstaller (matching the PyPI release flow — pip/wheel installs were never affected), every PyInstaller spec refuses to freeze when the bundles are missing, and a build that still lacks them serves an explanatory page on `/` (with the REST API still reachable under `/api`) instead of a bare 404.
21
+ - **Startup banner renders on legacy Windows consoles.** The `pythinker web` / `pythinker vis` PYTHINKER banner raw-printed Unicode block art, which garbled on legacy code pages (e.g. PowerShell with cp1252) and raised `UnicodeEncodeError` when output was redirected. The banner now honors the existing ASCII-glyph detection (`PYTHINKER_ASCII_UI` / `PYTHINKER_TUI_GLYPHS=ascii` opt-ins included) with width-preserving ASCII fallbacks, and degrades per line instead of crashing when a stream rejects Unicode.
22
+
23
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.40.1`, or use the native installer for your platform from the [Releases page](https://github.com/Pythoughts-labs/pythinker-code/releases/latest).
24
+
18
25
  ## 0.40.0 (2026-06-10)
19
26
 
20
27
  - **Web: same-origin WebSockets accepted, version banner synced to the backend, and token bootstrap race fixed.** The local-mode web server now auto-populates the allowed-origin list (an empty allowlist rejects every `Origin`-bearing request, which previously broke all WebSocket handshakes with a 403). The UI version banner prefers the version the running backend reports (via the config API) over the stale build-time constant, and a transient version-fetch failure no longer permanently disables the backend banner for the session. The initial auth-token bootstrap race that could fail the first request is resolved. `ESC` now reliably terminates only the background tasks spawned by the interrupted turn, and recall context is re-framed so prior-session snippets can't be misread as new instructions.
@@ -1,9 +1,32 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from pathlib import Path
4
+
3
5
  from PyInstaller.utils.hooks import collect_data_files, collect_submodules, copy_metadata
4
6
 
5
7
  from pythinker_code.cli._lazy_group import LazySubcommandGroup
6
8
 
9
+ # The web/vis frontends are gitignored build artifacts synced into the package
10
+ # by scripts/build_web.py and scripts/build_vis.py. collect_data_files()
11
+ # silently collects nothing for missing globs, which froze builds whose web UI
12
+ # answered "/" with a 404 (Windows/Linux native installers).
13
+ _REQUIRED_UI_ASSETS = ("web/static/index.html", "vis/static/index.html")
14
+
15
+
16
+ def require_ui_assets(package_root: Path | None = None) -> None:
17
+ """Abort the freeze when the web/vis UI bundles haven't been built."""
18
+ if package_root is None:
19
+ package_root = Path(__file__).resolve().parents[1]
20
+ missing = [rel for rel in _REQUIRED_UI_ASSETS if not (package_root / rel).is_file()]
21
+ if missing:
22
+ raise SystemExit(
23
+ "PyInstaller build aborted: UI bundles missing from pythinker_code "
24
+ f"({', '.join(missing)}). They are gitignored build artifacts; run "
25
+ "`make build-web build-vis` before freezing, or the packaged web UI "
26
+ "will 404 on '/'."
27
+ )
28
+
29
+
7
30
  lazy_cli_hiddenimports = [
8
31
  module_name
9
32
  for module_name, _attribute_name, _help_text in (LazySubcommandGroup.lazy_subcommands.values())
@@ -4,8 +4,11 @@ from __future__ import annotations
4
4
 
5
5
  import importlib
6
6
  import socket
7
+ import sys
7
8
  import textwrap
8
9
 
10
+ from pythinker_code.ui.terminal_capabilities import ascii_glyphs_enabled
11
+
9
12
  # Shared "PYTHINKER" wordmark used by the web and vis startup banners.
10
13
  PYTHINKER_BANNER_ART = [
11
14
  "<center>██████╗ ██╗ ██╗████████╗██╗ ██╗██╗███╗ ██╗██╗ ██╗███████╗██████╗ ",
@@ -16,6 +19,37 @@ PYTHINKER_BANNER_ART = [
16
19
  "<center>╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝",
17
20
  ]
18
21
 
22
+ # Single-cell ASCII stand-ins for every non-ASCII character the banners emit.
23
+ # All replacements are 1:1 so box alignment is preserved. Used when the
24
+ # terminal can't render Unicode (legacy Windows code pages such as cp1252,
25
+ # TERM=dumb, or an explicit PYTHINKER_ASCII_UI/PYTHINKER_TUI_GLYPHS opt-in);
26
+ # raw print() of the block art would otherwise garble or raise
27
+ # UnicodeEncodeError on those streams.
28
+ _BANNER_ASCII_FALLBACKS = str.maketrans(
29
+ {
30
+ "█": "#",
31
+ "╔": " ",
32
+ "╗": " ",
33
+ "╚": " ",
34
+ "╝": " ",
35
+ "║": " ",
36
+ "═": " ",
37
+ "➜": ">",
38
+ "•": "*",
39
+ "⚠": "!",
40
+ }
41
+ )
42
+
43
+
44
+ def _print_banner_line(text: str) -> None:
45
+ """Print one banner line, degrading to ASCII if the stream rejects it."""
46
+ try:
47
+ print(text)
48
+ except UnicodeEncodeError:
49
+ encoding = getattr(sys.stdout, "encoding", None) or "ascii"
50
+ fallback = text.translate(_BANNER_ASCII_FALLBACKS)
51
+ print(fallback.encode(encoding, errors="replace").decode(encoding, errors="replace"))
52
+
19
53
 
20
54
  def get_address_family(host: str) -> socket.AddressFamily:
21
55
  """Return AF_INET6 for IPv6 addresses, AF_INET for IPv4 and hostnames."""
@@ -96,8 +130,39 @@ def get_network_addresses() -> list[str]:
96
130
  return addresses
97
131
 
98
132
 
133
+ def missing_ui_page(asset_path: str, build_command: str) -> str:
134
+ """HTML served on ``/`` when the bundled frontend assets are absent.
135
+
136
+ Packaged builds that skipped the frontend build would otherwise answer
137
+ ``/`` with a bare 404, which reads like a routing bug instead of a
138
+ packaging one.
139
+ """
140
+ return f"""<!doctype html>
141
+ <html>
142
+ <head>
143
+ <meta charset="utf-8">
144
+ <title>Pythinker UI unavailable</title>
145
+ </head>
146
+ <body style="font-family: system-ui, sans-serif; max-width: 40rem;
147
+ margin: 4rem auto; line-height: 1.5;">
148
+ <h1>UI assets are missing</h1>
149
+ <p>This Pythinker build was packaged without its frontend bundle
150
+ (<code>{asset_path}</code> was not found).</p>
151
+ <p>If you installed a packaged build (Windows installer, winget, scoop,
152
+ .deb/.rpm), update to the latest release or report this as a packaging
153
+ bug. When running from source, build the frontend first:</p>
154
+ <pre><code>{build_command}</code></pre>
155
+ <p>The REST API is unaffected and remains available under <code>/api</code>.</p>
156
+ </body>
157
+ </html>
158
+ """
159
+
160
+
99
161
  def print_banner(lines: list[str]) -> None:
100
162
  """Print a boxed banner with tag conventions (<center>, <nowrap>, <hr>)."""
163
+ if ascii_glyphs_enabled():
164
+ lines = [line.translate(_BANNER_ASCII_FALLBACKS) for line in lines]
165
+
101
166
  processed: list[str] = []
102
167
  for line in lines:
103
168
  if line == "<hr>":
@@ -113,19 +178,21 @@ def print_banner(lines: list[str]) -> None:
113
178
  return s.removeprefix("<center>").removeprefix("<nowrap>")
114
179
 
115
180
  content_lines = [strip_tags(line) for line in processed if line != "<hr>"]
116
- width = max(60, *(len(line) for line in content_lines))
181
+ # The leading 60 lives inside the list: `max(60, *[])` is a TypeError when
182
+ # every line is an <hr>.
183
+ width = max([60, *(len(line) for line in content_lines)])
117
184
  top = "+" + "=" * (width + 2) + "+"
118
185
 
119
- print(top)
186
+ _print_banner_line(top)
120
187
  for line in processed:
121
188
  if line == "<hr>":
122
- print("|" + "-" * (width + 2) + "|")
189
+ _print_banner_line("|" + "-" * (width + 2) + "|")
123
190
  elif line.startswith("<center>"):
124
191
  content = line.removeprefix("<center>")
125
- print(f"| {content.center(width)} |")
192
+ _print_banner_line(f"| {content.center(width)} |")
126
193
  elif line.startswith("<nowrap>"):
127
194
  content = line.removeprefix("<nowrap>")
128
- print(f"| {content.ljust(width)} |")
195
+ _print_banner_line(f"| {content.ljust(width)} |")
129
196
  else:
130
- print(f"| {line.ljust(width)} |")
131
- print(top)
197
+ _print_banner_line(f"| {line.ljust(width)} |")
198
+ _print_banner_line(top)
@@ -10,6 +10,7 @@ from urllib.parse import quote
10
10
  from fastapi import FastAPI
11
11
  from fastapi.middleware.cors import CORSMiddleware
12
12
  from fastapi.middleware.gzip import GZipMiddleware
13
+ from fastapi.responses import HTMLResponse
13
14
  from fastapi.staticfiles import StaticFiles
14
15
 
15
16
  from pythinker_code.utils.server import (
@@ -18,6 +19,7 @@ from pythinker_code.utils.server import (
18
19
  format_url,
19
20
  get_network_addresses,
20
21
  is_local_host,
22
+ missing_ui_page,
21
23
  print_banner,
22
24
  )
23
25
  from pythinker_code.vis.api import sessions_router, statistics_router, system_router
@@ -82,8 +84,18 @@ def create_app() -> FastAPI:
82
84
  async def health_probe() -> dict[str, Any]: # pyright: ignore[reportUnusedFunction]
83
85
  return {"status": "ok"}
84
86
 
85
- if STATIC_DIR.exists():
87
+ # Gate on index.html, not just the directory: a build that skipped the vis
88
+ # bundle would otherwise answer "/" with a bare 404 instead of a hint.
89
+ if (STATIC_DIR / "index.html").is_file():
86
90
  application.mount("/", StaticFiles(directory=STATIC_DIR, html=True), name="static")
91
+ else:
92
+
93
+ @application.get("/", include_in_schema=False)
94
+ async def missing_vis_ui() -> HTMLResponse: # pyright: ignore[reportUnusedFunction]
95
+ return HTMLResponse(
96
+ status_code=503,
97
+ content=missing_ui_page("pythinker_code/vis/static/index.html", "make build-vis"),
98
+ )
87
99
 
88
100
  return application
89
101
 
@@ -25,6 +25,7 @@ from pythinker_code.utils.server import (
25
25
  format_url,
26
26
  get_network_addresses,
27
27
  is_local_host,
28
+ missing_ui_page,
28
29
  )
29
30
  from pythinker_code.web.api import (
30
31
  config_router,
@@ -218,9 +219,24 @@ def create_app(
218
219
  """Health check endpoint."""
219
220
  return {"status": "ok"}
220
221
 
221
- # Mount static files as fallback (must be last)
222
- if STATIC_DIR.exists():
222
+ # Mount static files as fallback (must be last). Gate on index.html, not
223
+ # just the directory: a build that skipped the web bundle can still ship
224
+ # the git-tracked brand/ files, and StaticFiles(html=True) would then 404
225
+ # on "/" with no hint of why.
226
+ if (STATIC_DIR / "index.html").is_file():
223
227
  application.mount("/", StaticFiles(directory=STATIC_DIR, html=True), name="static")
228
+ else:
229
+ logger.warning(
230
+ "Web UI assets missing at {static_dir}; serving setup instructions on /",
231
+ static_dir=STATIC_DIR,
232
+ )
233
+
234
+ @application.get("/", include_in_schema=False)
235
+ async def missing_web_ui() -> HTMLResponse: # pyright: ignore[reportUnusedFunction]
236
+ return HTMLResponse(
237
+ status_code=503,
238
+ content=missing_ui_page("pythinker_code/web/static/index.html", "make build-web"),
239
+ )
224
240
 
225
241
  return application
226
242
 
@@ -1 +1 @@
1
- import{M as ln,N as an,O as Y,P as O,Q,R as un,S as y,T as tn,V as j,W as _,X as rn,Y as o,Z as on,$ as sn,a0 as fn}from"./mermaid.core-DvJHNXLd.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,D,S,v,R,V,a){var E=D-l,i=S-h,n=V-v,d=a-R,u=d*E-n*i;if(!(u*u<y))return u=(n*(h-R)-d*(l-v))/u,[l+u*E,h+u*i]}function H(l,h,D,S,v,R,V){var a=l-D,E=h-S,i=(V?R:-R)/j(a*a+E*E),n=i*E,d=-i*a,u=l+n,s=h+d,f=D+n,c=S+d,W=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,A=m*m+g*g,T=v-R,P=u*c-f*s,I=(g<0?-1:1)*j(on(0,T*T*A-P*P)),M=(P*g-m*I)/A,N=(-P*m-g*I)/A,w=(P*g+m*I)/A,p=(-P*m+g*I)/A,x=M-W,e=N-t,r=w-W,X=p-t;return x*x+e*e>r*r+X*X&&(M=w,N=p),{cx:M,cy:N,x01:-n,y01:-d,x11:M*(v/T-1),y11:N*(v/T-1)}}function hn(){var l=cn,h=yn,D=Q(0),S=null,v=gn,R=dn,V=mn,a=null,E=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=R.apply(this,arguments)-un,W=rn(c-f),t=c>f;if(a||(a=n=E()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(W>tn-y)a.moveTo(s*Y(f),s*O(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*Y(c),u*O(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,A=f,T=c,P=W,I=W,M=V.apply(this,arguments)/2,N=M>y&&(S?+S.apply(this,arguments):j(u*u+s*s)),w=_(rn(s-u)/2,+D.apply(this,arguments)),p=w,x=w,e,r;if(N>y){var X=sn(N/u*O(M)),z=sn(N/s*O(M));(P-=X*2)>y?(X*=t?1:-1,A+=X,T-=X):(P=0,A=T=(f+c)/2),(I-=z*2)>y?(z*=t?1:-1,m+=z,g-=z):(I=0,m=g=(f+c)/2)}var Z=s*Y(m),$=s*O(m),B=u*Y(T),C=u*O(T);if(w>y){var F=s*Y(g),G=s*O(g),J=u*Y(A),K=u*O(A),q;if(W<an)if(q=pn(Z,$,J,K,F,G,B,C)){var L=Z-q[0],U=$-q[1],k=F-q[0],b=G-q[1],nn=1/O(fn((L*k+U*b)/(j(L*L+U*U)*j(k*k+b*b)))/2),en=j(q[0]*q[0]+q[1]*q[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}I>y?x>y?(e=H(J,K,Z,$,s,x,t),r=H(F,G,B,C,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(Z,$),a.arc(0,0,s,m,g,!t)):a.moveTo(Z,$),!(u>y)||!(P>y)?a.lineTo(B,C):p>y?(e=H(B,C,F,G,u,-p,t),r=H(Z,$,J,K,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,A,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +R.apply(this,arguments))/2-an/2;return[Y(d)*n,O(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:Q(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:Q(+n),i):h},i.cornerRadius=function(n){return arguments.length?(D=typeof n=="function"?n:Q(+n),i):D},i.padRadius=function(n){return arguments.length?(S=n==null?null:typeof n=="function"?n:Q(+n),i):S},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:Q(+n),i):v},i.endAngle=function(n){return arguments.length?(R=typeof n=="function"?n:Q(+n),i):R},i.padAngle=function(n){return arguments.length?(V=typeof n=="function"?n:Q(+n),i):V},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
1
+ import{M as ln,N as an,O as Y,P as O,Q,R as un,S as y,T as tn,V as j,W as _,X as rn,Y as o,Z as on,$ as sn,a0 as fn}from"./mermaid.core-C1dKLTYx.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,D,S,v,R,V,a){var E=D-l,i=S-h,n=V-v,d=a-R,u=d*E-n*i;if(!(u*u<y))return u=(n*(h-R)-d*(l-v))/u,[l+u*E,h+u*i]}function H(l,h,D,S,v,R,V){var a=l-D,E=h-S,i=(V?R:-R)/j(a*a+E*E),n=i*E,d=-i*a,u=l+n,s=h+d,f=D+n,c=S+d,W=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,A=m*m+g*g,T=v-R,P=u*c-f*s,I=(g<0?-1:1)*j(on(0,T*T*A-P*P)),M=(P*g-m*I)/A,N=(-P*m-g*I)/A,w=(P*g+m*I)/A,p=(-P*m+g*I)/A,x=M-W,e=N-t,r=w-W,X=p-t;return x*x+e*e>r*r+X*X&&(M=w,N=p),{cx:M,cy:N,x01:-n,y01:-d,x11:M*(v/T-1),y11:N*(v/T-1)}}function hn(){var l=cn,h=yn,D=Q(0),S=null,v=gn,R=dn,V=mn,a=null,E=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=R.apply(this,arguments)-un,W=rn(c-f),t=c>f;if(a||(a=n=E()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(W>tn-y)a.moveTo(s*Y(f),s*O(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*Y(c),u*O(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,A=f,T=c,P=W,I=W,M=V.apply(this,arguments)/2,N=M>y&&(S?+S.apply(this,arguments):j(u*u+s*s)),w=_(rn(s-u)/2,+D.apply(this,arguments)),p=w,x=w,e,r;if(N>y){var X=sn(N/u*O(M)),z=sn(N/s*O(M));(P-=X*2)>y?(X*=t?1:-1,A+=X,T-=X):(P=0,A=T=(f+c)/2),(I-=z*2)>y?(z*=t?1:-1,m+=z,g-=z):(I=0,m=g=(f+c)/2)}var Z=s*Y(m),$=s*O(m),B=u*Y(T),C=u*O(T);if(w>y){var F=s*Y(g),G=s*O(g),J=u*Y(A),K=u*O(A),q;if(W<an)if(q=pn(Z,$,J,K,F,G,B,C)){var L=Z-q[0],U=$-q[1],k=F-q[0],b=G-q[1],nn=1/O(fn((L*k+U*b)/(j(L*L+U*U)*j(k*k+b*b)))/2),en=j(q[0]*q[0]+q[1]*q[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}I>y?x>y?(e=H(J,K,Z,$,s,x,t),r=H(F,G,B,C,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(Z,$),a.arc(0,0,s,m,g,!t)):a.moveTo(Z,$),!(u>y)||!(P>y)?a.lineTo(B,C):p>y?(e=H(B,C,F,G,u,-p,t),r=H(Z,$,J,K,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,A,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +R.apply(this,arguments))/2-an/2;return[Y(d)*n,O(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:Q(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:Q(+n),i):h},i.cornerRadius=function(n){return arguments.length?(D=typeof n=="function"?n:Q(+n),i):D},i.padRadius=function(n){return arguments.length?(S=n==null?null:typeof n=="function"?n:Q(+n),i):S},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:Q(+n),i):v},i.endAngle=function(n){return arguments.length?(R=typeof n=="function"?n:Q(+n),i):R},i.padAngle=function(n){return arguments.length?(V=typeof n=="function"?n:Q(+n),i):V},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};