pythinker-code 2.2.0__tar.gz → 2.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/PKG-INFO +27 -5
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/README.md +24 -2
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/pyproject.toml +4 -4
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/CHANGELOG.md +21 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/acp/host.py +3 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/acp/session.py +7 -1
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/auth/oauth.py +18 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/auth/openai.py +12 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/auth/platforms.py +9 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/hooks/engine.py +13 -1
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/hooks/runner.py +3 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/btw.py +6 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/pythinkersoul.py +34 -4
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/toolset.py +42 -13
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/subagents/runner.py +7 -1
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/telemetry/config.py +29 -0
- pythinker_code-2.3.0/src/pythinker_code/telemetry/errors.py +107 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/telemetry/otel.py +24 -2
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/agent/__init__.py +3 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/ask_user/__init__.py +4 -1
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/glob.py +3 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/grep_local.py +3 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/read.py +3 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/read_media.py +3 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/replace.py +3 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/write.py +3 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/plan/__init__.py +4 -1
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/plan/enter.py +4 -1
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/shell/__init__.py +6 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/slash.py +121 -0
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/_baseUniq-3b9Vjh1L.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/_baseUniq-DYwtr3m4.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/arc-DR3CXZeR.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/arc-CNhBgyVb.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-BQ0-qSoc.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-DpvaxB3Y.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-Kd0tjFCT.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-IlYHIkrW.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-Cw4rqOBn.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-D_jGrUIu.js +1 -1
- pythinker_code-2.3.0/src/pythinker_code/web/static/assets/channel-BPOuE91b.js +1 -0
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-CrDv9tak.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-uYRqFG6q.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-DmOcpRpp.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-5K_8Tvtf.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-ChaFy2yE.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-BAp2tokd.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-BqW-gG3F.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-C3ICALbg.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-CubqcuRB.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-B3ntDoat.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-1SSU3xPb.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-Dy8y3fp6.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-ClwSLfPq.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-BXmiK1aE.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-DUb7Xnze.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-BbI6RHhP.js +1 -1
- pythinker_code-2.3.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-C1S9FRV4.js +1 -0
- pythinker_code-2.3.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-C1S9FRV4.js +1 -0
- pythinker_code-2.3.0/src/pythinker_code/web/static/assets/clone-D2vuslet.js +1 -0
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-CU9M5g3e.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-C09u1ZPS.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-BpIWTq5c.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-OfdgQa9b.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/cytoscape.esm-vaP_ZthC.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/cytoscape.esm-BHPoE92Y.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-DCC7bVEs.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-Dqsjg8sJ.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-DC8NtTl0.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-DxkId0Z8.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-BZIGC5xL.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-CkPNihvj.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-DgJwjM3h.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-C_N5Jjql.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-Cmn41NBD.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-C8_5yrCr.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-D3I6RCYp.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-BfV7xDb8.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-CKI2c4nb.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-Cld5kwhV.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-BC0ty1CW.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-F3FwjYQD.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/graph-CEqyonfn.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/graph-BWlEpfBO.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/index-cEE9hGzb.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/index-BqPJMGF-.js +2 -2
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/index-n9Qz5PAk.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/index-DYUDz2ym.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/index-B9Mjc3Gm.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/index-DpudRZuI.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-De2sP9Ub.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-BJOGXqn7.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-DfKYGnYF.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-BZdlH-JG.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-D3yKysrB.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-CmgmSsYi.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/layout-DPVEoKKe.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/layout-CWaYhVVo.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/linear-BEfJdq4v.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/linear-Bw6Dncma.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-BMWN6yQ-.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-CzjjwzDB.js +7 -7
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/mermaid.core-D1FKNjuC.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/mermaid.core-Bb0_1h52.js +5 -5
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/min-C_AGskQ6.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/min-Df20Er5m.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-s9jf1xzX.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-CAe0siLd.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-D-oXViLF.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-CLMBAwjU.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-DGUqiK6I.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-B9vjzD3o.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-CVwILSF5.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-Bbjo8TGX.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-D_M1b9Wz.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-xnxkDnDQ.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-CBLYLJJI.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-qkafBa71.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-ZZg0Md3N.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-BzTcRJpG.js +1 -1
- pythinker_code-2.3.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-TyAV0qk_.js +1 -0
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-B7D4eU3W.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-0ls9u7xd.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-Cy0XtWQy.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-C1ChVaOv.js +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-BWl1l11O.js → pythinker_code-2.3.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-Ba9eacUU.js +1 -1
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/index.html +1 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/channel-CV_6LFjm.js +0 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-DRifCGzI.js +0 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-DRifCGzI.js +0 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/clone-BZw9ajX3.js +0 -1
- pythinker_code-2.2.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-D1YbdDrw.js +0 -1
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/LICENSE +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/NOTICE +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/__main__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/acp/AGENTS.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/acp/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/acp/convert.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/acp/mcp.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/acp/server.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/acp/tools.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/acp/types.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/acp/version.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/agents/default/agent.yaml +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/agents/default/coder.yaml +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/agents/default/explore.yaml +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/agents/default/plan.yaml +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/agents/default/system.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/agentspec.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/app.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/approval_runtime/models.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/auth/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/auth/deepseek.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/auth/lm_studio.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/auth/minimax.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/auth/ollama.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/auth/opencode_go.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/auth/openrouter.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/background/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/background/agent_runner.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/background/ids.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/background/manager.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/background/models.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/background/store.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/background/summary.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/background/worker.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/cli/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/cli/__main__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/cli/_lazy_group.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/cli/export.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/cli/info.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/cli/mcp.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/cli/plugin.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/cli/toad.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/cli/update.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/cli/vis.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/cli/web.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/config.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/constant.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/events.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/exception.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/extensions.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/hooks/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/hooks/config.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/hooks/events.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/llm.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/metadata.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/notifications/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/notifications/llm.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/notifications/manager.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/notifications/models.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/notifications/notifier.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/notifications/store.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/notifications/wire.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/plugin/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/plugin/manager.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/plugin/tool.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/prompt_templates.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/prompts/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/prompts/compact.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/prompts/init.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/py.typed +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/session.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/session_fork.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/session_state.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/share.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/skill/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/skill/flow/d2.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/agent.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/approval.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/compaction.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/context.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/denwarenji.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/dynamic_injection.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/message.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/soul/slash.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/subagents/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/subagents/builder.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/subagents/core.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/subagents/git_context.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/subagents/models.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/subagents/output.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/subagents/registry.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/subagents/store.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/telemetry/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/telemetry/crash.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/telemetry/metrics.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/telemetry/sentry.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/telemetry/sink.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/AGENTS.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/agent/description.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/background/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/background/list.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/background/output.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/background/stop.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/display.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/glob.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/grep.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/read.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/read_media.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/replace.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/utils.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/file/write.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/plan/description.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/shell/bash.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/test.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/think/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/think/think.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/utils.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/web/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/web/fetch.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/web/fetch.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/web/search.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/tools/web/search.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/print/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/print/visualize.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/bash_execution.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/diff.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/components/tool_execution.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/console.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/debug.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/echo.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/oauth.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/prompt.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/replay.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selector.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/setup.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/startup.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/update.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/theme.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/ui/tui_config.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/aiohttp.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/aioqueue.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/broadcast.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/changelog.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/clipboard.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/datetime.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/diff.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/editor.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/environment.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/envvar.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/export.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/file_filter.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/frontmatter.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/io.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/logging.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/media_tags.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/message.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/path.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/proctitle.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/proxy.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/rich/columns.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/rich/diff_render.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/sensitive.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/server.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/signals.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/slashcmd.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/string.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/term.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/utils/typing.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/api/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/api/sessions.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/api/statistics.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/api/system.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/app.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-D2MTYyJz.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/index-CezafTt_.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/index-DSRInNnm.css +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/vis/static/index.html +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/api/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/api/config.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/api/open_in.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/api/sessions.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/app.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/auth.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/models.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/runner/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/runner/messages.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/runner/process.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/runner/worker.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/abap-BdImnpbu.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ada-bCR0ucgS.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/apache-Pmp26Uib.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/apex-D8_7TLub.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/apl-dKokRX4l.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/applescript-Co6uUVPk.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ara-BRHolxvo.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/asm-D_Q5rh1f.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/astro-CbQHKStN.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/awk-DMzUqQB5.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/bat-BkioyH1T.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/beancount-k_qm7-4y.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/berry-uYugtg8r.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/bibtex-CHM0blh-.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/bicep-Bmn6On1c.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/blade-D4QpJJKB.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/bsl-BO_Y6i37.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/c-BIGW1oBm.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/c3-VCDPK7BO.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/cairo-KRGpt6FW.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/clarity-D53aC0YG.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/clojure-P80f7IUj.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/cmake-D1j8_8rp.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/cobol-nwyudZeR.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/coffee-Ch7k5sss.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/coq-DkFqJrB1.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/cpp-CofmeUqb.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/crystal-tKQVLTB8.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/csharp-K5feNrxe.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/css-DPfMkruS.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/csv-fuZLfV_i.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/cue-D82EKSYY.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/cypher-COkxafJQ.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/d-85-TOEBH.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/dart-CF10PKvl.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/dax-CEL-wOlO.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/diff-D97Zzqfu.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/docker-BcOcwvcX.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/dotenv-Da5cRb03.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/dracula-BzJJZx-M.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/edge-BkV0erSs.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/elixir-CDX3lj18.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/elm-DbKCFpqz.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/erb-BOJIQeun.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/erlang-DsQrWhSR.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/fennel-BYunw83y.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/fish-BvzEVeQv.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/fluent-C4IJs8-o.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gdshader-DkwncUOv.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/genie-D0YGMca9.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/github-dark-DHJKELXO.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/github-light-DAi9KRSo.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gleam-BspZqrRM.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/glsl-DplSGwfg.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gn-n2N0HUVH.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/go-Dn2_MT6a.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/graphql-ChdNCCLP.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/groovy-gcz8RCvz.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/hack-CaT9iCJl.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/haml-B8DHNrY2.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/handlebars-BL8al0AC.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/haskell-Df6bDoY_.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/haxe-CzTSHFRz.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/hcl-BWvSN4gD.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/hjson-D5-asLiD.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/houston-DnULxvSX.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/html-GMplVEZG.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/http-jrhK8wxY.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/hurl-irOxFIW8.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/hy-DFXneXwc.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/imba-DGztddWO.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/index-BpoLgcEt.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/index-CzV_vCfu.css +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/index-DI2oedCt.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ini-BEwlwnbL.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/init-Gi6I4Gst.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/java-CylS5w8V.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/javascript-wDzz0qaB.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/jison-wvAkD_A8.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/json-Cp-IABpG.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/json5-C9tS-k6U.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/jsonc-Des-eS-w.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/jssm-C2t-YnRu.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/jsx-g9-lgVsj.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/julia-CxzCAyBv.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/katex-D2lIc1rk.css +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/kdl-DV7GczEv.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/kusto-DZf3V79B.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/laserwave-DUszq2jm.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/latex-B4uzh10-.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/lean-BZvkOJ9d.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/less-B1dDrJ26.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/liquid-DYVedYrR.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/llvm-BtvRca6l.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/log-2UxHyX5q.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/logo-BtOb2qkB.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/lua-BbnMAYS6.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/luau-C-HG3fhB.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/make-CHLpvVh8.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/markdown-Cvjx9yec.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/marko-DZsq8hO1.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/matlab-D7o27uSR.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/mdc-DUICxH0z.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B2P5VJ9v.css +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/min-dark-CafNBF8u.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/min-light-CTRr51gU.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/mojo-B93PlW-d.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/monokai-D4h5O-jR.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/moonbit-Ba13S78F.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/move-Bu9oaDYs.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/narrat-DRg8JJMk.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/nginx-DknmC5AR.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/night-owl-C39BiMTA.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/nim-CVrawwO9.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/nix-CwoSXNpI.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/nord-Ddv68eIx.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/nushell-C-sUppwS.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/one-light-PoHY5YXO.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/openscad-C4EeE6gA.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/pascal-D93ZcfNL.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/perl-C0TMdlhV.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/php-CDn_0X-4.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/pkl-u5AG7uiY.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/plastic-3e1v2bzS.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/plsql-ChMvpjG-.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/po-BTJTHyun.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/polar-C0HS_06l.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/postcss-CXtECtnM.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/powershell-Dpen1YoG.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/prisma-Dd19v3D-.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/prolog-CbFg5uaA.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/proto-C7zT0LnQ.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/pug-CGlum2m_.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/puppet-BMWR74SV.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/purescript-CklMAg4u.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/python-B6aJPvgy.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/qml-3beO22l8.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/qss-IeuSbFQv.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/r-Dspwwk_N.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/racket-BqYA7rlc.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/raku-DXvB9xmW.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/razor-C1TweQQi.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/red-bN70gL4F.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/reg-C-SQnVFl.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/rel-C3B-1QV4.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/riscv-BM1_JUlF.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/rst-B0xPkSld.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ruby-BvKwtOVI.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/rust-B1yitclQ.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/sas-cz2c8ADy.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/scala-C151Ov-r.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/scheme-C98Dy4si.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/scss-OYdSNvt2.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/shellscript-Yzrsuije.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/shellsession-BADoaaVG.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/solidity-rGO070M0.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/soy-Brmx7dQM.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/sparql-rVzFXLq3.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/splunk-BtCnVYZw.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/sql-BLtJtn59.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/stata-BH5u7GGu.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/svelte-zxCyuUbr.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/swift-Dg5xB15N.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/systemd-4A_iFExJ.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/talonscript-CkByrt1z.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/tasl-QIJgUcNo.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/tcl-dwOrl1Do.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/templ-W15q3VgB.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/terraform-BETggiCN.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/tex-CvyZ59Mk.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/tokyo-night-hegEt444.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/toml-vGWfd6FD.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/tsv-B_m7g4N7.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/tsx-COt5Ahok.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/turtle-BsS91CYL.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/twig-CO9l9SDP.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/typespec-BGHnOYBU.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/typst-DHCkPAjA.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/v-BcVCzyr7.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vala-CsfeWuGM.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vb-D17OF-Vu.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/verilog-BQ8w6xss.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vesper-DU1UobuO.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/viml-CJc9bBzg.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vue-DN_0RTcg.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/vyper-CDx5xZoG.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/wasm-MzD3tlZU.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/wenyan-BV7otONQ.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/wit-5i3qLPDT.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/xml-sdJ4AIDG.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/xsl-CtQFsRM5.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/yaml-Buea-lGh.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/assets/zig-VOosw3JB.js +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/static/logo.png +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/store/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/web/store/sessions.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/wire/__init__.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/wire/file.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/wire/protocol.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/wire/root_hub.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/wire/serde.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/wire/server.py +0 -0
- {pythinker_code-2.2.0 → pythinker_code-2.3.0}/src/pythinker_code/wire/types.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pythinker-code
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: Pythinker Code is your next CLI agent.
|
|
5
5
|
Keywords: cli,agent,ai,coding-assistant,llm,claude,openai,terminal
|
|
6
6
|
Author: Mohamed Elkholy
|
|
@@ -33,9 +33,9 @@ Requires-Dist: ripgrepy==2.2.0
|
|
|
33
33
|
Requires-Dist: streamingjson==0.0.5
|
|
34
34
|
Requires-Dist: trafilatura==2.0.0
|
|
35
35
|
Requires-Dist: lxml==6.0.2
|
|
36
|
-
Requires-Dist: tenacity==9.1.
|
|
36
|
+
Requires-Dist: tenacity==9.1.4
|
|
37
37
|
Requires-Dist: fastmcp==2.12.5
|
|
38
|
-
Requires-Dist: pydantic==2.
|
|
38
|
+
Requires-Dist: pydantic==2.13.4
|
|
39
39
|
Requires-Dist: httpx[socks]==0.28.1
|
|
40
40
|
Requires-Dist: pythinker-host==1.0.0
|
|
41
41
|
Requires-Dist: batrachian-toad==0.5.23 ; python_full_version >= '3.14'
|
|
@@ -110,7 +110,30 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
|
|
|
110
110
|
|
|
111
111
|
---
|
|
112
112
|
|
|
113
|
-
## 🆕 What's New in 2.
|
|
113
|
+
## 🆕 What's New in 2.3.0
|
|
114
|
+
|
|
115
|
+
Telemetry & observability audit on top of 2.2.1.
|
|
116
|
+
|
|
117
|
+
- **38 silent-catch sites instrumented** — tool failures, OAuth errors, MCP hiccups, hook callbacks, subagent crashes now surface in Bugsink + SigNoz.
|
|
118
|
+
- **`/report-error` slash command** — user-invoked complement to automatic capture.
|
|
119
|
+
- **OTel trace sampling tunable** — `PYTHINKER_OTEL_TRACE_SAMPLE_RATE` for operators running their own collector.
|
|
120
|
+
- **`pythinker.mcp.call` span** with `mcp.server` attribute.
|
|
121
|
+
- **`docs/en/reference/telemetry.md`** documents the full contract.
|
|
122
|
+
|
|
123
|
+
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.3.0`.
|
|
124
|
+
|
|
125
|
+
### What was new in 2.2.1
|
|
126
|
+
|
|
127
|
+
## 🆕 What's New in 2.2.1
|
|
128
|
+
|
|
129
|
+
CI hardening on top of 2.2.0.
|
|
130
|
+
|
|
131
|
+
- **macOS binary build is now optional-codesign** — the release workflow detects whether `APPLE_CERTIFICATE_P12` / `APPLE_NOTARIZATION_KEY_P8` repo secrets are set. When they aren't (the v2.2.0 case), it ships an ad-hoc-signed PyInstaller binary instead of failing the whole release. PyPI install (`pip install pythinker-code`) is unaffected.
|
|
132
|
+
- **PyPI publish is idempotent** — `pypa/gh-action-pypi-publish` now runs with `skip-existing: true`, so re-running the release workflow against an already-published version is a no-op.
|
|
133
|
+
|
|
134
|
+
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.3.0`.
|
|
135
|
+
|
|
136
|
+
### What was new in 2.2.0
|
|
114
137
|
|
|
115
138
|
Animated installer + Windows PATH automation, on top of 2.1.2.
|
|
116
139
|
|
|
@@ -148,7 +171,6 @@ A focused refresh of the TUI and slash-command UX.
|
|
|
148
171
|
- **Prompt templates** — discovery is now `~/.pythinker/prompts` and `<project>/.pythinker/prompts`. The legacy directory lookup has been retired.
|
|
149
172
|
- **TUI style flag** — only `card` (default) and `pythinker` are accepted; the legacy alias has been dropped.
|
|
150
173
|
|
|
151
|
-
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.2.0`.
|
|
152
174
|
|
|
153
175
|
---
|
|
154
176
|
|
|
@@ -48,7 +48,30 @@ It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientpr
|
|
|
48
48
|
|
|
49
49
|
---
|
|
50
50
|
|
|
51
|
-
## 🆕 What's New in 2.
|
|
51
|
+
## 🆕 What's New in 2.3.0
|
|
52
|
+
|
|
53
|
+
Telemetry & observability audit on top of 2.2.1.
|
|
54
|
+
|
|
55
|
+
- **38 silent-catch sites instrumented** — tool failures, OAuth errors, MCP hiccups, hook callbacks, subagent crashes now surface in Bugsink + SigNoz.
|
|
56
|
+
- **`/report-error` slash command** — user-invoked complement to automatic capture.
|
|
57
|
+
- **OTel trace sampling tunable** — `PYTHINKER_OTEL_TRACE_SAMPLE_RATE` for operators running their own collector.
|
|
58
|
+
- **`pythinker.mcp.call` span** with `mcp.server` attribute.
|
|
59
|
+
- **`docs/en/reference/telemetry.md`** documents the full contract.
|
|
60
|
+
|
|
61
|
+
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.3.0`.
|
|
62
|
+
|
|
63
|
+
### What was new in 2.2.1
|
|
64
|
+
|
|
65
|
+
## 🆕 What's New in 2.2.1
|
|
66
|
+
|
|
67
|
+
CI hardening on top of 2.2.0.
|
|
68
|
+
|
|
69
|
+
- **macOS binary build is now optional-codesign** — the release workflow detects whether `APPLE_CERTIFICATE_P12` / `APPLE_NOTARIZATION_KEY_P8` repo secrets are set. When they aren't (the v2.2.0 case), it ships an ad-hoc-signed PyInstaller binary instead of failing the whole release. PyPI install (`pip install pythinker-code`) is unaffected.
|
|
70
|
+
- **PyPI publish is idempotent** — `pypa/gh-action-pypi-publish` now runs with `skip-existing: true`, so re-running the release workflow against an already-published version is a no-op.
|
|
71
|
+
|
|
72
|
+
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.3.0`.
|
|
73
|
+
|
|
74
|
+
### What was new in 2.2.0
|
|
52
75
|
|
|
53
76
|
Animated installer + Windows PATH automation, on top of 2.1.2.
|
|
54
77
|
|
|
@@ -86,7 +109,6 @@ A focused refresh of the TUI and slash-command UX.
|
|
|
86
109
|
- **Prompt templates** — discovery is now `~/.pythinker/prompts` and `<project>/.pythinker/prompts`. The legacy directory lookup has been retired.
|
|
87
110
|
- **TUI style flag** — only `card` (default) and `pythinker` are accepted; the legacy alias has been dropped.
|
|
88
111
|
|
|
89
|
-
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.2.0`.
|
|
90
112
|
|
|
91
113
|
---
|
|
92
114
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "pythinker-code"
|
|
3
|
-
version = "2.
|
|
3
|
+
version = "2.3.0"
|
|
4
4
|
description = "Pythinker Code is your next CLI agent."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
@@ -38,9 +38,9 @@ dependencies = [
|
|
|
38
38
|
"trafilatura==2.0.0",
|
|
39
39
|
# lxml is used by trafilatura/htmldate/justext; keep pinned for binary wheels.
|
|
40
40
|
"lxml==6.0.2",
|
|
41
|
-
"tenacity==9.1.
|
|
41
|
+
"tenacity==9.1.4",
|
|
42
42
|
"fastmcp==2.12.5",
|
|
43
|
-
"pydantic==2.
|
|
43
|
+
"pydantic==2.13.4",
|
|
44
44
|
"httpx[socks]==0.28.1",
|
|
45
45
|
"pythinker-host==1.0.0",
|
|
46
46
|
"batrachian-toad==0.5.23; python_version >= \"3.14\"",
|
|
@@ -73,7 +73,7 @@ dev = [
|
|
|
73
73
|
]
|
|
74
74
|
|
|
75
75
|
[build-system]
|
|
76
|
-
requires = ["uv_build>=0.8.5,<0.
|
|
76
|
+
requires = ["uv_build>=0.8.5,<0.12.0"]
|
|
77
77
|
build-backend = "uv_build"
|
|
78
78
|
|
|
79
79
|
[tool.uv.build-backend]
|
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 2.3.0 (2026-05-09)
|
|
6
|
+
|
|
7
|
+
Telemetry & observability audit.
|
|
8
|
+
|
|
9
|
+
- New `pythinker_code/telemetry/errors.py` helper `report_handled_error(exc, *, site, tool=None, **attrs)` forwards caught-and-rendered exceptions to both Sentry/Bugsink and the OTel `error` event stream. Both forwarding paths are `contextlib.suppress`-wrapped so monitoring can never break the host program.
|
|
10
|
+
- 38 silent-catch sites instrumented across `tools/`, `auth/`, `soul/`, `acp/`, `hooks/`, `subagents/`. Tool failures, OAuth errors, MCP server hiccups, hook callback failures, and subagent crashes now reach Bugsink and SigNoz.
|
|
11
|
+
- `pythinker_code/telemetry/otel.py`: TracerProvider now uses `ParentBased(TraceIdRatioBased(rate))` driven by `PYTHINKER_OTEL_TRACE_SAMPLE_RATE` (default 1.0).
|
|
12
|
+
- New `pythinker.mcp.call` span around every MCPTool RPC.
|
|
13
|
+
- New `/report-error` slash command (aliases `/report`, `/report-error`).
|
|
14
|
+
- `docs/en/reference/telemetry.md` documents the full telemetry contract.
|
|
15
|
+
- `chore(test)`: updated google-genai snapshot for pydantic 2.13.4 + google-genai 2.0.0.
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
## 2.2.1 (2026-05-09)
|
|
19
|
+
|
|
20
|
+
CI hardening: macOS binary build is now optional-codesign.
|
|
21
|
+
|
|
22
|
+
- `.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.
|
|
23
|
+
- `.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.
|
|
24
|
+
- 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.
|
|
25
|
+
|
|
5
26
|
## 2.2.0 (2026-05-09)
|
|
6
27
|
|
|
7
28
|
Installer UX: animated logo + Windows PATH automation.
|
|
@@ -148,6 +148,9 @@ class ACPProcess:
|
|
|
148
148
|
)
|
|
149
149
|
self._feed_output(final_output)
|
|
150
150
|
except Exception as exc:
|
|
151
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
152
|
+
|
|
153
|
+
report_handled_error(exc, site="acp.host.terminal")
|
|
151
154
|
error_note = f"[acp terminal error] {exc}\n"
|
|
152
155
|
self._stdout.feed_data(error_note.encode("utf-8", "replace"))
|
|
153
156
|
if exit_code is None:
|
|
@@ -233,6 +233,9 @@ class ACPSession:
|
|
|
233
233
|
logger.info("Prompt cancelled by user")
|
|
234
234
|
return acp.PromptResponse(stop_reason="cancelled")
|
|
235
235
|
except Exception as e:
|
|
236
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
237
|
+
|
|
238
|
+
report_handled_error(e, site="acp.session.prompt")
|
|
236
239
|
logger.exception("Unexpected error during prompt:")
|
|
237
240
|
raise acp.RequestError.internal_error({"error": str(e)}) from e
|
|
238
241
|
finally:
|
|
@@ -461,7 +464,10 @@ class ACPSession:
|
|
|
461
464
|
# cancelled
|
|
462
465
|
logger.debug("Permission request cancelled for: {action}", action=request.action)
|
|
463
466
|
request.resolve("reject")
|
|
464
|
-
except Exception:
|
|
467
|
+
except Exception as exc:
|
|
468
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
469
|
+
|
|
470
|
+
report_handled_error(exc, site="acp.session.approval")
|
|
465
471
|
logger.exception("Error handling approval request:")
|
|
466
472
|
# On error, reject the request
|
|
467
473
|
request.resolve("reject")
|
|
@@ -358,6 +358,9 @@ def _load_from_keyring(key: str) -> OAuthToken | None:
|
|
|
358
358
|
try:
|
|
359
359
|
raw = keyring.get_password(KEYRING_SERVICE, key)
|
|
360
360
|
except Exception as exc:
|
|
361
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
362
|
+
|
|
363
|
+
report_handled_error(exc, site="auth.keyring.read")
|
|
361
364
|
logger.warning("Failed to read token from keyring: {error}", error=exc)
|
|
362
365
|
return None
|
|
363
366
|
if not raw:
|
|
@@ -632,6 +635,9 @@ async def login_pythinker_code(
|
|
|
632
635
|
try:
|
|
633
636
|
auth = await request_device_authorization()
|
|
634
637
|
except Exception as exc:
|
|
638
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
639
|
+
|
|
640
|
+
report_handled_error(exc, site="auth.oauth.device_authorize")
|
|
635
641
|
yield OAuthEvent("error", f"Login failed: {exc}")
|
|
636
642
|
return
|
|
637
643
|
|
|
@@ -680,6 +686,9 @@ async def login_pythinker_code(
|
|
|
680
686
|
yield OAuthEvent("info", "Device code expired, restarting login...")
|
|
681
687
|
continue
|
|
682
688
|
except Exception as exc:
|
|
689
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
690
|
+
|
|
691
|
+
report_handled_error(exc, site="auth.oauth.device_poll")
|
|
683
692
|
yield OAuthEvent("error", f"Login failed: {exc}")
|
|
684
693
|
return
|
|
685
694
|
break
|
|
@@ -692,6 +701,9 @@ async def login_pythinker_code(
|
|
|
692
701
|
try:
|
|
693
702
|
models = await list_models(platform, token.access_token)
|
|
694
703
|
except Exception as exc:
|
|
704
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
705
|
+
|
|
706
|
+
report_handled_error(exc, site="auth.models.fetch")
|
|
695
707
|
logger.error("Failed to get models: {error}", error=exc)
|
|
696
708
|
yield OAuthEvent("error", f"Failed to get models: {exc}")
|
|
697
709
|
return
|
|
@@ -947,6 +959,9 @@ class OAuthManager:
|
|
|
947
959
|
try:
|
|
948
960
|
await self.ensure_fresh(runtime, force=force)
|
|
949
961
|
except Exception as exc:
|
|
962
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
963
|
+
|
|
964
|
+
report_handled_error(exc, site="auth.oauth.refresh.background")
|
|
950
965
|
logger.warning(
|
|
951
966
|
"Failed to refresh OAuth token in background: {error}",
|
|
952
967
|
error=exc,
|
|
@@ -1071,6 +1086,9 @@ class OAuthManager:
|
|
|
1071
1086
|
except Exception as exc:
|
|
1072
1087
|
if force:
|
|
1073
1088
|
raise
|
|
1089
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
1090
|
+
|
|
1091
|
+
report_handled_error(exc, site="auth.oauth.refresh")
|
|
1074
1092
|
logger.warning("Failed to refresh OAuth token: {error}", error=exc)
|
|
1075
1093
|
from pythinker_code.telemetry import track
|
|
1076
1094
|
|
|
@@ -612,6 +612,9 @@ async def _finish_chatgpt_login(
|
|
|
612
612
|
models = await _discover_chatgpt_models(token.access_token)
|
|
613
613
|
selected_model, thinking = _select_default_openai_model(models)
|
|
614
614
|
except Exception as exc:
|
|
615
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
616
|
+
|
|
617
|
+
report_handled_error(exc, site="auth.openai.discover_chatgpt_models")
|
|
615
618
|
yield OAuthEvent("error", f"Failed to discover OpenAI ChatGPT models: {exc}")
|
|
616
619
|
return
|
|
617
620
|
|
|
@@ -649,6 +652,9 @@ async def login_openai_browser(
|
|
|
649
652
|
code, verifier, redirect_uri = await _wait_for_browser_code(open_browser=open_browser)
|
|
650
653
|
token_payload = await _exchange_code_for_tokens(code, verifier, redirect_uri)
|
|
651
654
|
except Exception as exc:
|
|
655
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
656
|
+
|
|
657
|
+
report_handled_error(exc, site="auth.openai.browser_login")
|
|
652
658
|
yield OAuthEvent("error", f"OpenAI browser login failed: {exc}")
|
|
653
659
|
return
|
|
654
660
|
|
|
@@ -667,6 +673,9 @@ async def login_openai_headless(config: Config) -> AsyncIterator[OAuthEvent]:
|
|
|
667
673
|
try:
|
|
668
674
|
device_code = await _request_device_code()
|
|
669
675
|
except Exception as exc:
|
|
676
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
677
|
+
|
|
678
|
+
report_handled_error(exc, site="auth.openai.device_start")
|
|
670
679
|
yield OAuthEvent("error", f"Failed to start OpenAI device login: {exc}")
|
|
671
680
|
return
|
|
672
681
|
|
|
@@ -688,6 +697,9 @@ async def login_openai_headless(config: Config) -> AsyncIterator[OAuthEvent]:
|
|
|
688
697
|
OPENAI_DEVICE_REDIRECT_URI,
|
|
689
698
|
)
|
|
690
699
|
except Exception as exc:
|
|
700
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
701
|
+
|
|
702
|
+
report_handled_error(exc, site="auth.openai.device_poll")
|
|
691
703
|
yield OAuthEvent("error", f"OpenAI device login failed: {exc}")
|
|
692
704
|
return
|
|
693
705
|
|
|
@@ -248,6 +248,9 @@ async def refresh_managed_models(config: Config) -> bool:
|
|
|
248
248
|
try:
|
|
249
249
|
await oauth_manager.ensure_fresh()
|
|
250
250
|
except Exception as exc:
|
|
251
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
252
|
+
|
|
253
|
+
report_handled_error(exc, site="auth.platforms.refresh.pre_sync")
|
|
251
254
|
logger.warning(
|
|
252
255
|
"Failed to refresh OAuth token before model sync for {platform}: {error}",
|
|
253
256
|
platform=platform_id,
|
|
@@ -281,6 +284,9 @@ async def refresh_managed_models(config: Config) -> bool:
|
|
|
281
284
|
try:
|
|
282
285
|
await oauth_manager.ensure_fresh(force=True)
|
|
283
286
|
except Exception as exc2:
|
|
287
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
288
|
+
|
|
289
|
+
report_handled_error(exc2, site="auth.platforms.refresh.after_401")
|
|
284
290
|
refresh_exc = exc2
|
|
285
291
|
logger.warning(
|
|
286
292
|
"Failed to refresh OAuth token after 401 for {platform}: {error}",
|
|
@@ -323,6 +329,9 @@ async def refresh_managed_models(config: Config) -> bool:
|
|
|
323
329
|
changed = True
|
|
324
330
|
continue
|
|
325
331
|
except Exception as exc:
|
|
332
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
333
|
+
|
|
334
|
+
report_handled_error(exc, site="auth.platforms.sync")
|
|
326
335
|
fallback_models = _fallback_or_log(platform_id=platform_id, error=exc)
|
|
327
336
|
if fallback_models is None:
|
|
328
337
|
continue
|
|
@@ -237,7 +237,10 @@ class HookEngine:
|
|
|
237
237
|
results = await self._execute_hooks(
|
|
238
238
|
event, matcher_value, server_matched, wire_matched, input_data
|
|
239
239
|
)
|
|
240
|
-
except Exception:
|
|
240
|
+
except Exception as exc:
|
|
241
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
242
|
+
|
|
243
|
+
report_handled_error(exc, site="hooks.engine.run")
|
|
241
244
|
logger.warning("Hook engine error for {}, failing open", event)
|
|
242
245
|
return []
|
|
243
246
|
|
|
@@ -278,6 +281,9 @@ class HookEngine:
|
|
|
278
281
|
try:
|
|
279
282
|
self._on_triggered(event, matcher_value, total)
|
|
280
283
|
except Exception as e:
|
|
284
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
285
|
+
|
|
286
|
+
report_handled_error(e, site="hooks.engine.triggered_cb")
|
|
281
287
|
logger.warning(
|
|
282
288
|
"HookTriggered callback failed for {event}: {error}, continuing",
|
|
283
289
|
event=event,
|
|
@@ -328,6 +334,9 @@ class HookEngine:
|
|
|
328
334
|
try:
|
|
329
335
|
self._on_resolved(event, matcher_value, action, reason, duration_ms)
|
|
330
336
|
except Exception as e:
|
|
337
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
338
|
+
|
|
339
|
+
report_handled_error(e, site="hooks.engine.resolved_cb")
|
|
331
340
|
logger.warning(
|
|
332
341
|
"HookResolved callback failed for {event}: {error}, continuing",
|
|
333
342
|
event=event,
|
|
@@ -366,6 +375,9 @@ class HookEngine:
|
|
|
366
375
|
logger.warning("Wire hook timed out: {} {}", event, target)
|
|
367
376
|
return HookResult(action="allow", timed_out=True)
|
|
368
377
|
except Exception as e:
|
|
378
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
379
|
+
|
|
380
|
+
report_handled_error(e, site="hooks.engine.wire")
|
|
369
381
|
hook_task.cancel()
|
|
370
382
|
logger.warning("Wire hook failed: {} {}: {}", event, target, e)
|
|
371
383
|
return HookResult(action="allow")
|
|
@@ -51,6 +51,9 @@ async def run_hook(
|
|
|
51
51
|
await proc.wait()
|
|
52
52
|
raise
|
|
53
53
|
except Exception as e:
|
|
54
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
55
|
+
|
|
56
|
+
report_handled_error(e, site="hooks.runner")
|
|
54
57
|
logger.warning("Hook failed: {}: {}", command, e)
|
|
55
58
|
return HookResult(action="allow", stderr=str(e))
|
|
56
59
|
|
|
@@ -176,6 +176,9 @@ async def execute_side_question(
|
|
|
176
176
|
|
|
177
177
|
return None, "No response received."
|
|
178
178
|
except Exception as e:
|
|
179
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
180
|
+
|
|
181
|
+
report_handled_error(e, site="soul.btw.execute")
|
|
179
182
|
logger.warning("Side question failed: {error}", error=e)
|
|
180
183
|
return None, str(e)
|
|
181
184
|
|
|
@@ -210,5 +213,8 @@ async def run_side_question(soul: PythinkerSoul, question: str) -> None:
|
|
|
210
213
|
else:
|
|
211
214
|
wire_send(BtwEnd(id=btw_id, error=error or "No response received."))
|
|
212
215
|
except Exception as e:
|
|
216
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
217
|
+
|
|
218
|
+
report_handled_error(e, site="soul.btw.run_wire")
|
|
213
219
|
logger.warning("Side question failed: {error}", error=e)
|
|
214
220
|
wire_send(BtwEnd(id=btw_id, error=str(e)))
|
|
@@ -286,7 +286,14 @@ class PythinkerSoul:
|
|
|
286
286
|
try:
|
|
287
287
|
result = await provider.get_injections(self._context.history, self)
|
|
288
288
|
injections.extend(result)
|
|
289
|
-
except Exception:
|
|
289
|
+
except Exception as exc:
|
|
290
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
291
|
+
|
|
292
|
+
report_handled_error(
|
|
293
|
+
exc,
|
|
294
|
+
site="soul.injection.get",
|
|
295
|
+
provider=type(provider).__name__,
|
|
296
|
+
)
|
|
290
297
|
logger.warning(
|
|
291
298
|
"injection provider %s failed",
|
|
292
299
|
type(provider).__name__,
|
|
@@ -304,7 +311,14 @@ class PythinkerSoul:
|
|
|
304
311
|
for provider in self._injection_providers:
|
|
305
312
|
try:
|
|
306
313
|
await provider.on_context_compacted()
|
|
307
|
-
except Exception:
|
|
314
|
+
except Exception as exc:
|
|
315
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
316
|
+
|
|
317
|
+
report_handled_error(
|
|
318
|
+
exc,
|
|
319
|
+
site="soul.injection.on_context_compacted",
|
|
320
|
+
provider=type(provider).__name__,
|
|
321
|
+
)
|
|
308
322
|
logger.warning(
|
|
309
323
|
"injection provider %s on_context_compacted failed",
|
|
310
324
|
type(provider).__name__,
|
|
@@ -316,7 +330,14 @@ class PythinkerSoul:
|
|
|
316
330
|
for provider in self._injection_providers:
|
|
317
331
|
try:
|
|
318
332
|
await provider.on_auto_changed(enabled)
|
|
319
|
-
except Exception:
|
|
333
|
+
except Exception as exc:
|
|
334
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
335
|
+
|
|
336
|
+
report_handled_error(
|
|
337
|
+
exc,
|
|
338
|
+
site="soul.injection.on_auto_changed",
|
|
339
|
+
provider=type(provider).__name__,
|
|
340
|
+
)
|
|
320
341
|
logger.warning(
|
|
321
342
|
"injection provider %s on_auto_changed failed",
|
|
322
343
|
type(provider).__name__,
|
|
@@ -937,6 +958,9 @@ class PythinkerSoul:
|
|
|
937
958
|
try:
|
|
938
959
|
await self.compact_context()
|
|
939
960
|
except Exception as compact_err:
|
|
961
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
962
|
+
|
|
963
|
+
report_handled_error(compact_err, site="soul.context.compact")
|
|
940
964
|
logger.error(
|
|
941
965
|
"Context compaction failed at step {step_no}: {error_type}: {error}",
|
|
942
966
|
step_no=step_no,
|
|
@@ -952,6 +976,9 @@ class PythinkerSoul:
|
|
|
952
976
|
except BackToTheFuture as e:
|
|
953
977
|
back_to_the_future = e
|
|
954
978
|
except Exception as e:
|
|
979
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
980
|
+
|
|
981
|
+
report_handled_error(e, site="soul.step.error")
|
|
955
982
|
# any other exception should interrupt the step
|
|
956
983
|
req_id = getattr(e, "request_id", None)
|
|
957
984
|
logger.error(
|
|
@@ -1453,7 +1480,10 @@ class PythinkerSoul:
|
|
|
1453
1480
|
raise
|
|
1454
1481
|
try:
|
|
1455
1482
|
recovered = chat_provider.on_retryable_error(error)
|
|
1456
|
-
except Exception:
|
|
1483
|
+
except Exception as recover_exc:
|
|
1484
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
1485
|
+
|
|
1486
|
+
report_handled_error(recover_exc, site="soul.chat.recover")
|
|
1457
1487
|
logger.exception(
|
|
1458
1488
|
"Failed to recover chat provider during {name} after {error_type}.",
|
|
1459
1489
|
name=name,
|
|
@@ -319,6 +319,9 @@ class PythinkerToolset:
|
|
|
319
319
|
parameters=parameters,
|
|
320
320
|
)
|
|
321
321
|
except Exception as e:
|
|
322
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
323
|
+
|
|
324
|
+
report_handled_error(e, site="soul.toolset.register_external")
|
|
322
325
|
return False, str(e)
|
|
323
326
|
self.add(tool)
|
|
324
327
|
return True, None
|
|
@@ -490,6 +493,9 @@ class PythinkerToolset:
|
|
|
490
493
|
logger.info("Connected MCP server: {server_name}", server_name=server_name)
|
|
491
494
|
return server_name, None
|
|
492
495
|
except Exception as e:
|
|
496
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
497
|
+
|
|
498
|
+
report_handled_error(e, site="soul.toolset.mcp.connect")
|
|
493
499
|
logger.error(
|
|
494
500
|
"Failed to connect MCP server: {server_name}, error: {error}",
|
|
495
501
|
server_name=server_name,
|
|
@@ -608,6 +614,7 @@ class MCPTool[T: ClientTransport](CallableTool):
|
|
|
608
614
|
**kwargs,
|
|
609
615
|
)
|
|
610
616
|
self._mcp_tool = mcp_tool
|
|
617
|
+
self._mcp_server_name = server_name
|
|
611
618
|
self._client = client
|
|
612
619
|
self._runtime = runtime
|
|
613
620
|
self._timeout = timedelta(milliseconds=runtime.config.mcp.client.tool_call_timeout_ms)
|
|
@@ -619,25 +626,43 @@ class MCPTool[T: ClientTransport](CallableTool):
|
|
|
619
626
|
if not result:
|
|
620
627
|
return result.rejection_error()
|
|
621
628
|
|
|
629
|
+
from pythinker_code.telemetry import otel as _otel
|
|
630
|
+
|
|
631
|
+
# `start_span` returns a sync context manager (the OTel SDK uses
|
|
632
|
+
# `_AgnosticContextManager`, which intentionally has no __aenter__).
|
|
633
|
+
# Keep it as a sync `with` and use `async with` only on the fastmcp
|
|
634
|
+
# client.
|
|
622
635
|
try:
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
636
|
+
with _otel.start_span(
|
|
637
|
+
"pythinker.mcp.call",
|
|
638
|
+
{
|
|
639
|
+
"mcp.server": self._mcp_server_name,
|
|
640
|
+
"mcp.tool": self._mcp_tool.name,
|
|
641
|
+
"mcp.timeout_ms": int(self._timeout.total_seconds() * 1000),
|
|
642
|
+
},
|
|
643
|
+
) as span:
|
|
644
|
+
async with self._client as client:
|
|
645
|
+
result = await client.call_tool(
|
|
646
|
+
self._mcp_tool.name,
|
|
647
|
+
kwargs,
|
|
648
|
+
timeout=self._timeout,
|
|
649
|
+
raise_on_error=False,
|
|
635
650
|
)
|
|
636
|
-
|
|
651
|
+
span.set_attribute("mcp.is_error", bool(result.is_error))
|
|
652
|
+
if result.is_error:
|
|
653
|
+
logger.warning(
|
|
654
|
+
"MCP tool returned error: {tool_name}: {content}",
|
|
655
|
+
tool_name=self._mcp_tool.name,
|
|
656
|
+
content=[str(p) for p in result.content][:3],
|
|
657
|
+
)
|
|
658
|
+
return convert_mcp_tool_result(result)
|
|
637
659
|
except Exception as e:
|
|
660
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
661
|
+
|
|
638
662
|
# fastmcp raises `RuntimeError` on timeout and we cannot tell it from other errors
|
|
639
663
|
exc_msg = str(e).lower()
|
|
640
664
|
if "timeout" in exc_msg or "timed out" in exc_msg:
|
|
665
|
+
report_handled_error(e, site="soul.toolset.mcp.call.timeout", tool="MCP")
|
|
641
666
|
logger.warning(
|
|
642
667
|
"MCP tool call timed out: {tool_name}: {error}",
|
|
643
668
|
tool_name=self._mcp_tool.name,
|
|
@@ -650,6 +675,7 @@ class MCPTool[T: ClientTransport](CallableTool):
|
|
|
650
675
|
),
|
|
651
676
|
brief="Timeout",
|
|
652
677
|
)
|
|
678
|
+
report_handled_error(e, site="soul.toolset.mcp.call", tool="MCP")
|
|
653
679
|
logger.error(
|
|
654
680
|
"MCP tool call failed: {tool_name}: {error}",
|
|
655
681
|
tool_name=self._mcp_tool.name,
|
|
@@ -693,6 +719,9 @@ class WireExternalTool(CallableTool):
|
|
|
693
719
|
except asyncio.CancelledError:
|
|
694
720
|
raise
|
|
695
721
|
except Exception as e:
|
|
722
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
723
|
+
|
|
724
|
+
report_handled_error(e, site="soul.toolset.external_tool", tool="External")
|
|
696
725
|
logger.exception("External tool call failed: {tool_name}:", tool_name=self.name)
|
|
697
726
|
return ToolError(
|
|
698
727
|
message=f"External tool call failed: {e}",
|
|
@@ -124,6 +124,9 @@ async def run_soul_checked(
|
|
|
124
124
|
brief="LLM provider error",
|
|
125
125
|
)
|
|
126
126
|
except Exception as exc:
|
|
127
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
128
|
+
|
|
129
|
+
report_handled_error(exc, site="subagents.run.soul")
|
|
127
130
|
logger.exception("Subagent soul run failed when {phase}", phase=phase)
|
|
128
131
|
return SoulRunFailure(
|
|
129
132
|
message=f"Unexpected error when {phase}: {exc}",
|
|
@@ -316,7 +319,10 @@ class ForegroundSubagentRunner:
|
|
|
316
319
|
self._store.update_instance(agent_id, status="killed")
|
|
317
320
|
output_writer.stage("cancelled")
|
|
318
321
|
raise RunCancelled("Subagent run was cancelled.") from exc
|
|
319
|
-
except Exception:
|
|
322
|
+
except Exception as exc:
|
|
323
|
+
from pythinker_code.telemetry.errors import report_handled_error
|
|
324
|
+
|
|
325
|
+
report_handled_error(exc, site="subagents.run.background")
|
|
320
326
|
self._store.update_instance(agent_id, status="failed")
|
|
321
327
|
output_writer.stage("failed_exception")
|
|
322
328
|
raise
|
|
@@ -52,3 +52,32 @@ def is_disabled() -> bool:
|
|
|
52
52
|
Sentry and OTel emission for the process."""
|
|
53
53
|
raw = os.environ.get("PYTHINKER_DISABLE_TELEMETRY", "").strip().lower()
|
|
54
54
|
return raw in {"1", "true", "yes", "on"}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# ---------------------------------------------------------------------------
|
|
58
|
+
# Sampling
|
|
59
|
+
# ---------------------------------------------------------------------------
|
|
60
|
+
|
|
61
|
+
DEFAULT_OTEL_TRACE_SAMPLE_RATE = 1.0
|
|
62
|
+
"""Default fraction of root-trace spans to record. 1.0 = always-on; 0.0 = none."""
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def otel_trace_sample_rate() -> float:
|
|
66
|
+
"""Resolve the OTel trace sampling rate.
|
|
67
|
+
|
|
68
|
+
Honors ``PYTHINKER_OTEL_TRACE_SAMPLE_RATE``. Clamped to ``[0.0, 1.0]``.
|
|
69
|
+
Malformed input falls back to the default rather than disabling tracing
|
|
70
|
+
or raising — telemetry config must never break the host program.
|
|
71
|
+
"""
|
|
72
|
+
raw = os.environ.get("PYTHINKER_OTEL_TRACE_SAMPLE_RATE", "").strip()
|
|
73
|
+
if not raw:
|
|
74
|
+
return DEFAULT_OTEL_TRACE_SAMPLE_RATE
|
|
75
|
+
try:
|
|
76
|
+
rate = float(raw)
|
|
77
|
+
except ValueError:
|
|
78
|
+
return DEFAULT_OTEL_TRACE_SAMPLE_RATE
|
|
79
|
+
if rate < 0.0:
|
|
80
|
+
return 0.0
|
|
81
|
+
if rate > 1.0:
|
|
82
|
+
return 1.0
|
|
83
|
+
return rate
|