pythinker-code 0.14.0__tar.gz → 0.15.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (830) hide show
  1. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/PKG-INFO +29 -30
  2. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/README.md +28 -29
  3. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/pyproject.toml +1 -1
  4. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/CHANGELOG.md +10 -0
  5. pythinker_code-0.15.0/src/pythinker_code/native.py +63 -0
  6. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/update.py +113 -47
  7. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/_baseUniq-C09CFMcb.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/_baseUniq-FLikL5oP.js +1 -1
  8. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/arc-vndVidZU.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/arc-CH7aTkr9.js +1 -1
  9. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-aHx4vpo6.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-DjjsbT9J.js +1 -1
  10. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-CK8Wu5Sz.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-D00CC7dg.js +1 -1
  11. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-GFtYFRZq.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-BZ8YW5l9.js +1 -1
  12. pythinker_code-0.15.0/src/pythinker_code/web/static/assets/channel-ChLkGicq.js +1 -0
  13. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-DHSrZa_c.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-CT51XVd2.js +1 -1
  14. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-CKx5mwXv.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-D9cOsagU.js +1 -1
  15. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-DepSCHzs.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-DLU0G-z9.js +1 -1
  16. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-ghSjx-4s.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-BoYyatMl.js +1 -1
  17. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-CZ-W34rs.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-BvtZuN5v.js +1 -1
  18. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-CJaddcG4.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-UzYfy8VX.js +1 -1
  19. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-B0ddzSE9.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-CkjMyo71.js +1 -1
  20. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-CkZXJVOs.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-FwTnUvW6.js +1 -1
  21. pythinker_code-0.15.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-CVLXpajg.js +1 -0
  22. pythinker_code-0.15.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-CVLXpajg.js +1 -0
  23. pythinker_code-0.15.0/src/pythinker_code/web/static/assets/clone-Bb8bPI91.js +1 -0
  24. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-C_PO3Y8u.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-DEzuAcDQ.js +1 -1
  25. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-EszWu_33.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-GsDbZVos.js +1 -1
  26. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/cytoscape.esm-Bpug4tfx.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/cytoscape.esm-CyvSsNDx.js +1 -1
  27. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-q1IRrtY9.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-Cz8X-74N.js +1 -1
  28. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-xPPymnsx.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-GfM-PGgf.js +1 -1
  29. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-lqmd2ZS5.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-C1ELKuDf.js +1 -1
  30. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-Mkc9A7mV.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-BnjnqEbK.js +1 -1
  31. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-D2NXtDpX.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-DhduFnCm.js +1 -1
  32. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-DXEBgOiE.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-Cz66XZ8r.js +1 -1
  33. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-B0juEKTq.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-D2ZFH9bE.js +1 -1
  34. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-CCOLX6a9.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-CjbNsL7k.js +1 -1
  35. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/graph-zQCuB0ii.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/graph-DJoi1jP0.js +1 -1
  36. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/index-CKiWCD3p.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/index-B5iJX3GK.js +1 -1
  37. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/index-BTo9SuG0.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/index-Cjy8jHlq.js +1 -1
  38. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/index-DUhp6as7.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/index-CwS0EXkr.js +2 -2
  39. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-DsZBOneg.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-CY1rxXp5.js +1 -1
  40. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-DIC4IfOP.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-CIoAb7p1.js +1 -1
  41. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-CjI-JpQF.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-Cv0RkQOy.js +1 -1
  42. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/layout-D_YFKfgX.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/layout-By6G60Po.js +1 -1
  43. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/linear-DL-5jFok.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/linear-B2R4zVv-.js +1 -1
  44. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-CENH8iSv.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-Bl-SdXa2.js +7 -7
  45. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/mermaid.core-DbXSGdxH.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/mermaid.core-DZmvwVNs.js +5 -5
  46. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/min-CVH2ckSS.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/min-ayt5ZU-J.js +1 -1
  47. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-CgFCoQXV.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-CBnIEP6L.js +1 -1
  48. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-BLUfmVC6.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-vMh5x4GJ.js +1 -1
  49. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-paLGoA70.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-ngAbPtkD.js +1 -1
  50. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-Nn02IObL.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-C8VB4e1y.js +1 -1
  51. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-DSqdplKY.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-DO_AEX2X.js +1 -1
  52. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-B0x4izdF.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-BhW0R8OX.js +1 -1
  53. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-Dp7_jWt8.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-l1IzipMH.js +1 -1
  54. pythinker_code-0.15.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-uNOmVN18.js +1 -0
  55. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-Dz4oGx-s.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-VlHp4E46.js +1 -1
  56. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-DfJhBtGa.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-CD_xN-Le.js +1 -1
  57. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-C2VK-J-z.js → pythinker_code-0.15.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-DD9WyEHn.js +1 -1
  58. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/index.html +1 -1
  59. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/install.ps1 +1 -1
  60. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/install.sh +1 -1
  61. pythinker_code-0.14.0/src/pythinker_code/native.py +0 -38
  62. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/channel-fVTjBWhH.js +0 -1
  63. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-KIr1VHCy.js +0 -1
  64. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-KIr1VHCy.js +0 -1
  65. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/clone-CxvtVeJa.js +0 -1
  66. pythinker_code-0.14.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-DdtldWYY.js +0 -1
  67. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/LICENSE +0 -0
  68. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/NOTICE +0 -0
  69. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/__init__.py +0 -0
  70. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/__main__.py +0 -0
  71. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/AGENTS.md +0 -0
  72. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/__init__.py +0 -0
  73. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/convert.py +0 -0
  74. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/host.py +0 -0
  75. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/mcp.py +0 -0
  76. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/server.py +0 -0
  77. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/session.py +0 -0
  78. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/tools.py +0 -0
  79. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/types.py +0 -0
  80. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/acp/version.py +0 -0
  81. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/agent.yaml +0 -0
  82. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/code_reviewer.yaml +0 -0
  83. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/coder.yaml +0 -0
  84. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/debugger.yaml +0 -0
  85. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/explore.yaml +0 -0
  86. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/implementer.yaml +0 -0
  87. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/plan.yaml +0 -0
  88. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/review.yaml +0 -0
  89. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/security_reviewer.yaml +0 -0
  90. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/system.md +0 -0
  91. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/default/verifier.yaml +0 -0
  92. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
  93. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/agentspec.py +0 -0
  94. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/app.py +0 -0
  95. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
  96. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/approval_runtime/models.py +0 -0
  97. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
  98. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/__init__.py +0 -0
  99. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
  100. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/deepseek.py +0 -0
  101. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/github_feedback.py +0 -0
  102. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/lm_studio.py +0 -0
  103. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/minimax.py +0 -0
  104. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/oauth.py +0 -0
  105. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/ollama.py +0 -0
  106. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/openai.py +0 -0
  107. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/opencode_go.py +0 -0
  108. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/openrouter.py +0 -0
  109. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/auth/platforms.py +0 -0
  110. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/background/__init__.py +0 -0
  111. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/background/agent_runner.py +0 -0
  112. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/background/ids.py +0 -0
  113. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/background/manager.py +0 -0
  114. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/background/models.py +0 -0
  115. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/background/store.py +0 -0
  116. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/background/summary.py +0 -0
  117. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/background/worker.py +0 -0
  118. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/__init__.py +0 -0
  119. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/__main__.py +0 -0
  120. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/_lazy_group.py +0 -0
  121. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/debug.py +0 -0
  122. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/export.py +0 -0
  123. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/info.py +0 -0
  124. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/mcp.py +0 -0
  125. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/plugin.py +0 -0
  126. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/review.py +0 -0
  127. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/secscan.py +0 -0
  128. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/security_scan.py +0 -0
  129. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/skill.py +0 -0
  130. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/toad.py +0 -0
  131. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/update.py +0 -0
  132. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/vis.py +0 -0
  133. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/cli/web.py +0 -0
  134. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/config.py +0 -0
  135. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/constant.py +0 -0
  136. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/events.py +0 -0
  137. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/exception.py +0 -0
  138. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/execution_profiles.py +0 -0
  139. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/extensions.py +0 -0
  140. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/file_restore.py +0 -0
  141. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/hooks/__init__.py +0 -0
  142. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/hooks/config.py +0 -0
  143. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/hooks/engine.py +0 -0
  144. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/hooks/events.py +0 -0
  145. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/hooks/runner.py +0 -0
  146. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/llm.py +0 -0
  147. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/metadata.py +0 -0
  148. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/notifications/__init__.py +0 -0
  149. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/notifications/llm.py +0 -0
  150. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/notifications/manager.py +0 -0
  151. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/notifications/models.py +0 -0
  152. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/notifications/notifier.py +0 -0
  153. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/notifications/store.py +0 -0
  154. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/notifications/wire.py +0 -0
  155. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/plugin/__init__.py +0 -0
  156. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/plugin/manager.py +0 -0
  157. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/plugin/tool.py +0 -0
  158. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/prompt_templates.py +0 -0
  159. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/prompts/__init__.py +0 -0
  160. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/prompts/compact.md +0 -0
  161. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/prompts/init.md +0 -0
  162. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/py.typed +0 -0
  163. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/session.py +0 -0
  164. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/session_fork.py +0 -0
  165. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/session_state.py +0 -0
  166. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/share.py +0 -0
  167. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skill/__init__.py +0 -0
  168. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
  169. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skill/flow/d2.py +0 -0
  170. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
  171. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skill/lockfile.py +0 -0
  172. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/check-impl-against-spec/SKILL.md +0 -0
  173. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/create-pr/SKILL.md +0 -0
  174. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/diagnose-ci-failures/SKILL.md +0 -0
  175. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/fix-errors/SKILL.md +0 -0
  176. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/implement-specs/SKILL.md +0 -0
  177. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/pr-walkthrough/SKILL.md +0 -0
  178. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
  179. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/reproduce-bug-report/SKILL.md +0 -0
  180. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/resolve-merge-conflicts/SKILL.md +0 -0
  181. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/review-pr/SKILL.md +0 -0
  182. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
  183. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/spec-driven-implementation/SKILL.md +0 -0
  184. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/write-product-spec/SKILL.md +0 -0
  185. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/skills/write-tech-spec/SKILL.md +0 -0
  186. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/__init__.py +0 -0
  187. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/agent.py +0 -0
  188. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/approval.py +0 -0
  189. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/btw.py +0 -0
  190. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/compaction.py +0 -0
  191. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/context.py +0 -0
  192. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/denwarenji.py +0 -0
  193. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/dynamic_injection.py +0 -0
  194. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
  195. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
  196. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
  197. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/message.py +0 -0
  198. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/permission.py +0 -0
  199. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/pythinkersoul.py +0 -0
  200. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/slash.py +0 -0
  201. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/soul/toolset.py +0 -0
  202. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/__init__.py +0 -0
  203. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/builder.py +0 -0
  204. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/core.py +0 -0
  205. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/discovery.py +0 -0
  206. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/git_context.py +0 -0
  207. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/models.py +0 -0
  208. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/output.py +0 -0
  209. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/registry.py +0 -0
  210. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/runner.py +0 -0
  211. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/subagents/store.py +0 -0
  212. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/__init__.py +0 -0
  213. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/config.py +0 -0
  214. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/crash.py +0 -0
  215. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/errors.py +0 -0
  216. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/metrics.py +0 -0
  217. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/otel.py +0 -0
  218. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/sentry.py +0 -0
  219. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/telemetry/sink.py +0 -0
  220. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/AGENTS.md +0 -0
  221. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/__init__.py +0 -0
  222. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/agent/__init__.py +0 -0
  223. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/agent/description.md +0 -0
  224. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/ask_user/__init__.py +0 -0
  225. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
  226. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/background/__init__.py +0 -0
  227. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/background/handoff.md +0 -0
  228. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/background/input.md +0 -0
  229. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/background/list.md +0 -0
  230. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/background/output.md +0 -0
  231. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/background/stop.md +0 -0
  232. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/display.py +0 -0
  233. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
  234. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
  235. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/__init__.py +0 -0
  236. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/glob.md +0 -0
  237. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/glob.py +0 -0
  238. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/grep.md +0 -0
  239. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/grep_local.py +0 -0
  240. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
  241. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/read.md +0 -0
  242. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/read.py +0 -0
  243. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/read_media.md +0 -0
  244. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/read_media.py +0 -0
  245. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/replace.md +0 -0
  246. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/replace.py +0 -0
  247. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/utils.py +0 -0
  248. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/write.md +0 -0
  249. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/file/write.py +0 -0
  250. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/plan/__init__.py +0 -0
  251. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/plan/description.md +0 -0
  252. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/plan/enter.py +0 -0
  253. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
  254. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/plan/handoff.py +0 -0
  255. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
  256. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/shell/__init__.py +0 -0
  257. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/shell/bash.md +0 -0
  258. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
  259. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/skill/__init__.py +0 -0
  260. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/skill/description.md +0 -0
  261. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/test.py +0 -0
  262. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/think/__init__.py +0 -0
  263. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/think/think.md +0 -0
  264. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
  265. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
  266. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/utils.py +0 -0
  267. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/web/__init__.py +0 -0
  268. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/web/fetch.md +0 -0
  269. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/web/fetch.py +0 -0
  270. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/web/search.md +0 -0
  271. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/tools/web/search.py +0 -0
  272. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/__init__.py +0 -0
  273. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
  274. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/print/__init__.py +0 -0
  275. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/print/visualize.py +0 -0
  276. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/__init__.py +0 -0
  277. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
  278. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
  279. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
  280. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
  281. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/diff.py +0 -0
  282. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
  283. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
  284. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/markdown.py +0 -0
  285. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
  286. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
  287. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
  288. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
  289. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
  290. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/console.py +0 -0
  291. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/debug.py +0 -0
  292. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/design_system.py +0 -0
  293. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/echo.py +0 -0
  294. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
  295. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/glyphs.py +0 -0
  296. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
  297. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
  298. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
  299. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
  300. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/motion.py +0 -0
  301. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
  302. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
  303. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/prompt.py +0 -0
  304. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/render_constants.py +0 -0
  305. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/replay.py +0 -0
  306. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selector.py +0 -0
  307. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
  308. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
  309. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
  310. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
  311. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
  312. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
  313. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
  314. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
  315. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/setup.py +0 -0
  316. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/slash.py +0 -0
  317. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/spacing.py +0 -0
  318. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/spinner_words.py +0 -0
  319. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/startup.py +0 -0
  320. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
  321. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tips.py +0 -0
  322. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
  323. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/_file_diff.py +0 -0
  324. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -0
  325. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
  326. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
  327. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
  328. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
  329. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
  330. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
  331. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
  332. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
  333. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
  334. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
  335. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
  336. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
  337. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -0
  338. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
  339. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage.py +0 -0
  340. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
  341. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
  342. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
  343. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
  344. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
  345. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
  346. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
  347. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
  348. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
  349. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
  350. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
  351. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
  352. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
  353. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_activity_tree.py +0 -0
  354. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
  355. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +0 -0
  356. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
  357. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_dialog_shell.py +0 -0
  358. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
  359. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +0 -0
  360. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +0 -0
  361. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
  362. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_transcript.py +0 -0
  363. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
  364. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/theme.py +0 -0
  365. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/ui/tui_config.py +0 -0
  366. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
  367. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/__init__.py +0 -0
  368. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/aiohttp.py +0 -0
  369. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/aioqueue.py +0 -0
  370. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/broadcast.py +0 -0
  371. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/changelog.py +0 -0
  372. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/clipboard.py +0 -0
  373. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/datetime.py +0 -0
  374. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/diff.py +0 -0
  375. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/editor.py +0 -0
  376. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/environment.py +0 -0
  377. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/envvar.py +0 -0
  378. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/export.py +0 -0
  379. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/file_filter.py +0 -0
  380. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/frontmatter.py +0 -0
  381. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/io.py +0 -0
  382. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/logging.py +0 -0
  383. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/media_tags.py +0 -0
  384. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/message.py +0 -0
  385. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/path.py +0 -0
  386. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/proctitle.py +0 -0
  387. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/proxy.py +0 -0
  388. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
  389. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
  390. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/rich/columns.py +0 -0
  391. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/rich/diff_render.py +0 -0
  392. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
  393. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
  394. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
  395. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
  396. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/sensitive.py +0 -0
  397. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/server.py +0 -0
  398. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/signals.py +0 -0
  399. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/slashcmd.py +0 -0
  400. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/string.py +0 -0
  401. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
  402. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/term.py +0 -0
  403. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/utils/typing.py +0 -0
  404. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/__init__.py +0 -0
  405. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/api/__init__.py +0 -0
  406. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/api/sessions.py +0 -0
  407. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/api/statistics.py +0 -0
  408. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/api/system.py +0 -0
  409. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/app.py +0 -0
  410. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-CY1rtwrX.js +0 -0
  411. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/index-DSRInNnm.css +0 -0
  412. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/index-DgmTI2M_.js +0 -0
  413. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  414. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  415. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  416. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  417. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  418. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  419. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  420. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/vis/static/index.html +0 -0
  421. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/__init__.py +0 -0
  422. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/api/__init__.py +0 -0
  423. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/api/config.py +0 -0
  424. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/api/open_in.py +0 -0
  425. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/api/sessions.py +0 -0
  426. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/app.py +0 -0
  427. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/auth.py +0 -0
  428. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/models.py +0 -0
  429. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/runner/__init__.py +0 -0
  430. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/runner/messages.py +0 -0
  431. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/runner/process.py +0 -0
  432. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/runner/worker.py +0 -0
  433. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/_headers +0 -0
  434. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  435. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  436. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  437. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  438. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  439. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  440. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  441. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  442. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  443. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  444. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  445. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  446. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  447. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  448. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  449. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  450. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  451. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  452. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  453. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  454. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  455. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  456. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  457. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  458. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  459. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  460. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  461. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  462. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  463. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  464. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  465. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  466. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  467. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  468. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  469. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  470. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  471. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  472. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  473. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  474. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  475. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  476. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  477. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  478. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  479. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  480. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  481. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  482. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  483. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  484. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  485. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  486. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  487. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  488. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  489. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  490. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  491. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  492. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  493. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/abap-BdImnpbu.js +0 -0
  494. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +0 -0
  495. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ada-bCR0ucgS.js +0 -0
  496. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +0 -0
  497. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +0 -0
  498. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +0 -0
  499. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/apache-Pmp26Uib.js +0 -0
  500. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/apex-D8_7TLub.js +0 -0
  501. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/apl-dKokRX4l.js +0 -0
  502. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/applescript-Co6uUVPk.js +0 -0
  503. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ara-BRHolxvo.js +0 -0
  504. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +0 -0
  505. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/asm-D_Q5rh1f.js +0 -0
  506. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/astro-CbQHKStN.js +0 -0
  507. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +0 -0
  508. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/awk-DMzUqQB5.js +0 -0
  509. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +0 -0
  510. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +0 -0
  511. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/bat-BkioyH1T.js +0 -0
  512. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/beancount-k_qm7-4y.js +0 -0
  513. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/berry-uYugtg8r.js +0 -0
  514. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/bibtex-CHM0blh-.js +0 -0
  515. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/bicep-Bmn6On1c.js +0 -0
  516. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/blade-D4QpJJKB.js +0 -0
  517. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/bsl-BO_Y6i37.js +0 -0
  518. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/c-BIGW1oBm.js +0 -0
  519. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/c3-VCDPK7BO.js +0 -0
  520. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +0 -0
  521. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/cairo-KRGpt6FW.js +0 -0
  522. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
  523. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
  524. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
  525. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
  526. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/clarity-D53aC0YG.js +0 -0
  527. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/clojure-P80f7IUj.js +0 -0
  528. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/cmake-D1j8_8rp.js +0 -0
  529. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/cobol-nwyudZeR.js +0 -0
  530. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +0 -0
  531. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +0 -0
  532. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/coffee-Ch7k5sss.js +0 -0
  533. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +0 -0
  534. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/coq-DkFqJrB1.js +0 -0
  535. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/cpp-CofmeUqb.js +0 -0
  536. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/crystal-tKQVLTB8.js +0 -0
  537. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/csharp-K5feNrxe.js +0 -0
  538. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/css-DPfMkruS.js +0 -0
  539. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/csv-fuZLfV_i.js +0 -0
  540. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/cue-D82EKSYY.js +0 -0
  541. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/cypher-COkxafJQ.js +0 -0
  542. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/d-85-TOEBH.js +0 -0
  543. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +0 -0
  544. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/dart-CF10PKvl.js +0 -0
  545. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/dax-CEL-wOlO.js +0 -0
  546. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +0 -0
  547. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +0 -0
  548. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/diff-D97Zzqfu.js +0 -0
  549. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/docker-BcOcwvcX.js +0 -0
  550. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/dotenv-Da5cRb03.js +0 -0
  551. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/dracula-BzJJZx-M.js +0 -0
  552. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +0 -0
  553. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +0 -0
  554. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/edge-BkV0erSs.js +0 -0
  555. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/elixir-CDX3lj18.js +0 -0
  556. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/elm-DbKCFpqz.js +0 -0
  557. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +0 -0
  558. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/erb-BOJIQeun.js +0 -0
  559. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/erlang-DsQrWhSR.js +0 -0
  560. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +0 -0
  561. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +0 -0
  562. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/fennel-BYunw83y.js +0 -0
  563. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/fish-BvzEVeQv.js +0 -0
  564. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/fluent-C4IJs8-o.js +0 -0
  565. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
  566. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
  567. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +0 -0
  568. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +0 -0
  569. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +0 -0
  570. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gdshader-DkwncUOv.js +0 -0
  571. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/genie-D0YGMca9.js +0 -0
  572. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +0 -0
  573. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +0 -0
  574. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +0 -0
  575. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/github-dark-DHJKELXO.js +0 -0
  576. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
  577. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
  578. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
  579. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/github-light-DAi9KRSo.js +0 -0
  580. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +0 -0
  581. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
  582. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gleam-BspZqrRM.js +0 -0
  583. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
  584. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +0 -0
  585. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/glsl-DplSGwfg.js +0 -0
  586. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gn-n2N0HUVH.js +0 -0
  587. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +0 -0
  588. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/go-Dn2_MT6a.js +0 -0
  589. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/graphql-ChdNCCLP.js +0 -0
  590. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/groovy-gcz8RCvz.js +0 -0
  591. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
  592. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
  593. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
  594. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
  595. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
  596. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
  597. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/hack-CaT9iCJl.js +0 -0
  598. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/haml-B8DHNrY2.js +0 -0
  599. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/handlebars-BL8al0AC.js +0 -0
  600. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/haskell-Df6bDoY_.js +0 -0
  601. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/haxe-CzTSHFRz.js +0 -0
  602. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/hcl-BWvSN4gD.js +0 -0
  603. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/hjson-D5-asLiD.js +0 -0
  604. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +0 -0
  605. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/houston-DnULxvSX.js +0 -0
  606. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/html-GMplVEZG.js +0 -0
  607. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +0 -0
  608. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/http-jrhK8wxY.js +0 -0
  609. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/hurl-irOxFIW8.js +0 -0
  610. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +0 -0
  611. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/hy-DFXneXwc.js +0 -0
  612. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/imba-DGztddWO.js +0 -0
  613. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/index-BpoLgcEt.js +0 -0
  614. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/index-CzV_vCfu.css +0 -0
  615. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/index-DI2oedCt.js +0 -0
  616. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ini-BEwlwnbL.js +0 -0
  617. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/init-Gi6I4Gst.js +0 -0
  618. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  619. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  620. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  621. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  622. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  623. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  624. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  625. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/java-CylS5w8V.js +0 -0
  626. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/javascript-wDzz0qaB.js +0 -0
  627. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +0 -0
  628. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/jison-wvAkD_A8.js +0 -0
  629. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/json-Cp-IABpG.js +0 -0
  630. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/json5-C9tS-k6U.js +0 -0
  631. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/jsonc-Des-eS-w.js +0 -0
  632. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +0 -0
  633. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +0 -0
  634. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/jssm-C2t-YnRu.js +0 -0
  635. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/jsx-g9-lgVsj.js +0 -0
  636. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/julia-CxzCAyBv.js +0 -0
  637. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
  638. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
  639. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
  640. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/katex-D2lIc1rk.css +0 -0
  641. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/kdl-DV7GczEv.js +0 -0
  642. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +0 -0
  643. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/kusto-DZf3V79B.js +0 -0
  644. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/laserwave-DUszq2jm.js +0 -0
  645. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/latex-B4uzh10-.js +0 -0
  646. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/lean-BZvkOJ9d.js +0 -0
  647. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/less-B1dDrJ26.js +0 -0
  648. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +0 -0
  649. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/liquid-DYVedYrR.js +0 -0
  650. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/llvm-BtvRca6l.js +0 -0
  651. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/log-2UxHyX5q.js +0 -0
  652. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/logo-BtOb2qkB.js +0 -0
  653. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/lua-BbnMAYS6.js +0 -0
  654. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/luau-C-HG3fhB.js +0 -0
  655. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/make-CHLpvVh8.js +0 -0
  656. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/markdown-Cvjx9yec.js +0 -0
  657. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/marko-DZsq8hO1.js +0 -0
  658. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +0 -0
  659. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
  660. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
  661. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +0 -0
  662. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
  663. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/matlab-D7o27uSR.js +0 -0
  664. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/mdc-DUICxH0z.js +0 -0
  665. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +0 -0
  666. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B2P5VJ9v.css +0 -0
  667. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +0 -0
  668. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/min-dark-CafNBF8u.js +0 -0
  669. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/min-light-CTRr51gU.js +0 -0
  670. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +0 -0
  671. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/mojo-B93PlW-d.js +0 -0
  672. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/monokai-D4h5O-jR.js +0 -0
  673. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/moonbit-Ba13S78F.js +0 -0
  674. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/move-Bu9oaDYs.js +0 -0
  675. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/narrat-DRg8JJMk.js +0 -0
  676. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +0 -0
  677. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/nginx-DknmC5AR.js +0 -0
  678. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/night-owl-C39BiMTA.js +0 -0
  679. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/nim-CVrawwO9.js +0 -0
  680. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/nix-CwoSXNpI.js +0 -0
  681. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/nord-Ddv68eIx.js +0 -0
  682. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/nushell-C-sUppwS.js +0 -0
  683. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +0 -0
  684. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +0 -0
  685. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +0 -0
  686. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
  687. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/one-light-PoHY5YXO.js +0 -0
  688. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/openscad-C4EeE6gA.js +0 -0
  689. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +0 -0
  690. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/pascal-D93ZcfNL.js +0 -0
  691. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/perl-C0TMdlhV.js +0 -0
  692. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/php-CDn_0X-4.js +0 -0
  693. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/pkl-u5AG7uiY.js +0 -0
  694. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/plastic-3e1v2bzS.js +0 -0
  695. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/plsql-ChMvpjG-.js +0 -0
  696. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/po-BTJTHyun.js +0 -0
  697. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +0 -0
  698. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/polar-C0HS_06l.js +0 -0
  699. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/postcss-CXtECtnM.js +0 -0
  700. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +0 -0
  701. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/powershell-Dpen1YoG.js +0 -0
  702. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/prisma-Dd19v3D-.js +0 -0
  703. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/prolog-CbFg5uaA.js +0 -0
  704. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/proto-C7zT0LnQ.js +0 -0
  705. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/pug-CGlum2m_.js +0 -0
  706. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/puppet-BMWR74SV.js +0 -0
  707. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/purescript-CklMAg4u.js +0 -0
  708. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/python-B6aJPvgy.js +0 -0
  709. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/qml-3beO22l8.js +0 -0
  710. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +0 -0
  711. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/qss-IeuSbFQv.js +0 -0
  712. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/r-Dspwwk_N.js +0 -0
  713. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/racket-BqYA7rlc.js +0 -0
  714. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/raku-DXvB9xmW.js +0 -0
  715. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/razor-C1TweQQi.js +0 -0
  716. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/red-bN70gL4F.js +0 -0
  717. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/reg-C-SQnVFl.js +0 -0
  718. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +0 -0
  719. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/rel-C3B-1QV4.js +0 -0
  720. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/riscv-BM1_JUlF.js +0 -0
  721. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
  722. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
  723. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +0 -0
  724. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +0 -0
  725. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/rst-B0xPkSld.js +0 -0
  726. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ruby-BvKwtOVI.js +0 -0
  727. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/rust-B1yitclQ.js +0 -0
  728. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/sas-cz2c8ADy.js +0 -0
  729. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +0 -0
  730. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/scala-C151Ov-r.js +0 -0
  731. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/scheme-C98Dy4si.js +0 -0
  732. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/scss-OYdSNvt2.js +0 -0
  733. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +0 -0
  734. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
  735. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/shellscript-Yzrsuije.js +0 -0
  736. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/shellsession-BADoaaVG.js +0 -0
  737. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +0 -0
  738. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +0 -0
  739. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +0 -0
  740. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +0 -0
  741. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +0 -0
  742. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +0 -0
  743. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/solidity-rGO070M0.js +0 -0
  744. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/soy-Brmx7dQM.js +0 -0
  745. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/sparql-rVzFXLq3.js +0 -0
  746. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/splunk-BtCnVYZw.js +0 -0
  747. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/sql-BLtJtn59.js +0 -0
  748. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +0 -0
  749. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/stata-BH5u7GGu.js +0 -0
  750. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +0 -0
  751. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/svelte-zxCyuUbr.js +0 -0
  752. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/swift-Dg5xB15N.js +0 -0
  753. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +0 -0
  754. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +0 -0
  755. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/systemd-4A_iFExJ.js +0 -0
  756. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/talonscript-CkByrt1z.js +0 -0
  757. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/tasl-QIJgUcNo.js +0 -0
  758. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/tcl-dwOrl1Do.js +0 -0
  759. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/templ-W15q3VgB.js +0 -0
  760. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/terraform-BETggiCN.js +0 -0
  761. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/tex-CvyZ59Mk.js +0 -0
  762. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/tokyo-night-hegEt444.js +0 -0
  763. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/toml-vGWfd6FD.js +0 -0
  764. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +0 -0
  765. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/tsv-B_m7g4N7.js +0 -0
  766. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/tsx-COt5Ahok.js +0 -0
  767. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/turtle-BsS91CYL.js +0 -0
  768. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/twig-CO9l9SDP.js +0 -0
  769. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +0 -0
  770. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/typespec-BGHnOYBU.js +0 -0
  771. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/typst-DHCkPAjA.js +0 -0
  772. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/v-BcVCzyr7.js +0 -0
  773. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vala-CsfeWuGM.js +0 -0
  774. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vb-D17OF-Vu.js +0 -0
  775. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/verilog-BQ8w6xss.js +0 -0
  776. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vesper-DU1UobuO.js +0 -0
  777. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +0 -0
  778. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/viml-CJc9bBzg.js +0 -0
  779. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
  780. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
  781. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +0 -0
  782. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vue-DN_0RTcg.js +0 -0
  783. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +0 -0
  784. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +0 -0
  785. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/vyper-CDx5xZoG.js +0 -0
  786. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +0 -0
  787. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/wasm-MzD3tlZU.js +0 -0
  788. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/wenyan-BV7otONQ.js +0 -0
  789. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +0 -0
  790. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +0 -0
  791. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/wit-5i3qLPDT.js +0 -0
  792. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +0 -0
  793. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/xml-sdJ4AIDG.js +0 -0
  794. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/xsl-CtQFsRM5.js +0 -0
  795. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/yaml-Buea-lGh.js +0 -0
  796. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +0 -0
  797. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/assets/zig-VOosw3JB.js +0 -0
  798. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
  799. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
  800. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
  801. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
  802. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
  803. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
  804. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
  805. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
  806. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
  807. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
  808. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
  809. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
  810. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
  811. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
  812. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
  813. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
  814. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
  815. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
  816. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
  817. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
  818. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
  819. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
  820. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/static/logo.png +0 -0
  821. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/store/__init__.py +0 -0
  822. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/web/store/sessions.py +0 -0
  823. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/__init__.py +0 -0
  824. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/file.py +0 -0
  825. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
  826. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/protocol.py +0 -0
  827. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/root_hub.py +0 -0
  828. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/serde.py +0 -0
  829. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/server.py +0 -0
  830. {pythinker_code-0.14.0 → pythinker_code-0.15.0}/src/pythinker_code/wire/types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pythinker-code
