pythinker-code 2.3.0__tar.gz → 2.5.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 (785) hide show
  1. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/PKG-INFO +34 -5
  2. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/README.md +33 -4
  3. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/pyproject.toml +1 -1
  4. pythinker_code-2.5.0/src/pythinker_code/CHANGELOG.md +165 -0
  5. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/acp/tools.py +7 -0
  6. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/agents/default/agent.yaml +10 -0
  7. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/agents/default/coder.yaml +17 -0
  8. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/agents/default/explore.yaml +15 -2
  9. pythinker_code-2.5.0/src/pythinker_code/agents/default/implementer.yaml +46 -0
  10. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/agents/default/plan.yaml +16 -4
  11. pythinker_code-2.5.0/src/pythinker_code/agents/default/review.yaml +47 -0
  12. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/agents/default/system.md +17 -1
  13. pythinker_code-2.5.0/src/pythinker_code/agents/default/verifier.yaml +46 -0
  14. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/app.py +18 -10
  15. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/background/manager.py +22 -4
  16. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/background/models.py +14 -1
  17. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/background/store.py +7 -1
  18. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/config.py +30 -2
  19. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/llm.py +35 -6
  20. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/plugin/manager.py +19 -6
  21. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/agent.py +1 -1
  22. pythinker_code-2.5.0/src/pythinker_code/soul/permission.py +341 -0
  23. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/pythinkersoul.py +104 -65
  24. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/toolset.py +35 -31
  25. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/subagents/builder.py +1 -0
  26. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/subagents/models.py +2 -0
  27. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/subagents/runner.py +16 -8
  28. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/subagents/store.py +4 -0
  29. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/telemetry/config.py +27 -4
  30. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/telemetry/crash.py +15 -2
  31. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/telemetry/otel.py +2 -1
  32. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/telemetry/sentry.py +46 -1
  33. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/agent/__init__.py +47 -1
  34. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/agent/description.md +11 -4
  35. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/__init__.py +2 -1
  36. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/grep_local.py +325 -13
  37. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/replace.py +6 -0
  38. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/write.py +6 -0
  39. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/plan/__init__.py +32 -0
  40. pythinker_code-2.5.0/src/pythinker_code/tools/plan/handoff.py +69 -0
  41. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/shell/__init__.py +4 -0
  42. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/web/fetch.py +74 -2
  43. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/__init__.py +8 -0
  44. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/prompt.py +27 -0
  45. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/slash.py +49 -32
  46. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/update.py +116 -2
  47. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/api/sessions.py +9 -6
  48. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/app.py +26 -2
  49. pythinker_code-2.3.0/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-D2MTYyJz.js → pythinker_code-2.5.0/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-CY1rtwrX.js +1 -1
  50. pythinker_code-2.3.0/src/pythinker_code/vis/static/assets/index-CezafTt_.js → pythinker_code-2.5.0/src/pythinker_code/vis/static/assets/index-DgmTI2M_.js +70 -70
  51. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/static/index.html +1 -1
  52. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/api/open_in.py +34 -19
  53. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/api/sessions.py +18 -13
  54. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/app.py +2 -4
  55. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/_baseUniq-DYwtr3m4.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/_baseUniq-Bv26EHIE.js +1 -1
  56. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/arc-CNhBgyVb.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/arc-DuCCCcUZ.js +1 -1
  57. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-DpvaxB3Y.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-CVZ131zn.js +1 -1
  58. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-IlYHIkrW.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-BAC2VOip.js +1 -1
  59. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-D_jGrUIu.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-9uwamEIP.js +1 -1
  60. pythinker_code-2.5.0/src/pythinker_code/web/static/assets/channel-aVyB491s.js +1 -0
  61. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-uYRqFG6q.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-BTdhSGW0.js +1 -1
  62. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-5K_8Tvtf.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-CYDI0p8Q.js +1 -1
  63. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-BAp2tokd.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-b8oi1KW8.js +1 -1
  64. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-C3ICALbg.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-DGaf6dom.js +1 -1
  65. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-B3ntDoat.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-C1R9DMCj.js +1 -1
  66. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-Dy8y3fp6.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-DjSDLitQ.js +1 -1
  67. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-BXmiK1aE.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-_zmK8SCU.js +1 -1
  68. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-BbI6RHhP.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-DURAXY_D.js +1 -1
  69. pythinker_code-2.5.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-cvkDF0Mx.js +1 -0
  70. pythinker_code-2.5.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-cvkDF0Mx.js +1 -0
  71. pythinker_code-2.5.0/src/pythinker_code/web/static/assets/clone-DQNyDB_s.js +1 -0
  72. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-C09u1ZPS.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-DL4aF17r.js +1 -1
  73. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-OfdgQa9b.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-BuUIleVc.js +1 -1
  74. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/cytoscape.esm-BHPoE92Y.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/cytoscape.esm-C-OXuR4H.js +1 -1
  75. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-Dqsjg8sJ.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-CFMQD_BU.js +1 -1
  76. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-DxkId0Z8.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-BlZG6Knx.js +1 -1
  77. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-CkPNihvj.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-Bx6pGAz_.js +1 -1
  78. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-C_N5Jjql.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-C3k3j5WT.js +1 -1
  79. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-C8_5yrCr.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-ZXF9DMQm.js +1 -1
  80. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-BfV7xDb8.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-BbSLxWgp.js +1 -1
  81. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-Cld5kwhV.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-NOlUrkQp.js +1 -1
  82. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-F3FwjYQD.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-BAlT86AC.js +1 -1
  83. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/graph-BWlEpfBO.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/graph-BzHVPchG.js +1 -1
  84. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/index-BqPJMGF-.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/index-Cm_lwIyA.js +2 -2
  85. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/index-DpudRZuI.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/index-CnM44gk-.js +1 -1
  86. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/index-DYUDz2ym.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/index-Cqg-K1YV.js +1 -1
  87. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-BJOGXqn7.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-DBX3JCDO.js +1 -1
  88. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-BZdlH-JG.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-yaCqhNqw.js +1 -1
  89. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-CmgmSsYi.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-Cw2loPy6.js +1 -1
  90. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/layout-CWaYhVVo.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/layout-DC8qmv-q.js +1 -1
  91. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/linear-Bw6Dncma.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/linear-Bpra1Fqc.js +1 -1
  92. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-CzjjwzDB.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-BvHbNBJJ.js +7 -7
  93. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/mermaid.core-Bb0_1h52.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/mermaid.core-QA4yHgUs.js +5 -5
  94. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/min-Df20Er5m.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/min-sLtZymTB.js +1 -1
  95. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-CAe0siLd.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-BycLAQjs.js +1 -1
  96. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-CLMBAwjU.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-CpFv1-B_.js +1 -1
  97. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-B9vjzD3o.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-C8HyfNyW.js +1 -1
  98. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-Bbjo8TGX.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-DyTuOubd.js +1 -1
  99. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-xnxkDnDQ.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-BlUGUAE1.js +1 -1
  100. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-qkafBa71.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-jqMJUHqm.js +1 -1
  101. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-BzTcRJpG.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-zShF28En.js +1 -1
  102. pythinker_code-2.5.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-lllXGHDb.js +1 -0
  103. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-0ls9u7xd.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-Cvekw0Hb.js +1 -1
  104. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-C1ChVaOv.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-DuFTYtWm.js +1 -1
  105. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-Ba9eacUU.js → pythinker_code-2.5.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-BVeBFpa0.js +1 -1
  106. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/index.html +1 -1
  107. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/wire/server.py +16 -13
  108. pythinker_code-2.3.0/src/pythinker_code/CHANGELOG.md +0 -83
  109. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/channel-BPOuE91b.js +0 -1
  110. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-C1S9FRV4.js +0 -1
  111. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-C1S9FRV4.js +0 -1
  112. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/clone-D2vuslet.js +0 -1
  113. pythinker_code-2.3.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-TyAV0qk_.js +0 -1
  114. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/LICENSE +0 -0
  115. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/NOTICE +0 -0
  116. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/__init__.py +0 -0
  117. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/__main__.py +0 -0
  118. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/acp/AGENTS.md +0 -0
  119. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/acp/__init__.py +0 -0
  120. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/acp/convert.py +0 -0
  121. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/acp/host.py +0 -0
  122. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/acp/mcp.py +0 -0
  123. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/acp/server.py +0 -0
  124. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/acp/session.py +0 -0
  125. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/acp/types.py +0 -0
  126. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/acp/version.py +0 -0
  127. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
  128. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/agentspec.py +0 -0
  129. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
  130. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/approval_runtime/models.py +0 -0
  131. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
  132. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/auth/__init__.py +0 -0
  133. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
  134. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/auth/deepseek.py +0 -0
  135. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/auth/lm_studio.py +0 -0
  136. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/auth/minimax.py +0 -0
  137. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/auth/oauth.py +0 -0
  138. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/auth/ollama.py +0 -0
  139. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/auth/openai.py +0 -0
  140. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/auth/opencode_go.py +0 -0
  141. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/auth/openrouter.py +0 -0
  142. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/auth/platforms.py +0 -0
  143. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/background/__init__.py +0 -0
  144. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/background/agent_runner.py +0 -0
  145. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/background/ids.py +0 -0
  146. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/background/summary.py +0 -0
  147. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/background/worker.py +0 -0
  148. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/cli/__init__.py +0 -0
  149. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/cli/__main__.py +0 -0
  150. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/cli/_lazy_group.py +0 -0
  151. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/cli/export.py +0 -0
  152. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/cli/info.py +0 -0
  153. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/cli/mcp.py +0 -0
  154. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/cli/plugin.py +0 -0
  155. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/cli/toad.py +0 -0
  156. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/cli/update.py +0 -0
  157. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/cli/vis.py +0 -0
  158. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/cli/web.py +0 -0
  159. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/constant.py +0 -0
  160. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/events.py +0 -0
  161. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/exception.py +0 -0
  162. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/extensions.py +0 -0
  163. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/hooks/__init__.py +0 -0
  164. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/hooks/config.py +0 -0
  165. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/hooks/engine.py +0 -0
  166. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/hooks/events.py +0 -0
  167. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/hooks/runner.py +0 -0
  168. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/metadata.py +0 -0
  169. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/notifications/__init__.py +0 -0
  170. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/notifications/llm.py +0 -0
  171. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/notifications/manager.py +0 -0
  172. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/notifications/models.py +0 -0
  173. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/notifications/notifier.py +0 -0
  174. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/notifications/store.py +0 -0
  175. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/notifications/wire.py +0 -0
  176. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/plugin/__init__.py +0 -0
  177. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/plugin/tool.py +0 -0
  178. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/prompt_templates.py +0 -0
  179. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/prompts/__init__.py +0 -0
  180. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/prompts/compact.md +0 -0
  181. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/prompts/init.md +0 -0
  182. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/py.typed +0 -0
  183. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/session.py +0 -0
  184. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/session_fork.py +0 -0
  185. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/session_state.py +0 -0
  186. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/share.py +0 -0
  187. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/skill/__init__.py +0 -0
  188. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
  189. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/skill/flow/d2.py +0 -0
  190. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
  191. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
  192. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
  193. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/__init__.py +0 -0
  194. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/approval.py +0 -0
  195. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/btw.py +0 -0
  196. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/compaction.py +0 -0
  197. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/context.py +0 -0
  198. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/denwarenji.py +0 -0
  199. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/dynamic_injection.py +0 -0
  200. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
  201. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
  202. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
  203. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/message.py +0 -0
  204. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/soul/slash.py +0 -0
  205. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/subagents/__init__.py +0 -0
  206. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/subagents/core.py +0 -0
  207. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/subagents/git_context.py +0 -0
  208. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/subagents/output.py +0 -0
  209. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/subagents/registry.py +0 -0
  210. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/telemetry/__init__.py +0 -0
  211. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/telemetry/errors.py +0 -0
  212. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/telemetry/metrics.py +0 -0
  213. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/telemetry/sink.py +0 -0
  214. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/AGENTS.md +0 -0
  215. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/__init__.py +0 -0
  216. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/ask_user/__init__.py +0 -0
  217. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
  218. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/background/__init__.py +0 -0
  219. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/background/list.md +0 -0
  220. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/background/output.md +0 -0
  221. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/background/stop.md +0 -0
  222. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/display.py +0 -0
  223. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
  224. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
  225. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/glob.md +0 -0
  226. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/glob.py +0 -0
  227. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/grep.md +0 -0
  228. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
  229. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/read.md +0 -0
  230. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/read.py +0 -0
  231. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/read_media.md +0 -0
  232. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/read_media.py +0 -0
  233. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/replace.md +0 -0
  234. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/utils.py +0 -0
  235. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/file/write.md +0 -0
  236. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/plan/description.md +0 -0
  237. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/plan/enter.py +0 -0
  238. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
  239. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
  240. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/shell/bash.md +0 -0
  241. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
  242. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/test.py +0 -0
  243. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/think/__init__.py +0 -0
  244. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/think/think.md +0 -0
  245. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
  246. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
  247. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/utils.py +0 -0
  248. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/web/__init__.py +0 -0
  249. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/web/fetch.md +0 -0
  250. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/web/search.md +0 -0
  251. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/tools/web/search.py +0 -0
  252. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/__init__.py +0 -0
  253. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
  254. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/print/__init__.py +0 -0
  255. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/print/visualize.py +0 -0
  256. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
  257. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
  258. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
  259. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
  260. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/components/diff.py +0 -0
  261. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
  262. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
  263. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
  264. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
  265. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
  266. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
  267. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
  268. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/console.py +0 -0
  269. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/debug.py +0 -0
  270. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/echo.py +0 -0
  271. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
  272. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
  273. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
  274. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
  275. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
  276. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
  277. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
  278. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/replay.py +0 -0
  279. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/selector.py +0 -0
  280. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
  281. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
  282. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
  283. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
  284. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
  285. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
  286. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
  287. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
  288. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/setup.py +0 -0
  289. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/startup.py +0 -0
  290. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
  291. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
  292. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -0
  293. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
  294. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
  295. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
  296. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
  297. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
  298. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
  299. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
  300. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
  301. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
  302. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
  303. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
  304. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
  305. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -0
  306. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
  307. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/usage.py +0 -0
  308. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
  309. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
  310. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
  311. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
  312. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
  313. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
  314. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
  315. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
  316. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
  317. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
  318. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
  319. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
  320. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
  321. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
  322. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +0 -0
  323. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
  324. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
  325. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +0 -0
  326. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +0 -0
  327. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
  328. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
  329. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/theme.py +0 -0
  330. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/ui/tui_config.py +0 -0
  331. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
  332. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/__init__.py +0 -0
  333. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/aiohttp.py +0 -0
  334. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/aioqueue.py +0 -0
  335. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/broadcast.py +0 -0
  336. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/changelog.py +0 -0
  337. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/clipboard.py +0 -0
  338. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/datetime.py +0 -0
  339. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/diff.py +0 -0
  340. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/editor.py +0 -0
  341. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/environment.py +0 -0
  342. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/envvar.py +0 -0
  343. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/export.py +0 -0
  344. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/file_filter.py +0 -0
  345. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/frontmatter.py +0 -0
  346. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/io.py +0 -0
  347. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/logging.py +0 -0
  348. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/media_tags.py +0 -0
  349. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/message.py +0 -0
  350. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/path.py +0 -0
  351. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/proctitle.py +0 -0
  352. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/proxy.py +0 -0
  353. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
  354. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
  355. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/rich/columns.py +0 -0
  356. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/rich/diff_render.py +0 -0
  357. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
  358. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
  359. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
  360. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
  361. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/sensitive.py +0 -0
  362. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/server.py +0 -0
  363. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/signals.py +0 -0
  364. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/slashcmd.py +0 -0
  365. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/string.py +0 -0
  366. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
  367. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/term.py +0 -0
  368. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/utils/typing.py +0 -0
  369. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/__init__.py +0 -0
  370. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/api/__init__.py +0 -0
  371. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/api/statistics.py +0 -0
  372. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/api/system.py +0 -0
  373. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/static/assets/index-DSRInNnm.css +0 -0
  374. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  375. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  376. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  377. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  378. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  379. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  380. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  381. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/__init__.py +0 -0
  382. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/api/__init__.py +0 -0
  383. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/api/config.py +0 -0
  384. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/auth.py +0 -0
  385. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/models.py +0 -0
  386. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/runner/__init__.py +0 -0
  387. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/runner/messages.py +0 -0
  388. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/runner/process.py +0 -0
  389. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/runner/worker.py +0 -0
  390. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  391. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  392. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  393. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  394. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  395. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  396. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  397. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  398. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  399. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  400. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  401. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  402. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  403. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  404. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  405. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  406. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  407. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  408. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  409. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  410. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  411. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  412. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  413. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  414. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  415. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  416. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  417. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  418. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  419. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  420. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  421. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  422. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  423. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  424. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  425. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  426. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  427. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  428. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  429. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  430. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  431. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  432. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  433. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  434. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  435. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  436. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  437. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  438. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  439. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  440. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  441. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  442. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  443. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  444. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  445. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  446. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  447. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  448. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  449. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/abap-BdImnpbu.js +0 -0
  450. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +0 -0
  451. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/ada-bCR0ucgS.js +0 -0
  452. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +0 -0
  453. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +0 -0
  454. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +0 -0
  455. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/apache-Pmp26Uib.js +0 -0
  456. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/apex-D8_7TLub.js +0 -0
  457. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/apl-dKokRX4l.js +0 -0
  458. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/applescript-Co6uUVPk.js +0 -0
  459. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/ara-BRHolxvo.js +0 -0
  460. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +0 -0
  461. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/asm-D_Q5rh1f.js +0 -0
  462. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/astro-CbQHKStN.js +0 -0
  463. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +0 -0
  464. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/awk-DMzUqQB5.js +0 -0
  465. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +0 -0
  466. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +0 -0
  467. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/bat-BkioyH1T.js +0 -0
  468. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/beancount-k_qm7-4y.js +0 -0
  469. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/berry-uYugtg8r.js +0 -0
  470. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/bibtex-CHM0blh-.js +0 -0
  471. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/bicep-Bmn6On1c.js +0 -0
  472. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/blade-D4QpJJKB.js +0 -0
  473. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/bsl-BO_Y6i37.js +0 -0
  474. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/c-BIGW1oBm.js +0 -0
  475. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/c3-VCDPK7BO.js +0 -0
  476. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +0 -0
  477. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/cairo-KRGpt6FW.js +0 -0
  478. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
  479. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
  480. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
  481. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
  482. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/clarity-D53aC0YG.js +0 -0
  483. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/clojure-P80f7IUj.js +0 -0
  484. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/cmake-D1j8_8rp.js +0 -0
  485. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/cobol-nwyudZeR.js +0 -0
  486. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +0 -0
  487. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +0 -0
  488. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/coffee-Ch7k5sss.js +0 -0
  489. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +0 -0
  490. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/coq-DkFqJrB1.js +0 -0
  491. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/cpp-CofmeUqb.js +0 -0
  492. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/crystal-tKQVLTB8.js +0 -0
  493. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/csharp-K5feNrxe.js +0 -0
  494. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/css-DPfMkruS.js +0 -0
  495. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/csv-fuZLfV_i.js +0 -0
  496. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/cue-D82EKSYY.js +0 -0
  497. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/cypher-COkxafJQ.js +0 -0
  498. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/d-85-TOEBH.js +0 -0
  499. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +0 -0
  500. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/dart-CF10PKvl.js +0 -0
  501. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/dax-CEL-wOlO.js +0 -0
  502. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +0 -0
  503. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +0 -0
  504. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/diff-D97Zzqfu.js +0 -0
  505. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/docker-BcOcwvcX.js +0 -0
  506. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/dotenv-Da5cRb03.js +0 -0
  507. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/dracula-BzJJZx-M.js +0 -0
  508. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +0 -0
  509. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +0 -0
  510. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/edge-BkV0erSs.js +0 -0
  511. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/elixir-CDX3lj18.js +0 -0
  512. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/elm-DbKCFpqz.js +0 -0
  513. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +0 -0
  514. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/erb-BOJIQeun.js +0 -0
  515. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/erlang-DsQrWhSR.js +0 -0
  516. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +0 -0
  517. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +0 -0
  518. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/fennel-BYunw83y.js +0 -0
  519. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/fish-BvzEVeQv.js +0 -0
  520. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/fluent-C4IJs8-o.js +0 -0
  521. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
  522. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
  523. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +0 -0
  524. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +0 -0
  525. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +0 -0
  526. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/gdshader-DkwncUOv.js +0 -0
  527. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/genie-D0YGMca9.js +0 -0
  528. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +0 -0
  529. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +0 -0
  530. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +0 -0
  531. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/github-dark-DHJKELXO.js +0 -0
  532. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
  533. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
  534. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
  535. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/github-light-DAi9KRSo.js +0 -0
  536. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +0 -0
  537. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
  538. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/gleam-BspZqrRM.js +0 -0
  539. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
  540. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +0 -0
  541. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/glsl-DplSGwfg.js +0 -0
  542. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/gn-n2N0HUVH.js +0 -0
  543. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +0 -0
  544. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/go-Dn2_MT6a.js +0 -0
  545. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/graphql-ChdNCCLP.js +0 -0
  546. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/groovy-gcz8RCvz.js +0 -0
  547. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
  548. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
  549. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
  550. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
  551. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
  552. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
  553. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/hack-CaT9iCJl.js +0 -0
  554. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/haml-B8DHNrY2.js +0 -0
  555. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/handlebars-BL8al0AC.js +0 -0
  556. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/haskell-Df6bDoY_.js +0 -0
  557. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/haxe-CzTSHFRz.js +0 -0
  558. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/hcl-BWvSN4gD.js +0 -0
  559. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/hjson-D5-asLiD.js +0 -0
  560. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +0 -0
  561. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/houston-DnULxvSX.js +0 -0
  562. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/html-GMplVEZG.js +0 -0
  563. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +0 -0
  564. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/http-jrhK8wxY.js +0 -0
  565. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/hurl-irOxFIW8.js +0 -0
  566. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +0 -0
  567. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/hy-DFXneXwc.js +0 -0
  568. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/imba-DGztddWO.js +0 -0
  569. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/index-BpoLgcEt.js +0 -0
  570. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/index-CzV_vCfu.css +0 -0
  571. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/index-DI2oedCt.js +0 -0
  572. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/ini-BEwlwnbL.js +0 -0
  573. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/init-Gi6I4Gst.js +0 -0
  574. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  575. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  576. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  577. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  578. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  579. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  580. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  581. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/java-CylS5w8V.js +0 -0
  582. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/javascript-wDzz0qaB.js +0 -0
  583. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +0 -0
  584. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/jison-wvAkD_A8.js +0 -0
  585. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/json-Cp-IABpG.js +0 -0
  586. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/json5-C9tS-k6U.js +0 -0
  587. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/jsonc-Des-eS-w.js +0 -0
  588. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +0 -0
  589. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +0 -0
  590. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/jssm-C2t-YnRu.js +0 -0
  591. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/jsx-g9-lgVsj.js +0 -0
  592. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/julia-CxzCAyBv.js +0 -0
  593. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
  594. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
  595. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
  596. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/katex-D2lIc1rk.css +0 -0
  597. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/kdl-DV7GczEv.js +0 -0
  598. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +0 -0
  599. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/kusto-DZf3V79B.js +0 -0
  600. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/laserwave-DUszq2jm.js +0 -0
  601. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/latex-B4uzh10-.js +0 -0
  602. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/lean-BZvkOJ9d.js +0 -0
  603. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/less-B1dDrJ26.js +0 -0
  604. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +0 -0
  605. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/liquid-DYVedYrR.js +0 -0
  606. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/llvm-BtvRca6l.js +0 -0
  607. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/log-2UxHyX5q.js +0 -0
  608. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/logo-BtOb2qkB.js +0 -0
  609. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/lua-BbnMAYS6.js +0 -0
  610. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/luau-C-HG3fhB.js +0 -0
  611. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/make-CHLpvVh8.js +0 -0
  612. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/markdown-Cvjx9yec.js +0 -0
  613. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/marko-DZsq8hO1.js +0 -0
  614. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +0 -0
  615. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
  616. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
  617. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +0 -0
  618. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
  619. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/matlab-D7o27uSR.js +0 -0
  620. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/mdc-DUICxH0z.js +0 -0
  621. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +0 -0
  622. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B2P5VJ9v.css +0 -0
  623. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +0 -0
  624. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/min-dark-CafNBF8u.js +0 -0
  625. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/min-light-CTRr51gU.js +0 -0
  626. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +0 -0
  627. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/mojo-B93PlW-d.js +0 -0
  628. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/monokai-D4h5O-jR.js +0 -0
  629. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/moonbit-Ba13S78F.js +0 -0
  630. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/move-Bu9oaDYs.js +0 -0
  631. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/narrat-DRg8JJMk.js +0 -0
  632. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +0 -0
  633. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/nginx-DknmC5AR.js +0 -0
  634. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/night-owl-C39BiMTA.js +0 -0
  635. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/nim-CVrawwO9.js +0 -0
  636. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/nix-CwoSXNpI.js +0 -0
  637. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/nord-Ddv68eIx.js +0 -0
  638. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/nushell-C-sUppwS.js +0 -0
  639. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +0 -0
  640. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +0 -0
  641. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +0 -0
  642. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
  643. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/one-light-PoHY5YXO.js +0 -0
  644. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/openscad-C4EeE6gA.js +0 -0
  645. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +0 -0
  646. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/pascal-D93ZcfNL.js +0 -0
  647. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/perl-C0TMdlhV.js +0 -0
  648. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/php-CDn_0X-4.js +0 -0
  649. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/pkl-u5AG7uiY.js +0 -0
  650. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/plastic-3e1v2bzS.js +0 -0
  651. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/plsql-ChMvpjG-.js +0 -0
  652. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/po-BTJTHyun.js +0 -0
  653. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +0 -0
  654. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/polar-C0HS_06l.js +0 -0
  655. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/postcss-CXtECtnM.js +0 -0
  656. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +0 -0
  657. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/powershell-Dpen1YoG.js +0 -0
  658. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/prisma-Dd19v3D-.js +0 -0
  659. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/prolog-CbFg5uaA.js +0 -0
  660. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/proto-C7zT0LnQ.js +0 -0
  661. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/pug-CGlum2m_.js +0 -0
  662. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/puppet-BMWR74SV.js +0 -0
  663. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/purescript-CklMAg4u.js +0 -0
  664. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/python-B6aJPvgy.js +0 -0
  665. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/qml-3beO22l8.js +0 -0
  666. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +0 -0
  667. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/qss-IeuSbFQv.js +0 -0
  668. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/r-Dspwwk_N.js +0 -0
  669. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/racket-BqYA7rlc.js +0 -0
  670. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/raku-DXvB9xmW.js +0 -0
  671. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/razor-C1TweQQi.js +0 -0
  672. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/red-bN70gL4F.js +0 -0
  673. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/reg-C-SQnVFl.js +0 -0
  674. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +0 -0
  675. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/rel-C3B-1QV4.js +0 -0
  676. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/riscv-BM1_JUlF.js +0 -0
  677. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
  678. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
  679. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +0 -0
  680. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +0 -0
  681. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/rst-B0xPkSld.js +0 -0
  682. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/ruby-BvKwtOVI.js +0 -0
  683. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/rust-B1yitclQ.js +0 -0
  684. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/sas-cz2c8ADy.js +0 -0
  685. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +0 -0
  686. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/scala-C151Ov-r.js +0 -0
  687. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/scheme-C98Dy4si.js +0 -0
  688. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/scss-OYdSNvt2.js +0 -0
  689. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +0 -0
  690. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
  691. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/shellscript-Yzrsuije.js +0 -0
  692. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/shellsession-BADoaaVG.js +0 -0
  693. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +0 -0
  694. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +0 -0
  695. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +0 -0
  696. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +0 -0
  697. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +0 -0
  698. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +0 -0
  699. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/solidity-rGO070M0.js +0 -0
  700. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/soy-Brmx7dQM.js +0 -0
  701. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/sparql-rVzFXLq3.js +0 -0
  702. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/splunk-BtCnVYZw.js +0 -0
  703. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/sql-BLtJtn59.js +0 -0
  704. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +0 -0
  705. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/stata-BH5u7GGu.js +0 -0
  706. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +0 -0
  707. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/svelte-zxCyuUbr.js +0 -0
  708. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/swift-Dg5xB15N.js +0 -0
  709. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +0 -0
  710. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +0 -0
  711. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/systemd-4A_iFExJ.js +0 -0
  712. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/talonscript-CkByrt1z.js +0 -0
  713. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/tasl-QIJgUcNo.js +0 -0
  714. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/tcl-dwOrl1Do.js +0 -0
  715. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/templ-W15q3VgB.js +0 -0
  716. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/terraform-BETggiCN.js +0 -0
  717. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/tex-CvyZ59Mk.js +0 -0
  718. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/tokyo-night-hegEt444.js +0 -0
  719. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/toml-vGWfd6FD.js +0 -0
  720. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +0 -0
  721. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/tsv-B_m7g4N7.js +0 -0
  722. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/tsx-COt5Ahok.js +0 -0
  723. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/turtle-BsS91CYL.js +0 -0
  724. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/twig-CO9l9SDP.js +0 -0
  725. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +0 -0
  726. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/typespec-BGHnOYBU.js +0 -0
  727. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/typst-DHCkPAjA.js +0 -0
  728. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/v-BcVCzyr7.js +0 -0
  729. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/vala-CsfeWuGM.js +0 -0
  730. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/vb-D17OF-Vu.js +0 -0
  731. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/verilog-BQ8w6xss.js +0 -0
  732. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/vesper-DU1UobuO.js +0 -0
  733. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +0 -0
  734. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/viml-CJc9bBzg.js +0 -0
  735. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
  736. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
  737. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +0 -0
  738. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/vue-DN_0RTcg.js +0 -0
  739. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +0 -0
  740. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +0 -0
  741. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/vyper-CDx5xZoG.js +0 -0
  742. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +0 -0
  743. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/wasm-MzD3tlZU.js +0 -0
  744. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/wenyan-BV7otONQ.js +0 -0
  745. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +0 -0
  746. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +0 -0
  747. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/wit-5i3qLPDT.js +0 -0
  748. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +0 -0
  749. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/xml-sdJ4AIDG.js +0 -0
  750. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/xsl-CtQFsRM5.js +0 -0
  751. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/yaml-Buea-lGh.js +0 -0
  752. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +0 -0
  753. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/assets/zig-VOosw3JB.js +0 -0
  754. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
  755. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
  756. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
  757. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
  758. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
  759. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
  760. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
  761. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
  762. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
  763. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
  764. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
  765. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
  766. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
  767. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
  768. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
  769. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
  770. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
  771. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
  772. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
  773. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
  774. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
  775. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
  776. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/static/logo.png +0 -0
  777. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/store/__init__.py +0 -0
  778. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/web/store/sessions.py +0 -0
  779. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/wire/__init__.py +0 -0
  780. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/wire/file.py +0 -0
  781. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
  782. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/wire/protocol.py +0 -0
  783. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/wire/root_hub.py +0 -0
  784. {pythinker_code-2.3.0 → pythinker_code-2.5.0}/src/pythinker_code/wire/serde.py +0 -0
  785. {pythinker_code-2.3.0 → pythinker_code-2.5.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.3.0
3
+ Version: 2.5.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
@@ -110,6 +110,39 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
110
110
 
111
111
  ---
112
112
 
113
+ ## 🆕 What's New in 2.5.0
114
+
115
+ Coding-agent runtime hardening: runtime-enforced permission profiles, FetchURL SSRF protection, a Windows self-upgrade fix, and a configurable feedback endpoint.
116
+
117
+ - **Runtime-enforced permission profiles** — every built-in role (`read-only` / `plan` / `ask` / `implement` / `review` / `verify`) is now backed by `src/pythinker_code/soul/permission.py`. Profiles are snapshot per LLM step so a mid-step model switch can't escalate. **Plan mode hard-denies** non-plan writes and dangerous shell mutations instead of relying on prompt-deny.
118
+ - **Plan → Implement handoff** — new `tools/plan/handoff.py` plus dynamic injection through `soul/dynamic_injections/plan_mode.py` carries the approved plan into implementation without re-priming the context.
119
+ - **FetchURL SSRF + size hardening** — `_validate_fetch_url` blocks private / loopback / link-local / multicast / reserved IPv4 + IPv6 ranges; rejects non-`http`/`https` schemes; non-host URLs. Responses are streamed with a hard **5 MB** ceiling honoring `Content-Length`.
120
+ - **Windows self-upgrade fixed** — `pythinker update` on Windows now spawns the upgrade in a **detached console** and exits the parent before `uv tool upgrade` runs, releasing the lock on the running `pythinker.exe`. Eliminates the `os error 32: The process cannot access the file because it is being used by another process` error.
121
+ - **Background recovery improved** — `recoverable` (resumable via stored `agent_id`) vs `lost` (worker gone, no resume target). Subagent instances are parked as `idle` when recoverable. `pythinker-host` subprocess teardown kills the entire child process tree and creates a new session group.
122
+ - **Feedback endpoint config** — new `feedback` config block (`endpoint_url`, `api_key`, `custom_headers`). The `/feedback` slash command now routes submissions to a user-configured HTTP endpoint instead of being a no-op.
123
+ - **Welcome-screen version banner** — installed Pythinker version is now visible up-front.
124
+ - **VS 2026 CI forward-compat probe** — non-blocking `windows-2025-vs2026` matrix entry on the host + cli builds validates MSVC v144 ahead of GitHub's eventual `windows-2022` deprecation.
125
+ - **anthropic 0.101 compat** — added fallbacks for the six new tool-result block types so `pyright` stays exhaustive.
126
+ - **Telemetry hygiene** — OTel `service.name` normalized to a stable value for SigNoz dashboards; Sentry filters drop test and shutdown noise.
127
+
128
+ Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.5.0`.
129
+
130
+ ### What was new in 2.4.0
131
+
132
+ ## 🆕 What's New in 2.4.0
133
+
134
+ Subagent roles overhaul, Moonshot/Kimi K2 provider support, and a ripgrep-free Grep fallback.
135
+
136
+ - **New subagents** — `implementer` (scoped edits + verification), `review` (severity-scored read-only review), and `verifier` (`PASS` / `FAIL` / `FLAKY` validation runner). Join the existing `coder` / `explore` / `plan` roster.
137
+ - **Structured subagent output** — every default agent now answers with `### SUMMARY / EVIDENCE / CHANGES / RISKS / BLOCKERS`, so the parent agent can consume results without re-parsing prose. New recommended flow: **Scout → Plan → Implement → Review → Verify** (review and verify can run in parallel).
138
+ - **Kimi K2.5 / K2.6 (Moonshot) support** — `--thinking` is routed via the provider-specific `thinking.type` body field, and assistant tool-call replays always carry `reasoning_content` so multi-step tool flows stop tripping Moonshot's strict thinking-replay check. Same hardening applied to DeepSeek's strict mode.
139
+ - **`Grep` works without `rg`** — pure-Python fallback honors `pattern` / `glob` / `type` / `ignore_case` / `multiline` / `context` / `output_mode` / `offset` / `head_limit` and respects `.gitignore`. The downloader also retries against the upstream GitHub releases mirror and accepts `PYTHINKER_RG_PATH=/absolute/path` plus extra discovery paths (`~/.cargo/bin`, `~/.local/bin`, `~/.pi/agent/bin`, `/usr/bin`, `/usr/local/bin`).
140
+ - **`AGENTS.md` rewritten** to match the new roster, and `tools/agent/description.md` documents the parallel-review and cross-check patterns.
141
+
142
+ Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.4.0`.
143
+
144
+ ### What was new in 2.3.0
145
+
113
146
  ## 🆕 What's New in 2.3.0
114
147
 
115
148
  Telemetry & observability audit on top of 2.2.1.
@@ -120,8 +153,6 @@ Telemetry & observability audit on top of 2.2.1.
120
153
  - **`pythinker.mcp.call` span** with `mcp.server` attribute.
121
154
  - **`docs/en/reference/telemetry.md`** documents the full contract.
122
155
 
123
- Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.3.0`.
124
-
125
156
  ### What was new in 2.2.1
126
157
 
127
158
  ## 🆕 What's New in 2.2.1
@@ -131,8 +162,6 @@ CI hardening on top of 2.2.0.
131
162
  - **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.
132
163
  - **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.
133
164
 
134
- Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.3.0`.
135
-
136
165
  ### What was new in 2.2.0
137
166
 
138
167
  Animated installer + Windows PATH automation, on top of 2.1.2.
@@ -48,6 +48,39 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
48
48
 
49
49
  ---
50
50
 
51
+ ## 🆕 What's New in 2.5.0
52
+
53
+ Coding-agent runtime hardening: runtime-enforced permission profiles, FetchURL SSRF protection, a Windows self-upgrade fix, and a configurable feedback endpoint.
54
+
55
+ - **Runtime-enforced permission profiles** — every built-in role (`read-only` / `plan` / `ask` / `implement` / `review` / `verify`) is now backed by `src/pythinker_code/soul/permission.py`. Profiles are snapshot per LLM step so a mid-step model switch can't escalate. **Plan mode hard-denies** non-plan writes and dangerous shell mutations instead of relying on prompt-deny.
56
+ - **Plan → Implement handoff** — new `tools/plan/handoff.py` plus dynamic injection through `soul/dynamic_injections/plan_mode.py` carries the approved plan into implementation without re-priming the context.
57
+ - **FetchURL SSRF + size hardening** — `_validate_fetch_url` blocks private / loopback / link-local / multicast / reserved IPv4 + IPv6 ranges; rejects non-`http`/`https` schemes; non-host URLs. Responses are streamed with a hard **5 MB** ceiling honoring `Content-Length`.
58
+ - **Windows self-upgrade fixed** — `pythinker update` on Windows now spawns the upgrade in a **detached console** and exits the parent before `uv tool upgrade` runs, releasing the lock on the running `pythinker.exe`. Eliminates the `os error 32: The process cannot access the file because it is being used by another process` error.
59
+ - **Background recovery improved** — `recoverable` (resumable via stored `agent_id`) vs `lost` (worker gone, no resume target). Subagent instances are parked as `idle` when recoverable. `pythinker-host` subprocess teardown kills the entire child process tree and creates a new session group.
60
+ - **Feedback endpoint config** — new `feedback` config block (`endpoint_url`, `api_key`, `custom_headers`). The `/feedback` slash command now routes submissions to a user-configured HTTP endpoint instead of being a no-op.
61
+ - **Welcome-screen version banner** — installed Pythinker version is now visible up-front.
62
+ - **VS 2026 CI forward-compat probe** — non-blocking `windows-2025-vs2026` matrix entry on the host + cli builds validates MSVC v144 ahead of GitHub's eventual `windows-2022` deprecation.
63
+ - **anthropic 0.101 compat** — added fallbacks for the six new tool-result block types so `pyright` stays exhaustive.
64
+ - **Telemetry hygiene** — OTel `service.name` normalized to a stable value for SigNoz dashboards; Sentry filters drop test and shutdown noise.
65
+
66
+ Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.5.0`.
67
+
68
+ ### What was new in 2.4.0
69
+
70
+ ## 🆕 What's New in 2.4.0
71
+
72
+ Subagent roles overhaul, Moonshot/Kimi K2 provider support, and a ripgrep-free Grep fallback.
73
+
74
+ - **New subagents** — `implementer` (scoped edits + verification), `review` (severity-scored read-only review), and `verifier` (`PASS` / `FAIL` / `FLAKY` validation runner). Join the existing `coder` / `explore` / `plan` roster.
75
+ - **Structured subagent output** — every default agent now answers with `### SUMMARY / EVIDENCE / CHANGES / RISKS / BLOCKERS`, so the parent agent can consume results without re-parsing prose. New recommended flow: **Scout → Plan → Implement → Review → Verify** (review and verify can run in parallel).
76
+ - **Kimi K2.5 / K2.6 (Moonshot) support** — `--thinking` is routed via the provider-specific `thinking.type` body field, and assistant tool-call replays always carry `reasoning_content` so multi-step tool flows stop tripping Moonshot's strict thinking-replay check. Same hardening applied to DeepSeek's strict mode.
77
+ - **`Grep` works without `rg`** — pure-Python fallback honors `pattern` / `glob` / `type` / `ignore_case` / `multiline` / `context` / `output_mode` / `offset` / `head_limit` and respects `.gitignore`. The downloader also retries against the upstream GitHub releases mirror and accepts `PYTHINKER_RG_PATH=/absolute/path` plus extra discovery paths (`~/.cargo/bin`, `~/.local/bin`, `~/.pi/agent/bin`, `/usr/bin`, `/usr/local/bin`).
78
+ - **`AGENTS.md` rewritten** to match the new roster, and `tools/agent/description.md` documents the parallel-review and cross-check patterns.
79
+
80
+ Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.4.0`.
81
+
82
+ ### What was new in 2.3.0
83
+
51
84
  ## 🆕 What's New in 2.3.0
52
85
 
53
86
  Telemetry & observability audit on top of 2.2.1.
@@ -58,8 +91,6 @@ Telemetry & observability audit on top of 2.2.1.
58
91
  - **`pythinker.mcp.call` span** with `mcp.server` attribute.
59
92
  - **`docs/en/reference/telemetry.md`** documents the full contract.
60
93
 
61
- Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.3.0`.
62
-
63
94
  ### What was new in 2.2.1
64
95
 
65
96
  ## 🆕 What's New in 2.2.1
@@ -69,8 +100,6 @@ CI hardening on top of 2.2.0.
69
100
  - **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.
70
101
  - **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.
71
102
 
72
- Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.3.0`.
73
-
74
103
  ### What was new in 2.2.0
75
104
 
76
105
  Animated installer + Windows PATH automation, on top of 2.1.2.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pythinker-code"
3
- version = "2.3.0"
3
+ version = "2.5.0"
4
4
  description = "Pythinker Code is your next CLI agent."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -0,0 +1,165 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ## 2.5.0 (2026-05-13)
6
+
7
+ bk_box_main coding-agent runtime port, Windows self-upgrade fix, FetchURL SSRF hardening, and a broad reliability/security pass.
8
+
9
+ ### Subagent runtime & permissions
10
+
11
+ - Runtime-enforced permission profiles for every built-in role: **read-only**, **plan**, **ask**, **implement**, **review**, **verify**. Profiles are snapshot per LLM step in the new `src/pythinker_code/soul/permission.py` so a mid-step model switch can't escalate. Plan mode now **hard-denies** non-plan writes and dangerous shell mutations instead of relying on prompt-deny.
12
+ - New plan-handoff workflow in `src/pythinker_code/tools/plan/handoff.py` with dynamic injection through `soul/dynamic_injections/plan_mode.py`. Smooth handoff from `plan` → `implement` without re-priming the context.
13
+ - New smart-search grep variant; new subagent metadata plumbing (`subagents/models.py`, `subagents/store.py`, `subagents/builder.py`, `subagents/runner.py`).
14
+
15
+ ### Background tasks
16
+
17
+ - Recovery distinguishes **`recoverable`** (resumable via a stored `agent_id`) from **`lost`** (worker is gone with no resume target). Agent instances are parked as `idle` rather than failed when the underlying task is recoverable.
18
+ - Guards against overwriting terminal task states; subagent races on instance transitions closed.
19
+ - `pythinker-host`: subprocess teardown now kills the **entire child process tree** and creates a new session group, so background workers can no longer survive their parent on Linux/macOS.
20
+
21
+ ### FetchURL — SSRF + resource-exhaustion hardening
22
+
23
+ - `pythinker_code.tools.web.fetch._validate_fetch_url` blocks **private, loopback, link-local, multicast, and reserved** IPv4/IPv6 ranges; rejects non-`http`/`https` schemes and host-less URLs up front.
24
+ - Responses are streamed with a hard **5 MB** ceiling (`_read_limited`) honoring `Content-Length`. Both the direct path and the configured fetch-service path enforce the same caps.
25
+
26
+ ### Web / vis surface
27
+
28
+ - Upload limits, open-in path escaping, and vis auth all hardened (`src/pythinker_code/web/`, `src/pythinker_code/vis/`, `vis/src/lib/api.ts`).
29
+
30
+ ### Plugin
31
+
32
+ - Plugin definitions no longer persist host credentials. Plugin **name validation** tightened to reject path-traversal and shell-meta characters.
33
+
34
+ ### Telemetry & observability
35
+
36
+ - OTel `service.name` normalized to a stable value, decoupled from the configured display name, so SigNoz dashboards keep working across rebrands.
37
+ - Sentry filters drop test-process noise and benign shutdown errors; `pythinker_code/telemetry/config.py` and `pythinker_code/telemetry/crash.py` updated accordingly.
38
+ - New `tests/telemetry/test_otel_resource.py` asserts the resource identity used by the dashboards.
39
+
40
+ ### Windows
41
+
42
+ - `pythinker update` on Windows now spawns the upgrade in a **detached console** and exits the parent process before `uv tool upgrade` runs, releasing the lock on the running `pythinker.exe`. Fixes the `os error 32: The process cannot access the file because it is being used by another process` error that blocked self-upgrade.
43
+ - New CI matrix entry on **`windows-2025-vs2026`** (experimental, non-blocking) for the pythinker-host and pythinker-cli build, validating Visual Studio 2026 / MSVC v144 forward-compat before GitHub eventually deprecates `windows-2022`.
44
+
45
+ ### Feedback
46
+
47
+ - New `feedback` config block: `endpoint_url`, `api_key`, `custom_headers`. The `/feedback` slash command now routes user submissions to a user-configured HTTP endpoint instead of being a no-op.
48
+
49
+ ### UI
50
+
51
+ - Pythinker version is shown on the welcome screen.
52
+
53
+ ### CI
54
+
55
+ - Pre-push hooks mirror CI's `check` target (`ruff format --check`, `ruff check`, `pyright`) so local pushes catch the same regressions CI does.
56
+ - README + CHANGELOG release-validate gate hardened; the GitHub Release publish step is now resilient to transient upstream failures.
57
+ - Spell-check vocabulary fix in `soul/permission.py` for an internal error string the typos crate flagged; experimental `windows-2025-vs2026` build no longer collides with `windows-2022` on the shared `pythinker-x86_64-pc-windows-msvc` artifact name.
58
+
59
+ ### Compatibility
60
+
61
+ - `pythinker_core.contrib.chat_provider.anthropic`: handle the six new tool-result block types added by anthropic SDK 0.101 (`web_fetch_tool_result`, `code_execution_tool_result`, `bash_code_execution_tool_result`, `text_editor_code_execution_tool_result`, `tool_search_tool_result`, `container_upload`). pyright is exhaustive again.
62
+
63
+ Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.5.0`.
64
+
65
+ ## 2.4.0 (2026-05-11)
66
+
67
+ Subagent roles overhaul, Moonshot/Kimi K2 provider support, and a ripgrep-free Grep fallback.
68
+
69
+ - New built-in subagents under `src/pythinker_code/agents/default/`:
70
+ - `implementer.yaml` — scoped code changes with minimum surrounding edits and a quick verification pass.
71
+ - `review.yaml` — read-only code review with severity-scored findings (BLOCKER / MAJOR / MINOR / NIT).
72
+ - `verifier.yaml` — read-only validation runner that reports `PASS` / `FAIL` / `FLAKY` without applying fixes.
73
+ - `coder.yaml`, `explore.yaml`, and `plan.yaml` now emit a standard `### SUMMARY / EVIDENCE / CHANGES / RISKS / BLOCKERS` response contract so the parent agent can consume subagent output without re-parsing prose.
74
+ - `agent.yaml` registers the three new roles; `tools/agent/description.md` documents the Scout → Plan → Implement → Review → Verify workflow and the parallel review/verification pattern.
75
+ - `agents/default/system.md`: adds decomposition guidance (preview → todo list → parallel chunks), enforces post-tool-call verification before acting on results, and tells the agent to cross-check at least one load-bearing subagent finding before editing from it.
76
+ - Kimi K2.5 / K2.6 (Moonshot) and other strict interleaved-thinking providers:
77
+ - `packages/pythinker-core/.../chat_provider/pythinker.py`: always emit `reasoning_content` on assistant tool-call replays so Moonshot's "thinking is enabled but reasoning_content is missing in assistant tool call message at index N" error no longer trips multi-step tool flows.
78
+ - `packages/pythinker-core/.../contrib/chat_provider/openai_legacy.py`: replay reasoning metadata on every assistant turn for `kimi-k2*` / `deepseek*` models (falls back to the assistant text or `"[reasoning unavailable]"` when reasoning content was not retained).
79
+ - `src/pythinker_code/llm.py`: route Kimi K2 thinking through the provider-specific `extra_body={"thinking": {"type": "enabled"|"disabled"}}` body field instead of OpenAI's `reasoning_effort` (which Kimi ignores), and persist `LLM.thinking` across `clone_llm_with_model_alias` so model switches preserve the user's thinking choice.
80
+ - `tools/file/grep_local.py`:
81
+ - Pure-Python `rg`-free fallback (`_python_grep`) honoring `pattern`, `path`, `glob`, `type` (bash / c / cpp / go / java / js / json / md / py / rust / sh / toml / ts / txt / yaml / zsh), `ignore_case`, `multiline`, `context` / `before_context` / `after_context`, `line_number`, `output_mode` (`content` / `files_with_matches` / `count_matches`), `offset`, `head_limit`, and the standard sensitive-file redaction. `.gitignore` / `.ignore` and the VCS metadata directories (`.git`, `.svn`, `.hg`, `.bzr`, `.jj`, `.sl`) are respected unless `include_ignored=true`.
82
+ - `_find_existing_rg` now honors `PYTHINKER_RG_PATH` and additionally probes `/usr/bin`, `/usr/local/bin`, `~/.cargo/bin`, `~/.local/bin`, and `~/.pi/agent/bin` before falling through to download.
83
+ - Downloader retries against the upstream GitHub releases mirror (`https://github.com/BurntSushi/ripgrep/releases/download/<version>/...`) when the CDN mirror is unreachable, and the failure path now degrades into the Python fallback instead of raising.
84
+ - `.gitignore`: ignore `graphify-out*/`, `.graphify_*.json`, `.graphify_*.txt`, and the local `blackbox/` scratch area.
85
+ - `AGENTS.md` rewritten to reflect the new subagent roster and workflow.
86
+
87
+ ## 2.3.0 (2026-05-09)
88
+
89
+ Telemetry & observability audit.
90
+
91
+ - 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.
92
+ - 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.
93
+ - `pythinker_code/telemetry/otel.py`: TracerProvider now uses `ParentBased(TraceIdRatioBased(rate))` driven by `PYTHINKER_OTEL_TRACE_SAMPLE_RATE` (default 1.0).
94
+ - New `pythinker.mcp.call` span around every MCPTool RPC.
95
+ - New `/report-error` slash command (aliases `/report`, `/report-error`).
96
+ - `docs/en/reference/telemetry.md` documents the full telemetry contract.
97
+ - `chore(test)`: updated google-genai snapshot for pydantic 2.13.4 + google-genai 2.0.0.
98
+
99
+
100
+ ## 2.2.1 (2026-05-09)
101
+
102
+ CI hardening: macOS binary build is now optional-codesign.
103
+
104
+ - `.github/workflows/release-pythinker-cli.yml`: detect whether `APPLE_CERTIFICATE_P12` and `APPLE_NOTARIZATION_KEY_P8` repo secrets are configured. When they aren't, skip the keychain setup, codesign, and notarization steps and ship an ad-hoc-signed PyInstaller binary instead of failing the whole release. The 2.2.0 release run failed because those secrets were empty in CI; this makes the release matrix all-green even without an Apple Developer cert.
105
+ - `.github/workflows/release-pythinker-cli.yml`: add `skip-existing: true` to `pypa/gh-action-pypi-publish` so re-runs of the release workflow against an already-published version are no-ops instead of HTTP 400 errors.
106
+ - macOS-arm64 binary downloads from the GitHub Release page will now show a Gatekeeper warning on first launch when the secrets aren't configured. Users can clear it with `xattr -d com.apple.quarantine ./pythinker`. PyPI install (`pip install pythinker-code`) is unaffected.
107
+
108
+ ## 2.2.0 (2026-05-09)
109
+
110
+ Installer UX: animated logo + Windows PATH automation.
111
+
112
+ - `scripts/install.sh`: Tetris-style logo animation. Pieces (walls, bars, eyes, ears, antenna) fall from above the canvas one at a time and settle into the robot head before install proceeds. Static logo remains the fallback for non-TTY / `NO_COLOR` / `TERM=dumb` / `CI=1` / `PYTHINKER_NO_ANIMATION=1`. Tunables: `PYTHINKER_LOGO_FRAME_DELAY` and `PYTHINKER_LOGO_STAGGER_DELAY` (seconds).
113
+ - `scripts/install.ps1`: same animation, PowerShell port. Tunables: `PYTHINKER_LOGO_FRAME_DELAY_MS` and `PYTHINKER_LOGO_STAGGER_DELAY_MS` (milliseconds).
114
+ - `scripts/install.ps1`: idempotently append `$USERPROFILE\.local\bin` to the User PATH via `[Environment]::SetEnvironmentVariable` and broadcast `WM_SETTINGCHANGE` so future shells (and Explorer-spawned children) pick up the new PATH automatically. No-op when the directory is already present.
115
+ - `scripts/install.ps1`: force `[Console]::OutputEncoding = UTF8` so the box-drawing characters render correctly on Windows hosts.
116
+
117
+ ## 2.1.2 (2026-05-09)
118
+
119
+ Windows installer fix.
120
+
121
+ - `scripts/install.ps1`: dot-source Astral's `uv` bootstrap inside `& { ... }` instead of spawning `powershell -File`, so `$env:PATH` updates land in the running process.
122
+ - `scripts/install.ps1`: refresh PATH after `uv tool install` and verify `pythinker` resolves before printing success; otherwise emit the absolute shim path.
123
+ - README: invoke the downloaded `install.ps1` with `& $installer` (current shell) instead of a `powershell -NoProfile -File $installer` subprocess. `uv`, `uvx`, and `pythinker` are now usable in the calling shell as soon as the installer exits.
124
+ - `tests/test_installation_docs.py`: lock in current-session invocation in the README and a dot-sourced `uv` bootstrap in `install.ps1`.
125
+
126
+ ## 2.1.1 (2026-05-08)
127
+
128
+ Documentation refresh.
129
+
130
+ - README: image and key file links converted to absolute GitHub URLs so the project page on PyPI renders the logo, demo GIFs, and architecture diagram correctly.
131
+ - README: added a "What's New in 2.1.0" section summarising the TUI CLI and slash-command enhancements.
132
+ - README: corrected the License section to Apache-2.0 (matches `pyproject.toml` and the `LICENSE` badge).
133
+
134
+ ## 2.1.0 (2026-05-08)
135
+
136
+ TUI CLI design and slash command enhancements.
137
+
138
+ - New selectors package — interactive `/theme`, `/thinking`, `/model`, `/login`, `/settings`, `/extension`, and `/show-images` panels replace inline numeric/text prompts.
139
+ - New `/thinking` slash command for adjusting reasoning effort at runtime.
140
+ - `SettingsList` component + `/settings` selector for live `Config` editing (theme, default model, TUI style, default thinking, telemetry).
141
+ - Selector framework: `SelectorHeader` sentinel and per-row `on_change` callback.
142
+ - Card-style TUI polish: bordered shell card, footer/toolbar, tool renderers (read/write/edit/grep/find/bash/agent) and a diff component; subagent tool cards get a running-dots spinner.
143
+ - Pythinker-branded slash menu, input row, and tool execution components.
144
+ - Prompt template discovery simplified to `.pythinker/prompts` at project and user scope (legacy directory lookup removed).
145
+ - TUI style flag now accepts only `card` (default) or `pythinker`; the legacy alias has been dropped.
146
+
147
+ - Update notifier: standalone "Update Available" banner shown above the welcome panel when a newer release is on PyPI; suppressed by `PYTHINKER_CLI_NO_AUTO_UPDATE=1`.
148
+ - New `pythinker update` subcommand (`--check` for a non-installing check) that auto-detects the install method (`uv tool`, `pipx`, or `pip`) and runs the matching upgrade command.
149
+ - Image paste placeholder now renders as `[Image #N]` in the input/buffer (mirroring `[Pasted text #N +K lines]`); history serialization keeps the canonical `[image:<id>,WxH]` form so attachments still resolve cross-session.
150
+ - Lower default paste-placeholderize thresholds to 200 chars / 5 lines (was 1000 / 15) so medium-length pastes collapse into `[Pasted text #N]` instead of overflowing the compact input window. Override via `PYTHINKER_CLI_PASTE_CHAR_THRESHOLD` and `PYTHINKER_CLI_PASTE_LINE_THRESHOLD`.
151
+
152
+ ## 1.0.0 (2026-05-06)
153
+
154
+ Initial release of Pythinker CLI.
155
+
156
+ - Interactive terminal AI coding agent with shell command mode (Ctrl-X)
157
+ - ACP server (`pythinker acp`) for IDE integrations such as Zed and JetBrains
158
+ - MCP tool support: `pythinker mcp` sub-commands and ad-hoc `--mcp-config-file`
159
+ - Multi-provider auth: OpenAI, OpenAI Codex, Anthropic, OpenRouter, DeepSeek, MiniMax, Opencode-Go
160
+ - Skills, plugins, and slash commands across project / user / built-in scopes
161
+ - Session persistence with subagents and approval workflows
162
+ - Print mode and wire mode for non-interactive and programmatic use
163
+ - Plan mode for read-only research and design before code changes
164
+ - YOLO mode (`--yolo` / `/yolo`) to dangerously skip permission approvals while keeping the user reachable via `AskUserQuestion`
165
+ - Auto mode (`--auto` / `/auto`) for unattended runs: auto-approves tool calls and auto-dismisses `AskUserQuestion` so the agent finishes end-to-end without a user
@@ -8,6 +8,7 @@ from pythinker_host.local import local_host
8
8
 
9
9
  from pythinker_code.soul.agent import Runtime
10
10
  from pythinker_code.soul.approval import Approval
11
+ from pythinker_code.soul.permission import check_shell_command_allowed
11
12
  from pythinker_code.soul.toolset import PythinkerToolset
12
13
  from pythinker_code.tools.shell import Params as ShellParams
13
14
  from pythinker_code.tools.shell import Shell
@@ -35,6 +36,7 @@ def replace_tools(
35
36
  acp_conn,
36
37
  acp_session_id,
37
38
  runtime.approval,
39
+ runtime,
38
40
  )
39
41
  )
