pythinker-code 2.2.1__tar.gz → 2.3.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 (779) hide show
  1. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/PKG-INFO +18 -4
  2. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/README.md +15 -1
  3. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/pyproject.toml +4 -4
  4. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/CHANGELOG.md +13 -0
  5. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/acp/host.py +3 -0
  6. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/acp/session.py +7 -1
  7. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/auth/oauth.py +18 -0
  8. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/auth/openai.py +12 -0
  9. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/auth/platforms.py +9 -0
  10. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/hooks/engine.py +13 -1
  11. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/hooks/runner.py +3 -0
  12. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/btw.py +6 -0
  13. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/pythinkersoul.py +34 -4
  14. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/toolset.py +42 -13
  15. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/subagents/runner.py +7 -1
  16. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/telemetry/config.py +29 -0
  17. pythinker_code-2.3.0/src/pythinker_code/telemetry/errors.py +107 -0
  18. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/telemetry/otel.py +24 -2
  19. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/agent/__init__.py +3 -0
  20. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/ask_user/__init__.py +4 -1
  21. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/glob.py +3 -0
  22. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/grep_local.py +3 -0
  23. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/read.py +3 -0
  24. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/read_media.py +3 -0
  25. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/replace.py +3 -0
  26. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/write.py +3 -0
  27. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/plan/__init__.py +4 -1
  28. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/plan/enter.py +4 -1
  29. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/shell/__init__.py +6 -0
  30. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/slash.py +121 -0
  31. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/_baseUniq-D7qiASUy.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/_baseUniq-DYwtr3m4.js +1 -1
  32. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/arc-G4WaEU6H.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/arc-CNhBgyVb.js +1 -1
  33. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-CcYeuWPi.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-DpvaxB3Y.js +1 -1
  34. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-DWIqpSyD.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-IlYHIkrW.js +1 -1
  35. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-BLk0cKfQ.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-D_jGrUIu.js +1 -1
  36. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/channel-BPOuE91b.js +1 -0
  37. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-ChVR7Ju_.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-uYRqFG6q.js +1 -1
  38. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-55IACEB6-DEiz531X.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-5K_8Tvtf.js +1 -1
  39. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-QjrqjAAP.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-BAp2tokd.js +1 -1
  40. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-Bw4GqGyI.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-C3ICALbg.js +1 -1
  41. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-bEv-7epi.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-B3ntDoat.js +1 -1
  42. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-QN33PNHL-DOmXNpah.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-Dy8y3fp6.js +1 -1
  43. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-D-6zUU9h.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-BXmiK1aE.js +1 -1
  44. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-CfuYCubo.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-BbI6RHhP.js +1 -1
  45. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-C1S9FRV4.js +1 -0
  46. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-C1S9FRV4.js +1 -0
  47. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/clone-D2vuslet.js +1 -0
  48. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-DsAmzUoy.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-C09u1ZPS.js +1 -1
  49. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-aT1O0X9J.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-OfdgQa9b.js +1 -1
  50. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/cytoscape.esm-B4IyJ4dz.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/cytoscape.esm-BHPoE92Y.js +1 -1
  51. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-DaTedwqX.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-Dqsjg8sJ.js +1 -1
  52. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-BykkJf3F.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-DxkId0Z8.js +1 -1
  53. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-Dui_gc9d.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-CkPNihvj.js +1 -1
  54. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-B7DmELTs.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-C_N5Jjql.js +1 -1
  55. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-C_CHmY_j.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-C8_5yrCr.js +1 -1
  56. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-BLZZYAxJ.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-BfV7xDb8.js +1 -1
  57. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-Cb4lBZT4.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-Cld5kwhV.js +1 -1
  58. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-BrRnu-oS.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-F3FwjYQD.js +1 -1
  59. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/graph-Cdru59AN.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/graph-BWlEpfBO.js +1 -1
  60. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/index-Ix9ej5i-.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/index-BqPJMGF-.js +2 -2
  61. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/index-CHZz2B-g.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/index-DYUDz2ym.js +1 -1
  62. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/index-B9rDlDTV.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/index-DpudRZuI.js +1 -1
  63. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-BWbx2G71.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-BJOGXqn7.js +1 -1
  64. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-e5r2mFfX.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-BZdlH-JG.js +1 -1
  65. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-Cw-5DMZz.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-CmgmSsYi.js +1 -1
  66. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/layout-Bz5NLD6Y.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/layout-CWaYhVVo.js +1 -1
  67. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/linear-C6xei9WU.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/linear-Bw6Dncma.js +1 -1
  68. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B2s4EhdL.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-CzjjwzDB.js +7 -7
  69. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/mermaid.core-DE-3B90d.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/mermaid.core-Bb0_1h52.js +5 -5
  70. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/min-DIq8zNFr.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/min-Df20Er5m.js +1 -1
  71. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-CRmn6NBA.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-CAe0siLd.js +1 -1
  72. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-xaDAWjUB.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-CLMBAwjU.js +1 -1
  73. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-DL9984Cg.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-B9vjzD3o.js +1 -1
  74. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-DMnNecbQ.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-Bbjo8TGX.js +1 -1
  75. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-BhFUMQqC.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-xnxkDnDQ.js +1 -1
  76. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-Da3-18pZ.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-qkafBa71.js +1 -1
  77. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-D-vEOsdI.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-BzTcRJpG.js +1 -1
  78. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-TyAV0qk_.js +1 -0
  79. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-jjwwP1hV.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-0ls9u7xd.js +1 -1
  80. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-CsfY6M0V.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-C1ChVaOv.js +1 -1
  81. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-Dk2xKhgL.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-Ba9eacUU.js +1 -1
  82. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/index.html +1 -1
  83. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/channel-N3T2k8B2.js +0 -1
  84. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-mMiORCnw.js +0 -1
  85. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-mMiORCnw.js +0 -1
  86. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/clone-hquVYw4G.js +0 -1
  87. pythinker_code-2.2.1/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-CsiNChEg.js +0 -1
  88. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/LICENSE +0 -0
  89. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/NOTICE +0 -0
  90. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/__init__.py +0 -0
  91. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/__main__.py +0 -0
  92. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/acp/AGENTS.md +0 -0
  93. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/acp/__init__.py +0 -0
  94. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/acp/convert.py +0 -0
  95. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/acp/mcp.py +0 -0
  96. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/acp/server.py +0 -0
  97. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/acp/tools.py +0 -0
  98. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/acp/types.py +0 -0
  99. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/acp/version.py +0 -0
  100. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/agents/default/agent.yaml +0 -0
  101. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/agents/default/coder.yaml +0 -0
  102. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/agents/default/explore.yaml +0 -0
  103. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/agents/default/plan.yaml +0 -0
  104. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/agents/default/system.md +0 -0
  105. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
  106. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/agentspec.py +0 -0
  107. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/app.py +0 -0
  108. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
  109. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/approval_runtime/models.py +0 -0
  110. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
  111. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/auth/__init__.py +0 -0
  112. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
  113. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/auth/deepseek.py +0 -0
  114. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/auth/lm_studio.py +0 -0
  115. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/auth/minimax.py +0 -0
  116. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/auth/ollama.py +0 -0
  117. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/auth/opencode_go.py +0 -0
  118. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/auth/openrouter.py +0 -0
  119. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/background/__init__.py +0 -0
  120. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/background/agent_runner.py +0 -0
  121. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/background/ids.py +0 -0
  122. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/background/manager.py +0 -0
  123. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/background/models.py +0 -0
  124. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/background/store.py +0 -0
  125. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/background/summary.py +0 -0
  126. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/background/worker.py +0 -0
  127. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/cli/__init__.py +0 -0
  128. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/cli/__main__.py +0 -0
  129. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/cli/_lazy_group.py +0 -0
  130. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/cli/export.py +0 -0
  131. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/cli/info.py +0 -0
  132. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/cli/mcp.py +0 -0
  133. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/cli/plugin.py +0 -0
  134. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/cli/toad.py +0 -0
  135. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/cli/update.py +0 -0
  136. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/cli/vis.py +0 -0
  137. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/cli/web.py +0 -0
  138. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/config.py +0 -0
  139. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/constant.py +0 -0
  140. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/events.py +0 -0
  141. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/exception.py +0 -0
  142. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/extensions.py +0 -0
  143. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/hooks/__init__.py +0 -0
  144. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/hooks/config.py +0 -0
  145. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/hooks/events.py +0 -0
  146. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/llm.py +0 -0
  147. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/metadata.py +0 -0
  148. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/notifications/__init__.py +0 -0
  149. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/notifications/llm.py +0 -0
  150. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/notifications/manager.py +0 -0
  151. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/notifications/models.py +0 -0
  152. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/notifications/notifier.py +0 -0
  153. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/notifications/store.py +0 -0
  154. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/notifications/wire.py +0 -0
  155. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/plugin/__init__.py +0 -0
  156. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/plugin/manager.py +0 -0
  157. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/plugin/tool.py +0 -0
  158. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/prompt_templates.py +0 -0
  159. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/prompts/__init__.py +0 -0
  160. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/prompts/compact.md +0 -0
  161. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/prompts/init.md +0 -0
  162. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/py.typed +0 -0
  163. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/session.py +0 -0
  164. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/session_fork.py +0 -0
  165. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/session_state.py +0 -0
  166. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/share.py +0 -0
  167. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/skill/__init__.py +0 -0
  168. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
  169. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/skill/flow/d2.py +0 -0
  170. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
  171. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
  172. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
  173. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/__init__.py +0 -0
  174. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/agent.py +0 -0
  175. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/approval.py +0 -0
  176. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/compaction.py +0 -0
  177. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/context.py +0 -0
  178. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/denwarenji.py +0 -0
  179. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/dynamic_injection.py +0 -0
  180. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
  181. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
  182. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
  183. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/message.py +0 -0
  184. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/soul/slash.py +0 -0
  185. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/subagents/__init__.py +0 -0
  186. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/subagents/builder.py +0 -0
  187. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/subagents/core.py +0 -0
  188. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/subagents/git_context.py +0 -0
  189. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/subagents/models.py +0 -0
  190. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/subagents/output.py +0 -0
  191. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/subagents/registry.py +0 -0
  192. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/subagents/store.py +0 -0
  193. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/telemetry/__init__.py +0 -0
  194. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/telemetry/crash.py +0 -0
  195. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/telemetry/metrics.py +0 -0
  196. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/telemetry/sentry.py +0 -0
  197. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/telemetry/sink.py +0 -0
  198. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/AGENTS.md +0 -0
  199. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/__init__.py +0 -0
  200. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/agent/description.md +0 -0
  201. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
  202. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/background/__init__.py +0 -0
  203. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/background/list.md +0 -0
  204. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/background/output.md +0 -0
  205. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/background/stop.md +0 -0
  206. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/display.py +0 -0
  207. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
  208. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
  209. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/__init__.py +0 -0
  210. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/glob.md +0 -0
  211. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/grep.md +0 -0
  212. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
  213. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/read.md +0 -0
  214. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/read_media.md +0 -0
  215. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/replace.md +0 -0
  216. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/utils.py +0 -0
  217. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/write.md +0 -0
  218. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/plan/description.md +0 -0
  219. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
  220. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
  221. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/shell/bash.md +0 -0
  222. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
  223. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/test.py +0 -0
  224. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/think/__init__.py +0 -0
  225. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/think/think.md +0 -0
  226. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
  227. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
  228. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/utils.py +0 -0
  229. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/web/__init__.py +0 -0
  230. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/web/fetch.md +0 -0
  231. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/web/fetch.py +0 -0
  232. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/web/search.md +0 -0
  233. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/tools/web/search.py +0 -0
  234. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/__init__.py +0 -0
  235. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
  236. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/print/__init__.py +0 -0
  237. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/print/visualize.py +0 -0
  238. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/__init__.py +0 -0
  239. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
  240. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
  241. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
  242. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
  243. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/diff.py +0 -0
  244. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
  245. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
  246. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
  247. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
  248. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
  249. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
  250. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
  251. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/console.py +0 -0
  252. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/debug.py +0 -0
  253. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/echo.py +0 -0
  254. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
  255. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
  256. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
  257. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
  258. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
  259. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
  260. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
  261. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/prompt.py +0 -0
  262. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/replay.py +0 -0
  263. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selector.py +0 -0
  264. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
  265. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
  266. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
  267. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
  268. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
  269. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
  270. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
  271. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
  272. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/setup.py +0 -0
  273. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/startup.py +0 -0
  274. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
  275. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
  276. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -0
  277. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
  278. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
  279. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
  280. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
  281. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
  282. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
  283. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
  284. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
  285. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
  286. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
  287. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
  288. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
  289. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -0
  290. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
  291. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/update.py +0 -0
  292. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage.py +0 -0
  293. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
  294. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
  295. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
  296. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
  297. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
  298. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
  299. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
  300. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
  301. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
  302. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
  303. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
  304. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
  305. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
  306. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
  307. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +0 -0
  308. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
  309. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
  310. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +0 -0
  311. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +0 -0
  312. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
  313. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
  314. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/theme.py +0 -0
  315. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/ui/tui_config.py +0 -0
  316. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
  317. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/__init__.py +0 -0
  318. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/aiohttp.py +0 -0
  319. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/aioqueue.py +0 -0
  320. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/broadcast.py +0 -0
  321. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/changelog.py +0 -0
  322. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/clipboard.py +0 -0
  323. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/datetime.py +0 -0
  324. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/diff.py +0 -0
  325. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/editor.py +0 -0
  326. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/environment.py +0 -0
  327. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/envvar.py +0 -0
  328. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/export.py +0 -0
  329. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/file_filter.py +0 -0
  330. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/frontmatter.py +0 -0
  331. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/io.py +0 -0
  332. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/logging.py +0 -0
  333. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/media_tags.py +0 -0
  334. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/message.py +0 -0
  335. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/path.py +0 -0
  336. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/proctitle.py +0 -0
  337. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/proxy.py +0 -0
  338. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
  339. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
  340. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/rich/columns.py +0 -0
  341. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/rich/diff_render.py +0 -0
  342. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
  343. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
  344. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
  345. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
  346. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/sensitive.py +0 -0
  347. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/server.py +0 -0
  348. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/signals.py +0 -0
  349. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/slashcmd.py +0 -0
  350. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/string.py +0 -0
  351. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
  352. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/term.py +0 -0
  353. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/utils/typing.py +0 -0
  354. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/__init__.py +0 -0
  355. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/api/__init__.py +0 -0
  356. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/api/sessions.py +0 -0
  357. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/api/statistics.py +0 -0
  358. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/api/system.py +0 -0
  359. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/app.py +0 -0
  360. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-D2MTYyJz.js +0 -0
  361. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/index-CezafTt_.js +0 -0
  362. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/index-DSRInNnm.css +0 -0
  363. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  364. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  365. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  366. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  367. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  368. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  369. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  370. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/index.html +0 -0
  371. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/__init__.py +0 -0
  372. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/api/__init__.py +0 -0
  373. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/api/config.py +0 -0
  374. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/api/open_in.py +0 -0
  375. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/api/sessions.py +0 -0
  376. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/app.py +0 -0
  377. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/auth.py +0 -0
  378. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/models.py +0 -0
  379. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/runner/__init__.py +0 -0
  380. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/runner/messages.py +0 -0
  381. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/runner/process.py +0 -0
  382. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/runner/worker.py +0 -0
  383. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  384. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  385. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  386. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  387. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  388. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  389. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  390. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  391. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  392. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  393. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  394. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  395. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  396. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  397. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  398. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  399. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  400. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  401. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  402. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  403. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  404. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  405. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  406. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  407. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  408. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  409. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  410. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  411. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  412. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  413. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  414. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  415. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  416. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  417. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  418. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  419. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  420. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  421. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  422. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  423. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  424. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  425. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  426. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  427. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  428. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  429. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  430. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  431. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  432. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  433. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  434. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  435. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  436. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  437. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  438. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  439. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  440. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  441. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  442. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/abap-BdImnpbu.js +0 -0
  443. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +0 -0
  444. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ada-bCR0ucgS.js +0 -0
  445. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +0 -0
  446. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +0 -0
  447. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +0 -0
  448. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/apache-Pmp26Uib.js +0 -0
  449. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/apex-D8_7TLub.js +0 -0
  450. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/apl-dKokRX4l.js +0 -0
  451. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/applescript-Co6uUVPk.js +0 -0
  452. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ara-BRHolxvo.js +0 -0
  453. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +0 -0
  454. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/asm-D_Q5rh1f.js +0 -0
  455. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/astro-CbQHKStN.js +0 -0
  456. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +0 -0
  457. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/awk-DMzUqQB5.js +0 -0
  458. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +0 -0
  459. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +0 -0
  460. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/bat-BkioyH1T.js +0 -0
  461. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/beancount-k_qm7-4y.js +0 -0
  462. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/berry-uYugtg8r.js +0 -0
  463. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/bibtex-CHM0blh-.js +0 -0
  464. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/bicep-Bmn6On1c.js +0 -0
  465. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/blade-D4QpJJKB.js +0 -0
  466. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/bsl-BO_Y6i37.js +0 -0
  467. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/c-BIGW1oBm.js +0 -0
  468. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/c3-VCDPK7BO.js +0 -0
  469. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +0 -0
  470. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/cairo-KRGpt6FW.js +0 -0
  471. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
  472. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
  473. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
  474. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
  475. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/clarity-D53aC0YG.js +0 -0
  476. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/clojure-P80f7IUj.js +0 -0
  477. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/cmake-D1j8_8rp.js +0 -0
  478. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/cobol-nwyudZeR.js +0 -0
  479. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +0 -0
  480. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +0 -0
  481. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/coffee-Ch7k5sss.js +0 -0
  482. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +0 -0
  483. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/coq-DkFqJrB1.js +0 -0
  484. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/cpp-CofmeUqb.js +0 -0
  485. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/crystal-tKQVLTB8.js +0 -0
  486. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/csharp-K5feNrxe.js +0 -0
  487. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/css-DPfMkruS.js +0 -0
  488. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/csv-fuZLfV_i.js +0 -0
  489. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/cue-D82EKSYY.js +0 -0
  490. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/cypher-COkxafJQ.js +0 -0
  491. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/d-85-TOEBH.js +0 -0
  492. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +0 -0
  493. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/dart-CF10PKvl.js +0 -0
  494. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/dax-CEL-wOlO.js +0 -0
  495. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +0 -0
  496. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +0 -0
  497. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/diff-D97Zzqfu.js +0 -0
  498. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/docker-BcOcwvcX.js +0 -0
  499. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/dotenv-Da5cRb03.js +0 -0
  500. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/dracula-BzJJZx-M.js +0 -0
  501. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +0 -0
  502. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +0 -0
  503. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/edge-BkV0erSs.js +0 -0
  504. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/elixir-CDX3lj18.js +0 -0
  505. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/elm-DbKCFpqz.js +0 -0
  506. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +0 -0
  507. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/erb-BOJIQeun.js +0 -0
  508. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/erlang-DsQrWhSR.js +0 -0
  509. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +0 -0
  510. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +0 -0
  511. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/fennel-BYunw83y.js +0 -0
  512. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/fish-BvzEVeQv.js +0 -0
  513. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/fluent-C4IJs8-o.js +0 -0
  514. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
  515. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
  516. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +0 -0
  517. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +0 -0
  518. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +0 -0
  519. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gdshader-DkwncUOv.js +0 -0
  520. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/genie-D0YGMca9.js +0 -0
  521. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +0 -0
  522. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +0 -0
  523. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +0 -0
  524. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/github-dark-DHJKELXO.js +0 -0
  525. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
  526. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
  527. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
  528. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/github-light-DAi9KRSo.js +0 -0
  529. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +0 -0
  530. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
  531. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gleam-BspZqrRM.js +0 -0
  532. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
  533. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +0 -0
  534. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/glsl-DplSGwfg.js +0 -0
  535. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gn-n2N0HUVH.js +0 -0
  536. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +0 -0
  537. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/go-Dn2_MT6a.js +0 -0
  538. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/graphql-ChdNCCLP.js +0 -0
  539. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/groovy-gcz8RCvz.js +0 -0
  540. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
  541. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
  542. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
  543. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
  544. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
  545. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
  546. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/hack-CaT9iCJl.js +0 -0
  547. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/haml-B8DHNrY2.js +0 -0
  548. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/handlebars-BL8al0AC.js +0 -0
  549. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/haskell-Df6bDoY_.js +0 -0
  550. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/haxe-CzTSHFRz.js +0 -0
  551. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/hcl-BWvSN4gD.js +0 -0
  552. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/hjson-D5-asLiD.js +0 -0
  553. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +0 -0
  554. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/houston-DnULxvSX.js +0 -0
  555. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/html-GMplVEZG.js +0 -0
  556. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +0 -0
  557. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/http-jrhK8wxY.js +0 -0
  558. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/hurl-irOxFIW8.js +0 -0
  559. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +0 -0
  560. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/hy-DFXneXwc.js +0 -0
  561. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/imba-DGztddWO.js +0 -0
  562. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/index-BpoLgcEt.js +0 -0
  563. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/index-CzV_vCfu.css +0 -0
  564. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/index-DI2oedCt.js +0 -0
  565. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ini-BEwlwnbL.js +0 -0
  566. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/init-Gi6I4Gst.js +0 -0
  567. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  568. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  569. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  570. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  571. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  572. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  573. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  574. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/java-CylS5w8V.js +0 -0
  575. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/javascript-wDzz0qaB.js +0 -0
  576. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +0 -0
  577. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/jison-wvAkD_A8.js +0 -0
  578. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/json-Cp-IABpG.js +0 -0
  579. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/json5-C9tS-k6U.js +0 -0
  580. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/jsonc-Des-eS-w.js +0 -0
  581. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +0 -0
  582. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +0 -0
  583. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/jssm-C2t-YnRu.js +0 -0
  584. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/jsx-g9-lgVsj.js +0 -0
  585. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/julia-CxzCAyBv.js +0 -0
  586. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
  587. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
  588. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
  589. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/katex-D2lIc1rk.css +0 -0
  590. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/kdl-DV7GczEv.js +0 -0
  591. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +0 -0
  592. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/kusto-DZf3V79B.js +0 -0
  593. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/laserwave-DUszq2jm.js +0 -0
  594. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/latex-B4uzh10-.js +0 -0
  595. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/lean-BZvkOJ9d.js +0 -0
  596. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/less-B1dDrJ26.js +0 -0
  597. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +0 -0
  598. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/liquid-DYVedYrR.js +0 -0
  599. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/llvm-BtvRca6l.js +0 -0
  600. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/log-2UxHyX5q.js +0 -0
  601. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/logo-BtOb2qkB.js +0 -0
  602. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/lua-BbnMAYS6.js +0 -0
  603. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/luau-C-HG3fhB.js +0 -0
  604. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/make-CHLpvVh8.js +0 -0
  605. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/markdown-Cvjx9yec.js +0 -0
  606. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/marko-DZsq8hO1.js +0 -0
  607. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +0 -0
  608. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
  609. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
  610. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +0 -0
  611. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
  612. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/matlab-D7o27uSR.js +0 -0
  613. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/mdc-DUICxH0z.js +0 -0
  614. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +0 -0
  615. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B2P5VJ9v.css +0 -0
  616. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +0 -0
  617. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/min-dark-CafNBF8u.js +0 -0
  618. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/min-light-CTRr51gU.js +0 -0
  619. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +0 -0
  620. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/mojo-B93PlW-d.js +0 -0
  621. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/monokai-D4h5O-jR.js +0 -0
  622. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/moonbit-Ba13S78F.js +0 -0
  623. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/move-Bu9oaDYs.js +0 -0
  624. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/narrat-DRg8JJMk.js +0 -0
  625. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +0 -0
  626. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/nginx-DknmC5AR.js +0 -0
  627. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/night-owl-C39BiMTA.js +0 -0
  628. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/nim-CVrawwO9.js +0 -0
  629. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/nix-CwoSXNpI.js +0 -0
  630. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/nord-Ddv68eIx.js +0 -0
  631. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/nushell-C-sUppwS.js +0 -0
  632. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +0 -0
  633. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +0 -0
  634. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +0 -0
  635. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
  636. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/one-light-PoHY5YXO.js +0 -0
  637. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/openscad-C4EeE6gA.js +0 -0
  638. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +0 -0
  639. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/pascal-D93ZcfNL.js +0 -0
  640. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/perl-C0TMdlhV.js +0 -0
  641. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/php-CDn_0X-4.js +0 -0
  642. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/pkl-u5AG7uiY.js +0 -0
  643. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/plastic-3e1v2bzS.js +0 -0
  644. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/plsql-ChMvpjG-.js +0 -0
  645. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/po-BTJTHyun.js +0 -0
  646. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +0 -0
  647. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/polar-C0HS_06l.js +0 -0
  648. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/postcss-CXtECtnM.js +0 -0
  649. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +0 -0
  650. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/powershell-Dpen1YoG.js +0 -0
  651. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/prisma-Dd19v3D-.js +0 -0
  652. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/prolog-CbFg5uaA.js +0 -0
  653. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/proto-C7zT0LnQ.js +0 -0
  654. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/pug-CGlum2m_.js +0 -0
  655. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/puppet-BMWR74SV.js +0 -0
  656. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/purescript-CklMAg4u.js +0 -0
  657. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/python-B6aJPvgy.js +0 -0
  658. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/qml-3beO22l8.js +0 -0
  659. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +0 -0
  660. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/qss-IeuSbFQv.js +0 -0
  661. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/r-Dspwwk_N.js +0 -0
  662. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/racket-BqYA7rlc.js +0 -0
  663. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/raku-DXvB9xmW.js +0 -0
  664. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/razor-C1TweQQi.js +0 -0
  665. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/red-bN70gL4F.js +0 -0
  666. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/reg-C-SQnVFl.js +0 -0
  667. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +0 -0
  668. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/rel-C3B-1QV4.js +0 -0
  669. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/riscv-BM1_JUlF.js +0 -0
  670. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
  671. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
  672. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +0 -0
  673. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +0 -0
  674. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/rst-B0xPkSld.js +0 -0
  675. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ruby-BvKwtOVI.js +0 -0
  676. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/rust-B1yitclQ.js +0 -0
  677. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/sas-cz2c8ADy.js +0 -0
  678. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +0 -0
  679. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/scala-C151Ov-r.js +0 -0
  680. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/scheme-C98Dy4si.js +0 -0
  681. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/scss-OYdSNvt2.js +0 -0
  682. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +0 -0
  683. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
  684. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/shellscript-Yzrsuije.js +0 -0
  685. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/shellsession-BADoaaVG.js +0 -0
  686. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +0 -0
  687. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +0 -0
  688. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +0 -0
  689. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +0 -0
  690. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +0 -0
  691. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +0 -0
  692. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/solidity-rGO070M0.js +0 -0
  693. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/soy-Brmx7dQM.js +0 -0
  694. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/sparql-rVzFXLq3.js +0 -0
  695. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/splunk-BtCnVYZw.js +0 -0
  696. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/sql-BLtJtn59.js +0 -0
  697. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +0 -0
  698. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/stata-BH5u7GGu.js +0 -0
  699. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +0 -0
  700. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/svelte-zxCyuUbr.js +0 -0
  701. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/swift-Dg5xB15N.js +0 -0
  702. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +0 -0
  703. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +0 -0
  704. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/systemd-4A_iFExJ.js +0 -0
  705. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/talonscript-CkByrt1z.js +0 -0
  706. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/tasl-QIJgUcNo.js +0 -0
  707. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/tcl-dwOrl1Do.js +0 -0
  708. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/templ-W15q3VgB.js +0 -0
  709. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/terraform-BETggiCN.js +0 -0
  710. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/tex-CvyZ59Mk.js +0 -0
  711. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/tokyo-night-hegEt444.js +0 -0
  712. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/toml-vGWfd6FD.js +0 -0
  713. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +0 -0
  714. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/tsv-B_m7g4N7.js +0 -0
  715. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/tsx-COt5Ahok.js +0 -0
  716. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/turtle-BsS91CYL.js +0 -0
  717. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/twig-CO9l9SDP.js +0 -0
  718. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +0 -0
  719. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/typespec-BGHnOYBU.js +0 -0
  720. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/typst-DHCkPAjA.js +0 -0
  721. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/v-BcVCzyr7.js +0 -0
  722. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vala-CsfeWuGM.js +0 -0
  723. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vb-D17OF-Vu.js +0 -0
  724. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/verilog-BQ8w6xss.js +0 -0
  725. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vesper-DU1UobuO.js +0 -0
  726. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +0 -0
  727. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/viml-CJc9bBzg.js +0 -0
  728. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
  729. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
  730. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +0 -0
  731. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vue-DN_0RTcg.js +0 -0
  732. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +0 -0
  733. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +0 -0
  734. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vyper-CDx5xZoG.js +0 -0
  735. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +0 -0
  736. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/wasm-MzD3tlZU.js +0 -0
  737. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/wenyan-BV7otONQ.js +0 -0
  738. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +0 -0
  739. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +0 -0
  740. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/wit-5i3qLPDT.js +0 -0
  741. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +0 -0
  742. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/xml-sdJ4AIDG.js +0 -0
  743. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/xsl-CtQFsRM5.js +0 -0
  744. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/yaml-Buea-lGh.js +0 -0
  745. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +0 -0
  746. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/zig-VOosw3JB.js +0 -0
  747. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
  748. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
  749. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
  750. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
  751. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
  752. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
  753. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
  754. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
  755. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
  756. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
  757. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
  758. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
  759. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
  760. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
  761. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
  762. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
  763. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
  764. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
  765. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
  766. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
  767. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
  768. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
  769. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/static/logo.png +0 -0
  770. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/store/__init__.py +0 -0
  771. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/web/store/sessions.py +0 -0
  772. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/wire/__init__.py +0 -0
  773. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/wire/file.py +0 -0
  774. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
  775. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/wire/protocol.py +0 -0
  776. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/wire/root_hub.py +0 -0
  777. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/wire/serde.py +0 -0
  778. {pythinker_code-2.2.1 → pythinker_code-2.3.0}/src/pythinker_code/wire/server.py +0 -0
  779. {pythinker_code-2.2.1 → pythinker_code-2.3.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.3.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,20 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
110
110
 
111
111
  ---
112
112
 
113
+ ## 🆕 What's New in 2.3.0
114
+
115
+ Telemetry & observability audit on top of 2.2.1.
116
+
117
+ - **38 silent-catch sites instrumented** — tool failures, OAuth errors, MCP hiccups, hook callbacks, subagent crashes now surface in Bugsink + SigNoz.
118
+ - **`/report-error` slash command** — user-invoked complement to automatic capture.
119
+ - **OTel trace sampling tunable** — `PYTHINKER_OTEL_TRACE_SAMPLE_RATE` for operators running their own collector.
120
+ - **`pythinker.mcp.call` span** with `mcp.server` attribute.
121
+ - **`docs/en/reference/telemetry.md`** documents the full contract.
122
+
123
+ Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.3.0`.
124
+
125
+ ### What was new in 2.2.1
126
+
113
127
  ## 🆕 What's New in 2.2.1
114
128
 
115
129
  CI hardening on top of 2.2.0.
@@ -117,7 +131,7 @@ CI hardening on top of 2.2.0.
117
131
  - **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
132
  - **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
133
 
120
- Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.2.1`.
134
+ Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.3.0`.
121
135
 
122
136
  ### What was new in 2.2.0
123
137
 
@@ -48,6 +48,20 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
48
48
 
49
49
  ---
50
50
 
51
+ ## 🆕 What's New in 2.3.0
52
+
53
+ Telemetry & observability audit on top of 2.2.1.
54
+
55
+ - **38 silent-catch sites instrumented** — tool failures, OAuth errors, MCP hiccups, hook callbacks, subagent crashes now surface in Bugsink + SigNoz.
56
+ - **`/report-error` slash command** — user-invoked complement to automatic capture.
57
+ - **OTel trace sampling tunable** — `PYTHINKER_OTEL_TRACE_SAMPLE_RATE` for operators running their own collector.
58
+ - **`pythinker.mcp.call` span** with `mcp.server` attribute.
59
+ - **`docs/en/reference/telemetry.md`** documents the full contract.
60
+
61
+ Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.3.0`.
62
+
63
+ ### What was new in 2.2.1
64
+
51
65
  ## 🆕 What's New in 2.2.1
52
66
 
53
67
  CI hardening on top of 2.2.0.
@@ -55,7 +69,7 @@ CI hardening on top of 2.2.0.
55
69
  - **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
70
  - **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
71
 
58
- Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.2.1`.
72
+ Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.3.0`.
59
73
 
60
74
  ### What was new in 2.2.0
61
75
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pythinker-code"
3
- version = "2.2.1"
3
+ version = "2.3.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,19 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 2.3.0 (2026-05-09)
6
+
7
+ Telemetry & observability audit.
8
+
9
+ - 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.
10
+ - 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.
11
+ - `pythinker_code/telemetry/otel.py`: TracerProvider now uses `ParentBased(TraceIdRatioBased(rate))` driven by `PYTHINKER_OTEL_TRACE_SAMPLE_RATE` (default 1.0).
12
+ - New `pythinker.mcp.call` span around every MCPTool RPC.
13
+ - New `/report-error` slash command (aliases `/report`, `/report-error`).
14
+ - `docs/en/reference/telemetry.md` documents the full telemetry contract.
15
+ - `chore(test)`: updated google-genai snapshot for pydantic 2.13.4 + google-genai 2.0.0.
16
+
17
+
5
18
  ## 2.2.1 (2026-05-09)
6
19
 
7
20
  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")
@@ -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
@@ -237,7 +237,10 @@ class HookEngine:
237
237
  results = await self._execute_hooks(
238
238
  event, matcher_value, server_matched, wire_matched, input_data
239
239
  )
240
- except Exception:
240
+ except Exception as exc:
241
+ from pythinker_code.telemetry.errors import report_handled_error
242
+
243
+ report_handled_error(exc, site="hooks.engine.run")
241
244
  logger.warning("Hook engine error for {}, failing open", event)
242
245
  return []
243
246
 
@@ -278,6 +281,9 @@ class HookEngine:
278
281
  try:
279
282
  self._on_triggered(event, matcher_value, total)
280
283
  except Exception as e:
284
+ from pythinker_code.telemetry.errors import report_handled_error
285
+
286
+ report_handled_error(e, site="hooks.engine.triggered_cb")
281
287
  logger.warning(
282
288
  "HookTriggered callback failed for {event}: {error}, continuing",
283
289
  event=event,
@@ -328,6 +334,9 @@ class HookEngine:
328
334
  try:
329
335
  self._on_resolved(event, matcher_value, action, reason, duration_ms)
330
336
  except Exception as e:
337
+ from pythinker_code.telemetry.errors import report_handled_error
338
+
339
+ report_handled_error(e, site="hooks.engine.resolved_cb")
331
340
  logger.warning(
332
341
  "HookResolved callback failed for {event}: {error}, continuing",
333
342
  event=event,
@@ -366,6 +375,9 @@ class HookEngine:
366
375
  logger.warning("Wire hook timed out: {} {}", event, target)
367
376
  return HookResult(action="allow", timed_out=True)
368
377
  except Exception as e:
378
+ from pythinker_code.telemetry.errors import report_handled_error
379
+
380
+ report_handled_error(e, site="hooks.engine.wire")
369
381
  hook_task.cancel()
370
382
  logger.warning("Wire hook failed: {} {}: {}", event, target, e)
371
383
  return HookResult(action="allow")
@@ -51,6 +51,9 @@ async def run_hook(
51
51
  await proc.wait()
52
52
  raise
53
53
  except Exception as e:
54
+ from pythinker_code.telemetry.errors import report_handled_error
55
+
56
+ report_handled_error(e, site="hooks.runner")
54
57
  logger.warning("Hook failed: {}: {}", command, e)
55
58
  return HookResult(action="allow", stderr=str(e))
56
59
 
@@ -176,6 +176,9 @@ async def execute_side_question(
176
176
 
177
177
  return None, "No response received."
178
178
  except Exception as e:
179
+ from pythinker_code.telemetry.errors import report_handled_error
180
+
181
+ report_handled_error(e, site="soul.btw.execute")
179
182
  logger.warning("Side question failed: {error}", error=e)
180
183
  return None, str(e)
181
184
 
@@ -210,5 +213,8 @@ async def run_side_question(soul: PythinkerSoul, question: str) -> None:
210
213
  else:
211
214
  wire_send(BtwEnd(id=btw_id, error=error or "No response received."))
212
215
  except Exception as e:
216
+ from pythinker_code.telemetry.errors import report_handled_error
217
+
218
+ report_handled_error(e, site="soul.btw.run_wire")
213
219
  logger.warning("Side question failed: {error}", error=e)
214
220
  wire_send(BtwEnd(id=btw_id, error=str(e)))
@@ -286,7 +286,14 @@ class PythinkerSoul:
286
286
  try:
287
287
  result = await provider.get_injections(self._context.history, self)
288
288
  injections.extend(result)
289
- except Exception:
289
+ except Exception as exc:
290
+ from pythinker_code.telemetry.errors import report_handled_error
291
+
292
+ report_handled_error(
293
+ exc,
294
+ site="soul.injection.get",
295
+ provider=type(provider).__name__,
296
+ )
290
297
  logger.warning(
291
298
  "injection provider %s failed",
292
299
  type(provider).__name__,
@@ -304,7 +311,14 @@ class PythinkerSoul:
304
311
  for provider in self._injection_providers:
305
312
  try:
306
313
  await provider.on_context_compacted()
307
- except Exception:
314
+ except Exception as exc:
315
+ from pythinker_code.telemetry.errors import report_handled_error
316
+
317
+ report_handled_error(
318
+ exc,
319
+ site="soul.injection.on_context_compacted",
320
+ provider=type(provider).__name__,
321
+ )
308
322
  logger.warning(
309
323
  "injection provider %s on_context_compacted failed",
310
324
  type(provider).__name__,
@@ -316,7 +330,14 @@ class PythinkerSoul:
316
330
  for provider in self._injection_providers:
317
331
  try:
318
332
  await provider.on_auto_changed(enabled)
319
- except Exception:
333
+ except Exception as exc:
334
+ from pythinker_code.telemetry.errors import report_handled_error
335
+
336
+ report_handled_error(
337
+ exc,
338
+ site="soul.injection.on_auto_changed",
339
+ provider=type(provider).__name__,
340
+ )
320
341
  logger.warning(
321
342
  "injection provider %s on_auto_changed failed",
322
343
  type(provider).__name__,
@@ -937,6 +958,9 @@ class PythinkerSoul:
937
958
  try:
938
959
  await self.compact_context()
939
960
  except Exception as compact_err:
961
+ from pythinker_code.telemetry.errors import report_handled_error
962
+
963
+ report_handled_error(compact_err, site="soul.context.compact")
940
964
  logger.error(
941
965
  "Context compaction failed at step {step_no}: {error_type}: {error}",
942
966
  step_no=step_no,
@@ -952,6 +976,9 @@ class PythinkerSoul:
952
976
  except BackToTheFuture as e:
953
977
  back_to_the_future = e
954
978
  except Exception as e:
979
+ from pythinker_code.telemetry.errors import report_handled_error
980
+
981
+ report_handled_error(e, site="soul.step.error")
955
982
  # any other exception should interrupt the step
956
983
  req_id = getattr(e, "request_id", None)
957
984
  logger.error(
@@ -1453,7 +1480,10 @@ class PythinkerSoul:
1453
1480
  raise
1454
1481
  try:
1455
1482
  recovered = chat_provider.on_retryable_error(error)
1456
- except Exception:
1483
+ except Exception as recover_exc:
1484
+ from pythinker_code.telemetry.errors import report_handled_error
1485
+
1486
+ report_handled_error(recover_exc, site="soul.chat.recover")
1457
1487
  logger.exception(
1458
1488
  "Failed to recover chat provider during {name} after {error_type}.",
1459
1489
  name=name,
@@ -319,6 +319,9 @@ class PythinkerToolset:
319
319
  parameters=parameters,
320
320
  )
321
321
  except Exception as e:
322
+ from pythinker_code.telemetry.errors import report_handled_error
323
+
324
+ report_handled_error(e, site="soul.toolset.register_external")
322
325
  return False, str(e)
323
326
  self.add(tool)
324
327
  return True, None
@@ -490,6 +493,9 @@ class PythinkerToolset:
490
493
  logger.info("Connected MCP server: {server_name}", server_name=server_name)
491
494
  return server_name, None
492
495
  except Exception as e:
496
+ from pythinker_code.telemetry.errors import report_handled_error
497
+
498
+ report_handled_error(e, site="soul.toolset.mcp.connect")
493
499
  logger.error(
494
500
  "Failed to connect MCP server: {server_name}, error: {error}",
495
501
  server_name=server_name,
@@ -608,6 +614,7 @@ class MCPTool[T: ClientTransport](CallableTool):
608
614
  **kwargs,
609
615
  )
610
616
  self._mcp_tool = mcp_tool
617
+ self._mcp_server_name = server_name
611
618
  self._client = client
612
619
  self._runtime = runtime
613
620
  self._timeout = timedelta(milliseconds=runtime.config.mcp.client.tool_call_timeout_ms)
@@ -619,25 +626,43 @@ class MCPTool[T: ClientTransport](CallableTool):
619
626
  if not result:
620
627
  return result.rejection_error()
621
628
 
629
+ from pythinker_code.telemetry import otel as _otel
630
+
631
+ # `start_span` returns a sync context manager (the OTel SDK uses
632
+ # `_AgnosticContextManager`, which intentionally has no __aenter__).
633
+ # Keep it as a sync `with` and use `async with` only on the fastmcp
634
+ # client.
622
635
  try:
623
- async with self._client as client:
624
- result = await client.call_tool(
625
- self._mcp_tool.name,
626
- kwargs,
627
- timeout=self._timeout,
628
- raise_on_error=False,
629
- )
630
- if result.is_error:
631
- logger.warning(
632
- "MCP tool returned error: {tool_name}: {content}",
633
- tool_name=self._mcp_tool.name,
634
- content=[str(p) for p in result.content][:3],
636
+ with _otel.start_span(
637
+ "pythinker.mcp.call",
638
+ {
639
+ "mcp.server": self._mcp_server_name,
640
+ "mcp.tool": self._mcp_tool.name,
641
+ "mcp.timeout_ms": int(self._timeout.total_seconds() * 1000),
642
+ },
643
+ ) as span:
644
+ async with self._client as client:
645
+ result = await client.call_tool(
646
+ self._mcp_tool.name,
647
+ kwargs,
648
+ timeout=self._timeout,
649
+ raise_on_error=False,
635
650
  )
636
- return convert_mcp_tool_result(result)
651
+ span.set_attribute("mcp.is_error", bool(result.is_error))
652
+ if result.is_error:
653
+ logger.warning(
654
+ "MCP tool returned error: {tool_name}: {content}",
655
+ tool_name=self._mcp_tool.name,
656
+ content=[str(p) for p in result.content][:3],
657
+ )
658
+ return convert_mcp_tool_result(result)
637
659
  except Exception as e:
660
+ from pythinker_code.telemetry.errors import report_handled_error
661
+
638
662
  # fastmcp raises `RuntimeError` on timeout and we cannot tell it from other errors
639
663
  exc_msg = str(e).lower()
640
664
  if "timeout" in exc_msg or "timed out" in exc_msg:
665
+ report_handled_error(e, site="soul.toolset.mcp.call.timeout", tool="MCP")
641
666
  logger.warning(
642
667
  "MCP tool call timed out: {tool_name}: {error}",
643
668
  tool_name=self._mcp_tool.name,
@@ -650,6 +675,7 @@ class MCPTool[T: ClientTransport](CallableTool):
650
675
  ),
651
676
  brief="Timeout",
652
677
  )
678
+ report_handled_error(e, site="soul.toolset.mcp.call", tool="MCP")
653
679
  logger.error(
654
680
  "MCP tool call failed: {tool_name}: {error}",
655
681
  tool_name=self._mcp_tool.name,
@@ -693,6 +719,9 @@ class WireExternalTool(CallableTool):
693
719
  except asyncio.CancelledError:
694
720
  raise
695
721
  except Exception as e:
722
+ from pythinker_code.telemetry.errors import report_handled_error
723
+
724
+ report_handled_error(e, site="soul.toolset.external_tool", tool="External")
696
725
  logger.exception("External tool call failed: {tool_name}:", tool_name=self.name)
697
726
  return ToolError(
698
727
  message=f"External tool call failed: {e}",
@@ -124,6 +124,9 @@ async def run_soul_checked(
124
124
  brief="LLM provider error",
125
125
  )
126
126
  except Exception as exc:
127
+ from pythinker_code.telemetry.errors import report_handled_error
128
+
129
+ report_handled_error(exc, site="subagents.run.soul")
127
130
  logger.exception("Subagent soul run failed when {phase}", phase=phase)
128
131
  return SoulRunFailure(
129
132
  message=f"Unexpected error when {phase}: {exc}",
@@ -316,7 +319,10 @@ class ForegroundSubagentRunner:
316
319
  self._store.update_instance(agent_id, status="killed")
317
320
  output_writer.stage("cancelled")
318
321
  raise RunCancelled("Subagent run was cancelled.") from exc
319
- except Exception:
322
+ except Exception as exc:
323
+ from pythinker_code.telemetry.errors import report_handled_error
324
+
325
+ report_handled_error(exc, site="subagents.run.background")
320
326
  self._store.update_instance(agent_id, status="failed")
321
327
  output_writer.stage("failed_exception")
322
328
  raise
@@ -52,3 +52,32 @@ def is_disabled() -> bool:
52
52
  Sentry and OTel emission for the process."""
53
53
  raw = os.environ.get("PYTHINKER_DISABLE_TELEMETRY", "").strip().lower()
54
54
  return raw in {"1", "true", "yes", "on"}
55
+
56
+
57
+ # ---------------------------------------------------------------------------
58
+ # Sampling
59
+ # ---------------------------------------------------------------------------
60
+
61
+ DEFAULT_OTEL_TRACE_SAMPLE_RATE = 1.0
62
+ """Default fraction of root-trace spans to record. 1.0 = always-on; 0.0 = none."""
63
+
64
+
65
+ def otel_trace_sample_rate() -> float:
66
+ """Resolve the OTel trace sampling rate.
67
+
68
+ Honors ``PYTHINKER_OTEL_TRACE_SAMPLE_RATE``. Clamped to ``[0.0, 1.0]``.
69
+ Malformed input falls back to the default rather than disabling tracing
70
+ or raising — telemetry config must never break the host program.
71
+ """
72
+ raw = os.environ.get("PYTHINKER_OTEL_TRACE_SAMPLE_RATE", "").strip()
73
+ if not raw:
74
+ return DEFAULT_OTEL_TRACE_SAMPLE_RATE
75
+ try:
76
+ rate = float(raw)
77
+ except ValueError:
78
+ return DEFAULT_OTEL_TRACE_SAMPLE_RATE
79
+ if rate < 0.0:
80
+ return 0.0
81
+ if rate > 1.0:
82
+ return 1.0
83
+ return rate