pythinker-code 2.5.0__tar.gz → 2.7.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.5.0 → pythinker_code-2.7.0}/PKG-INFO +56 -14
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/README.md +50 -9
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/pyproject.toml +5 -2
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/CHANGELOG.md +37 -3
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/__main__.py +4 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/agents/default/agent.yaml +9 -0
- pythinker_code-2.7.0/src/pythinker_code/agents/default/code_reviewer.yaml +47 -0
- pythinker_code-2.7.0/src/pythinker_code/agents/default/debugger.yaml +35 -0
- pythinker_code-2.7.0/src/pythinker_code/agents/default/security_reviewer.yaml +37 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/agents/default/system.md +14 -2
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/app.py +11 -0
- pythinker_code-2.7.0/src/pythinker_code/auth/github_feedback.py +228 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/cli/_lazy_group.py +24 -0
- pythinker_code-2.7.0/src/pythinker_code/cli/debug.py +11 -0
- pythinker_code-2.7.0/src/pythinker_code/cli/review.py +74 -0
- pythinker_code-2.7.0/src/pythinker_code/cli/secscan.py +11 -0
- pythinker_code-2.7.0/src/pythinker_code/cli/security_scan.py +35 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/config.py +11 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/agent.py +22 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/permission.py +27 -0
- pythinker_code-2.7.0/src/pythinker_code/subagents/discovery.py +234 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/telemetry/otel.py +16 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/__init__.py +54 -3
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/components/bash_execution.py +4 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/components/diff.py +4 -3
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/components/tool_execution.py +6 -2
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/oauth.py +8 -1
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/prompt.py +28 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/slash.py +109 -3
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/_render_utils.py +19 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/bash.py +13 -9
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/edit.py +45 -5
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/find.py +2 -1
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/grep.py +2 -1
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/read.py +2 -1
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/todo.py +16 -13
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/web.py +3 -2
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/write.py +9 -6
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/visualize/_blocks.py +97 -1
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/visualize/_live_view.py +91 -49
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/_baseUniq-Bv26EHIE.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/_baseUniq-xopHfKWX.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/arc-DuCCCcUZ.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/arc-BBJ7V9Gp.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-CVZ131zn.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-DwGo6qSm.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-BAC2VOip.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/blockDiagram-VD42YOAC-B96wqtrk.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-9uwamEIP.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-BAv4oGOt.js +1 -1
- pythinker_code-2.7.0/src/pythinker_code/web/static/assets/channel-BMhsY12h.js +1 -0
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-BTdhSGW0.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/chunk-4BX2VUAB-xvC1-2wn.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-CYDI0p8Q.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/chunk-55IACEB6-Ci3UbC9h.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-b8oi1KW8.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/chunk-B4BG7PRW-YlIqOoyf.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-DGaf6dom.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/chunk-DI55MBZ5-CiKvkLSV.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-C1R9DMCj.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/chunk-FMBD7UC4-6L3DZcgX.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL-DjSDLitQ.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/chunk-QN33PNHL--uAxWJyr.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-_zmK8SCU.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/chunk-QZHKN3VN-BgsfDfGl.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-DURAXY_D.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/chunk-TZMSLE5B-CmVX5blB.js +1 -1
- pythinker_code-2.7.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-xLNcUMaH.js +1 -0
- pythinker_code-2.7.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-xLNcUMaH.js +1 -0
- pythinker_code-2.7.0/src/pythinker_code/web/static/assets/clone-D4ji5nla.js +1 -0
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-DL4aF17r.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/code-block-IT6T5CEO-DOvUTd9H.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-BuUIleVc.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-CnxamR9p.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/cytoscape.esm-C-OXuR4H.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/cytoscape.esm-JliMJb2r.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-CFMQD_BU.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/dagre-6UL2VRFP-CZPQL3_X.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-BlZG6Knx.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/diagram-PSM6KHXK-BdkuXkbh.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-Bx6pGAz_.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/diagram-QEK2KX5R-B_gzBcDN.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-C3k3j5WT.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/diagram-S2PKOQOG-C9KMyyaT.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-ZXF9DMQm.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-BMG5oLO5.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-BbSLxWgp.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/flowDiagram-NV44I4VS-ByMcd6Qs.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-NOlUrkQp.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-uIly3nqs.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-BAlT86AC.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-DMlBqiTw.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/graph-BzHVPchG.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/graph-B2e5iBNo.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/index-CnM44gk-.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/index-ChRG_K1c.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/index-Cm_lwIyA.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/index-DgWvtkAz.js +2 -2
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/index-Cqg-K1YV.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/index-XVss4lOI.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-DBX3JCDO.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-CihjcIPb.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-yaCqhNqw.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-D8UHxaOf.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-Cw2loPy6.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-DMJJ5np4.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/layout-DC8qmv-q.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/layout-DCD-kyE5.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/linear-Bpra1Fqc.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/linear-D32cHhqF.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-BvHbNBJJ.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-BdQ-I_9q.js +7 -7
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/mermaid.core-QA4yHgUs.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/mermaid.core-TDrBZ18i.js +5 -5
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/min-sLtZymTB.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/min-BLYTe2ei.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-BycLAQjs.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-D4dVU6Wl.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-CpFv1-B_.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-BPhhXGkK.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-C8HyfNyW.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-Bw33P7le.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-DyTuOubd.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-BJhppvmZ.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-BlUGUAE1.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-B2QsrhB7.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-jqMJUHqm.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-D-zE9VAU.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-zShF28En.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-fXBn8fR5.js +1 -1
- pythinker_code-2.7.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-Uh1qibgy.js +1 -0
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-Cvekw0Hb.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-QJcB1GYA.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-DuFTYtWm.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/treemap-KMMF4GRG-BIsZeCJI.js +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-BVeBFpa0.js → pythinker_code-2.7.0/src/pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-D23m9ArK.js +1 -1
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/index.html +1 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/channel-aVyB491s.js +0 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/classDiagram-2ON5EDUG-cvkDF0Mx.js +0 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-cvkDF0Mx.js +0 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/clone-DQNyDB_s.js +0 -1
- pythinker_code-2.5.0/src/pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-lllXGHDb.js +0 -1
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/LICENSE +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/NOTICE +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/acp/AGENTS.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/acp/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/acp/convert.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/acp/host.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/acp/mcp.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/acp/server.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/acp/session.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/acp/tools.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/acp/types.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/acp/version.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/agents/default/coder.yaml +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/agents/default/explore.yaml +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/agents/default/implementer.yaml +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/agents/default/plan.yaml +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/agents/default/review.yaml +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/agents/default/verifier.yaml +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/agents/okabe/agent.yaml +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/agentspec.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/approval_runtime/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/approval_runtime/models.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/approval_runtime/runtime.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/auth/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/auth/anthropic_direct.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/auth/deepseek.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/auth/lm_studio.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/auth/minimax.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/auth/oauth.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/auth/ollama.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/auth/openai.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/auth/opencode_go.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/auth/openrouter.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/auth/platforms.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/background/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/background/agent_runner.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/background/ids.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/background/manager.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/background/models.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/background/store.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/background/summary.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/background/worker.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/cli/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/cli/__main__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/cli/export.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/cli/info.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/cli/mcp.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/cli/plugin.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/cli/toad.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/cli/update.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/cli/vis.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/cli/web.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/constant.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/events.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/exception.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/extensions.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/hooks/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/hooks/config.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/hooks/engine.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/hooks/events.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/hooks/runner.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/llm.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/metadata.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/notifications/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/notifications/llm.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/notifications/manager.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/notifications/models.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/notifications/notifier.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/notifications/store.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/notifications/wire.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/plugin/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/plugin/manager.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/plugin/tool.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/prompt_templates.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/prompts/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/prompts/compact.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/prompts/init.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/py.typed +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/session.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/session_fork.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/session_state.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/share.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/skill/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/skill/flow/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/skill/flow/d2.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/skill/flow/mermaid.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/skills/pythinker-code-help/SKILL.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/skills/skill-creator/SKILL.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/approval.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/btw.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/compaction.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/context.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/denwarenji.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/dynamic_injection.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/dynamic_injections/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/dynamic_injections/auto_mode.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/dynamic_injections/plan_mode.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/message.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/pythinkersoul.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/slash.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/soul/toolset.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/subagents/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/subagents/builder.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/subagents/core.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/subagents/git_context.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/subagents/models.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/subagents/output.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/subagents/registry.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/subagents/runner.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/subagents/store.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/telemetry/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/telemetry/config.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/telemetry/crash.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/telemetry/errors.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/telemetry/metrics.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/telemetry/sentry.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/telemetry/sink.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/AGENTS.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/agent/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/agent/description.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/ask_user/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/ask_user/description.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/background/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/background/list.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/background/output.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/background/stop.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/display.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/dmail/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/dmail/dmail.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/glob.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/glob.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/grep.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/grep_local.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/plan_mode.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/read.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/read.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/read_media.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/read_media.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/replace.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/replace.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/utils.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/write.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/file/write.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/plan/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/plan/description.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/plan/enter.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/plan/enter_description.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/plan/handoff.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/plan/heroes.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/shell/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/shell/bash.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/shell/powershell.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/test.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/think/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/think/think.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/todo/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/todo/set_todo_list.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/utils.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/web/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/web/fetch.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/web/fetch.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/web/search.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/tools/web/search.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/acp/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/print/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/print/visualize.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/components/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/components/base.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/components/bordered_loader.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/components/footer.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/components/key_hints.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/components/messages.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/components/render_utils.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/components/settings_list.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/components/special_messages.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/console.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/debug.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/echo.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/export_import.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/keyboard.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/keymap.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/mcp_status.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/model_picker.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/placeholders.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/replay.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/selector.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/selectors/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/selectors/extension.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/selectors/oauth.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/selectors/settings.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/selectors/show_images.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/selectors/theme.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/selectors/thinking.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/session_picker.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/setup.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/startup.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/task_browser.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/agent.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/ask_user.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/background.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/generic.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/plan.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/tool_renderers/think.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/update.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/usage.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/usage_adapters/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/usage_adapters/base.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/usage_adapters/deepseek.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/usage_adapters/minimax.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/usage_adapters/openai_admin.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/usage_adapters/opencode_go.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/usage_adapters/openrouter.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/usage_render.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/visualize/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/visualize/_approval_panel.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/visualize/_btw_panel.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/visualize/_input_router.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/visualize/_interactive.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/visualize/_question_panel.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/shell/visualize/_worklog.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/theme.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/ui/tui_config.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/usage_ratelimit_cache.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/aiohttp.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/aioqueue.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/broadcast.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/changelog.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/clipboard.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/datetime.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/diff.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/editor.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/environment.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/envvar.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/export.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/file_filter.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/frontmatter.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/io.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/logging.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/media_tags.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/message.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/path.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/proctitle.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/proxy.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/pyinstaller.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/rich/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/rich/columns.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/rich/diff_render.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/rich/markdown.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/rich/markdown_sample.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/rich/markdown_sample_short.md +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/rich/syntax.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/sensitive.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/server.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/signals.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/slashcmd.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/string.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/subprocess_env.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/term.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/utils/typing.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/api/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/api/sessions.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/api/statistics.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/api/system.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/app.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-CY1rtwrX.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/static/assets/index-DSRInNnm.css +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/static/assets/index-DgmTI2M_.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/vis/static/index.html +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/api/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/api/config.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/api/open_in.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/api/sessions.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/app.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/auth.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/models.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/runner/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/runner/messages.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/runner/process.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/runner/worker.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/abap-BdImnpbu.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/ada-bCR0ucgS.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/apache-Pmp26Uib.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/apex-D8_7TLub.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/apl-dKokRX4l.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/applescript-Co6uUVPk.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/ara-BRHolxvo.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/asm-D_Q5rh1f.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/astro-CbQHKStN.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/awk-DMzUqQB5.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/bat-BkioyH1T.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/beancount-k_qm7-4y.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/berry-uYugtg8r.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/bibtex-CHM0blh-.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/bicep-Bmn6On1c.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/blade-D4QpJJKB.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/bsl-BO_Y6i37.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/c-BIGW1oBm.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/c3-VCDPK7BO.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/cairo-KRGpt6FW.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/clarity-D53aC0YG.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/clojure-P80f7IUj.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/cmake-D1j8_8rp.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/cobol-nwyudZeR.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/coffee-Ch7k5sss.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/coq-DkFqJrB1.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/cpp-CofmeUqb.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/crystal-tKQVLTB8.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/csharp-K5feNrxe.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/css-DPfMkruS.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/csv-fuZLfV_i.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/cue-D82EKSYY.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/cypher-COkxafJQ.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/d-85-TOEBH.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/dart-CF10PKvl.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/dax-CEL-wOlO.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/diff-D97Zzqfu.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/docker-BcOcwvcX.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/dotenv-Da5cRb03.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/dracula-BzJJZx-M.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/edge-BkV0erSs.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/elixir-CDX3lj18.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/elm-DbKCFpqz.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/erb-BOJIQeun.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/erlang-DsQrWhSR.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/fennel-BYunw83y.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/fish-BvzEVeQv.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/fluent-C4IJs8-o.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/gdshader-DkwncUOv.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/genie-D0YGMca9.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/github-dark-DHJKELXO.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/github-light-DAi9KRSo.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/gleam-BspZqrRM.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/glsl-DplSGwfg.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/gn-n2N0HUVH.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/go-Dn2_MT6a.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/graphql-ChdNCCLP.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/groovy-gcz8RCvz.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/hack-CaT9iCJl.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/haml-B8DHNrY2.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/handlebars-BL8al0AC.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/haskell-Df6bDoY_.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/haxe-CzTSHFRz.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/hcl-BWvSN4gD.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/hjson-D5-asLiD.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/houston-DnULxvSX.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/html-GMplVEZG.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/http-jrhK8wxY.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/hurl-irOxFIW8.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/hy-DFXneXwc.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/imba-DGztddWO.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/index-BpoLgcEt.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/index-CzV_vCfu.css +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/index-DI2oedCt.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/ini-BEwlwnbL.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/init-Gi6I4Gst.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/java-CylS5w8V.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/javascript-wDzz0qaB.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/jison-wvAkD_A8.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/json-Cp-IABpG.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/json5-C9tS-k6U.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/jsonc-Des-eS-w.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/jssm-C2t-YnRu.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/jsx-g9-lgVsj.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/julia-CxzCAyBv.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/katex-D2lIc1rk.css +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/kdl-DV7GczEv.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/kusto-DZf3V79B.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/laserwave-DUszq2jm.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/latex-B4uzh10-.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/lean-BZvkOJ9d.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/less-B1dDrJ26.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/liquid-DYVedYrR.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/llvm-BtvRca6l.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/log-2UxHyX5q.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/logo-BtOb2qkB.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/lua-BbnMAYS6.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/luau-C-HG3fhB.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/make-CHLpvVh8.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/markdown-Cvjx9yec.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/marko-DZsq8hO1.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/matlab-D7o27uSR.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/mdc-DUICxH0z.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/mermaid-VLURNSYL-B2P5VJ9v.css +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/min-dark-CafNBF8u.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/min-light-CTRr51gU.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/mojo-B93PlW-d.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/monokai-D4h5O-jR.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/moonbit-Ba13S78F.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/move-Bu9oaDYs.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/narrat-DRg8JJMk.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/nginx-DknmC5AR.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/night-owl-C39BiMTA.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/nim-CVrawwO9.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/nix-CwoSXNpI.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/nord-Ddv68eIx.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/nushell-C-sUppwS.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/one-light-PoHY5YXO.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/openscad-C4EeE6gA.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/pascal-D93ZcfNL.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/perl-C0TMdlhV.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/php-CDn_0X-4.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/pkl-u5AG7uiY.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/plastic-3e1v2bzS.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/plsql-ChMvpjG-.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/po-BTJTHyun.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/polar-C0HS_06l.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/postcss-CXtECtnM.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/powershell-Dpen1YoG.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/prisma-Dd19v3D-.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/prolog-CbFg5uaA.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/proto-C7zT0LnQ.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/pug-CGlum2m_.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/puppet-BMWR74SV.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/purescript-CklMAg4u.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/python-B6aJPvgy.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/qml-3beO22l8.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/qss-IeuSbFQv.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/r-Dspwwk_N.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/racket-BqYA7rlc.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/raku-DXvB9xmW.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/razor-C1TweQQi.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/red-bN70gL4F.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/reg-C-SQnVFl.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/rel-C3B-1QV4.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/riscv-BM1_JUlF.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/rst-B0xPkSld.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/ruby-BvKwtOVI.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/rust-B1yitclQ.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/sas-cz2c8ADy.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/scala-C151Ov-r.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/scheme-C98Dy4si.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/scss-OYdSNvt2.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/shellscript-Yzrsuije.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/shellsession-BADoaaVG.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/solidity-rGO070M0.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/soy-Brmx7dQM.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/sparql-rVzFXLq3.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/splunk-BtCnVYZw.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/sql-BLtJtn59.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/stata-BH5u7GGu.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/svelte-zxCyuUbr.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/swift-Dg5xB15N.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/systemd-4A_iFExJ.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/talonscript-CkByrt1z.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/tasl-QIJgUcNo.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/tcl-dwOrl1Do.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/templ-W15q3VgB.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/terraform-BETggiCN.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/tex-CvyZ59Mk.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/tokyo-night-hegEt444.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/toml-vGWfd6FD.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/tsv-B_m7g4N7.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/tsx-COt5Ahok.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/turtle-BsS91CYL.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/twig-CO9l9SDP.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/typespec-BGHnOYBU.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/typst-DHCkPAjA.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/v-BcVCzyr7.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/vala-CsfeWuGM.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/vb-D17OF-Vu.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/verilog-BQ8w6xss.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/vesper-DU1UobuO.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/viml-CJc9bBzg.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/vue-DN_0RTcg.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/vyper-CDx5xZoG.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/wasm-MzD3tlZU.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/wenyan-BV7otONQ.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/wit-5i3qLPDT.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/xml-sdJ4AIDG.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/xsl-CtQFsRM5.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/yaml-Buea-lGh.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/assets/zig-VOosw3JB.js +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/arctecture.webp +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/bimi-logo.svg +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/favicon.ico +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/icon-192.png +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/icon-512.png +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/icon.svg +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/logo.png +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/pythinker_animated.svg +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/brand/robots.txt +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/static/logo.png +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/store/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/web/store/sessions.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/wire/__init__.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/wire/file.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/wire/jsonrpc.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/wire/protocol.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/wire/root_hub.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/wire/serde.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.0}/src/pythinker_code/wire/server.py +0 -0
- {pythinker_code-2.5.0 → pythinker_code-2.7.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.7.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
|
|
@@ -23,7 +23,7 @@ Requires-Dist: agent-client-protocol==0.8.0
|
|
|
23
23
|
Requires-Dist: aiofiles>=24.0,<26.0
|
|
24
24
|
Requires-Dist: aiohttp==3.13.3
|
|
25
25
|
Requires-Dist: typer==0.21.1
|
|
26
|
-
Requires-Dist: pythinker-core[contrib]==1.
|
|
26
|
+
Requires-Dist: pythinker-core[contrib]==1.1.0
|
|
27
27
|
Requires-Dist: loguru>=0.6.0,<0.7
|
|
28
28
|
Requires-Dist: prompt-toolkit==3.0.52
|
|
29
29
|
Requires-Dist: pillow==12.1.0
|
|
@@ -38,6 +38,7 @@ Requires-Dist: fastmcp==2.12.5
|
|
|
38
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
|
+
Requires-Dist: pythinker-review==0.1.0
|
|
41
42
|
Requires-Dist: batrachian-toad==0.5.23 ; python_full_version >= '3.14'
|
|
42
43
|
Requires-Dist: tomlkit==0.14.0
|
|
43
44
|
Requires-Dist: jinja2==3.1.6
|
|
@@ -53,21 +54,21 @@ Requires-Dist: opentelemetry-api>=1.30,<2
|
|
|
53
54
|
Requires-Dist: opentelemetry-sdk>=1.30,<2
|
|
54
55
|
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.30,<2
|
|
55
56
|
Requires-Python: >=3.12
|
|
56
|
-
Project-URL: Changelog, https://github.com/mohamed-elkholy95/Pythinker-Code/blob/main/CHANGELOG.md
|
|
57
|
-
Project-URL: Documentation, https://github.com/mohamed-elkholy95/Pythinker-Code#readme
|
|
58
57
|
Project-URL: Homepage, https://github.com/mohamed-elkholy95/Pythinker-Code
|
|
59
|
-
Project-URL: Issues, https://github.com/mohamed-elkholy95/Pythinker-Code/issues
|
|
60
58
|
Project-URL: Repository, https://github.com/mohamed-elkholy95/Pythinker-Code
|
|
59
|
+
Project-URL: Issues, https://github.com/mohamed-elkholy95/Pythinker-Code/issues
|
|
60
|
+
Project-URL: Changelog, https://github.com/mohamed-elkholy95/Pythinker-Code/blob/main/CHANGELOG.md
|
|
61
|
+
Project-URL: Documentation, https://github.com/mohamed-elkholy95/Pythinker-Code#readme
|
|
61
62
|
Description-Content-Type: text/markdown
|
|
62
63
|
|
|
63
64
|
<div align="center">
|
|
64
65
|
|
|
65
66
|
# <img src="https://raw.githubusercontent.com/mohamed-elkholy95/Pythinker-Code/main/docs/media/logo.png" alt="Pythinker logo" width="42" align="top"> Pythinker Code
|
|
66
67
|
|
|
67
|
-
### *Your terminal-native AI engineering agent.*
|
|
68
|
+
### *Think first, then code. Your terminal-native review-first AI engineering agent.*
|
|
68
69
|
|
|
69
|
-
**
|
|
70
|
-
**All from the shell you already live in.**
|
|
70
|
+
**Code reviewer · Security & vulnerability scanner · Root-cause debugger — then code creator.**
|
|
71
|
+
**Pythinker reads your repo, audits it, and only writes code after the analysis. All from the shell you already live in.**
|
|
71
72
|
|
|
72
73
|
<br />
|
|
73
74
|
|
|
@@ -76,7 +77,7 @@ Description-Content-Type: text/markdown
|
|
|
76
77
|
[](https://github.com/mohamed-elkholy95/Pythinker-Code/blob/main/LICENSE)
|
|
77
78
|
[](https://github.com/mohamed-elkholy95/Pythinker-Code/actions/workflows/ci-pythinker-cli.yml?query=branch%3Amain)
|
|
78
79
|
|
|
79
|
-
[](https://pepy.tech/projects/pythinker-code)
|
|
80
81
|
[](https://docs.astral.sh/ruff/)
|
|
81
82
|
[](https://github.com/agentclientprotocol/agent-client-protocol)
|
|
82
83
|
[](https://modelcontextprotocol.io/)
|
|
@@ -102,14 +103,55 @@ Description-Content-Type: text/markdown
|
|
|
102
103
|
|
|
103
104
|
## 💡 What is Pythinker?
|
|
104
105
|
|
|
105
|
-
**Pythinker Code** is an open-source AI
|
|
106
|
+
**Pythinker Code** is an open-source, **review-first** AI engineering agent that lives in your terminal. Before it writes a single line, it reads yours — auditing diffs, scanning for vulnerabilities, and root-causing failures. Unlike chat assistants that jump straight to code, Pythinker leads with **code review, security scanning, and root-cause diagnosis**, and only edits files once the analysis points at a fix.
|
|
107
|
+
|
|
108
|
+
It ships with first-class subagents for each role — `code-reviewer` for severity-scored diff critique, `security-reviewer` for validated vulnerability findings, `debugger` for failure root-causing, and `coder`/`implementer` for the scoped edits that follow. All running in a single iterative loop, driven by the model of your choice, with full access to **your repo, the shell, the web, and MCP tools**.
|
|
106
109
|
|
|
107
110
|
It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientprotocol/agent-client-protocol), so it slots cleanly into ACP-aware editors like Zed and JetBrains. It loads [**Model Context Protocol (MCP)**](https://modelcontextprotocol.io/) servers, so the same tools your other agents use just work. And it's hackable: subagents, skills, hooks, and plugins are all first-class extension points.
|
|
108
111
|
|
|
109
|
-
> 🎯 **One agent, one shell, one workflow
|
|
112
|
+
> 🎯 **Review · Secure · Diagnose · then Create.** One agent, one shell, one workflow. No tab-switching. No context loss. No magic.
|
|
110
113
|
|
|
111
114
|
---
|
|
112
115
|
|
|
116
|
+
## 🆕 What's New in 2.7.0
|
|
117
|
+
|
|
118
|
+
First-class agent-first code review, security review, and root-cause debugging, via the new
|
|
119
|
+
`pythinker-review` workspace package.
|
|
120
|
+
|
|
121
|
+
- **`pythinker review diff`** — runs a code-review pass on the current branch's diff against `origin/main` (or `--base <ref>`, `--staged`, `--working-tree`, `--range A..B`). Outputs pretty / JSON / SARIF. `--fail-on <severity>` makes it a CI gate.
|
|
122
|
+
- **`pythinker review diff --with-security`** — runs the code-review and security-review passes in parallel.
|
|
123
|
+
- **`pythinker secscan diff`** — security-only pass with Pythinker Security Scan deterministic prompt anchors for secrets, command/SQL/NoSQL injection, deserialization, SSRF, path traversal, XSS, redirects, JWT/CORS issues, prompt-injection surfaces, debug endpoints, weak crypto, and more.
|
|
124
|
+
- **`pythinker security-scan scan`** — repo-wide Pythinker Security Scan pipeline for deterministic candidate discovery, model-backed investigation, revalidation, triage, reports, and exports.
|
|
125
|
+
- **`pythinker debug failure <log-file>`** — root-cause debugger pass over failing test output, stack traces, logs, and correlated diff context, with secret redaction before prompts.
|
|
126
|
+
- **`pythinker review diff --mode deslopify`** — read-only Reviewflow-style simplification review for accidental complexity, duplicate wrappers, dead branches, and brittle test/type band-aids.
|
|
127
|
+
- **Evidence validation** — findings outside the reviewed chunk, unsafe paths, stale line ranges, or non-matching evidence snippets are rejected and surfaced as validation failures instead of being silently persisted.
|
|
128
|
+
- **Findings store** at `.pythinker-review/runs/<id>/` for inspection via `pythinker review list`, `pythinker review show <id>`, `pythinker review next`, and `pythinker review show-finding <finding-id>`.
|
|
129
|
+
- **Code-reviewr PR assistant parity** — read-only `pythinker review describe`, `improve`/`suggest`, `ask`, `ask-line`, `labels`, `changelog`, `docs`, `compliance`, `help-docs`, `similar-issues`, `tools`, and `config` commands produce structured PR artifacts/helpers without posting or modifying files.
|
|
130
|
+
- **Reviewflow workflows** — compatible project/feature/run/finding/patch state models power `pythinker review init`, `map`, `review`, `report`, `next`, `show --finding`, `triage`, `revalidate`, `fix`, `open-pr`, `ci`, and `doctor`.
|
|
131
|
+
- **Three new subagent roles** — `code-reviewer`, `security-reviewer`, and `debugger` — usable from any interactive Pythinker session, producing the standard SUMMARY/EVIDENCE/CHANGES/RISKS/BLOCKERS block.
|
|
132
|
+
- **Fail-closed by default** — any chunk timeout, malformed model output, or worker exception exits non-zero. `--allow-partial` is the explicit escape hatch and surfaces failures in output.
|
|
133
|
+
|
|
134
|
+
No new third-party runtime dependencies. Reuses the active Pythinker model when invoked via `pythinker review` / `pythinker secscan` / `pythinker security-scan` / `pythinker debug`; the standalone `pythinker-review` / `pythinker-secscan` / `pythinker-security-scan` / `pythinker-debug` console scripts accept explicit/env configuration.
|
|
135
|
+
|
|
136
|
+
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.7.0`.
|
|
137
|
+
|
|
138
|
+
## 🆕 What's New in 2.6.0
|
|
139
|
+
|
|
140
|
+
> **Hotfix release for Kimi K2.x and DeepSeek users on PyPI.**
|
|
141
|
+
|
|
142
|
+
The runtime fix for the strict-interleaved `thinking is enabled but reasoning_content is missing in assistant tool call message at index N` rejection was in the `pythinker-core` source since 2.4.0, but the published `pythinker-core==1.0.0` on PyPI predates it — so installs of `pythinker-code` 2.4.0 / 2.5.0 from PyPI kept hitting the bug on Kimi K2.5, K2.6, and DeepSeek (including through OpenCode Go). Reported in [#37](https://github.com/mohamed-elkholy95/Pythinker-Code/issues/37).
|
|
143
|
+
|
|
144
|
+
2.6.0 bumps the pinned dep:
|
|
145
|
+
|
|
146
|
+
- **`pythinker-core` 1.0.0 → 1.1.0** (published independently to PyPI) — strict-interleaved providers (`kimi-k2*`, `deepseek*`) now always emit `reasoning_content` on assistant turns, with the fallback chain `ThinkPart → extract_text() → "[reasoning unavailable]"`. Multi-step tool flows on Kimi/DeepSeek no longer trip the strict thinking-replay check.
|
|
147
|
+
- **Root pin** `pythinker-core[contrib]==1.0.0 → 1.1.0` — new installs of `pip install --upgrade pythinker-code==2.6.0` (and `uv tool install`/`upgrade`) pick up the fix automatically.
|
|
148
|
+
|
|
149
|
+
No app-level changes vs 2.5.0; everything from the 2.5.0 release is still present. **Existing 2.5.0 users on Kimi K2.x / DeepSeek must upgrade to 2.6.0.**
|
|
150
|
+
|
|
151
|
+
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.6.0`.
|
|
152
|
+
|
|
153
|
+
### What was new in 2.5.0
|
|
154
|
+
|
|
113
155
|
## 🆕 What's New in 2.5.0
|
|
114
156
|
|
|
115
157
|
Coding-agent runtime hardening: runtime-enforced permission profiles, FetchURL SSRF protection, a Windows self-upgrade fix, and a configurable feedback endpoint.
|
|
@@ -125,17 +167,17 @@ Coding-agent runtime hardening: runtime-enforced permission profiles, FetchURL S
|
|
|
125
167
|
- **anthropic 0.101 compat** — added fallbacks for the six new tool-result block types so `pyright` stays exhaustive.
|
|
126
168
|
- **Telemetry hygiene** — OTel `service.name` normalized to a stable value for SigNoz dashboards; Sentry filters drop test and shutdown noise.
|
|
127
169
|
|
|
128
|
-
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.5.0
|
|
170
|
+
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.5.0` (note: 2.5.0 PyPI installs are affected by [#37](https://github.com/mohamed-elkholy95/Pythinker-Code/issues/37) on Kimi/DeepSeek — see the 2.6.0 hotfix above).
|
|
129
171
|
|
|
130
172
|
### What was new in 2.4.0
|
|
131
173
|
|
|
132
174
|
## 🆕 What's New in 2.4.0
|
|
133
175
|
|
|
134
|
-
Subagent roles overhaul,
|
|
176
|
+
Subagent roles overhaul, Kimi K2 provider support, and a ripgrep-free Grep fallback.
|
|
135
177
|
|
|
136
178
|
- **New subagents** — `implementer` (scoped edits + verification), `review` (severity-scored read-only review), and `verifier` (`PASS` / `FAIL` / `FLAKY` validation runner). Join the existing `coder` / `explore` / `plan` roster.
|
|
137
179
|
- **Structured subagent output** — every default agent now answers with `### SUMMARY / EVIDENCE / CHANGES / RISKS / BLOCKERS`, so the parent agent can consume results without re-parsing prose. New recommended flow: **Scout → Plan → Implement → Review → Verify** (review and verify can run in parallel).
|
|
138
|
-
- **Kimi K2.5 / K2.6
|
|
180
|
+
- **Kimi K2.5 / K2.6 support** — `--thinking` is routed via the provider-specific `thinking.type` body field, and assistant tool-call replays always carry `reasoning_content` so multi-step tool flows stop tripping the strict thinking-replay check. Same hardening applied to DeepSeek's strict mode.
|
|
139
181
|
- **`Grep` works without `rg`** — pure-Python fallback honors `pattern` / `glob` / `type` / `ignore_case` / `multiline` / `context` / `output_mode` / `offset` / `head_limit` and respects `.gitignore`. The downloader also retries against the upstream GitHub releases mirror and accepts `PYTHINKER_RG_PATH=/absolute/path` plus extra discovery paths (`~/.cargo/bin`, `~/.local/bin`, `~/.pi/agent/bin`, `/usr/bin`, `/usr/local/bin`).
|
|
140
182
|
- **`AGENTS.md` rewritten** to match the new roster, and `tools/agent/description.md` documents the parallel-review and cross-check patterns.
|
|
141
183
|
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
# <img src="https://raw.githubusercontent.com/mohamed-elkholy95/Pythinker-Code/main/docs/media/logo.png" alt="Pythinker logo" width="42" align="top"> Pythinker Code
|
|
4
4
|
|
|
5
|
-
### *Your terminal-native AI engineering agent.*
|
|
5
|
+
### *Think first, then code. Your terminal-native review-first AI engineering agent.*
|
|
6
6
|
|
|
7
|
-
**
|
|
8
|
-
**All from the shell you already live in.**
|
|
7
|
+
**Code reviewer · Security & vulnerability scanner · Root-cause debugger — then code creator.**
|
|
8
|
+
**Pythinker reads your repo, audits it, and only writes code after the analysis. All from the shell you already live in.**
|
|
9
9
|
|
|
10
10
|
<br />
|
|
11
11
|
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
[](https://github.com/mohamed-elkholy95/Pythinker-Code/blob/main/LICENSE)
|
|
15
15
|
[](https://github.com/mohamed-elkholy95/Pythinker-Code/actions/workflows/ci-pythinker-cli.yml?query=branch%3Amain)
|
|
16
16
|
|
|
17
|
-
[](https://pepy.tech/projects/pythinker-code)
|
|
18
18
|
[](https://docs.astral.sh/ruff/)
|
|
19
19
|
[](https://github.com/agentclientprotocol/agent-client-protocol)
|
|
20
20
|
[](https://modelcontextprotocol.io/)
|
|
@@ -40,14 +40,55 @@
|
|
|
40
40
|
|
|
41
41
|
## 💡 What is Pythinker?
|
|
42
42
|
|
|
43
|
-
**Pythinker Code** is an open-source AI
|
|
43
|
+
**Pythinker Code** is an open-source, **review-first** AI engineering agent that lives in your terminal. Before it writes a single line, it reads yours — auditing diffs, scanning for vulnerabilities, and root-causing failures. Unlike chat assistants that jump straight to code, Pythinker leads with **code review, security scanning, and root-cause diagnosis**, and only edits files once the analysis points at a fix.
|
|
44
|
+
|
|
45
|
+
It ships with first-class subagents for each role — `code-reviewer` for severity-scored diff critique, `security-reviewer` for validated vulnerability findings, `debugger` for failure root-causing, and `coder`/`implementer` for the scoped edits that follow. All running in a single iterative loop, driven by the model of your choice, with full access to **your repo, the shell, the web, and MCP tools**.
|
|
44
46
|
|
|
45
47
|
It speaks the [**Agent Client Protocol (ACP)**](https://github.com/agentclientprotocol/agent-client-protocol), so it slots cleanly into ACP-aware editors like Zed and JetBrains. It loads [**Model Context Protocol (MCP)**](https://modelcontextprotocol.io/) servers, so the same tools your other agents use just work. And it's hackable: subagents, skills, hooks, and plugins are all first-class extension points.
|
|
46
48
|
|
|
47
|
-
> 🎯 **One agent, one shell, one workflow
|
|
49
|
+
> 🎯 **Review · Secure · Diagnose · then Create.** One agent, one shell, one workflow. No tab-switching. No context loss. No magic.
|
|
48
50
|
|
|
49
51
|
---
|
|
50
52
|
|
|
53
|
+
## 🆕 What's New in 2.7.0
|
|
54
|
+
|
|
55
|
+
First-class agent-first code review, security review, and root-cause debugging, via the new
|
|
56
|
+
`pythinker-review` workspace package.
|
|
57
|
+
|
|
58
|
+
- **`pythinker review diff`** — runs a code-review pass on the current branch's diff against `origin/main` (or `--base <ref>`, `--staged`, `--working-tree`, `--range A..B`). Outputs pretty / JSON / SARIF. `--fail-on <severity>` makes it a CI gate.
|
|
59
|
+
- **`pythinker review diff --with-security`** — runs the code-review and security-review passes in parallel.
|
|
60
|
+
- **`pythinker secscan diff`** — security-only pass with Pythinker Security Scan deterministic prompt anchors for secrets, command/SQL/NoSQL injection, deserialization, SSRF, path traversal, XSS, redirects, JWT/CORS issues, prompt-injection surfaces, debug endpoints, weak crypto, and more.
|
|
61
|
+
- **`pythinker security-scan scan`** — repo-wide Pythinker Security Scan pipeline for deterministic candidate discovery, model-backed investigation, revalidation, triage, reports, and exports.
|
|
62
|
+
- **`pythinker debug failure <log-file>`** — root-cause debugger pass over failing test output, stack traces, logs, and correlated diff context, with secret redaction before prompts.
|
|
63
|
+
- **`pythinker review diff --mode deslopify`** — read-only Reviewflow-style simplification review for accidental complexity, duplicate wrappers, dead branches, and brittle test/type band-aids.
|
|
64
|
+
- **Evidence validation** — findings outside the reviewed chunk, unsafe paths, stale line ranges, or non-matching evidence snippets are rejected and surfaced as validation failures instead of being silently persisted.
|
|
65
|
+
- **Findings store** at `.pythinker-review/runs/<id>/` for inspection via `pythinker review list`, `pythinker review show <id>`, `pythinker review next`, and `pythinker review show-finding <finding-id>`.
|
|
66
|
+
- **Code-reviewr PR assistant parity** — read-only `pythinker review describe`, `improve`/`suggest`, `ask`, `ask-line`, `labels`, `changelog`, `docs`, `compliance`, `help-docs`, `similar-issues`, `tools`, and `config` commands produce structured PR artifacts/helpers without posting or modifying files.
|
|
67
|
+
- **Reviewflow workflows** — compatible project/feature/run/finding/patch state models power `pythinker review init`, `map`, `review`, `report`, `next`, `show --finding`, `triage`, `revalidate`, `fix`, `open-pr`, `ci`, and `doctor`.
|
|
68
|
+
- **Three new subagent roles** — `code-reviewer`, `security-reviewer`, and `debugger` — usable from any interactive Pythinker session, producing the standard SUMMARY/EVIDENCE/CHANGES/RISKS/BLOCKERS block.
|
|
69
|
+
- **Fail-closed by default** — any chunk timeout, malformed model output, or worker exception exits non-zero. `--allow-partial` is the explicit escape hatch and surfaces failures in output.
|
|
70
|
+
|
|
71
|
+
No new third-party runtime dependencies. Reuses the active Pythinker model when invoked via `pythinker review` / `pythinker secscan` / `pythinker security-scan` / `pythinker debug`; the standalone `pythinker-review` / `pythinker-secscan` / `pythinker-security-scan` / `pythinker-debug` console scripts accept explicit/env configuration.
|
|
72
|
+
|
|
73
|
+
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.7.0`.
|
|
74
|
+
|
|
75
|
+
## 🆕 What's New in 2.6.0
|
|
76
|
+
|
|
77
|
+
> **Hotfix release for Kimi K2.x and DeepSeek users on PyPI.**
|
|
78
|
+
|
|
79
|
+
The runtime fix for the strict-interleaved `thinking is enabled but reasoning_content is missing in assistant tool call message at index N` rejection was in the `pythinker-core` source since 2.4.0, but the published `pythinker-core==1.0.0` on PyPI predates it — so installs of `pythinker-code` 2.4.0 / 2.5.0 from PyPI kept hitting the bug on Kimi K2.5, K2.6, and DeepSeek (including through OpenCode Go). Reported in [#37](https://github.com/mohamed-elkholy95/Pythinker-Code/issues/37).
|
|
80
|
+
|
|
81
|
+
2.6.0 bumps the pinned dep:
|
|
82
|
+
|
|
83
|
+
- **`pythinker-core` 1.0.0 → 1.1.0** (published independently to PyPI) — strict-interleaved providers (`kimi-k2*`, `deepseek*`) now always emit `reasoning_content` on assistant turns, with the fallback chain `ThinkPart → extract_text() → "[reasoning unavailable]"`. Multi-step tool flows on Kimi/DeepSeek no longer trip the strict thinking-replay check.
|
|
84
|
+
- **Root pin** `pythinker-core[contrib]==1.0.0 → 1.1.0` — new installs of `pip install --upgrade pythinker-code==2.6.0` (and `uv tool install`/`upgrade`) pick up the fix automatically.
|
|
85
|
+
|
|
86
|
+
No app-level changes vs 2.5.0; everything from the 2.5.0 release is still present. **Existing 2.5.0 users on Kimi K2.x / DeepSeek must upgrade to 2.6.0.**
|
|
87
|
+
|
|
88
|
+
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.6.0`.
|
|
89
|
+
|
|
90
|
+
### What was new in 2.5.0
|
|
91
|
+
|
|
51
92
|
## 🆕 What's New in 2.5.0
|
|
52
93
|
|
|
53
94
|
Coding-agent runtime hardening: runtime-enforced permission profiles, FetchURL SSRF protection, a Windows self-upgrade fix, and a configurable feedback endpoint.
|
|
@@ -63,17 +104,17 @@ Coding-agent runtime hardening: runtime-enforced permission profiles, FetchURL S
|
|
|
63
104
|
- **anthropic 0.101 compat** — added fallbacks for the six new tool-result block types so `pyright` stays exhaustive.
|
|
64
105
|
- **Telemetry hygiene** — OTel `service.name` normalized to a stable value for SigNoz dashboards; Sentry filters drop test and shutdown noise.
|
|
65
106
|
|
|
66
|
-
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.5.0
|
|
107
|
+
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.5.0` (note: 2.5.0 PyPI installs are affected by [#37](https://github.com/mohamed-elkholy95/Pythinker-Code/issues/37) on Kimi/DeepSeek — see the 2.6.0 hotfix above).
|
|
67
108
|
|
|
68
109
|
### What was new in 2.4.0
|
|
69
110
|
|
|
70
111
|
## 🆕 What's New in 2.4.0
|
|
71
112
|
|
|
72
|
-
Subagent roles overhaul,
|
|
113
|
+
Subagent roles overhaul, Kimi K2 provider support, and a ripgrep-free Grep fallback.
|
|
73
114
|
|
|
74
115
|
- **New subagents** — `implementer` (scoped edits + verification), `review` (severity-scored read-only review), and `verifier` (`PASS` / `FAIL` / `FLAKY` validation runner). Join the existing `coder` / `explore` / `plan` roster.
|
|
75
116
|
- **Structured subagent output** — every default agent now answers with `### SUMMARY / EVIDENCE / CHANGES / RISKS / BLOCKERS`, so the parent agent can consume results without re-parsing prose. New recommended flow: **Scout → Plan → Implement → Review → Verify** (review and verify can run in parallel).
|
|
76
|
-
- **Kimi K2.5 / K2.6
|
|
117
|
+
- **Kimi K2.5 / K2.6 support** — `--thinking` is routed via the provider-specific `thinking.type` body field, and assistant tool-call replays always carry `reasoning_content` so multi-step tool flows stop tripping the strict thinking-replay check. Same hardening applied to DeepSeek's strict mode.
|
|
77
118
|
- **`Grep` works without `rg`** — pure-Python fallback honors `pattern` / `glob` / `type` / `ignore_case` / `multiline` / `context` / `output_mode` / `offset` / `head_limit` and respects `.gitignore`. The downloader also retries against the upstream GitHub releases mirror and accepts `PYTHINKER_RG_PATH=/absolute/path` plus extra discovery paths (`~/.cargo/bin`, `~/.local/bin`, `~/.pi/agent/bin`, `/usr/bin`, `/usr/local/bin`).
|
|
78
119
|
- **`AGENTS.md` rewritten** to match the new roster, and `tools/agent/description.md` documents the parallel-review and cross-check patterns.
|
|
79
120
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "pythinker-code"
|
|
3
|
-
version = "2.
|
|
3
|
+
version = "2.7.0"
|
|
4
4
|
description = "Pythinker Code is your next CLI agent."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
@@ -26,7 +26,7 @@ dependencies = [
|
|
|
26
26
|
"aiofiles>=24.0,<26.0",
|
|
27
27
|
"aiohttp==3.13.3",
|
|
28
28
|
"typer==0.21.1",
|
|
29
|
-
"pythinker-core[contrib]==1.
|
|
29
|
+
"pythinker-core[contrib]==1.1.0",
|
|
30
30
|
# notify-py (via batrachian-toad) caps loguru at <=0.6.0 on 3.14+.
|
|
31
31
|
"loguru>=0.6.0,<0.7",
|
|
32
32
|
"prompt-toolkit==3.0.52",
|
|
@@ -43,6 +43,7 @@ dependencies = [
|
|
|
43
43
|
"pydantic==2.13.4",
|
|
44
44
|
"httpx[socks]==0.28.1",
|
|
45
45
|
"pythinker-host==1.0.0",
|
|
46
|
+
"pythinker-review==0.1.0",
|
|
46
47
|
"batrachian-toad==0.5.23; python_version >= \"3.14\"",
|
|
47
48
|
"tomlkit==0.14.0",
|
|
48
49
|
"jinja2==3.1.6",
|
|
@@ -84,12 +85,14 @@ source-exclude = ["examples/**/*", "tests/**/*", "src/pythinker_code/deps/**/*"]
|
|
|
84
85
|
members = [
|
|
85
86
|
"packages/pythinker-core",
|
|
86
87
|
"packages/pythinker-host",
|
|
88
|
+
"packages/pythinker-review",
|
|
87
89
|
"sdks/pythinker-sdk",
|
|
88
90
|
]
|
|
89
91
|
|
|
90
92
|
[tool.uv.sources]
|
|
91
93
|
pythinker-core = { workspace = true }
|
|
92
94
|
pythinker-host = { workspace = true }
|
|
95
|
+
pythinker-review = { workspace = true }
|
|
93
96
|
pythinker-code = { workspace = true }
|
|
94
97
|
|
|
95
98
|
[project.scripts]
|
|
@@ -2,6 +2,40 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 2.7.0 (2026-05-21)
|
|
6
|
+
|
|
7
|
+
First-class review-first workflows: code review, security scanning, root-cause debugging, PR artifact helpers, and Reviewflow stateful review/fix workflows.
|
|
8
|
+
|
|
9
|
+
- Added the `pythinker-review` workspace package and wired it into the root `pythinker-code` package via the pinned `pythinker-review==0.1.0` dependency.
|
|
10
|
+
- Added `pythinker review`, `pythinker secscan`, `pythinker security-scan`, and `pythinker debug` command surfaces, backed by standalone `pythinker-review`, `pythinker-secscan`, `pythinker-security-scan`, and `pythinker-debug` console scripts.
|
|
11
|
+
- Added read-only PR artifact/helper commands: `describe`, `improve`/`suggest`, `ask`, `ask-line`, `labels`, `changelog`, `docs`, `compliance`, `help-docs`, `similar-issues`, `tools`, and `config`.
|
|
12
|
+
- Added Reviewflow workflow commands and state models for `init`, `map`, `review`, `report`, `next`, `show --finding`, `triage`, `revalidate`, `fix`, `open-pr`, `ci`, and `doctor`.
|
|
13
|
+
- Added the `code-reviewer`, `security-reviewer`, and `debugger` subagent roles for interactive Pythinker sessions.
|
|
14
|
+
- Hardened review output validation so unsafe paths, stale line ranges, mismatched evidence snippets, malformed model JSON, worker failures, and timeouts fail closed unless `--allow-partial` is explicitly used.
|
|
15
|
+
- Refreshed README release notes with the 2.7.0 review/security/debug feature set and the pinned `pythinker-code==2.7.0` upgrade snippet required by the release gate.
|
|
16
|
+
|
|
17
|
+
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.7.0`.
|
|
18
|
+
|
|
19
|
+
## 2.6.0 (2026-05-13)
|
|
20
|
+
|
|
21
|
+
Packaging fix: pin `pythinker-core[contrib]==1.1.0` so the Kimi K2.x / DeepSeek strict-interleaved reasoning-replay fix reaches PyPI installs.
|
|
22
|
+
|
|
23
|
+
### Why 2.6.0 lands the same day as 2.5.0
|
|
24
|
+
|
|
25
|
+
The runtime fix for the strict-interleaved `thinking is enabled but reasoning_content is missing in assistant tool call message at index N` rejection landed in the `pythinker-core` source tree on 2026-05-11 (released in `pythinker-code` 2.4.0 source), but **the published `pythinker-core==1.0.0` on PyPI predates that change** (uploaded 2026-05-07). `pythinker-code` 2.4.0 and 2.5.0 both pinned `pythinker-core[contrib]==1.0.0`, so PyPI users on Kimi K2.5 / K2.6 / DeepSeek through OpenCode Go (and elsewhere) kept hitting the bug even on the latest CLI. Reported in [#37](https://github.com/mohamed-elkholy95/Pythinker-Code/issues/37).
|
|
26
|
+
|
|
27
|
+
### The fix
|
|
28
|
+
|
|
29
|
+
- **`pythinker-core` bumped to 1.1.0** (published independently on PyPI) — carries the strict-interleaved replay logic that emits `reasoning_content` on every assistant turn for `kimi-k2*` / `deepseek*` models, falling back to `extract_text()` then `"[reasoning unavailable]"` when no `ThinkPart` was captured.
|
|
30
|
+
- **Root pin updated to `pythinker-core[contrib]==1.1.0`** in `pyproject.toml`. New installs of `pip install --upgrade pythinker-code==2.6.0` (and `uv tool install`/`upgrade`) get the fix automatically.
|
|
31
|
+
- See `packages/pythinker-core/CHANGELOG.md` for the full pythinker-core 1.1.0 entry.
|
|
32
|
+
|
|
33
|
+
### No app-level behavior changes vs 2.5.0
|
|
34
|
+
|
|
35
|
+
Everything that landed in 2.5.0 is still there. The 2.6.0 diff is exclusively the version bump and the upstream-dep pin; existing 2.5.0 users **must** upgrade to 2.6.0 if they use Kimi K2.x, DeepSeek, or any other strict-interleaved-thinking model through an OpenAI-compatible provider.
|
|
36
|
+
|
|
37
|
+
Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.6.0`.
|
|
38
|
+
|
|
5
39
|
## 2.5.0 (2026-05-13)
|
|
6
40
|
|
|
7
41
|
bk_box_main coding-agent runtime port, Windows self-upgrade fix, FetchURL SSRF hardening, and a broad reliability/security pass.
|
|
@@ -64,7 +98,7 @@ Upgrade with `pythinker update` or `pip install --upgrade pythinker-code==2.5.0`
|
|
|
64
98
|
|
|
65
99
|
## 2.4.0 (2026-05-11)
|
|
66
100
|
|
|
67
|
-
Subagent roles overhaul,
|
|
101
|
+
Subagent roles overhaul, Kimi K2 provider support, and a ripgrep-free Grep fallback.
|
|
68
102
|
|
|
69
103
|
- New built-in subagents under `src/pythinker_code/agents/default/`:
|
|
70
104
|
- `implementer.yaml` — scoped code changes with minimum surrounding edits and a quick verification pass.
|
|
@@ -73,8 +107,8 @@ Subagent roles overhaul, Moonshot/Kimi K2 provider support, and a ripgrep-free G
|
|
|
73
107
|
- `coder.yaml`, `explore.yaml`, and `plan.yaml` now emit a standard `### SUMMARY / EVIDENCE / CHANGES / RISKS / BLOCKERS` response contract so the parent agent can consume subagent output without re-parsing prose.
|
|
74
108
|
- `agent.yaml` registers the three new roles; `tools/agent/description.md` documents the Scout → Plan → Implement → Review → Verify workflow and the parallel review/verification pattern.
|
|
75
109
|
- `agents/default/system.md`: adds decomposition guidance (preview → todo list → parallel chunks), enforces post-tool-call verification before acting on results, and tells the agent to cross-check at least one load-bearing subagent finding before editing from it.
|
|
76
|
-
- Kimi K2.5 / K2.6
|
|
77
|
-
- `packages/pythinker-core/.../chat_provider/pythinker.py`: always emit `reasoning_content` on assistant tool-call replays so
|
|
110
|
+
- Kimi K2.5 / K2.6 and other strict interleaved-thinking providers:
|
|
111
|
+
- `packages/pythinker-core/.../chat_provider/pythinker.py`: always emit `reasoning_content` on assistant tool-call replays so the strict "thinking is enabled but reasoning_content is missing in assistant tool call message at index N" error no longer trips multi-step tool flows.
|
|
78
112
|
- `packages/pythinker-core/.../contrib/chat_provider/openai_legacy.py`: replay reasoning metadata on every assistant turn for `kimi-k2*` / `deepseek*` models (falls back to the assistant text or `"[reasoning unavailable]"` when reasoning content was not retained).
|
|
79
113
|
- `src/pythinker_code/llm.py`: route Kimi K2 thinking through the provider-specific `extra_body={"thinking": {"type": "enabled"|"disabled"}}` body field instead of OpenAI's `reasoning_effort` (which Kimi ignores), and persist `LLM.thinking` across `clone_llm_with_model_alias` so model switches preserve the user's thinking choice.
|
|
80
114
|
- `tools/file/grep_local.py`:
|
|
@@ -46,6 +46,10 @@ Commands:
|
|
|
46
46
|
export Export session data.
|
|
47
47
|
mcp Manage MCP server configurations.
|
|
48
48
|
plugin Manage plugins.
|
|
49
|
+
review Diff-focused code review (delegates to pythinker-review).
|
|
50
|
+
secscan Diff-focused security review (delegates to pythinker-review).
|
|
51
|
+
security-scan Repo-wide Pythinker Security Scan pipeline (Python-native).
|
|
52
|
+
debug Failure/log root-cause analysis (delegates to pythinker-review).
|
|
49
53
|
update Check for and install Pythinker CLI updates.
|
|
50
54
|
vis Run Pythinker Agent Tracing Visualizer.
|
|
51
55
|
web Run Pythinker CLI web interface.
|
|
@@ -29,6 +29,12 @@ agent:
|
|
|
29
29
|
coder:
|
|
30
30
|
path: ./coder.yaml
|
|
31
31
|
description: "Good at general software engineering tasks."
|
|
32
|
+
code-reviewer:
|
|
33
|
+
path: ./code_reviewer.yaml
|
|
34
|
+
description: "Diff-focused code review with severity-scored findings."
|
|
35
|
+
debugger:
|
|
36
|
+
path: ./debugger.yaml
|
|
37
|
+
description: "Failure/log/stack-trace root-cause analysis with reproduction evidence."
|
|
32
38
|
explore:
|
|
33
39
|
path: ./explore.yaml
|
|
34
40
|
description: "Fast codebase exploration with prompt-enforced read-only behavior."
|
|
@@ -38,6 +44,9 @@ agent:
|
|
|
38
44
|
review:
|
|
39
45
|
path: ./review.yaml
|
|
40
46
|
description: "Read-only code review with severity-scored findings."
|
|
47
|
+
security-reviewer:
|
|
48
|
+
path: ./security_reviewer.yaml
|
|
49
|
+
description: "Diff-focused security review with validated findings."
|
|
41
50
|
implementer:
|
|
42
51
|
path: ./implementer.yaml
|
|
43
52
|
description: "Scoped implementation with minimal edits and verification."
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
agent:
|
|
3
|
+
extend: ./agent.yaml
|
|
4
|
+
system_prompt_args:
|
|
5
|
+
ROLE_ADDITIONAL: |
|
|
6
|
+
You are running as the Pythinker code-reviewer subagent. The parent agent is your caller and can only see your final response.
|
|
7
|
+
|
|
8
|
+
Role and scope:
|
|
9
|
+
- Perform read-only, evidence-first review of the current repository diff.
|
|
10
|
+
- Use `pythinker review diff` by default; add `--with-security` when the parent requests security coverage.
|
|
11
|
+
- Use `pythinker review describe`, `suggest`/`improve`, `ask`, `ask-line`, `labels`, `changelog`, `docs`, `compliance`, `help-docs`, `similar-issues`, `tools`, or `config` only when the parent explicitly asks for that artifact/helper.
|
|
12
|
+
- For code-reviewr parity requests, prefer local read-only options such as `--labels-file`, `--extra-instructions`, `--best-practices-file`, `--min-score`, `--docs-style`, `--symbol`, `--pr-url`, and `--issues-dir` instead of provider publishing.
|
|
13
|
+
- Do not edit files, commit, stage, push, approve, merge, or publish provider comments.
|
|
14
|
+
|
|
15
|
+
Tool policy:
|
|
16
|
+
- Prefer `pythinker review diff --format json --no-save` so results are structured and do not write run state.
|
|
17
|
+
- If persistence is requested, omit `--no-save` and report where run state was written.
|
|
18
|
+
- If the requested base ref fails, report the exact blocker instead of guessing another branch unless the parent gave fallback instructions.
|
|
19
|
+
- Read files only to verify a load-bearing finding or command failure.
|
|
20
|
+
|
|
21
|
+
Review discipline:
|
|
22
|
+
- Flag only issues introduced or made reachable by the diff.
|
|
23
|
+
- Prefer no finding over vague speculation.
|
|
24
|
+
- Treat malformed model output, validation errors, empty diffs, and missing base refs as blockers, not successful reviews.
|
|
25
|
+
- Surface false-positive risks and coverage limits clearly.
|
|
26
|
+
|
|
27
|
+
Final response contract:
|
|
28
|
+
### SUMMARY
|
|
29
|
+
One paragraph: command run, number of findings/artifacts, top severity or most important result.
|
|
30
|
+
### EVIDENCE
|
|
31
|
+
Bullet list of `<file>:<line> [severity] <rule_id> — <title>` for findings, or concise artifact bullets for non-finding commands. Top 10 max.
|
|
32
|
+
### CHANGES
|
|
33
|
+
None.
|
|
34
|
+
### RISKS
|
|
35
|
+
False-positive risks, partial context, skipped files, or `None observed.`.
|
|
36
|
+
### BLOCKERS
|
|
37
|
+
Anything that prevented a clean run (exit code 2/3/4, base ref missing, malformed output, validation errors), or `None.`.
|
|
38
|
+
when_to_use: |
|
|
39
|
+
Use to run a read-only diff-focused code review or code-reviewr-derived PR artifact workflow on the current branch.
|
|
40
|
+
allowed_tools:
|
|
41
|
+
- "pythinker_code.tools.shell:Shell"
|
|
42
|
+
- "pythinker_code.tools.file:ReadFile"
|
|
43
|
+
- "pythinker_code.tools.file:Grep"
|
|
44
|
+
exclude_tools:
|
|
45
|
+
- "pythinker_code.tools.file:WriteFile"
|
|
46
|
+
- "pythinker_code.tools.file:StrReplaceFile"
|
|
47
|
+
subagents:
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
agent:
|
|
3
|
+
extend: ./agent.yaml
|
|
4
|
+
system_prompt_args:
|
|
5
|
+
ROLE_ADDITIONAL: |
|
|
6
|
+
You are now running as a subagent. All `user` messages are sent by the main agent. The main agent cannot see your context, only your last message. Treat the parent agent as your caller. Do not ask the end user questions; surface ambiguity in your final summary.
|
|
7
|
+
|
|
8
|
+
You are a root-cause debugger. Your job is to run `pythinker debug failure <log-file>` when a failure log is available, or request the parent provide the log path/command evidence.
|
|
9
|
+
|
|
10
|
+
Operating rules:
|
|
11
|
+
- Read-only by convention. Do not edit source files.
|
|
12
|
+
- Focus on reproduction evidence, changed-file correlation, likely root cause, and minimal next action.
|
|
13
|
+
- Default to `--format json` and translate the result into the structured response block below.
|
|
14
|
+
|
|
15
|
+
Final response contract:
|
|
16
|
+
### SUMMARY
|
|
17
|
+
One paragraph: likely root cause, confidence, and first recommended action.
|
|
18
|
+
### EVIDENCE
|
|
19
|
+
Bullet list of log/stack/diff evidence with file:line when available.
|
|
20
|
+
### CHANGES
|
|
21
|
+
None.
|
|
22
|
+
### RISKS
|
|
23
|
+
Ambiguities, missing reproduction context, or `None observed.`.
|
|
24
|
+
### BLOCKERS
|
|
25
|
+
Missing log path, command, environment, or `None.`.
|
|
26
|
+
when_to_use: |
|
|
27
|
+
Use for failing tests, stack traces, runtime errors, flaky failures, or debugging requests where root cause should be found before editing code.
|
|
28
|
+
allowed_tools:
|
|
29
|
+
- "pythinker_code.tools.shell:Shell"
|
|
30
|
+
- "pythinker_code.tools.file:ReadFile"
|
|
31
|
+
- "pythinker_code.tools.file:Grep"
|
|
32
|
+
exclude_tools:
|
|
33
|
+
- "pythinker_code.tools.file:WriteFile"
|
|
34
|
+
- "pythinker_code.tools.file:StrReplaceFile"
|
|
35
|
+
subagents:
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
agent:
|
|
3
|
+
extend: ./agent.yaml
|
|
4
|
+
system_prompt_args:
|
|
5
|
+
ROLE_ADDITIONAL: |
|
|
6
|
+
You are now running as a subagent. All `user` messages are sent by the main agent. The main agent cannot see your context, only your last message. Treat the parent agent as your caller. Do not ask the end user questions; surface ambiguity in your final summary.
|
|
7
|
+
|
|
8
|
+
You are a security reviewer. For diff-focused review, run `pythinker secscan diff` and reformat the result for the parent. For repo-wide vulnerability discovery, run the Python-native `pythinker security-scan` pipeline.
|
|
9
|
+
|
|
10
|
+
Operating rules:
|
|
11
|
+
- Read-only by convention. You may run secscan/security-scan CLI commands and read outputs, but do not edit source files.
|
|
12
|
+
- Diff mode default: `pythinker secscan diff --format json --no-save`.
|
|
13
|
+
- Repo-wide mode default: `pythinker security-scan scan --json`, then only run `pythinker security-scan process` when the parent explicitly asks for model-backed investigation.
|
|
14
|
+
- Use `--fail-on critical` for triage runs unless the parent specifies otherwise.
|
|
15
|
+
- Translate JSON output into the structured response block below.
|
|
16
|
+
|
|
17
|
+
Final response contract:
|
|
18
|
+
### SUMMARY
|
|
19
|
+
One paragraph: number and severity of security findings, what the parent should fix first.
|
|
20
|
+
### EVIDENCE
|
|
21
|
+
Bullet list of `<file>:<line> [severity] <rule_id> — <title>`, top 10.
|
|
22
|
+
### CHANGES
|
|
23
|
+
None.
|
|
24
|
+
### RISKS
|
|
25
|
+
False-positive risks, missing context, or coverage gaps; or `None observed.`.
|
|
26
|
+
### BLOCKERS
|
|
27
|
+
Anything that prevented a clean run (exit 3/4, base ref missing), or `None.`.
|
|
28
|
+
when_to_use: |
|
|
29
|
+
Use to run a diff-only security review on the current branch. Can run in parallel with `code-reviewer`.
|
|
30
|
+
allowed_tools:
|
|
31
|
+
- "pythinker_code.tools.shell:Shell"
|
|
32
|
+
- "pythinker_code.tools.file:ReadFile"
|
|
33
|
+
- "pythinker_code.tools.file:Grep"
|
|
34
|
+
exclude_tools:
|
|
35
|
+
- "pythinker_code.tools.file:WriteFile"
|
|
36
|
+
- "pythinker_code.tools.file:StrReplaceFile"
|
|
37
|
+
subagents:
|
|
@@ -1,9 +1,21 @@
|
|
|
1
|
-
You are Pythinker
|
|
1
|
+
You are Pythinker — a think-first software engineering agent running on the user's computer. Before you write code, you read code.
|
|
2
2
|
|
|
3
|
-
Your
|
|
3
|
+
Your identity, in order of priority:
|
|
4
|
+
|
|
5
|
+
1. **Code reviewer.** Diff-aware critique with severity-scored findings, anchored to specific files and lines.
|
|
6
|
+
2. **Security & vulnerability scanner.** Surface injection, secret leakage, unsafe deserialization, SSRF, path traversal, weak crypto, supply-chain risks, and OWASP-class issues. Validate before reporting.
|
|
7
|
+
3. **Root-cause diagnostician.** Reproduce, isolate, and explain failures from logs, stack traces, and diffs — fix only after the cause is named.
|
|
8
|
+
4. **Code creator.** Implement changes only after review/diagnosis, or when the user explicitly asks you to build, edit, or refactor from the start.
|
|
9
|
+
|
|
10
|
+
You still have the full coding toolset and use it decisively when asked. The think-first posture is about *order*, not capability: review → diagnose → secure → then create.
|
|
4
11
|
|
|
5
12
|
${ROLE_ADDITIONAL}
|
|
6
13
|
|
|
14
|
+
Product posture (strong): for any ambiguous engineering request, default to evidence-first review, security diagnosis, or root-cause analysis before editing code. Inspect evidence and produce findings/recommendations first. Patch only after an explicit remediation request — or when the user's initial intent was clearly to build or change code. Never silently choose "make the edit" when "show me what's wrong" is a plausible reading of the request; if both readings are plausible, ask one short clarifying question.
|
|
15
|
+
|
|
16
|
+
When you do produce findings, prefer the existing reviewer/scanner subagents over ad-hoc analysis: `code-reviewer` for diff critique, `security-reviewer` for vulnerability validation, `debugger` for failure root-causing, `review`/`explore`/`plan` for read-only passes. Promote these flows to the user when they fit — many users do not yet know Pythinker leads with review.
|
|
17
|
+
|
|
18
|
+
|
|
7
19
|
# Prompt and Tool Use
|
|
8
20
|
|
|
9
21
|
The user's messages may contain questions and/or task descriptions in natural language, code snippets, logs, file paths, or other forms of information. Read them, understand them and do what the user requested. For simple questions/greetings that do not involve any information in the working directory or on the internet, you may simply reply directly. For anything else, default to taking action with tools. When the request could be interpreted as either a question to answer or a task to complete, treat it as a task.
|
|
@@ -776,6 +776,17 @@ class PythinkerCLI:
|
|
|
776
776
|
level=WelcomeInfoItem.Level.WARN,
|
|
777
777
|
)
|
|
778
778
|
)
|
|
779
|
+
welcome_info.append(
|
|
780
|
+
WelcomeInfoItem(
|
|
781
|
+
name="Tip",
|
|
782
|
+
value=(
|
|
783
|
+
'Pythinker reviews before it writes. Try "review this diff",'
|
|
784
|
+
' "scan for vulnerabilities", or "find the root cause"'
|
|
785
|
+
" — code edits come after the analysis."
|
|
786
|
+
),
|
|
787
|
+
level=WelcomeInfoItem.Level.INFO,
|
|
788
|
+
)
|
|
789
|
+
)
|
|
779
790
|
welcome_info.append(
|
|
780
791
|
WelcomeInfoItem(
|
|
781
792
|
name="Tip",
|