40
42
 
@@ -52,6 +54,7 @@ class Terminal(CallableTool2[ShellParams]):
52
54
  acp_conn: acp.Client,
53
55
  acp_session_id: str,
54
56
  approval: Approval,
57
+ runtime: Runtime,
55
58
  ) -> None:
56
59
  # Use the `name`, `description`, and `params` from the existing Shell tool,
57
60
  # so that when this is added to the toolset, it replaces the original Shell tool.
@@ -59,6 +62,7 @@ class Terminal(CallableTool2[ShellParams]):
59
62
  self._acp_conn = acp_conn
60
63
  self._acp_session_id = acp_session_id
61
64
  self._approval = approval
65
+ self._runtime = runtime
62
66
 
63
67
  async def __call__(self, params: ShellParams) -> ToolReturnValue:
64
68
  from pythinker_code.acp.session import get_current_acp_tool_call_id_or_none
@@ -71,6 +75,9 @@ class Terminal(CallableTool2[ShellParams]):
71
75
  if not params.command:
72
76
  return builder.error("Command cannot be empty.", brief="Empty command")
73
77
 
78
+ if err := check_shell_command_allowed(self._runtime, params.command):
79
+ return err
80
+
74
81
  approval_result = await self._approval.request(
75
82
  self.name,
76
83
  "run shell command",
@@ -18,6 +18,7 @@ agent:
18
18
  - "pythinker_code.tools.file:ReadMediaFile"
19
19
  - "pythinker_code.tools.file:Glob"
20
20
  - "pythinker_code.tools.file:Grep"
21
+ - "pythinker_code.tools.file:SmartSearch"
21
22
  - "pythinker_code.tools.file:WriteFile"
22
23
  - "pythinker_code.tools.file:StrReplaceFile"
23
24
  - "pythinker_code.tools.web:SearchWeb"
@@ -34,3 +35,12 @@ agent:
34
35
  plan:
35
36
  path: ./plan.yaml
36
37
  description: "Read-only implementation planning and architecture design."
38
+ review:
39
+ path: ./review.yaml
40
+ description: "Read-only code review with severity-scored findings."
41
+ implementer:
42
+ path: ./implementer.yaml
43
+ description: "Scoped implementation with minimal edits and verification."
44
+ verifier:
45
+ path: ./verifier.yaml
46
+ description: "Read-only validation runner for tests, lint, and builds."
@@ -4,6 +4,22 @@ agent:
4
4
  system_prompt_args:
5
5
  ROLE_ADDITIONAL: |
6
6
  You are now running as a subagent. All the `user` messages are sent by the main agent. The main agent cannot see your context, it can only see your last message when you finish the task. You must treat the parent agent as your caller. Do not directly ask the end user questions. If something is unclear, explain the ambiguity in your final summary to the parent agent.
7
+
8
+ Stay tightly scoped to exactly what the parent assigned. Do not expand into adjacent cleanup or refactors. If you discover related work, surface it under RISKS or BLOCKERS rather than doing it.
9
+
10
+ Before editing, read the target files and confirm the line ranges/patterns you will change. Prefer the minimum edit that satisfies the brief. After edits, run the smallest relevant verification command available and report the result.
11
+
12
+ Final response contract:
13
+ ### SUMMARY
14
+ One paragraph with what you did and the outcome.
15
+ ### EVIDENCE
16
+ Bullet list of concrete file paths, command results, or observed errors that support the outcome.
17
+ ### CHANGES
18
+ Bullet list of every file you modified, or `None.` if read-only.
19
+ ### RISKS
20
+ Bullet list of remaining risks or `None observed.`.
21
+ ### BLOCKERS
22
+ Bullet list of anything that stopped completion, or `None.`.
7
23
  when_to_use: |
8
24
  Use this agent for non-trivial software engineering work that may require reading files, editing code, running commands, and returning a compact but technically complete summary to the parent agent.
9
25
  allowed_tools:
@@ -12,6 +28,7 @@ agent:
12
28
  - "pythinker_code.tools.file:ReadMediaFile"
13
29
  - "pythinker_code.tools.file:Glob"
14
30
  - "pythinker_code.tools.file:Grep"
31
+ - "pythinker_code.tools.file:SmartSearch"
15
32
  - "pythinker_code.tools.file:WriteFile"
16
33
  - "pythinker_code.tools.file:StrReplaceFile"
17
34
  - "pythinker_code.tools.web:SearchWeb"
@@ -5,7 +5,7 @@ agent:
5
5
  ROLE_ADDITIONAL: |
6
6
  You are now running as a subagent. All the `user` messages are sent by the main agent. The main agent cannot see your context, it can only see your last message when you finish the task. You must treat the parent agent as your caller. Do not directly ask the end user questions. If something is unclear, explain the ambiguity in your final summary to the parent agent.
7
7
 
8
- You are a codebase exploration specialist. Your role is EXCLUSIVELY to search, read, and analyze existing code and resources. You do NOT have access to file editing tools.
8
+ You are a codebase exploration specialist. Your role is EXCLUSIVELY to search, read, and analyze existing code and resources. You do NOT have access to file editing tools. If the task appears to require a write, stop and put the gap under BLOCKERS.
9
9
 
10
10
  Your strengths:
11
11
  - Rapidly finding files using glob patterns
@@ -24,7 +24,19 @@ agent:
24
24
 
25
25
  If the prompt includes a <git-context> block, use it to orient yourself about the repository state before starting your investigation.
26
26
 
27
- You are meant to be a fast agent. Complete the search request efficiently and report your findings clearly in a structured format.
27
+ You are meant to be a fast agent. Complete the search request efficiently and report your findings clearly in a structured format. EVIDENCE is the load-bearing section: cite each important finding as `path:line-range` when possible, and stop once you have enough evidence rather than exhaustively reading the whole repository.
28
+
29
+ Final response contract:
30
+ ### SUMMARY
31
+ One paragraph with the headline answer.
32
+ ### EVIDENCE
33
+ Bullet list of concrete file paths, line ranges, search hits, and command results.
34
+ ### CHANGES
35
+ Always write `None.`.
36
+ ### RISKS
37
+ Bullet list of uncertainties or `None observed.`.
38
+ ### BLOCKERS
39
+ Bullet list of missing context/capabilities or `None.`.
28
40
  when_to_use: |
29
41
  Fast agent specialized for exploring codebases. Use this when you need to quickly find files by patterns (e.g. "src/**/*.yaml"), search code for keywords (e.g. "database connection"), or answer questions about the codebase (e.g. "how does the auth module work?"). When calling this agent, specify the desired thoroughness level: "quick" for basic searches, "medium" for moderate exploration, or "thorough" for comprehensive analysis across multiple locations and naming conventions. Use this agent for any read-only exploration that will clearly require more than 3 tool calls. Prefer launching multiple explore agents concurrently when investigating independent questions.
30
42
  allowed_tools:
@@ -33,6 +45,7 @@ agent:
33
45
  - "pythinker_code.tools.file:ReadMediaFile"
34
46
  - "pythinker_code.tools.file:Glob"
35
47
  - "pythinker_code.tools.file:Grep"
48
+ - "pythinker_code.tools.file:SmartSearch"
36
49
  - "pythinker_code.tools.web:SearchWeb"
37
50
  - "pythinker_code.tools.web:FetchURL"
38
51
  exclude_tools:
@@ -0,0 +1,46 @@
1
+ version: 1
2
+ agent:
3
+ extend: ./agent.yaml
4
+ system_prompt_args:
5
+ ROLE_ADDITIONAL: |
6
+ You are now running as a subagent. All the `user` messages are sent by the main agent. The main agent cannot see your context, it can only see your last message when you finish the task. Treat the parent agent as your caller. Do not directly ask the end user questions.
7
+
8
+ You are an implementation specialist. Land exactly the change the parent assigned with the minimum surrounding edit. Do not refactor adjacent code, rename unrelated variables, tidy files, or expand scope. Put related follow-up work under RISKS or BLOCKERS instead.
9
+
10
+ Method:
11
+ - Read target files before editing.
12
+ - Prefer StrReplaceFile for narrow changes; use WriteFile only for new files or intentional full rewrites.
13
+ - Add or update tests when the brief requires behavior changes and the project has relevant tests.
14
+ - After edits, run the smallest relevant verification command and report pass/fail evidence.
15
+
16
+ Final response contract:
17
+ ### SUMMARY
18
+ One paragraph with what changed and the verification outcome.
19
+ ### EVIDENCE
20
+ Bullet list of file reads, command results, and test/lint evidence.
21
+ ### CHANGES
22
+ Bullet list of every modified path with a one-line reason.
23
+ ### RISKS
24
+ Bullet list of remaining risks or `None observed.`.
25
+ ### BLOCKERS
26
+ Bullet list of anything that stopped completion, or `None.`.
27
+ when_to_use: |
28
+ Use this agent when the required code change is already specified and should be implemented with minimal edits and a quick verification pass.
29
+ allowed_tools:
30
+ - "pythinker_code.tools.shell:Shell"
31
+ - "pythinker_code.tools.file:ReadFile"
32
+ - "pythinker_code.tools.file:ReadMediaFile"
33
+ - "pythinker_code.tools.file:Glob"
34
+ - "pythinker_code.tools.file:Grep"
35
+ - "pythinker_code.tools.file:SmartSearch"
36
+ - "pythinker_code.tools.file:WriteFile"
37
+ - "pythinker_code.tools.file:StrReplaceFile"
38
+ - "pythinker_code.tools.web:SearchWeb"
39
+ - "pythinker_code.tools.web:FetchURL"
40
+ exclude_tools:
41
+ - "pythinker_code.tools.agent:Agent"
42
+ - "pythinker_code.tools.ask_user:AskUserQuestion"
43
+ - "pythinker_code.tools.todo:SetTodoList"
44
+ - "pythinker_code.tools.plan:ExitPlanMode"
45
+ - "pythinker_code.tools.plan.enter:EnterPlanMode"
46
+ subagents:
@@ -5,10 +5,21 @@ agent:
5
5
  ROLE_ADDITIONAL: |
6
6
  You are now running as a subagent. All the `user` messages are sent by the main agent. The main agent cannot see your context, it can only see your last message when you finish the task. You must treat the parent agent as your caller. Do not directly ask the end user questions. If something is unclear, explain the ambiguity in your final summary to the parent agent.
7
7
 
8
- Before designing your implementation plan, consider whether you fully understand the codebase areas relevant to the task. If not, recommend the parent agent to use the explore agent (subagent_type="explore") to investigate key questions first. In your response, clearly state:
9
- 1. What you already know from the information provided
10
- 2. What questions remain unanswered that would benefit from explore agent investigation
11
- 3. Your implementation plan (either preliminary if questions remain, or final if sufficient context exists)
8
+ Before designing your implementation plan, consider whether you fully understand the codebase areas relevant to the task. If not, recommend the parent agent to use the explore agent (subagent_type="explore") to investigate key questions first.
9
+
10
+ Ground the plan in evidence. Read enough files to avoid guessing, name the trade-offs, and choose one path with a reason. Each step should name the artifact it changes and the verification that proves it worked. Order steps by dependency first, then by risk reduced per effort.
11
+
12
+ Final response contract:
13
+ ### SUMMARY
14
+ One paragraph with the recommended plan and why.
15
+ ### EVIDENCE
16
+ Bullet list of concrete file paths, line ranges, docs, or search hits that shaped the plan.
17
+ ### CHANGES
18
+ Always write `None.` unless you wrote a plan artifact.
19
+ ### RISKS
20
+ Bullet list of trade-offs, unknowns, or rollout risks.
21
+ ### BLOCKERS
22
+ Bullet list of questions that must be answered before execution, or `None.`.
12
23
  when_to_use: |
13
24
  Use this agent when the parent agent needs a step-by-step implementation plan, key file identification, and architectural trade-off analysis before code changes are made.
14
25
  allowed_tools:
@@ -16,6 +27,7 @@ agent:
16
27
  - "pythinker_code.tools.file:ReadMediaFile"
17
28
  - "pythinker_code.tools.file:Glob"
18
29
  - "pythinker_code.tools.file:Grep"
30
+ - "pythinker_code.tools.file:SmartSearch"
19
31
  - "pythinker_code.tools.web:SearchWeb"
20
32
  - "pythinker_code.tools.web:FetchURL"
21
33
  exclude_tools:
@@ -0,0 +1,47 @@
1
+ version: 1
2
+ agent:
3
+ extend: ./agent.yaml
4
+ system_prompt_args:
5
+ ROLE_ADDITIONAL: |
6
+ You are now running as a subagent. All the `user` messages are sent by the main agent. The main agent cannot see your context, it can only see your last message when you finish the task. Treat the parent agent as your caller. Do not directly ask the end user questions.
7
+
8
+ You are a code review specialist. Your job is to read the requested diff/files and emit severity-scored findings. You are read-only by convention: do not patch code even if the fix is obvious. Describe the fix so the parent can dispatch an implementer.
9
+
10
+ Method:
11
+ - Read the diff or target files before scoring.
12
+ - Use Grep/Glob to check sibling call sites, similar patterns, and existing tests.
13
+ - Score each finding as BLOCKER, MAJOR, MINOR, or NIT.
14
+ - Order findings by severity, BLOCKER first.
15
+ - Be constructive: cite failure modes and evidence, not author intent.
16
+
17
+ Final response contract:
18
+ ### SUMMARY
19
+ One paragraph. If there are no MAJOR/BLOCKER issues, say that plainly.
20
+ ### EVIDENCE
21
+ Bullet list. Format review findings as `[SEVERITY] path:line-range — issue; suggested fix`.
22
+ ### CHANGES
23
+ Always write `None.`.
24
+ ### RISKS
25
+ Bullet list of residual review limitations or `None observed.`.
26
+ ### BLOCKERS
27
+ Bullet list of missing context/capabilities or `None.`.
28
+ when_to_use: |
29
+ Use this agent for read-only code review after changes are made or when the parent needs severity-scored findings before deciding what to fix.
30
+ allowed_tools:
31
+ - "pythinker_code.tools.shell:Shell"
32
+ - "pythinker_code.tools.file:ReadFile"
33
+ - "pythinker_code.tools.file:ReadMediaFile"
34
+ - "pythinker_code.tools.file:Glob"
35
+ - "pythinker_code.tools.file:Grep"
36
+ - "pythinker_code.tools.file:SmartSearch"
37
+ - "pythinker_code.tools.web:SearchWeb"
38
+ - "pythinker_code.tools.web:FetchURL"
39
+ exclude_tools:
40
+ - "pythinker_code.tools.agent:Agent"
41
+ - "pythinker_code.tools.ask_user:AskUserQuestion"
42
+ - "pythinker_code.tools.todo:SetTodoList"
43
+ - "pythinker_code.tools.plan:ExitPlanMode"
44
+ - "pythinker_code.tools.plan.enter:EnterPlanMode"
45
+ - "pythinker_code.tools.file:WriteFile"
46
+ - "pythinker_code.tools.file:StrReplaceFile"
47
+ subagents:
@@ -10,10 +10,26 @@ The user's messages may contain questions and/or task descriptions in natural la
10
10
 
11
11
  When handling the user's request, if it involves creating, modifying, or running code or files, you MUST use the appropriate tools (e.g., `WriteFile`, `Shell`) to make actual changes — do not just describe the solution in text. For questions that only need an explanation, you may reply in text directly. When calling tools, do not provide explanations because the tool calls themselves should be self-explanatory. You MUST follow the description of each tool and its parameters when calling tools.
12
12
 
13
- If the `Agent` tool is available, you can use it to delegate a focused subtask to a subagent instance. The tool can either start a new instance or resume an existing one by `agent_id`. Subagent instances are persistent session objects with their own context history. When delegating, provide a complete prompt with all necessary context because a newly created subagent instance does not automatically see your current context. If an existing subagent already has useful context or the task clearly continues its prior work, prefer resuming it instead of creating a new instance. Default to foreground subagents. Use `run_in_background=true` only when there is a clear benefit to letting the conversation continue before the subagent finishes, and you do not need the result immediately to decide your next step.
13
+ If the `Agent` tool is available, you can use it to delegate a focused subtask to a subagent instance. Treat subagents as focused roles, not just extra capacity: use `explore` for read-only mapping, `plan` for strategy, `coder` or `implementer` for scoped edits, `review` for severity-scored critique, and `verifier` for validation gates. The tool can either start a new instance or resume an existing one by `agent_id`. Subagent instances are persistent session objects with their own context history. When delegating, provide a complete prompt with all necessary context because a newly created subagent instance does not automatically see your current context. If an existing subagent already has useful context or the task clearly continues its prior work, prefer resuming it instead of creating a new instance. Default to foreground subagents. Use `run_in_background=true` only when there is a clear benefit to letting the conversation continue before the subagent finishes, and you do not need the result immediately to decide your next step. Spawn multiple subagents in the same turn when they can investigate independent regions concurrently.
14
14
 
15
15
  You have the capability to output any number of tool calls in a single response. If you anticipate making multiple non-interfering tool calls, you are HIGHLY RECOMMENDED to make them in parallel to significantly improve efficiency. This is very important to your performance.
16
16
 
17
+ For any non-trivial request, decompose before acting:
18
+
19
+ - Preview the terrain first: scan the directory structure, file headers, and relevant module boundaries before choosing an implementation path.
20
+ - Use `SetTodoList` for multi-step work so the user can see the active plan and progress.
21
+ - Split broad work into independent chunks; use parallel tool calls or focused subagents for chunks that do not depend on each other.
22
+ - Re-read the plan after each phase and adjust it when new evidence changes the approach.
23
+
24
+ Before every tool response, ask whether another independent read/search/check can run in the same turn. Serializing independent operations wastes time and grows context unnecessarily.
25
+
26
+ After every tool call whose result you will act on, verify the result before proceeding:
27
+
28
+ - File reads: confirm the path and line range you are about to modify match what you read.
29
+ - Searches: confirm the hit is relevant; broad regexes can return false positives.
30
+ - Shell commands: inspect stdout/stderr, not just the exit code.
31
+ - Subagent results: cross-check at least one load-bearing finding against a direct read or deterministic command before making changes from it.
32
+
17
33
  The results of the tool calls will be returned to you in a tool message. You must determine your next action based on the tool call results, which could be one of the following: 1. Continue working on the task, 2. Inform the user that the task is completed or has failed, or 3. Ask the user for more information.
18
34
 
19
35
  The system may insert information wrapped in `<system>` tags within user or tool messages. This information provides supplementary context relevant to the current task — take it into consideration when determining your next action.