3
- Version: 0.14.0
3
+ Version: 0.15.0
4
4
  Summary: Pythinker Code is your next CLI agent.
5
5
  Keywords: cli,agent,ai,coding-assistant,llm,claude,openai,terminal
6
6
  Author: Mohamed Elkholy
@@ -116,14 +116,13 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
116
116
 
117
117
  ---
118
118
 
119
- ## 🆕 What's New in 0.14.0
119
+ ## 🆕 What's New in 0.15.0
120
120
 
121
- - **Install counts are now visible from the README.** The canonical `https://pythinker.com/install.sh` and `https://pythinker.com/install.ps1` endpoints are backed by a Cloudflare Worker that counts successful installer fetches and serves the flat-square install badge shown above.
122
- - **Safer, more reliable installer routing.** The hosted shell and PowerShell endpoints remain the canonical install paths, with fixed-version commands updated for `0.14.0` artifacts and SHA-256 verification across Windows, Linux, and macOS tarball installs.
123
- - **TUI activity polish.** Agent/task names now resolve at call time, live activity indicators use calmer grey headers and pinned spinner behavior, oversized output is capped, and markdown/tool surfaces are more consistent.
124
- - **Release and CI hardening.** Plugin downloads are stricter, the pythinker-home sync dispatch skips cleanly when its optional token is not configured, and the release docs reflect the current native installer flow.
121
+ - **Native updater fixed for curl-bash installs.** `pythinker update` now recognizes PyInstaller-frozen `~/.local/bin/pythinker` binaries as native installs even when older onefile tarballs lack the `.pythinker-native` sentinel.
122
+ - **Unix native updates pull release archives directly.** On Linux and Apple Silicon macOS, `pythinker update` downloads the matching `pythinker-0.15.0-<target>.tar.gz`, verifies its `.sha256`, and replaces the current native binary instead of trying to run `pythinker -m pip install`.
123
+ - **Clearer fallback guidance.** Native update banners now point Unix users at the canonical `curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.15.0` command, while Windows still points at the native setup executable.
125
124
 
