pythinker-code 2.2.1__tar.gz → 2.4.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 (782) hide show
  1. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/PKG-INFO +29 -5
  2. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/README.md +26 -2
  3. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/pyproject.toml +4 -4
  4. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/CHANGELOG.md +35 -0
  5. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/acp/host.py +3 -0
  6. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/acp/session.py +7 -1
  7. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/agents/default/agent.yaml +9 -0
  8. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/agents/default/coder.yaml +16 -0
  9. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/agents/default/explore.yaml +14 -2
  10. pythinker_code-2.4.0/src/pythinker_code/agents/default/implementer.yaml +45 -0
  11. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/agents/default/plan.yaml +15 -4
  12. pythinker_code-2.4.0/src/pythinker_code/agents/default/review.yaml +46 -0
  13. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/agents/default/system.md +17 -1
  14. pythinker_code-2.4.0/src/pythinker_code/agents/default/verifier.yaml +45 -0
  15. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/auth/oauth.py +18 -0
  16. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/auth/openai.py +12 -0
  17. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/auth/platforms.py +9 -0
  18. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/hooks/engine.py +13 -1
  19. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/hooks/runner.py +3 -0
  20. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/llm.py +33 -6
  21. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/btw.py +6 -0
  22. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/pythinkersoul.py +34 -4
  23. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/toolset.py +42 -13
  24. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/subagents/runner.py +7 -1
  25. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/telemetry/config.py +29 -0
  26. pythinker_code-2.4.0/src/pythinker_code/telemetry/errors.py +107 -0
  27. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/telemetry/otel.py +24 -2
  28. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/agent/__init__.py +3 -0
  29. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/agent/description.md +11 -4
  30. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/ask_user/__init__.py +4 -1
  31. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/glob.py +3 -0
  32. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/grep_local.py +225 -12
  33. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/read.py +3 -0
  34. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/read_media.py +3 -0
  35. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/replace.py +3 -0
  36. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/write.py +3 -0
  37. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/plan/__init__.py +4 -1
  38. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/plan/enter.py +4 -1
  39. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/shell/__init__.py +6 -0
  40. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/slash.py +121 -0
  41. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/_baseUniq-D7qiASUy.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/_baseUniq-CnjLtNBK.js +1 -1
  42. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/arc-G4WaEU6H.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/arc-p8Zl45yf.js +1 -1
  43. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-CcYeuWPi.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-Lxm5mR82.js +1 -1
  44. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-DWIqpSyD.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-B7qw0bmu.js +1 -1
  45. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-BLk0cKfQ.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-CdgJaayE.js +1 -1
  46. pythinker_code-2.4.0/src/pythinker_code/web/static/assets/channel-BZBK5lN6.js +1 -0
  47. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-ChVR7Ju_.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-DNr_hwHQ.js +1 -1
  48. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-55IACEB6-DEiz531X.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-BWRJeLuP.js +1 -1
  49. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-QjrqjAAP.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-BRveHO02.js +1 -1
  50. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-Bw4GqGyI.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-CC8092Ai.js +1 -1
  51. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-bEv-7epi.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-BWlTTg4C.js +1 -1
  52. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-QN33PNHL-DOmXNpah.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-CQB7XXqV.js +1 -1
  53. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-D-6zUU9h.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-DR05TXzx.js +1 -1
  54. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-CfuYCubo.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-BooWpSCF.js +1 -1
  55. pythinker_code-2.4.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-BpVZZpbi.js +1 -0
  56. pythinker_code-2.4.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-BpVZZpbi.js +1 -0
  57. pythinker_code-2.4.0/src/pythinker_code/web/static/assets/clone-C-R24ClB.js +1 -0
  58. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-DsAmzUoy.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-C0nbBxoU.js +1 -1
  59. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-aT1O0X9J.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A---Tl6BDU.js +1 -1
  60. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/cytoscape.esm-B4IyJ4dz.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/cytoscape.esm-Dlvswyl5.js +1 -1
  61. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-DaTedwqX.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-CXURVXMQ.js +1 -1
  62. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-BykkJf3F.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-DqPWQvWf.js +1 -1
  63. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-Dui_gc9d.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-XG4wk_zx.js +1 -1
  64. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-B7DmELTs.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-sNvTPY2M.js +1 -1
  65. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-C_CHmY_j.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-BOJaQQQU.js +1 -1
  66. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-BLZZYAxJ.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-CbfuToSV.js +1 -1
  67. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-Cb4lBZT4.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-ulVOoUco.js +1 -1
  68. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-BrRnu-oS.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-D2qIB9v4.js +1 -1
  69. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/graph-Cdru59AN.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/graph-CMrFXUW3.js +1 -1
  70. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/index-Ix9ej5i-.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/index-BORZhTVE.js +2 -2
  71. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/index-CHZz2B-g.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/index-Cw0e9z0j.js +1 -1
  72. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/index-B9rDlDTV.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/index-nZJqxMTn.js +1 -1
  73. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-BWbx2G71.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-B-DtK8KA.js +1 -1
  74. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-e5r2mFfX.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-CVpxG_1t.js +1 -1
  75. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-Cw-5DMZz.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-DsoNxPLk.js +1 -1
  76. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/layout-Bz5NLD6Y.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/layout-C-IPsObI.js +1 -1
  77. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/linear-C6xei9WU.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/linear-BoIapCU_.js +1 -1
  78. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B2s4EhdL.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-BNd1nBm2.js +7 -7
  79. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/mermaid.core-DE-3B90d.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/mermaid.core-CiwyVvHW.js +5 -5
  80. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/min-DIq8zNFr.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/min-BCUh9ALv.js +1 -1
  81. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-CRmn6NBA.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-CjwMDCnL.js +1 -1
  82. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-xaDAWjUB.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-fDnq6EaG.js +1 -1
  83. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-DL9984Cg.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-DyHz9xJE.js +1 -1
  84. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-DMnNecbQ.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-CtnhMmz_.js +1 -1
  85. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-BhFUMQqC.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-DBjlbTUH.js +1 -1
  86. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-Da3-18pZ.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-B8vAgUxw.js +1 -1
  87. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-D-vEOsdI.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-CKckm--Z.js +1 -1
  88. pythinker_code-2.4.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-DFvB4bvk.js +1 -0
  89. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-jjwwP1hV.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-ByteGYaR.js +1 -1
  90. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-CsfY6M0V.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-CBb0li3c.js +1 -1
  91. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-Dk2xKhgL.js → pythinker_code-2.4.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-E_ri2DuP.js +1 -1
  92. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/index.html +1 -1
  93. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/channel-N3T2k8B2.js +0 -1
  94. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-mMiORCnw.js +0 -1
  95. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-mMiORCnw.js +0 -1
  96. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/clone-hquVYw4G.js +0 -1
  97. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-CsiNChEg.js +0 -1
  98. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/LICENSE +0 -0
  99. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/NOTICE +0 -0
  100. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/__init__.py +0 -0
  101. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/__main__.py +0 -0
  102. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/acp/AGENTS.md +0 -0
  103. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/acp/__init__.py +0 -0
  104. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/acp/convert.py +0 -0
  105. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/acp/mcp.py +0 -0
  106. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/acp/server.py +0 -0
  107. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/acp/tools.py +0 -0
  108. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/acp/types.py +0 -0
  109. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/acp/version.py +0 -0
  110. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
  111. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/agentspec.py +0 -0
  112. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/app.py +0 -0
  113. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
  114. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/approval_runtime/models.py +0 -0
  115. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
  116. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/auth/__init__.py +0 -0
  117. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
  118. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/auth/deepseek.py +0 -0
  119. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/auth/lm_studio.py +0 -0
  120. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/auth/minimax.py +0 -0
  121. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/auth/ollama.py +0 -0
  122. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/auth/opencode_go.py +0 -0
  123. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/auth/openrouter.py +0 -0
  124. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/background/__init__.py +0 -0
  125. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/background/agent_runner.py +0 -0
  126. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/background/ids.py +0 -0
  127. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/background/manager.py +0 -0
  128. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/background/models.py +0 -0
  129. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/background/store.py +0 -0
  130. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/background/summary.py +0 -0
  131. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/background/worker.py +0 -0
  132. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/cli/__init__.py +0 -0
  133. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/cli/__main__.py +0 -0
  134. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/cli/_lazy_group.py +0 -0
  135. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/cli/export.py +0 -0
  136. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/cli/info.py +0 -0
  137. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/cli/mcp.py +0 -0
  138. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/cli/plugin.py +0 -0
  139. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/cli/toad.py +0 -0
  140. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/cli/update.py +0 -0
  141. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/cli/vis.py +0 -0
  142. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/cli/web.py +0 -0
  143. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/config.py +0 -0
  144. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/constant.py +0 -0
  145. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/events.py +0 -0
  146. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/exception.py +0 -0
  147. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/extensions.py +0 -0
  148. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/hooks/__init__.py +0 -0
  149. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/hooks/config.py +0 -0
  150. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/hooks/events.py +0 -0
  151. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/metadata.py +0 -0
  152. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/notifications/__init__.py +0 -0
  153. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/notifications/llm.py +0 -0
  154. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/notifications/manager.py +0 -0
  155. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/notifications/models.py +0 -0
  156. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/notifications/notifier.py +0 -0
  157. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/notifications/store.py +0 -0
  158. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/notifications/wire.py +0 -0
  159. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/plugin/__init__.py +0 -0
  160. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/plugin/manager.py +0 -0
  161. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/plugin/tool.py +0 -0
  162. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/prompt_templates.py +0 -0
  163. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/prompts/__init__.py +0 -0
  164. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/prompts/compact.md +0 -0
  165. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/prompts/init.md +0 -0
  166. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/py.typed +0 -0
  167. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/session.py +0 -0
  168. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/session_fork.py +0 -0
  169. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/session_state.py +0 -0
  170. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/share.py +0 -0
  171. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/skill/__init__.py +0 -0
  172. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
  173. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/skill/flow/d2.py +0 -0
  174. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
  175. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
  176. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
  177. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/__init__.py +0 -0
  178. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/agent.py +0 -0
  179. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/approval.py +0 -0
  180. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/compaction.py +0 -0
  181. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/context.py +0 -0
  182. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/denwarenji.py +0 -0
  183. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/dynamic_injection.py +0 -0
  184. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
  185. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
  186. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
  187. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/message.py +0 -0
  188. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/soul/slash.py +0 -0
  189. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/subagents/__init__.py +0 -0
  190. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/subagents/builder.py +0 -0
  191. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/subagents/core.py +0 -0
  192. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/subagents/git_context.py +0 -0
  193. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/subagents/models.py +0 -0
  194. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/subagents/output.py +0 -0
  195. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/subagents/registry.py +0 -0
  196. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/subagents/store.py +0 -0
  197. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/telemetry/__init__.py +0 -0
  198. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/telemetry/crash.py +0 -0
  199. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/telemetry/metrics.py +0 -0
  200. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/telemetry/sentry.py +0 -0
  201. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/telemetry/sink.py +0 -0
  202. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/AGENTS.md +0 -0
  203. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/__init__.py +0 -0
  204. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
  205. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/background/__init__.py +0 -0
  206. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/background/list.md +0 -0
  207. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/background/output.md +0 -0
  208. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/background/stop.md +0 -0
  209. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/display.py +0 -0
  210. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
  211. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
  212. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/__init__.py +0 -0
  213. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/glob.md +0 -0
  214. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/grep.md +0 -0
  215. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
  216. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/read.md +0 -0
  217. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/read_media.md +0 -0
  218. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/replace.md +0 -0
  219. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/utils.py +0 -0
  220. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/file/write.md +0 -0
  221. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/plan/description.md +0 -0
  222. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
  223. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
  224. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/shell/bash.md +0 -0
  225. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
  226. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/test.py +0 -0
  227. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/think/__init__.py +0 -0
  228. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/think/think.md +0 -0
  229. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
  230. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
  231. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/utils.py +0 -0
  232. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/web/__init__.py +0 -0
  233. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/web/fetch.md +0 -0
  234. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/web/fetch.py +0 -0
  235. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/web/search.md +0 -0
  236. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/tools/web/search.py +0 -0
  237. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/__init__.py +0 -0
  238. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
  239. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/print/__init__.py +0 -0
  240. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/print/visualize.py +0 -0
  241. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/__init__.py +0 -0
  242. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
  243. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
  244. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
  245. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
  246. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/components/diff.py +0 -0
  247. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
  248. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
  249. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
  250. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
  251. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
  252. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
  253. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
  254. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/console.py +0 -0
  255. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/debug.py +0 -0
  256. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/echo.py +0 -0
  257. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
  258. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
  259. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
  260. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
  261. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
  262. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
  263. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
  264. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/prompt.py +0 -0
  265. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/replay.py +0 -0
  266. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/selector.py +0 -0
  267. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
  268. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
  269. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
  270. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
  271. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
  272. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
  273. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
  274. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
  275. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/setup.py +0 -0
  276. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/startup.py +0 -0
  277. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
  278. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
  279. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -0
  280. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
  281. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
  282. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
  283. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
  284. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
  285. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
  286. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
  287. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
  288. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
  289. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
  290. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
  291. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
  292. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -0
  293. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
  294. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/update.py +0 -0
  295. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/usage.py +0 -0
  296. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
  297. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
  298. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
  299. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
  300. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
  301. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
  302. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
  303. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
  304. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
  305. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
  306. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
  307. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
  308. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
  309. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
  310. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +0 -0
  311. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
  312. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
  313. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +0 -0
  314. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +0 -0
  315. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
  316. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
  317. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/theme.py +0 -0
  318. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/ui/tui_config.py +0 -0
  319. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
  320. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/__init__.py +0 -0
  321. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/aiohttp.py +0 -0
  322. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/aioqueue.py +0 -0
  323. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/broadcast.py +0 -0
  324. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/changelog.py +0 -0
  325. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/clipboard.py +0 -0
  326. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/datetime.py +0 -0
  327. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/diff.py +0 -0
  328. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/editor.py +0 -0
  329. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/environment.py +0 -0
  330. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/envvar.py +0 -0
  331. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/export.py +0 -0
  332. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/file_filter.py +0 -0
  333. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/frontmatter.py +0 -0
  334. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/io.py +0 -0
  335. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/logging.py +0 -0
  336. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/media_tags.py +0 -0
  337. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/message.py +0 -0
  338. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/path.py +0 -0
  339. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/proctitle.py +0 -0
  340. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/proxy.py +0 -0
  341. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
  342. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
  343. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/rich/columns.py +0 -0
  344. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/rich/diff_render.py +0 -0
  345. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
  346. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
  347. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
  348. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
  349. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/sensitive.py +0 -0
  350. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/server.py +0 -0
  351. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/signals.py +0 -0
  352. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/slashcmd.py +0 -0
  353. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/string.py +0 -0
  354. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
  355. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/term.py +0 -0
  356. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/utils/typing.py +0 -0
  357. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/__init__.py +0 -0
  358. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/api/__init__.py +0 -0
  359. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/api/sessions.py +0 -0
  360. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/api/statistics.py +0 -0
  361. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/api/system.py +0 -0
  362. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/app.py +0 -0
  363. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-D2MTYyJz.js +0 -0
  364. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/static/assets/index-CezafTt_.js +0 -0
  365. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/static/assets/index-DSRInNnm.css +0 -0
  366. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  367. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  368. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  369. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  370. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  371. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  372. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  373. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/vis/static/index.html +0 -0
  374. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/__init__.py +0 -0
  375. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/api/__init__.py +0 -0
  376. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/api/config.py +0 -0
  377. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/api/open_in.py +0 -0
  378. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/api/sessions.py +0 -0
  379. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/app.py +0 -0
  380. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/auth.py +0 -0
  381. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/models.py +0 -0
  382. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/runner/__init__.py +0 -0
  383. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/runner/messages.py +0 -0
  384. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/runner/process.py +0 -0
  385. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/runner/worker.py +0 -0
  386. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  387. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  388. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  389. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  390. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  391. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  392. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  393. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  394. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  395. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  396. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  397. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  398. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  399. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  400. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  401. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  402. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  403. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  404. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  405. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  406. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  407. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  408. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  409. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  410. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  411. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  412. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  413. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  414. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  415. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  416. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  417. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  418. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  419. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  420. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  421. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  422. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  423. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  424. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  425. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  426. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  427. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  428. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  429. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  430. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  431. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  432. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  433. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  434. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  435. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  436. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  437. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  438. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  439. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  440. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  441. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  442. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  443. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  444. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  445. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/abap-BdImnpbu.js +0 -0
  446. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +0 -0
  447. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/ada-bCR0ucgS.js +0 -0
  448. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +0 -0
  449. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +0 -0
  450. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +0 -0
  451. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/apache-Pmp26Uib.js +0 -0
  452. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/apex-D8_7TLub.js +0 -0
  453. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/apl-dKokRX4l.js +0 -0
  454. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/applescript-Co6uUVPk.js +0 -0
  455. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/ara-BRHolxvo.js +0 -0
  456. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +0 -0
  457. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/asm-D_Q5rh1f.js +0 -0
  458. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/astro-CbQHKStN.js +0 -0
  459. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +0 -0
  460. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/awk-DMzUqQB5.js +0 -0
  461. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +0 -0
  462. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +0 -0
  463. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/bat-BkioyH1T.js +0 -0
  464. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/beancount-k_qm7-4y.js +0 -0
  465. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/berry-uYugtg8r.js +0 -0
  466. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/bibtex-CHM0blh-.js +0 -0
  467. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/bicep-Bmn6On1c.js +0 -0
  468. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/blade-D4QpJJKB.js +0 -0
  469. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/bsl-BO_Y6i37.js +0 -0
  470. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/c-BIGW1oBm.js +0 -0
  471. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/c3-VCDPK7BO.js +0 -0
  472. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +0 -0
  473. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/cairo-KRGpt6FW.js +0 -0
  474. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
  475. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
  476. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
  477. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
  478. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/clarity-D53aC0YG.js +0 -0
  479. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/clojure-P80f7IUj.js +0 -0
  480. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/cmake-D1j8_8rp.js +0 -0
  481. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/cobol-nwyudZeR.js +0 -0
  482. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +0 -0
  483. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +0 -0
  484. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/coffee-Ch7k5sss.js +0 -0
  485. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +0 -0
  486. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/coq-DkFqJrB1.js +0 -0
  487. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/cpp-CofmeUqb.js +0 -0
  488. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/crystal-tKQVLTB8.js +0 -0
  489. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/csharp-K5feNrxe.js +0 -0
  490. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/css-DPfMkruS.js +0 -0
  491. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/csv-fuZLfV_i.js +0 -0
  492. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/cue-D82EKSYY.js +0 -0
  493. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/cypher-COkxafJQ.js +0 -0
  494. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/d-85-TOEBH.js +0 -0
  495. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +0 -0
  496. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/dart-CF10PKvl.js +0 -0
  497. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/dax-CEL-wOlO.js +0 -0
  498. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +0 -0
  499. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +0 -0
  500. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/diff-D97Zzqfu.js +0 -0
  501. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/docker-BcOcwvcX.js +0 -0
  502. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/dotenv-Da5cRb03.js +0 -0
  503. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/dracula-BzJJZx-M.js +0 -0
  504. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +0 -0
  505. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +0 -0
  506. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/edge-BkV0erSs.js +0 -0
  507. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/elixir-CDX3lj18.js +0 -0
  508. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/elm-DbKCFpqz.js +0 -0
  509. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +0 -0
  510. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/erb-BOJIQeun.js +0 -0
  511. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/erlang-DsQrWhSR.js +0 -0
  512. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +0 -0
  513. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +0 -0
  514. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/fennel-BYunw83y.js +0 -0
  515. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/fish-BvzEVeQv.js +0 -0
  516. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/fluent-C4IJs8-o.js +0 -0
  517. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
  518. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
  519. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +0 -0
  520. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +0 -0
  521. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +0 -0
  522. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/gdshader-DkwncUOv.js +0 -0
  523. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/genie-D0YGMca9.js +0 -0
  524. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +0 -0
  525. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +0 -0
  526. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +0 -0
  527. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/github-dark-DHJKELXO.js +0 -0
  528. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
  529. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
  530. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
  531. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/github-light-DAi9KRSo.js +0 -0
  532. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +0 -0
  533. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
  534. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/gleam-BspZqrRM.js +0 -0
  535. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
  536. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +0 -0
  537. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/glsl-DplSGwfg.js +0 -0
  538. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/gn-n2N0HUVH.js +0 -0
  539. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +0 -0
  540. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/go-Dn2_MT6a.js +0 -0
  541. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/graphql-ChdNCCLP.js +0 -0
  542. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/groovy-gcz8RCvz.js +0 -0
  543. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
  544. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
  545. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
  546. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
  547. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
  548. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
  549. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/hack-CaT9iCJl.js +0 -0
  550. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/haml-B8DHNrY2.js +0 -0
  551. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/handlebars-BL8al0AC.js +0 -0
  552. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/haskell-Df6bDoY_.js +0 -0
  553. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/haxe-CzTSHFRz.js +0 -0
  554. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/hcl-BWvSN4gD.js +0 -0
  555. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/hjson-D5-asLiD.js +0 -0
  556. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +0 -0
  557. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/houston-DnULxvSX.js +0 -0
  558. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/html-GMplVEZG.js +0 -0
  559. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +0 -0
  560. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/http-jrhK8wxY.js +0 -0
  561. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/hurl-irOxFIW8.js +0 -0
  562. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +0 -0
  563. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/hy-DFXneXwc.js +0 -0
  564. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/imba-DGztddWO.js +0 -0
  565. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/index-BpoLgcEt.js +0 -0
  566. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/index-CzV_vCfu.css +0 -0
  567. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/index-DI2oedCt.js +0 -0
  568. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/ini-BEwlwnbL.js +0 -0
  569. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/init-Gi6I4Gst.js +0 -0
  570. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  571. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  572. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  573. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  574. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  575. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  576. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  577. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/java-CylS5w8V.js +0 -0
  578. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/javascript-wDzz0qaB.js +0 -0
  579. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +0 -0
  580. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/jison-wvAkD_A8.js +0 -0
  581. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/json-Cp-IABpG.js +0 -0
  582. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/json5-C9tS-k6U.js +0 -0
  583. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/jsonc-Des-eS-w.js +0 -0
  584. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +0 -0
  585. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +0 -0
  586. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/jssm-C2t-YnRu.js +0 -0
  587. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/jsx-g9-lgVsj.js +0 -0
  588. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/julia-CxzCAyBv.js +0 -0
  589. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
  590. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
  591. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
  592. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/katex-D2lIc1rk.css +0 -0
  593. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/kdl-DV7GczEv.js +0 -0
  594. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +0 -0
  595. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/kusto-DZf3V79B.js +0 -0
  596. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/laserwave-DUszq2jm.js +0 -0
  597. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/latex-B4uzh10-.js +0 -0
  598. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/lean-BZvkOJ9d.js +0 -0
  599. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/less-B1dDrJ26.js +0 -0
  600. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +0 -0
  601. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/liquid-DYVedYrR.js +0 -0
  602. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/llvm-BtvRca6l.js +0 -0
  603. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/log-2UxHyX5q.js +0 -0
  604. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/logo-BtOb2qkB.js +0 -0
  605. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/lua-BbnMAYS6.js +0 -0
  606. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/luau-C-HG3fhB.js +0 -0
  607. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/make-CHLpvVh8.js +0 -0
  608. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/markdown-Cvjx9yec.js +0 -0
  609. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/marko-DZsq8hO1.js +0 -0
  610. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +0 -0
  611. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
  612. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
  613. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +0 -0
  614. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
  615. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/matlab-D7o27uSR.js +0 -0
  616. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/mdc-DUICxH0z.js +0 -0
  617. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +0 -0
  618. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B2P5VJ9v.css +0 -0
  619. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +0 -0
  620. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/min-dark-CafNBF8u.js +0 -0
  621. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/min-light-CTRr51gU.js +0 -0
  622. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +0 -0
  623. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/mojo-B93PlW-d.js +0 -0
  624. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/monokai-D4h5O-jR.js +0 -0
  625. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/moonbit-Ba13S78F.js +0 -0
  626. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/move-Bu9oaDYs.js +0 -0
  627. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/narrat-DRg8JJMk.js +0 -0
  628. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +0 -0
  629. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/nginx-DknmC5AR.js +0 -0
  630. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/night-owl-C39BiMTA.js +0 -0
  631. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/nim-CVrawwO9.js +0 -0
  632. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/nix-CwoSXNpI.js +0 -0
  633. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/nord-Ddv68eIx.js +0 -0
  634. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/nushell-C-sUppwS.js +0 -0
  635. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +0 -0
  636. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +0 -0
  637. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +0 -0
  638. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
  639. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/one-light-PoHY5YXO.js +0 -0
  640. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/openscad-C4EeE6gA.js +0 -0
  641. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +0 -0
  642. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/pascal-D93ZcfNL.js +0 -0
  643. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/perl-C0TMdlhV.js +0 -0
  644. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/php-CDn_0X-4.js +0 -0
  645. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/pkl-u5AG7uiY.js +0 -0
  646. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/plastic-3e1v2bzS.js +0 -0
  647. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/plsql-ChMvpjG-.js +0 -0
  648. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/po-BTJTHyun.js +0 -0
  649. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +0 -0
  650. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/polar-C0HS_06l.js +0 -0
  651. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/postcss-CXtECtnM.js +0 -0
  652. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +0 -0
  653. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/powershell-Dpen1YoG.js +0 -0
  654. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/prisma-Dd19v3D-.js +0 -0
  655. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/prolog-CbFg5uaA.js +0 -0
  656. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/proto-C7zT0LnQ.js +0 -0
  657. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/pug-CGlum2m_.js +0 -0
  658. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/puppet-BMWR74SV.js +0 -0
  659. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/purescript-CklMAg4u.js +0 -0
  660. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/python-B6aJPvgy.js +0 -0
  661. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/qml-3beO22l8.js +0 -0
  662. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +0 -0
  663. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/qss-IeuSbFQv.js +0 -0
  664. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/r-Dspwwk_N.js +0 -0
  665. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/racket-BqYA7rlc.js +0 -0
  666. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/raku-DXvB9xmW.js +0 -0
  667. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/razor-C1TweQQi.js +0 -0
  668. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/red-bN70gL4F.js +0 -0
  669. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/reg-C-SQnVFl.js +0 -0
  670. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +0 -0
  671. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/rel-C3B-1QV4.js +0 -0
  672. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/riscv-BM1_JUlF.js +0 -0
  673. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
  674. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
  675. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +0 -0
  676. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +0 -0
  677. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/rst-B0xPkSld.js +0 -0
  678. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/ruby-BvKwtOVI.js +0 -0
  679. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/rust-B1yitclQ.js +0 -0
  680. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/sas-cz2c8ADy.js +0 -0
  681. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +0 -0
  682. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/scala-C151Ov-r.js +0 -0
  683. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/scheme-C98Dy4si.js +0 -0
  684. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/scss-OYdSNvt2.js +0 -0
  685. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +0 -0
  686. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
  687. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/shellscript-Yzrsuije.js +0 -0
  688. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/shellsession-BADoaaVG.js +0 -0
  689. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +0 -0
  690. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +0 -0
  691. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +0 -0
  692. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +0 -0
  693. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +0 -0
  694. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +0 -0
  695. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/solidity-rGO070M0.js +0 -0
  696. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/soy-Brmx7dQM.js +0 -0
  697. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/sparql-rVzFXLq3.js +0 -0
  698. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/splunk-BtCnVYZw.js +0 -0
  699. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/sql-BLtJtn59.js +0 -0
  700. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +0 -0
  701. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/stata-BH5u7GGu.js +0 -0
  702. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +0 -0
  703. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/svelte-zxCyuUbr.js +0 -0
  704. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/swift-Dg5xB15N.js +0 -0
  705. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +0 -0
  706. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +0 -0
  707. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/systemd-4A_iFExJ.js +0 -0
  708. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/talonscript-CkByrt1z.js +0 -0
  709. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/tasl-QIJgUcNo.js +0 -0
  710. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/tcl-dwOrl1Do.js +0 -0
  711. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/templ-W15q3VgB.js +0 -0
  712. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/terraform-BETggiCN.js +0 -0
  713. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/tex-CvyZ59Mk.js +0 -0
  714. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/tokyo-night-hegEt444.js +0 -0
  715. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/toml-vGWfd6FD.js +0 -0
  716. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +0 -0
  717. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/tsv-B_m7g4N7.js +0 -0
  718. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/tsx-COt5Ahok.js +0 -0
  719. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/turtle-BsS91CYL.js +0 -0
  720. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/twig-CO9l9SDP.js +0 -0
  721. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +0 -0
  722. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/typespec-BGHnOYBU.js +0 -0
  723. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/typst-DHCkPAjA.js +0 -0
  724. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/v-BcVCzyr7.js +0 -0
  725. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/vala-CsfeWuGM.js +0 -0
  726. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/vb-D17OF-Vu.js +0 -0
  727. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/verilog-BQ8w6xss.js +0 -0
  728. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/vesper-DU1UobuO.js +0 -0
  729. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +0 -0
  730. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/viml-CJc9bBzg.js +0 -0
  731. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
  732. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
  733. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +0 -0
  734. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/vue-DN_0RTcg.js +0 -0
  735. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +0 -0
  736. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +0 -0
  737. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/vyper-CDx5xZoG.js +0 -0
  738. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +0 -0
  739. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/wasm-MzD3tlZU.js +0 -0
  740. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/wenyan-BV7otONQ.js +0 -0
  741. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +0 -0
  742. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +0 -0
  743. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/wit-5i3qLPDT.js +0 -0
  744. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +0 -0
  745. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/xml-sdJ4AIDG.js +0 -0
  746. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/xsl-CtQFsRM5.js +0 -0
  747. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/yaml-Buea-lGh.js +0 -0
  748. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +0 -0
  749. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/assets/zig-VOosw3JB.js +0 -0
  750. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
  751. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
  752. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
  753. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
  754. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
  755. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
  756. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
  757. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
  758. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
  759. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
  760. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
  761. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
  762. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
  763. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
  764. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
  765. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
  766. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
  767. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
  768. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
  769. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
  770. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
  771. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
  772. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/static/logo.png +0 -0
  773. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/store/__init__.py +0 -0
  774. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/web/store/sessions.py +0 -0
  775. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/wire/__init__.py +0 -0
  776. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/wire/file.py +0 -0
  777. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
  778. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/wire/protocol.py +0 -0
  779. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/wire/root_hub.py +0 -0
  780. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/wire/serde.py +0 -0
  781. {pythinker_code-2.2.1 → pythinker_code-2.4.0}/src/pythinker_code/wire/server.py +0 -0
  782. {pythinker_code-2.2.1 → pythinker_code-2.4.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: 2.2.1
3
+ Version: 2.4.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
@@ -33,9 +33,9 @@ Requires-Dist: ripgrepy==2.2.0
33
33
  Requires-Dist: streamingjson==0.0.5
34
34
  Requires-Dist: trafilatura==2.0.0
35
35
  Requires-Dist: lxml==6.0.2
36
- Requires-Dist: tenacity==9.1.2
36
+ Requires-Dist: tenacity==9.1.4
37
37
  Requires-Dist: fastmcp==2.12.5
38
- Requires-Dist: pydantic==2.12.5
38
+ Requires-Dist: pydantic==2.13.4
39
39
  Requires-Dist: httpx[socks]==0.28.1
40
40
  Requires-Dist: pythinker-host==1.0.0
41
41
  Requires-Dist: batrachian-toad==0.5.23 ; python_full_version >= '3.14'
@@ -110,6 +110,32 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
110
110
 
111
111
  ---
112
112
 
113
+ ## 🆕 What's New in 2.4.0
114
+
115
+ Subagent roles overhaul, Moonshot/Kimi K2 provider support, and a ripgrep-free Grep fallback.
116
+
117
+ - **New subagents** — `implementer` (scoped edits + verification), `review` (severity-scored read-only review), and `verifier` (`PASS` / `FAIL` / `FLAKY` validation runner). Join the existing `coder` / `explore` / `plan` roster.
118
+ - **Structured subagent output** — every default agent now answers with `### SUMMARY / EVIDENCE / CHANGES / RISKS / BLOCKERS`, so the parent agent can consume results without re-parsing prose. New recommended flow: **Scout → Plan → Implement → Review → Verify** (review and verify can run in parallel).
119
+ - **Kimi K2.5 / K2.6 (Moonshot) support** — `--thinking` is routed via the provider-specific `thinking.type` body field, and assistant tool-call replays always carry `reasoning_content` so multi-step tool flows stop tripping Moonshot's strict thinking-replay check. Same hardening applied to DeepSeek's strict mode.
120
+ - **`Grep` works without `rg`** — pure-Python fallback honors `pattern` / `glob` / `type` / `ignore_case` / `multiline` / `context` / `output_mode` / `offset` / `head_limit` and respects `.gitignore`. The downloader also retries against the upstream GitHub releases mirror and accepts `PYTHINKER_RG_PATH=/absolute/path` plus extra discovery paths (`~/.cargo/bin`, `~/.local/bin`, `~/.pi/agent/bin`, `/usr/bin`, `/usr/local/bin`).
121
+ - **`AGENTS.md` rewritten** to match the new roster, and `tools/agent/description.md` documents the parallel-review and cross-check patterns.
122
+
123
+ Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.4.0`.
124
+
125
+ ### What was new in 2.3.0
126
+
127
+ ## 🆕 What's New in 2.3.0
128
+
129
+ Telemetry & observability audit on top of 2.2.1.
130
+
131
+ - **38 silent-catch sites instrumented** — tool failures, OAuth errors, MCP hiccups, hook callbacks, subagent crashes now surface in Bugsink + SigNoz.
132
+ - **`/report-error` slash command** — user-invoked complement to automatic capture.
133
+ - **OTel trace sampling tunable** — `PYTHINKER_OTEL_TRACE_SAMPLE_RATE` for operators running their own collector.
134
+ - **`pythinker.mcp.call` span** with `mcp.server` attribute.
135
+ - **`docs/en/reference/telemetry.md`** documents the full contract.
136
+
137
+ ### What was new in 2.2.1
138
+
113
139
  ## 🆕 What's New in 2.2.1
114
140
 
115
141
  CI hardening on top of 2.2.0.
@@ -117,8 +143,6 @@ CI hardening on top of 2.2.0.
117
143
  - **macOS binary build is now optional-codesign** — the release workflow detects whether `APPLE_CERTIFICATE_P12` / `APPLE_NOTARIZATION_KEY_P8` repo secrets are set. When they aren't (the v2.2.0 case), it ships an ad-hoc-signed PyInstaller binary instead of failing the whole release. PyPI install (`pip install pythinker-code`) is unaffected.
118
144
  - **PyPI publish is idempotent** — `pypa/gh-action-pypi-publish` now runs with `skip-existing: true`, so re-running the release workflow against an already-published version is a no-op.
119
145
 
120
- Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.2.1`.
121
-
122
146
  ### What was new in 2.2.0
123
147
 
124
148
  Animated installer + Windows PATH automation, on top of 2.1.2.
@@ -48,6 +48,32 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
48
48
 
49
49
  ---
50
50
 
51
+ ## 🆕 What's New in 2.4.0
52
+
53
+ Subagent roles overhaul, Moonshot/Kimi K2 provider support, and a ripgrep-free Grep fallback.
54
+
55
+ - **New subagents** — `implementer` (scoped edits + verification), `review` (severity-scored read-only review), and `verifier` (`PASS` / `FAIL` / `FLAKY` validation runner). Join the existing `coder` / `explore` / `plan` roster.
56
+ - **Structured subagent output** — every default agent now answers with `### SUMMARY / EVIDENCE / CHANGES / RISKS / BLOCKERS`, so the parent agent can consume results without re-parsing prose. New recommended flow: **Scout → Plan → Implement → Review → Verify** (review and verify can run in parallel).
57
+ - **Kimi K2.5 / K2.6 (Moonshot) support** — `--thinking` is routed via the provider-specific `thinking.type` body field, and assistant tool-call replays always carry `reasoning_content` so multi-step tool flows stop tripping Moonshot's strict thinking-replay check. Same hardening applied to DeepSeek's strict mode.
58
+ - **`Grep` works without `rg`** — pure-Python fallback honors `pattern` / `glob` / `type` / `ignore_case` / `multiline` / `context` / `output_mode` / `offset` / `head_limit` and respects `.gitignore`. The downloader also retries against the upstream GitHub releases mirror and accepts `PYTHINKER_RG_PATH=/absolute/path` plus extra discovery paths (`~/.cargo/bin`, `~/.local/bin`, `~/.pi/agent/bin`, `/usr/bin`, `/usr/local/bin`).
59
+ - **`AGENTS.md` rewritten** to match the new roster, and `tools/agent/description.md` documents the parallel-review and cross-check patterns.
60
+
61
+ Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.4.0`.
62
+
63
+ ### What was new in 2.3.0
64
+
65
+ ## 🆕 What's New in 2.3.0
66
+
67
+ Telemetry & observability audit on top of 2.2.1.
68
+
69
+ - **38 silent-catch sites instrumented** — tool failures, OAuth errors, MCP hiccups, hook callbacks, subagent crashes now surface in Bugsink + SigNoz.
70
+ - **`/report-error` slash command** — user-invoked complement to automatic capture.
71
+ - **OTel trace sampling tunable** — `PYTHINKER_OTEL_TRACE_SAMPLE_RATE` for operators running their own collector.
72
+ - **`pythinker.mcp.call` span** with `mcp.server` attribute.
73
+ - **`docs/en/reference/telemetry.md`** documents the full contract.
74
+
75
+ ### What was new in 2.2.1
76
+
51
77
  ## 🆕 What's New in 2.2.1
52
78
 
53
79
  CI hardening on top of 2.2.0.
@@ -55,8 +81,6 @@ CI hardening on top of 2.2.0.
55
81
  - **macOS binary build is now optional-codesign** — the release workflow detects whether `APPLE_CERTIFICATE_P12` / `APPLE_NOTARIZATION_KEY_P8` repo secrets are set. When they aren't (the v2.2.0 case), it ships an ad-hoc-signed PyInstaller binary instead of failing the whole release. PyPI install (`pip install pythinker-code`) is unaffected.
56
82
  - **PyPI publish is idempotent** — `pypa/gh-action-pypi-publish` now runs with `skip-existing: true`, so re-running the release workflow against an already-published version is a no-op.
57
83
 
58
- Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.2.1`.
59
-
60
84
  ### What was new in 2.2.0
61
85
 
62
86
  Animated installer + Windows PATH automation, on top of 2.1.2.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pythinker-code"
3
- version = "2.2.1"
3
+ version = "2.4.0"
4
4
  description = "Pythinker Code is your next CLI agent."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -38,9 +38,9 @@ dependencies = [
38
38
  "trafilatura==2.0.0",
39
39
  # lxml is used by trafilatura/htmldate/justext; keep pinned for binary wheels.
40
40
  "lxml==6.0.2",
41
- "tenacity==9.1.2",
41
+ "tenacity==9.1.4",
42
42
  "fastmcp==2.12.5",
43
- "pydantic==2.12.5",
43
+ "pydantic==2.13.4",
44
44
  "httpx[socks]==0.28.1",
45
45
  "pythinker-host==1.0.0",
46
46
  "batrachian-toad==0.5.23; python_version >= \"3.14\"",
@@ -73,7 +73,7 @@ dev = [
73
73
  ]
74
74
 
75
75
  [build-system]
76
- requires = ["uv_build>=0.8.5,<0.10.0"]
76
+ requires = ["uv_build>=0.8.5,<0.12.0"]
77
77
  build-backend = "uv_build"
78
78
 
79
79
  [tool.uv.build-backend]
@@ -2,6 +2,41 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 2.4.0 (2026-05-11)
6
+
7
+ Subagent roles overhaul, Moonshot/Kimi K2 provider support, and a ripgrep-free Grep fallback.
8
+
9
+ - New built-in subagents under `src/pythinker_code/agents/default/`:
10
+ - `implementer.yaml` — scoped code changes with minimum surrounding edits and a quick verification pass.
11
+ - `review.yaml` — read-only code review with severity-scored findings (BLOCKER / MAJOR / MINOR / NIT).
12
+ - `verifier.yaml` — read-only validation runner that reports `PASS` / `FAIL` / `FLAKY` without applying fixes.
13
+ - `coder.yaml`, `explore.yaml`, and `plan.yaml` now emit a standard `### SUMMARY / EVIDENCE / CHANGES / RISKS / BLOCKERS` response contract so the parent agent can consume subagent output without re-parsing prose.
14
+ - `agent.yaml` registers the three new roles; `tools/agent/description.md` documents the Scout → Plan → Implement → Review → Verify workflow and the parallel review/verification pattern.
15
+ - `agents/default/system.md`: adds decomposition guidance (preview → todo list → parallel chunks), enforces post-tool-call verification before acting on results, and tells the agent to cross-check at least one load-bearing subagent finding before editing from it.
16
+ - Kimi K2.5 / K2.6 (Moonshot) and other strict interleaved-thinking providers:
17
+ - `packages/pythinker-core/.../chat_provider/pythinker.py`: always emit `reasoning_content` on assistant tool-call replays so Moonshot's "thinking is enabled but reasoning_content is missing in assistant tool call message at index N" error no longer trips multi-step tool flows.
18
+ - `packages/pythinker-core/.../contrib/chat_provider/openai_legacy.py`: replay reasoning metadata on every assistant turn for `kimi-k2*` / `deepseek*` models (falls back to the assistant text or `"[reasoning unavailable]"` when reasoning content was not retained).
19
+ - `src/pythinker_code/llm.py`: route Kimi K2 thinking through the provider-specific `extra_body={"thinking": {"type": "enabled"|"disabled"}}` body field instead of OpenAI's `reasoning_effort` (which Kimi ignores), and persist `LLM.thinking` across `clone_llm_with_model_alias` so model switches preserve the user's thinking choice.
20
+ - `tools/file/grep_local.py`:
21
+ - Pure-Python `rg`-free fallback (`_python_grep`) honoring `pattern`, `path`, `glob`, `type` (bash / c / cpp / go / java / js / json / md / py / rust / sh / toml / ts / txt / yaml / zsh), `ignore_case`, `multiline`, `context` / `before_context` / `after_context`, `line_number`, `output_mode` (`content` / `files_with_matches` / `count_matches`), `offset`, `head_limit`, and the standard sensitive-file redaction. `.gitignore` / `.ignore` and the VCS metadata directories (`.git`, `.svn`, `.hg`, `.bzr`, `.jj`, `.sl`) are respected unless `include_ignored=true`.
22
+ - `_find_existing_rg` now honors `PYTHINKER_RG_PATH` and additionally probes `/usr/bin`, `/usr/local/bin`, `~/.cargo/bin`, `~/.local/bin`, and `~/.pi/agent/bin` before falling through to download.
23
+ - Downloader retries against the upstream GitHub releases mirror (`https://github.com/BurntSushi/ripgrep/releases/download/<version>/...`) when the CDN mirror is unreachable, and the failure path now degrades into the Python fallback instead of raising.
24
+ - `.gitignore`: ignore `graphify-out*/`, `.graphify_*.json`, `.graphify_*.txt`, and the local `blackbox/` scratch area.
25
+ - `AGENTS.md` rewritten to reflect the new subagent roster and workflow.
26
+
27
+ ## 2.3.0 (2026-05-09)
28
+
29
+ Telemetry & observability audit.
30
+
31
+ - New `pythinker_code/telemetry/errors.py` helper `report_handled_error(exc, *, site, tool=None, **attrs)` forwards caught-and-rendered exceptions to both Sentry/Bugsink and the OTel `error` event stream. Both forwarding paths are `contextlib.suppress`-wrapped so monitoring can never break the host program.
32
+ - 38 silent-catch sites instrumented across `tools/`, `auth/`, `soul/`, `acp/`, `hooks/`, `subagents/`. Tool failures, OAuth errors, MCP server hiccups, hook callback failures, and subagent crashes now reach Bugsink and SigNoz.
33
+ - `pythinker_code/telemetry/otel.py`: TracerProvider now uses `ParentBased(TraceIdRatioBased(rate))` driven by `PYTHINKER_OTEL_TRACE_SAMPLE_RATE` (default 1.0).
34
+ - New `pythinker.mcp.call` span around every MCPTool RPC.
35
+ - New `/report-error` slash command (aliases `/report`, `/report-error`).
36
+ - `docs/en/reference/telemetry.md` documents the full telemetry contract.
37
+ - `chore(test)`: updated google-genai snapshot for pydantic 2.13.4 + google-genai 2.0.0.
38
+
39
+
5
40
  ## 2.2.1 (2026-05-09)
6
41
 
7
42
  CI hardening: macOS binary build is now optional-codesign.
@@ -148,6 +148,9 @@ class ACPProcess:
148
148
  )
149
149
  self._feed_output(final_output)
150
150
  except Exception as exc:
151
+ from pythinker_code.telemetry.errors import report_handled_error
152
+
153
+ report_handled_error(exc, site="acp.host.terminal")
151
154
  error_note = f"[acp terminal error] {exc}\n"
152
155
  self._stdout.feed_data(error_note.encode("utf-8", "replace"))
153
156
  if exit_code is None:
@@ -233,6 +233,9 @@ class ACPSession:
233
233
  logger.info("Prompt cancelled by user")
234
234
  return acp.PromptResponse(stop_reason="cancelled")
235
235
  except Exception as e:
236
+ from pythinker_code.telemetry.errors import report_handled_error
237
+
238
+ report_handled_error(e, site="acp.session.prompt")
236
239
  logger.exception("Unexpected error during prompt:")
237
240
  raise acp.RequestError.internal_error({"error": str(e)}) from e
238
241
  finally:
@@ -461,7 +464,10 @@ class ACPSession:
461
464
  # cancelled
462
465
  logger.debug("Permission request cancelled for: {action}", action=request.action)
463
466
  request.resolve("reject")
464
- except Exception:
467
+ except Exception as exc:
468
+ from pythinker_code.telemetry.errors import report_handled_error
469
+
470
+ report_handled_error(exc, site="acp.session.approval")
465
471
  logger.exception("Error handling approval request:")
466
472
  # On error, reject the request
467
473
  request.resolve("reject")
@@ -34,3 +34,12 @@ agent:
34
34
  plan:
35
35
  path: ./plan.yaml
36
36
  description: "Read-only implementation planning and architecture design."
37
+ review:
38
+ path: ./review.yaml
39
+ description: "Read-only code review with severity-scored findings."
40
+ implementer:
41
+ path: ./implementer.yaml
42
+ description: "Scoped implementation with minimal edits and verification."
43
+ verifier:
44
+ path: ./verifier.yaml
45
+ description: "Read-only validation runner for tests, lint, and builds."
@@ -4,6 +4,22 @@ agent:
4
4
  system_prompt_args:
5
5
  ROLE_ADDITIONAL: |
6
6
  You are now running as a subagent. All the `user` messages are sent by the main agent. The main agent cannot see your context, it can only see your last message when you finish the task. You must treat the parent agent as your caller. Do not directly ask the end user questions. If something is unclear, explain the ambiguity in your final summary to the parent agent.
7
+
8
+ Stay tightly scoped to exactly what the parent assigned. Do not expand into adjacent cleanup or refactors. If you discover related work, surface it under RISKS or BLOCKERS rather than doing it.
9
+
10
+ Before editing, read the target files and confirm the line ranges/patterns you will change. Prefer the minimum edit that satisfies the brief. After edits, run the smallest relevant verification command available and report the result.
11
+
12
+ Final response contract:
13
+ ### SUMMARY
14
+ One paragraph with what you did and the outcome.
15
+ ### EVIDENCE
16
+ Bullet list of concrete file paths, command results, or observed errors that support the outcome.
17
+ ### CHANGES
18
+ Bullet list of every file you modified, or `None.` if read-only.
19
+ ### RISKS
20
+ Bullet list of remaining risks or `None observed.`.
21
+ ### BLOCKERS
22
+ Bullet list of anything that stopped completion, or `None.`.
7
23
  when_to_use: |
8
24
  Use this agent for non-trivial software engineering work that may require reading files, editing code, running commands, and returning a compact but technically complete summary to the parent agent.
9
25
  allowed_tools:
@@ -5,7 +5,7 @@ agent:
5
5
  ROLE_ADDITIONAL: |
6
6
  You are now running as a subagent. All the `user` messages are sent by the main agent. The main agent cannot see your context, it can only see your last message when you finish the task. You must treat the parent agent as your caller. Do not directly ask the end user questions. If something is unclear, explain the ambiguity in your final summary to the parent agent.
7
7
 
8
- You are a codebase exploration specialist. Your role is EXCLUSIVELY to search, read, and analyze existing code and resources. You do NOT have access to file editing tools.
8
+ You are a codebase exploration specialist. Your role is EXCLUSIVELY to search, read, and analyze existing code and resources. You do NOT have access to file editing tools. If the task appears to require a write, stop and put the gap under BLOCKERS.
9
9
 
10
10
  Your strengths:
11
11
  - Rapidly finding files using glob patterns
@@ -24,7 +24,19 @@ agent:
24
24
 
25
25
  If the prompt includes a <git-context> block, use it to orient yourself about the repository state before starting your investigation.
26
26
 
27
- You are meant to be a fast agent. Complete the search request efficiently and report your findings clearly in a structured format.
27
+ You are meant to be a fast agent. Complete the search request efficiently and report your findings clearly in a structured format. EVIDENCE is the load-bearing section: cite each important finding as `path:line-range` when possible, and stop once you have enough evidence rather than exhaustively reading the whole repository.
28
+
29
+ Final response contract:
30
+ ### SUMMARY
31
+ One paragraph with the headline answer.
32
+ ### EVIDENCE
33
+ Bullet list of concrete file paths, line ranges, search hits, and command results.
34
+ ### CHANGES
35
+ Always write `None.`.
36
+ ### RISKS
37
+ Bullet list of uncertainties or `None observed.`.
38
+ ### BLOCKERS
39
+ Bullet list of missing context/capabilities or `None.`.
28
40
  when_to_use: |
29
41
  Fast agent specialized for exploring codebases. Use this when you need to quickly find files by patterns (e.g. "src/**/*.yaml"), search code for keywords (e.g. "database connection"), or answer questions about the codebase (e.g. "how does the auth module work?"). When calling this agent, specify the desired thoroughness level: "quick" for basic searches, "medium" for moderate exploration, or "thorough" for comprehensive analysis across multiple locations and naming conventions. Use this agent for any read-only exploration that will clearly require more than 3 tool calls. Prefer launching multiple explore agents concurrently when investigating independent questions.
30
42
  allowed_tools:
@@ -0,0 +1,45 @@
1
+ version: 1
2
+ agent:
3
+ extend: ./agent.yaml
4
+ system_prompt_args:
5
+ ROLE_ADDITIONAL: |
6
+ You are now running as a subagent. All the `user` messages are sent by the main agent. The main agent cannot see your context, it can only see your last message when you finish the task. Treat the parent agent as your caller. Do not directly ask the end user questions.
7
+
8
+ You are an implementation specialist. Land exactly the change the parent assigned with the minimum surrounding edit. Do not refactor adjacent code, rename unrelated variables, tidy files, or expand scope. Put related follow-up work under RISKS or BLOCKERS instead.
9
+
10
+ Method:
11
+ - Read target files before editing.
12
+ - Prefer StrReplaceFile for narrow changes; use WriteFile only for new files or intentional full rewrites.
13
+ - Add or update tests when the brief requires behavior changes and the project has relevant tests.
14
+ - After edits, run the smallest relevant verification command and report pass/fail evidence.
15
+
16
+ Final response contract:
17
+ ### SUMMARY
18
+ One paragraph with what changed and the verification outcome.
19
+ ### EVIDENCE
20
+ Bullet list of file reads, command results, and test/lint evidence.
21
+ ### CHANGES
22
+ Bullet list of every modified path with a one-line reason.
23
+ ### RISKS
24
+ Bullet list of remaining risks or `None observed.`.
25
+ ### BLOCKERS
26
+ Bullet list of anything that stopped completion, or `None.`.
27
+ when_to_use: |
28
+ Use this agent when the required code change is already specified and should be implemented with minimal edits and a quick verification pass.
29
+ allowed_tools:
30
+ - "pythinker_code.tools.shell:Shell"
31
+ - "pythinker_code.tools.file:ReadFile"
32
+ - "pythinker_code.tools.file:ReadMediaFile"
33
+ - "pythinker_code.tools.file:Glob"
34
+ - "pythinker_code.tools.file:Grep"
35
+ - "pythinker_code.tools.file:WriteFile"
36
+ - "pythinker_code.tools.file:StrReplaceFile"
37
+ - "pythinker_code.tools.web:SearchWeb"
38
+ - "pythinker_code.tools.web:FetchURL"
39
+ exclude_tools:
40
+ - "pythinker_code.tools.agent:Agent"
41
+ - "pythinker_code.tools.ask_user:AskUserQuestion"
42
+ - "pythinker_code.tools.todo:SetTodoList"
43
+ - "pythinker_code.tools.plan:ExitPlanMode"
44
+ - "pythinker_code.tools.plan.enter:EnterPlanMode"
45
+ subagents:
@@ -5,10 +5,21 @@ agent:
5
5
  ROLE_ADDITIONAL: |
6
6
  You are now running as a subagent. All the `user` messages are sent by the main agent. The main agent cannot see your context, it can only see your last message when you finish the task. You must treat the parent agent as your caller. Do not directly ask the end user questions. If something is unclear, explain the ambiguity in your final summary to the parent agent.
7
7
 
8
- Before designing your implementation plan, consider whether you fully understand the codebase areas relevant to the task. If not, recommend the parent agent to use the explore agent (subagent_type="explore") to investigate key questions first. In your response, clearly state:
9
- 1. What you already know from the information provided
10
- 2. What questions remain unanswered that would benefit from explore agent investigation
11
- 3. Your implementation plan (either preliminary if questions remain, or final if sufficient context exists)
8
+ Before designing your implementation plan, consider whether you fully understand the codebase areas relevant to the task. If not, recommend the parent agent to use the explore agent (subagent_type="explore") to investigate key questions first.
9
+
10
+ Ground the plan in evidence. Read enough files to avoid guessing, name the trade-offs, and choose one path with a reason. Each step should name the artifact it changes and the verification that proves it worked. Order steps by dependency first, then by risk reduced per effort.
11
+
12
+ Final response contract:
13
+ ### SUMMARY
14
+ One paragraph with the recommended plan and why.
15
+ ### EVIDENCE
16
+ Bullet list of concrete file paths, line ranges, docs, or search hits that shaped the plan.
17
+ ### CHANGES
18
+ Always write `None.` unless you wrote a plan artifact.
19
+ ### RISKS
20
+ Bullet list of trade-offs, unknowns, or rollout risks.
21
+ ### BLOCKERS
22
+ Bullet list of questions that must be answered before execution, or `None.`.
12
23
  when_to_use: |
13
24
  Use this agent when the parent agent needs a step-by-step implementation plan, key file identification, and architectural trade-off analysis before code changes are made.
14
25
  allowed_tools:
@@ -0,0 +1,46 @@
1
+ version: 1
2
+ agent:
3
+ extend: ./agent.yaml
4
+ system_prompt_args:
5
+ ROLE_ADDITIONAL: |
6
+ You are now running as a subagent. All the `user` messages are sent by the main agent. The main agent cannot see your context, it can only see your last message when you finish the task. Treat the parent agent as your caller. Do not directly ask the end user questions.
7
+
8
+ You are a code review specialist. Your job is to read the requested diff/files and emit severity-scored findings. You are read-only by convention: do not patch code even if the fix is obvious. Describe the fix so the parent can dispatch an implementer.
9
+
10
+ Method:
11
+ - Read the diff or target files before scoring.
12
+ - Use Grep/Glob to check sibling call sites, similar patterns, and existing tests.
13
+ - Score each finding as BLOCKER, MAJOR, MINOR, or NIT.
14
+ - Order findings by severity, BLOCKER first.
15
+ - Be constructive: cite failure modes and evidence, not author intent.
16
+
17
+ Final response contract:
18
+ ### SUMMARY
19
+ One paragraph. If there are no MAJOR/BLOCKER issues, say that plainly.
20
+ ### EVIDENCE
21
+ Bullet list. Format review findings as `[SEVERITY] path:line-range — issue; suggested fix`.
22
+ ### CHANGES
23
+ Always write `None.`.
24
+ ### RISKS
25
+ Bullet list of residual review limitations or `None observed.`.
26
+ ### BLOCKERS
27
+ Bullet list of missing context/capabilities or `None.`.
28
+ when_to_use: |
29
+ Use this agent for read-only code review after changes are made or when the parent needs severity-scored findings before deciding what to fix.
30
+ allowed_tools:
31
+ - "pythinker_code.tools.shell:Shell"
32
+ - "pythinker_code.tools.file:ReadFile"
33
+ - "pythinker_code.tools.file:ReadMediaFile"
34
+ - "pythinker_code.tools.file:Glob"
35
+ - "pythinker_code.tools.file:Grep"
36
+ - "pythinker_code.tools.web:SearchWeb"
37
+ - "pythinker_code.tools.web:FetchURL"
38
+ exclude_tools:
39
+ - "pythinker_code.tools.agent:Agent"
40
+ - "pythinker_code.tools.ask_user:AskUserQuestion"
41
+ - "pythinker_code.tools.todo:SetTodoList"
42
+ - "pythinker_code.tools.plan:ExitPlanMode"
43
+ - "pythinker_code.tools.plan.enter:EnterPlanMode"
44
+ - "pythinker_code.tools.file:WriteFile"
45
+ - "pythinker_code.tools.file:StrReplaceFile"
46
+ subagents:
@@ -10,10 +10,26 @@ The user's messages may contain questions and/or task descriptions in natural la
10
10
 
11
11
  When handling the user's request, if it involves creating, modifying, or running code or files, you MUST use the appropriate tools (e.g., `WriteFile`, `Shell`) to make actual changes — do not just describe the solution in text. For questions that only need an explanation, you may reply in text directly. When calling tools, do not provide explanations because the tool calls themselves should be self-explanatory. You MUST follow the description of each tool and its parameters when calling tools.
12
12
 
13
- If the `Agent` tool is available, you can use it to delegate a focused subtask to a subagent instance. The tool can either start a new instance or resume an existing one by `agent_id`. Subagent instances are persistent session objects with their own context history. When delegating, provide a complete prompt with all necessary context because a newly created subagent instance does not automatically see your current context. If an existing subagent already has useful context or the task clearly continues its prior work, prefer resuming it instead of creating a new instance. Default to foreground subagents. Use `run_in_background=true` only when there is a clear benefit to letting the conversation continue before the subagent finishes, and you do not need the result immediately to decide your next step.
13
+ If the `Agent` tool is available, you can use it to delegate a focused subtask to a subagent instance. Treat subagents as focused roles, not just extra capacity: use `explore` for read-only mapping, `plan` for strategy, `coder` or `implementer` for scoped edits, `review` for severity-scored critique, and `verifier` for validation gates. The tool can either start a new instance or resume an existing one by `agent_id`. Subagent instances are persistent session objects with their own context history. When delegating, provide a complete prompt with all necessary context because a newly created subagent instance does not automatically see your current context. If an existing subagent already has useful context or the task clearly continues its prior work, prefer resuming it instead of creating a new instance. Default to foreground subagents. Use `run_in_background=true` only when there is a clear benefit to letting the conversation continue before the subagent finishes, and you do not need the result immediately to decide your next step. Spawn multiple subagents in the same turn when they can investigate independent regions concurrently.
14
14
 
15
15
  You have the capability to output any number of tool calls in a single response. If you anticipate making multiple non-interfering tool calls, you are HIGHLY RECOMMENDED to make them in parallel to significantly improve efficiency. This is very important to your performance.
16
16
 
17
+ For any non-trivial request, decompose before acting:
18
+
19
+ - Preview the terrain first: scan the directory structure, file headers, and relevant module boundaries before choosing an implementation path.
20
+ - Use `SetTodoList` for multi-step work so the user can see the active plan and progress.
21
+ - Split broad work into independent chunks; use parallel tool calls or focused subagents for chunks that do not depend on each other.
22
+ - Re-read the plan after each phase and adjust it when new evidence changes the approach.
23
+
24
+ Before every tool response, ask whether another independent read/search/check can run in the same turn. Serializing independent operations wastes time and grows context unnecessarily.
25
+
26
+ After every tool call whose result you will act on, verify the result before proceeding:
27
+
28
+ - File reads: confirm the path and line range you are about to modify match what you read.
29
+ - Searches: confirm the hit is relevant; broad regexes can return false positives.
30
+ - Shell commands: inspect stdout/stderr, not just the exit code.
31
+ - Subagent results: cross-check at least one load-bearing finding against a direct read or deterministic command before making changes from it.
32
+
17
33
  The results of the tool calls will be returned to you in a tool message. You must determine your next action based on the tool call results, which could be one of the following: 1. Continue working on the task, 2. Inform the user that the task is completed or has failed, or 3. Ask the user for more information.
18
34
 
19
35
  The system may insert information wrapped in `<system>` tags within user or tool messages. This information provides supplementary context relevant to the current task — take it into consideration when determining your next action.
@@ -0,0 +1,45 @@
1
+ version: 1
2
+ agent:
3
+ extend: ./agent.yaml
4
+ system_prompt_args:
5
+ ROLE_ADDITIONAL: |
6
+ You are now running as a subagent. All the `user` messages are sent by the main agent. The main agent cannot see your context, it can only see your last message when you finish the task. Treat the parent agent as your caller. Do not directly ask the end user questions.
7
+
8
+ You are a verification specialist. Your job is to run the validation gate the parent requested and report PASS / FAIL / FLAKY with actionable evidence. You are read-only by convention: do not patch failing code, update snapshots, or fix lint. If a fix is obvious, describe it under RISKS.
9
+
10
+ Method:
11
+ - Run the narrowest relevant gate when the parent gives one; otherwise choose the standard project command from AGENTS.md.
12
+ - Capture exact failing assertions, stack traces, and file:line references.
13
+ - Do not run expensive full suites unless requested or clearly necessary.
14
+ - If a result looks flaky, mention how many runs were attempted.
15
+
16
+ Final response contract:
17
+ ### SUMMARY
18
+ Start with `PASS`, `FAIL`, or `FLAKY`, then one paragraph explaining the outcome.
19
+ ### EVIDENCE
20
+ Bullet list of commands, exit codes, important stdout/stderr, and file:line failures.
21
+ ### CHANGES
22
+ Always write `None.`.
23
+ ### RISKS
24
+ Bullet list of likely causes or follow-up fixes, or `None observed.`.
25
+ ### BLOCKERS
26
+ Bullet list of missing dependencies, unavailable commands, or `None.`.
27
+ when_to_use: |
28
+ Use this agent when the parent needs tests, lint, type checks, builds, or other validation gates run and reported without applying fixes.
29
+ allowed_tools:
30
+ - "pythinker_code.tools.shell:Shell"
31
+ - "pythinker_code.tools.file:ReadFile"
32
+ - "pythinker_code.tools.file:ReadMediaFile"
33
+ - "pythinker_code.tools.file:Glob"
34
+ - "pythinker_code.tools.file:Grep"
35
+ exclude_tools:
36
+ - "pythinker_code.tools.agent:Agent"
37
+ - "pythinker_code.tools.ask_user:AskUserQuestion"
38
+ - "pythinker_code.tools.todo:SetTodoList"
39
+ - "pythinker_code.tools.plan:ExitPlanMode"
40
+ - "pythinker_code.tools.plan.enter:EnterPlanMode"
41
+ - "pythinker_code.tools.file:WriteFile"
42
+ - "pythinker_code.tools.file:StrReplaceFile"
43
+ - "pythinker_code.tools.web:SearchWeb"
44
+ - "pythinker_code.tools.web:FetchURL"
45
+ subagents:
@@ -358,6 +358,9 @@ def _load_from_keyring(key: str) -> OAuthToken | None:
358
358
  try:
359
359
  raw = keyring.get_password(KEYRING_SERVICE, key)
360
360
  except Exception as exc:
361
+ from pythinker_code.telemetry.errors import report_handled_error
362
+
363
+ report_handled_error(exc, site="auth.keyring.read")
361
364
  logger.warning("Failed to read token from keyring: {error}", error=exc)
362
365
  return None
363
366
  if not raw:
@@ -632,6 +635,9 @@ async def login_pythinker_code(
632
635
  try:
633
636
  auth = await request_device_authorization()
634
637
  except Exception as exc:
638
+ from pythinker_code.telemetry.errors import report_handled_error
639
+
640
+ report_handled_error(exc, site="auth.oauth.device_authorize")
635
641
  yield OAuthEvent("error", f"Login failed: {exc}")
636
642
  return
637
643
 
@@ -680,6 +686,9 @@ async def login_pythinker_code(
680
686
  yield OAuthEvent("info", "Device code expired, restarting login...")
681
687
  continue
682
688
  except Exception as exc:
689
+ from pythinker_code.telemetry.errors import report_handled_error
690
+
691
+ report_handled_error(exc, site="auth.oauth.device_poll")
683
692
  yield OAuthEvent("error", f"Login failed: {exc}")
684
693
  return
685
694
  break
@@ -692,6 +701,9 @@ async def login_pythinker_code(
692
701
  try:
693
702
  models = await list_models(platform, token.access_token)
694
703
  except Exception as exc:
704
+ from pythinker_code.telemetry.errors import report_handled_error
705
+
706
+ report_handled_error(exc, site="auth.models.fetch")
695
707
  logger.error("Failed to get models: {error}", error=exc)
696
708
  yield OAuthEvent("error", f"Failed to get models: {exc}")
697
709
  return
@@ -947,6 +959,9 @@ class OAuthManager:
947
959
  try:
948
960
  await self.ensure_fresh(runtime, force=force)
949
961
  except Exception as exc:
962
+ from pythinker_code.telemetry.errors import report_handled_error
963
+
964
+ report_handled_error(exc, site="auth.oauth.refresh.background")
950
965
  logger.warning(
951
966
  "Failed to refresh OAuth token in background: {error}",
952
967
  error=exc,
@@ -1071,6 +1086,9 @@ class OAuthManager:
1071
1086
  except Exception as exc:
1072
1087
  if force:
1073
1088
  raise
1089
+ from pythinker_code.telemetry.errors import report_handled_error
1090
+
1091
+ report_handled_error(exc, site="auth.oauth.refresh")
1074
1092
  logger.warning("Failed to refresh OAuth token: {error}", error=exc)
1075
1093
  from pythinker_code.telemetry import track
1076
1094
 
@@ -612,6 +612,9 @@ async def _finish_chatgpt_login(
612
612
  models = await _discover_chatgpt_models(token.access_token)
613
613
  selected_model, thinking = _select_default_openai_model(models)
614
614
  except Exception as exc:
615
+ from pythinker_code.telemetry.errors import report_handled_error
616
+
617
+ report_handled_error(exc, site="auth.openai.discover_chatgpt_models")
615
618
  yield OAuthEvent("error", f"Failed to discover OpenAI ChatGPT models: {exc}")
616
619
  return
617
620
 
@@ -649,6 +652,9 @@ async def login_openai_browser(
649
652
  code, verifier, redirect_uri = await _wait_for_browser_code(open_browser=open_browser)
650
653
  token_payload = await _exchange_code_for_tokens(code, verifier, redirect_uri)
651
654
  except Exception as exc:
655
+ from pythinker_code.telemetry.errors import report_handled_error
656
+
657
+ report_handled_error(exc, site="auth.openai.browser_login")
652
658
  yield OAuthEvent("error", f"OpenAI browser login failed: {exc}")
653
659
  return
654
660
 
@@ -667,6 +673,9 @@ async def login_openai_headless(config: Config) -> AsyncIterator[OAuthEvent]:
667
673
  try:
668
674
  device_code = await _request_device_code()
669
675
  except Exception as exc:
676
+ from pythinker_code.telemetry.errors import report_handled_error
677
+
678
+ report_handled_error(exc, site="auth.openai.device_start")
670
679
  yield OAuthEvent("error", f"Failed to start OpenAI device login: {exc}")
671
680
  return
672
681
 
@@ -688,6 +697,9 @@ async def login_openai_headless(config: Config) -> AsyncIterator[OAuthEvent]:
688
697
  OPENAI_DEVICE_REDIRECT_URI,
689
698
  )
690
699
  except Exception as exc:
700
+ from pythinker_code.telemetry.errors import report_handled_error
701
+
702
+ report_handled_error(exc, site="auth.openai.device_poll")
691
703
  yield OAuthEvent("error", f"OpenAI device login failed: {exc}")
692
704
  return
693
705
 
@@ -248,6 +248,9 @@ async def refresh_managed_models(config: Config) -> bool:
248
248
  try:
249
249
  await oauth_manager.ensure_fresh()
250
250
  except Exception as exc:
251
+ from pythinker_code.telemetry.errors import report_handled_error
252
+
253
+ report_handled_error(exc, site="auth.platforms.refresh.pre_sync")
251
254
  logger.warning(
252
255
  "Failed to refresh OAuth token before model sync for {platform}: {error}",
253
256
  platform=platform_id,
@@ -281,6 +284,9 @@ async def refresh_managed_models(config: Config) -> bool:
281
284
  try:
282
285
  await oauth_manager.ensure_fresh(force=True)
283
286
  except Exception as exc2:
287
+ from pythinker_code.telemetry.errors import report_handled_error
288
+
289
+ report_handled_error(exc2, site="auth.platforms.refresh.after_401")
284
290
  refresh_exc = exc2
285
291
  logger.warning(
286
292
  "Failed to refresh OAuth token after 401 for {platform}: {error}",
@@ -323,6 +329,9 @@ async def refresh_managed_models(config: Config) -> bool:
323
329
  changed = True
324
330
  continue
325
331
  except Exception as exc:
332
+ from pythinker_code.telemetry.errors import report_handled_error
333
+
334
+ report_handled_error(exc, site="auth.platforms.sync")
326
335
  fallback_models = _fallback_or_log(platform_id=platform_id, error=exc)
327
336
  if fallback_models is None:
328
337
  continue