126
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.14.0`, or use the native installer for your platform from the [Releases page](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest).
125
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.15.0`, or use the native installer for your platform from the [Releases page](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest).
127
126
 
128
127
 
129
128
  ---
@@ -215,9 +214,9 @@ matches your OS — no Python, Node, or `uv` prerequisite.
215
214
  |---|---|---|
216
215
  | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | native `.exe` installer |
217
216
  | **🍎 macOS (Apple Silicon + Intel)** | `brew install mohamed-elkholy95/pythinker/pythinker-code` | Homebrew tap |
218
- | **🐧 Linux (Debian / Ubuntu)** | `sudo dpkg -i pythinker-code_0.14.0_amd64.deb` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
219
- | **🐧 Linux (Fedora / RHEL)** | Download `pythinker-code-0.14.0.x86_64.rpm`, then `sudo dnf install ./pythinker-code-0.14.0.x86_64.rpm` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
220
- | **🐧 Linux (openSUSE)** | Download `pythinker-code-0.14.0.x86_64.rpm`, then `sudo zypper install ./pythinker-code-0.14.0.x86_64.rpm` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
217
+ | **🐧 Linux (Debian / Ubuntu)** | `sudo dpkg -i pythinker-code_0.15.0_amd64.deb` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
218
+ | **🐧 Linux (Fedora / RHEL)** | Download `pythinker-code-0.15.0.x86_64.rpm`, then `sudo dnf install ./pythinker-code-0.15.0.x86_64.rpm` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
219
+ | **🐧 Linux (openSUSE)** | Download `pythinker-code-0.15.0.x86_64.rpm`, then `sudo zypper install ./pythinker-code-0.15.0.x86_64.rpm` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
221
220
  | **🌐 macOS / Linux — curl-bash** | `curl -fsSL https://pythinker.com/install.sh \| bash` | tarball |
222
221
  | **🐍 Python fallback** (universal) | `pip install pythinker-code` | PyPI |
223
222
 
@@ -240,7 +239,7 @@ pythinker # start the interactive TUI
240
239
 
241
240
  ### 🪟 Windows — native installer
242
241
 
243
- `PythinkerSetup-0.14.0.exe` is a signed* Inno Setup wizard. Installs per-user
242
+ `PythinkerSetup-0.15.0.exe` is a signed* Inno Setup wizard. Installs per-user
244
243
  into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
245
244
  PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
246
245
  the change. **No UAC prompt.**
@@ -251,13 +250,13 @@ irm https://pythinker.com/install.ps1 | iex
251
250
 
252
251
  # Or manually download the installer + checksum from the Releases page,
253
252
  # verify with Get-FileHash, then run:
254
- .\PythinkerSetup-0.14.0.exe
253
+ .\PythinkerSetup-0.15.0.exe
255
254
 
256
255
  # Open a fresh PowerShell
257
256
  pythinker --version
258
257
  ```
259
258
 
260
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.14.0.exe /ALLUSERS`
259
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.15.0.exe /ALLUSERS`
261
260
  installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
262
261
 
263
262
  **Upgrade:** `pythinker update` from inside the running app — it downloads
@@ -307,26 +306,26 @@ attached to every GitHub Release.
307
306
 
308
307
  ```sh
309
308
  # Debian / Ubuntu (x86_64)
310
- sudo dpkg -i pythinker-code_0.14.0_amd64.deb
309
+ sudo dpkg -i pythinker-code_0.15.0_amd64.deb
311
310
  sudo apt-get install -f # only if dpkg reports missing deps
312
311
 
313
312
  # Debian / Ubuntu (ARM64)
314
- sudo dpkg -i pythinker-code_0.14.0_arm64.deb
313
+ sudo dpkg -i pythinker-code_0.15.0_arm64.deb
315
314
 
316
315
  # Fedora / RHEL / openSUSE (x86_64)
317
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.14.0/pythinker-code-0.14.0.x86_64.rpm
318
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.14.0/pythinker-code-0.14.0.x86_64.rpm.sha256
319
- sha256sum -c pythinker-code-0.14.0.x86_64.rpm.sha256
316
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.x86_64.rpm
317
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.x86_64.rpm.sha256
318
+ sha256sum -c pythinker-code-0.15.0.x86_64.rpm.sha256
320
319
  # Fedora / RHEL:
321
- sudo dnf install ./pythinker-code-0.14.0.x86_64.rpm
320
+ sudo dnf install ./pythinker-code-0.15.0.x86_64.rpm
322
321
  # openSUSE:
323
- sudo zypper install ./pythinker-code-0.14.0.x86_64.rpm
322
+ sudo zypper install ./pythinker-code-0.15.0.x86_64.rpm
324
323
 
325
324
  # Fedora / RHEL (aarch64)
326
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.14.0/pythinker-code-0.14.0.aarch64.rpm
327
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.14.0/pythinker-code-0.14.0.aarch64.rpm.sha256
328
- sha256sum -c pythinker-code-0.14.0.aarch64.rpm.sha256
329
- sudo dnf install ./pythinker-code-0.14.0.aarch64.rpm
325
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.aarch64.rpm
326
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.aarch64.rpm.sha256
327
+ sha256sum -c pythinker-code-0.15.0.aarch64.rpm.sha256
328
+ sudo dnf install ./pythinker-code-0.15.0.aarch64.rpm
330
329
  ```
331
330
 
332
331
  Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
@@ -335,8 +334,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
335
334
  **Verify before install:**
336
335
 
337
336
  ```sh
338
- sha256sum -c pythinker-code_0.14.0_amd64.deb.sha256 # Debian/Ubuntu
339
- sha256sum -c pythinker-code-0.14.0.x86_64.rpm.sha256 # Fedora/RHEL
337
+ sha256sum -c pythinker-code_0.15.0_amd64.deb.sha256 # Debian/Ubuntu
338
+ sha256sum -c pythinker-code-0.15.0.x86_64.rpm.sha256 # Fedora/RHEL
340
339
  ```
341
340
 
342
341
  **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
@@ -366,7 +365,7 @@ at `~/.local/bin/pythinker`.
366
365
  curl -fsSL https://pythinker.com/install.sh | bash
367
366
 
368
367
  # Pin a specific version
369
- curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.14.0
368
+ curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.15.0
370
369
 
371
370
  # Custom prefix (defaults to $HOME/.local)
372
371
  curl -fsSL https://pythinker.com/install.sh | bash -s -- --prefix /opt/pythinker
@@ -387,9 +386,9 @@ Supported targets:
387
386
 
388
387
  | `uname -s / -m` | Tarball asset |
389
388
  |---|---|
390
- | Linux / x86_64 | `pythinker-0.14.0-x86_64-unknown-linux-gnu.tar.gz` |
391
- | Linux / aarch64 | `pythinker-0.14.0-aarch64-unknown-linux-gnu.tar.gz` |
392
- | Darwin / arm64 | `pythinker-0.14.0-aarch64-apple-darwin.tar.gz` |
389
+ | Linux / x86_64 | `pythinker-0.15.0-x86_64-unknown-linux-gnu.tar.gz` |
390
+ | Linux / aarch64 | `pythinker-0.15.0-aarch64-unknown-linux-gnu.tar.gz` |
391
+ | Darwin / arm64 | `pythinker-0.15.0-aarch64-apple-darwin.tar.gz` |
393
392
 
394
393
  The script prints PATH guidance if `~/.local/bin` isn't already on your
395
394
  `$PATH`. Intel macOS users — use Homebrew or `pip install pythinker-code`;
@@ -51,14 +51,13 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
51
51
 
52
52
  ---
53
53
 
54
- ## 🆕 What's New in 0.14.0
54
+ ## 🆕 What's New in 0.15.0
55
55
 
56
- - **Install counts are now visible from the README.** The canonical `https://pythinker.com/install.sh` and `https://pythinker.com/install.ps1` endpoints are backed by a Cloudflare Worker that counts successful installer fetches and serves the flat-square install badge shown above.
57
- - **Safer, more reliable installer routing.** The hosted shell and PowerShell endpoints remain the canonical install paths, with fixed-version commands updated for `0.14.0` artifacts and SHA-256 verification across Windows, Linux, and macOS tarball installs.
58
- - **TUI activity polish.** Agent/task names now resolve at call time, live activity indicators use calmer grey headers and pinned spinner behavior, oversized output is capped, and markdown/tool surfaces are more consistent.
59
- - **Release and CI hardening.** Plugin downloads are stricter, the pythinker-home sync dispatch skips cleanly when its optional token is not configured, and the release docs reflect the current native installer flow.
56
+ - **Native updater fixed for curl-bash installs.** `pythinker update` now recognizes PyInstaller-frozen `~/.local/bin/pythinker` binaries as native installs even when older onefile tarballs lack the `.pythinker-native` sentinel.
57
+ - **Unix native updates pull release archives directly.** On Linux and Apple Silicon macOS, `pythinker update` downloads the matching `pythinker-0.15.0-<target>.tar.gz`, verifies its `.sha256`, and replaces the current native binary instead of trying to run `pythinker -m pip install`.
58
+ - **Clearer fallback guidance.** Native update banners now point Unix users at the canonical `curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.15.0` command, while Windows still points at the native setup executable.
60
59
 
61
- Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.14.0`, or use the native installer for your platform from the [Releases page](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest).
60
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.15.0`, or use the native installer for your platform from the [Releases page](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest).
62
61
 
63
62
 
64
63
  ---
@@ -150,9 +149,9 @@ matches your OS — no Python, Node, or `uv` prerequisite.
150
149
  |---|---|---|
151
150
  | **🪟 Windows** | `irm https://pythinker.com/install.ps1 \| iex` | native `.exe` installer |
152
151
  | **🍎 macOS (Apple Silicon + Intel)** | `brew install mohamed-elkholy95/pythinker/pythinker-code` | Homebrew tap |
153
- | **🐧 Linux (Debian / Ubuntu)** | `sudo dpkg -i pythinker-code_0.14.0_amd64.deb` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
154
- | **🐧 Linux (Fedora / RHEL)** | Download `pythinker-code-0.14.0.x86_64.rpm`, then `sudo dnf install ./pythinker-code-0.14.0.x86_64.rpm` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
155
- | **🐧 Linux (openSUSE)** | Download `pythinker-code-0.14.0.x86_64.rpm`, then `sudo zypper install ./pythinker-code-0.14.0.x86_64.rpm` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
152
+ | **🐧 Linux (Debian / Ubuntu)** | `sudo dpkg -i pythinker-code_0.15.0_amd64.deb` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
153
+ | **🐧 Linux (Fedora / RHEL)** | Download `pythinker-code-0.15.0.x86_64.rpm`, then `sudo dnf install ./pythinker-code-0.15.0.x86_64.rpm` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
154
+ | **🐧 Linux (openSUSE)** | Download `pythinker-code-0.15.0.x86_64.rpm`, then `sudo zypper install ./pythinker-code-0.15.0.x86_64.rpm` | [Releases](https://github.com/mohamed-elkholy95/Pythinker-Code/releases/latest) |
156
155
  | **🌐 macOS / Linux — curl-bash** | `curl -fsSL https://pythinker.com/install.sh \| bash` | tarball |
157
156
  | **🐍 Python fallback** (universal) | `pip install pythinker-code` | PyPI |
158
157
 
@@ -175,7 +174,7 @@ pythinker # start the interactive TUI
175
174
 
176
175
  ### 🪟 Windows — native installer
177
176
 
178
- `PythinkerSetup-0.14.0.exe` is a signed* Inno Setup wizard. Installs per-user
177
+ `PythinkerSetup-0.15.0.exe` is a signed* Inno Setup wizard. Installs per-user
179
178
  into `%LOCALAPPDATA%\Programs\Pythinker`, registers `pythinker` on your user
180
179
  PATH (`HKCU\Environment`), broadcasts `WM_SETTINGCHANGE` so new shells see
181
180
  the change. **No UAC prompt.**
@@ -186,13 +185,13 @@ irm https://pythinker.com/install.ps1 | iex
186
185
 
187
186
  # Or manually download the installer + checksum from the Releases page,
188
187
  # verify with Get-FileHash, then run:
189
- .\PythinkerSetup-0.14.0.exe
188
+ .\PythinkerSetup-0.15.0.exe
190
189
 
191
190
  # Open a fresh PowerShell
192
191
  pythinker --version
193
192
  ```
194
193
 
195
- **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.14.0.exe /ALLUSERS`
194
+ **Per-machine install** (IT-managed boxes): `.\PythinkerSetup-0.15.0.exe /ALLUSERS`
196
195
  installs to `%ProgramFiles%\Pythinker` and writes PATH to HKLM (requires admin).
197
196
 
198
197
  **Upgrade:** `pythinker update` from inside the running app — it downloads
@@ -242,26 +241,26 @@ attached to every GitHub Release.
242
241
 
243
242
  ```sh
244
243
  # Debian / Ubuntu (x86_64)
245
- sudo dpkg -i pythinker-code_0.14.0_amd64.deb
244
+ sudo dpkg -i pythinker-code_0.15.0_amd64.deb
246
245
  sudo apt-get install -f # only if dpkg reports missing deps
247
246
 
248
247
  # Debian / Ubuntu (ARM64)
249
- sudo dpkg -i pythinker-code_0.14.0_arm64.deb
248
+ sudo dpkg -i pythinker-code_0.15.0_arm64.deb
250
249
 
251
250
  # Fedora / RHEL / openSUSE (x86_64)
252
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.14.0/pythinker-code-0.14.0.x86_64.rpm
253
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.14.0/pythinker-code-0.14.0.x86_64.rpm.sha256
254
- sha256sum -c pythinker-code-0.14.0.x86_64.rpm.sha256
251
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.x86_64.rpm
252
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.x86_64.rpm.sha256
253
+ sha256sum -c pythinker-code-0.15.0.x86_64.rpm.sha256
255
254
  # Fedora / RHEL:
256
- sudo dnf install ./pythinker-code-0.14.0.x86_64.rpm
255
+ sudo dnf install ./pythinker-code-0.15.0.x86_64.rpm
257
256
  # openSUSE:
258
- sudo zypper install ./pythinker-code-0.14.0.x86_64.rpm
257
+ sudo zypper install ./pythinker-code-0.15.0.x86_64.rpm
259
258
 
260
259
  # Fedora / RHEL (aarch64)
261
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.14.0/pythinker-code-0.14.0.aarch64.rpm
262
- curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.14.0/pythinker-code-0.14.0.aarch64.rpm.sha256
263
- sha256sum -c pythinker-code-0.14.0.aarch64.rpm.sha256
264
- sudo dnf install ./pythinker-code-0.14.0.aarch64.rpm
260
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.aarch64.rpm
261
+ curl -LO https://github.com/mohamed-elkholy95/Pythinker-Code/releases/download/v0.15.0/pythinker-code-0.15.0.aarch64.rpm.sha256
262
+ sha256sum -c pythinker-code-0.15.0.aarch64.rpm.sha256
263
+ sudo dnf install ./pythinker-code-0.15.0.aarch64.rpm
265
264
  ```
266
265
 
267
266
  Both packages drop a small `/usr/bin/pythinker` launcher that execs the real
@@ -270,8 +269,8 @@ binary under `/usr/lib/pythinker/`, so your `$PATH` stays tidy.
270
269
  **Verify before install:**
271
270
 
272
271
  ```sh
273
- sha256sum -c pythinker-code_0.14.0_amd64.deb.sha256 # Debian/Ubuntu
274
- sha256sum -c pythinker-code-0.14.0.x86_64.rpm.sha256 # Fedora/RHEL
272
+ sha256sum -c pythinker-code_0.15.0_amd64.deb.sha256 # Debian/Ubuntu
273
+ sha256sum -c pythinker-code-0.15.0.x86_64.rpm.sha256 # Fedora/RHEL
275
274
  ```
276
275
 
277
276
  **Upgrade:** download the new `.deb`/`.rpm` from Releases and `dpkg -i` /
@@ -301,7 +300,7 @@ at `~/.local/bin/pythinker`.
301
300
  curl -fsSL https://pythinker.com/install.sh | bash
302
301
 
303
302
  # Pin a specific version
304
- curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.14.0
303
+ curl -fsSL https://pythinker.com/install.sh | bash -s -- --version 0.15.0
305
304
 
306
305
  # Custom prefix (defaults to $HOME/.local)
307
306
  curl -fsSL https://pythinker.com/install.sh | bash -s -- --prefix /opt/pythinker
@@ -322,9 +321,9 @@ Supported targets:
322
321
 
323
322
  | `uname -s / -m` | Tarball asset |
324
323
  |---|---|
325
- | Linux / x86_64 | `pythinker-0.14.0-x86_64-unknown-linux-gnu.tar.gz` |
326
- | Linux / aarch64 | `pythinker-0.14.0-aarch64-unknown-linux-gnu.tar.gz` |
327
- | Darwin / arm64 | `pythinker-0.14.0-aarch64-apple-darwin.tar.gz` |
324
+ | Linux / x86_64 | `pythinker-0.15.0-x86_64-unknown-linux-gnu.tar.gz` |
325
+ | Linux / aarch64 | `pythinker-0.15.0-aarch64-unknown-linux-gnu.tar.gz` |
326
+ | Darwin / arm64 | `pythinker-0.15.0-aarch64-apple-darwin.tar.gz` |
328
327
 
329
328
  The script prints PATH guidance if `~/.local/bin` isn't already on your
330
329
  `$PATH`. Intel macOS users — use Homebrew or `pip install pythinker-code`;
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pythinker-code"
3
- version = "0.14.0"
3
+ version = "0.15.0"
4
4
  description = "Pythinker Code is your next CLI agent."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -15,6 +15,16 @@ GitHub Releases page; `0.8.0` is the new starting line.
15
15
 
16
16
  ## Unreleased
17
17
 
18
+ ## 0.15.0 (2026-05-24)
19
+
20
+ ### What changed in this release
21
+
22
+ - **Fixed `pythinker update` for curl-bash native installs.** Frozen onefile installs in `~/.local/bin/pythinker` are now detected as native even when older tarballs do not include the `.pythinker-native` sentinel, avoiding the broken `pythinker -m pip install --upgrade pythinker-code` path.
23
+ - **Added Unix native archive updating.** Linux and Apple Silicon macOS native builds now download the matching GitHub Release tarball, verify its `.sha256`, extract `pythinker`, and replace the current executable in place.
24
+ - **Improved native update guidance.** The update banner now shows the canonical fixed-version curl installer on Unix and keeps the Windows installer guidance for Windows native builds.
25
+
26
+ Upgrade with `pythinker update`, `pip install --upgrade pythinker-code==0.15.0`, or use the native installer for your OS (see the README install table).
27
+
18
28
  ## 0.14.0 (2026-05-24)
19
29
 
20
30
  ### What changed in this release
@@ -0,0 +1,63 @@
1
+ """Native-build detection + GitHub Releases lookup helpers.
2
+
3
+ Native packages may drop a sentinel file ``.pythinker-native`` next to the
4
+ PyInstaller-frozen executable. Older curl-bash onefile installs did not include
5
+ that sentinel, so runtime detection also treats a frozen ``pythinker`` executable
6
+ as native. Native installs update from GitHub Release assets instead of shelling
7
+ out to ``pip`` from inside the frozen CLI.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import platform
13
+ import sys
14
+ from pathlib import Path
15
+
16
+ GITHUB_REPO = "mohamed-elkholy95/Pythinker-Code"
17
+ SENTINEL_FILENAME = ".pythinker-native"
18
+
19
+
20
+ def is_native_build() -> bool:
21
+ """True iff this process is a PyInstaller-frozen Pythinker native install."""
22
+ if not getattr(sys, "frozen", False):
23
+ return False
24
+ try:
25
+ exe_path = Path(sys.executable).resolve()
26
+ except OSError:
27
+ return False
28
+ if (exe_path.parent / SENTINEL_FILENAME).is_file():
29
+ return True
30
+ return exe_path.stem.lower() == "pythinker"
31
+
32
+
33
+ def native_installer_release_url(channel: str = "latest") -> str:
34
+ """Return the GitHub API URL for the requested release channel."""
35
+ if channel == "latest":
36
+ return f"https://api.github.com/repos/{GITHUB_REPO}/releases/latest"
37
+ return f"https://api.github.com/repos/{GITHUB_REPO}/releases/tags/{channel}"
38
+
39
+
40
+ def native_installer_asset_name(version: str) -> str:
41
+ """Filename of the Windows installer asset attached to a Release."""
42
+ return f"PythinkerSetup-{version}.exe"
43
+
44
+
45
+ def native_archive_asset_name(version: str) -> str | None:
46
+ """Filename of the onefile native archive for this platform, if published."""
47
+ target = _native_archive_target()
48
+ if target is None:
49
+ return None
50
+ return f"pythinker-{version}-{target}.tar.gz"
51
+
52
+
53
+ def _native_archive_target() -> str | None:
54
+ system = sys.platform
55
+ machine = platform.machine().lower()
56
+ if system.startswith("linux"):
57
+ if machine in {"x86_64", "amd64"}:
58
+ return "x86_64-unknown-linux-gnu"
59
+ if machine in {"aarch64", "arm64"}:
60
+ return "aarch64-unknown-linux-gnu"
61
+ if system == "darwin" and machine in {"aarch64", "arm64"}:
62
+ return "aarch64-apple-darwin"
63
+ return None
@@ -1,9 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import contextlib
5
+ import os
4
6
  import re
7
+ import shutil
5
8
  import subprocess
6
9
  import sys
10
+ import tarfile
7
11
  import time
8
12
  from enum import Enum, auto
9
13
  from pathlib import Path
@@ -16,6 +20,7 @@ from pythinker_code.native import (
16
20
  is_native_build as _is_native_build,
17
21
  )
18
22
  from pythinker_code.native import (
23
+ native_archive_asset_name,
19
24
  native_installer_asset_name,
20
25
  native_installer_release_url,
21
26
  )
@@ -269,19 +274,11 @@ def _update_banner_text(current_version: str, latest_version: str) -> Text:
269
274
  ("1", "bold cyan"),
270
275
  (". Run ", ""),
271
276
  ("pythinker update", "bold cyan"),
272
- (" (downloads installer automatically)", "grey50"),
277
+ (" (downloads native updater automatically)", "grey50"),
273
278
  ("\n ", ""),
274
279
  ("2", "bold cyan"),
275
- (". Or download ", ""),
276
- (
277
- f"PythinkerSetup-{latest_version}.exe",
278
- "bold",
279
- ),
280
- (" from the ", "grey50"),
281
- (
282
- "GitHub Releases page",
283
- "grey50 underline",
284
- ),
280
+ (". Or run ", ""),
281
+ (_native_manual_update_command(latest_version), "bold"),
285
282
  )
286
283
  upgrade_command_text = _format_upgrade_command(upgrade_command)
287
284
  return Text.assemble(
@@ -306,10 +303,16 @@ def _render_update_banner(current_version: str, latest_version: str) -> None:
306
303
  console.print(_update_banner_text(current_version, latest_version))
307
304
 
308
305
 
309
- async def _fetch_native_installer_asset(
310
- session: aiohttp.ClientSession, latest_version: str, channel: str
306
+ def _native_manual_update_command(latest_version: str) -> str:
307
+ if _is_windows():
308
+ return f"download PythinkerSetup-{latest_version}.exe from GitHub Releases"
309
+ return f"curl -fsSL https://pythinker.com/install.sh | bash -s -- --version {latest_version}"
310
+
311
+
312
+ async def _fetch_native_release_asset(
313
+ session: aiohttp.ClientSession, asset_name: str, channel: str
311
314
  ) -> tuple[str, str] | None:
312
- """Return (download_url, sha256) for the installer asset, or None on failure."""
315
+ """Return (download_url, sha256) for a native release asset, or None on failure."""
313
316
  url = native_installer_release_url(channel=channel)
314
317
  try:
315
318
  async with session.get(url, headers={"Accept": "application/vnd.github+json"}) as resp:
@@ -318,10 +321,9 @@ async def _fetch_native_installer_asset(
318
321
  return None
319
322
  payload = await resp.json()
320
323
  except Exception:
321
- logger.exception("Failed to look up native installer release")
324
+ logger.exception("Failed to look up native release")
322
325
  return None
323
326
 
324
- asset_name = native_installer_asset_name(latest_version)
325
327
  download_url: str | None = None
326
328
  sha256_url: str | None = None
327
329
  for asset in payload.get("assets", []):
@@ -331,18 +333,18 @@ async def _fetch_native_installer_asset(
331
333
  elif name == asset_name + ".sha256":
332
334
  sha256_url = asset.get("browser_download_url")
333
335
  if not download_url or not sha256_url:
334
- logger.warning("Native installer asset {name} not found on release", name=asset_name)
336
+ logger.warning("Native asset {name} not found on release", name=asset_name)
335
337
  return None
336
338
 
337
339
  try:
338
340
  async with session.get(sha256_url) as resp:
339
341
  text = (await resp.text()).strip()
340
342
  except Exception:
341
- logger.exception("Failed to fetch installer sha256")
343
+ logger.exception("Failed to fetch native asset sha256")
342
344
  return None
343
345
  sha = text.split()[0] if text else ""
344
346
  if len(sha) != 64:
345
- logger.warning("Installer sha256 has unexpected length: {n}", n=len(sha))
347
+ logger.warning("Native asset sha256 has unexpected length: {n}", n=len(sha))
346
348
  return None
347
349
  return download_url, sha
348
350
 
@@ -357,51 +359,112 @@ def _run_native_installer(installer_path: Path) -> None:
357
359
  sys.exit(0)
358
360
 
359
361
 
362
+ async def _download_native_asset(
363
+ session: aiohttp.ClientSession, asset_name: str, download_url: str, destination: Path
364
+ ) -> UpdateResult:
365
+ try:
366
+ async with session.get(download_url) as resp:
367
+ if resp.status != 200:
368
+ logger.warning(
369
+ "Native asset {name} download returned {status}",
370
+ name=asset_name,
371
+ status=resp.status,
372
+ )
373
+ return UpdateResult.FAILED
374
+ with destination.open("wb") as fh:
375
+ async for chunk in resp.content.iter_chunked(64 * 1024):
376
+ fh.write(chunk)
377
+ except Exception:
378
+ logger.exception("Native asset {name} download failed", name=asset_name)
379
+ return UpdateResult.FAILED
380
+ return UpdateResult.UPDATED
381
+
382
+
383
+ def _verify_sha256(path: Path, expected_sha: str) -> bool:
384
+ import hashlib
385
+
386
+ digest = hashlib.sha256()
387
+ with path.open("rb") as fh:
388
+ for chunk in iter(lambda: fh.read(64 * 1024), b""):
389
+ digest.update(chunk)
390
+ actual_sha = digest.hexdigest()
391
+ if actual_sha != expected_sha:
392
+ logger.error(
393
+ "Native asset sha mismatch: expected={expected} actual={actual}",
394
+ expected=expected_sha,
395
+ actual=actual_sha,
396
+ )
397
+ return False
398
+ return True
399
+
400
+
401
+ def _install_native_archive(archive: Path) -> UpdateResult:
402
+ target = Path(sys.executable).resolve()
403
+ extract_dir = archive.parent / "extract"
404
+ extract_dir.mkdir()
405
+ try:
406
+ with tarfile.open(archive, "r:gz") as tar:
407
+ tar.extract("pythinker", path=extract_dir, filter="data")
408
+ except Exception:
409
+ logger.exception("Failed to extract native archive")
410
+ return UpdateResult.FAILED
411
+
412
+ extracted = extract_dir / "pythinker"
413
+ if not extracted.is_file():
414
+ logger.error("Native archive did not contain a pythinker executable")
415
+ return UpdateResult.FAILED
416
+
417
+ replacement = target.with_name(f".{target.name}.new-{os.getpid()}")
418
+ try:
419
+ shutil.copyfile(extracted, replacement)
420
+ replacement.chmod(target.stat().st_mode | 0o755)
421
+ os.replace(replacement, target)
422
+ except OSError:
423
+ logger.exception("Failed to replace native executable:")
424
+ with contextlib.suppress(OSError):
425
+ replacement.unlink()
426
+ return UpdateResult.FAILED
427
+ return UpdateResult.UPDATED
428
+
429
+
360
430
  async def _maybe_run_native_update(latest_version: str, channel: str = "latest") -> UpdateResult:
361
431
  """Native-build update path. Returns UPDATED on success; UPDATE_AVAILABLE if skipped."""
362
432
  if _auto_update_disabled():
363
433
  logger.info("PYTHINKER_CLI_NO_AUTO_UPDATE set; skipping native auto-update")
364
434
  return UpdateResult.UPDATE_AVAILABLE
365
435
 
366
- import hashlib
367
436
  import tempfile
368
437
 
438
+ asset_name = (
439
+ native_installer_asset_name(latest_version)
440
+ if _is_windows()
441
+ else native_archive_asset_name(latest_version)
442
+ )
443
+ if asset_name is None:
444
+ logger.warning("No native updater asset is published for this platform")
445
+ return UpdateResult.FAILED
446
+
369
447
  timeout = aiohttp.ClientTimeout(total=120, sock_connect=10, sock_read=60)
370
448
  async with new_client_session(timeout=timeout) as session:
371
- fetched = await _fetch_native_installer_asset(session, latest_version, channel)
449
+ fetched = await _fetch_native_release_asset(session, asset_name, channel)
372
450
  if fetched is None:
373
451
  return UpdateResult.FAILED
374
452
  download_url, expected_sha = fetched
375
453
 
376
454
  tmpdir = Path(tempfile.mkdtemp(prefix="pythinker-update-"))
377
- installer = tmpdir / native_installer_asset_name(latest_version)
378
- try:
379
- async with session.get(download_url) as resp:
380
- if resp.status != 200:
381
- logger.warning("Installer download returned {status}", status=resp.status)
382
- return UpdateResult.FAILED
383
- with installer.open("wb") as fh:
384
- async for chunk in resp.content.iter_chunked(64 * 1024):
385
- fh.write(chunk)
386
- except Exception:
387
- logger.exception("Installer download failed")
388
- return UpdateResult.FAILED
455
+ asset = tmpdir / asset_name
456
+ download_result = await _download_native_asset(session, asset_name, download_url, asset)
457
+ if download_result is UpdateResult.FAILED:
458
+ return download_result
389
459
 
390
- digest = hashlib.sha256()
391
- with installer.open("rb") as fh:
392
- for chunk in iter(lambda: fh.read(64 * 1024), b""):
393
- digest.update(chunk)
394
- actual_sha = digest.hexdigest()
395
- if actual_sha != expected_sha:
396
- logger.error(
397
- "Installer sha mismatch: expected={expected} actual={actual}",
398
- expected=expected_sha,
399
- actual=actual_sha,
400
- )
460
+ if not _verify_sha256(asset, expected_sha):
401
461
  return UpdateResult.FAILED
402
462
 
403
- _run_native_installer(installer)
404
- return UpdateResult.UPDATED # unreachable; sys.exit fires inside _run_native_installer
463
+ if _is_windows():
464
+ _run_native_installer(asset)
465
+ return UpdateResult.UPDATED # unreachable; sys.exit fires inside _run_native_installer
466
+
467
+ return _install_native_archive(asset)
405
468
 
406
469
 
407
470
  async def do_update(*, print: bool = True, check_only: bool = False) -> UpdateResult:
@@ -458,7 +521,7 @@ async def _do_update(*, print: bool, check_only: bool) -> UpdateResult:
458
521
  _print(f"[grey50]Running: {upgrade_command_text}[/grey50]")
459
522
 
460
523
  if upgrade_command == [NATIVE_INSTALLER_MARKER]:
461
- _print("[grey50]Downloading native installer for update...[/grey50]")
524
+ _print("[grey50]Downloading native updater...[/grey50]")
462
525
  native_result = await _maybe_run_native_update(latest_version)
463
526
  if native_result is UpdateResult.UPDATE_AVAILABLE:
464
527
  _print(
@@ -470,6 +533,9 @@ async def _do_update(*, print: bool, check_only: bool) -> UpdateResult:
470
533
  if native_result is UpdateResult.FAILED:
471
534
  _print("[red]Native update failed. Download manually from the releases page.[/red]")
472
535
  return UpdateResult.FAILED
536
+ if native_result is UpdateResult.UPDATED:
537
+ _print("[green]Updated successfully![/green]")
538
+ _print("[yellow]Restart Pythinker CLI to use the new version.[/yellow]")
473
539
  return native_result
474
540
 
475
541
  # On Windows, the running pythinker.exe holds an exclusive lock on its own