pythinker-code 2.0.0__py3-none-any.whl
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/CHANGELOG.md +16 -0
- pythinker_code/__init__.py +0 -0
- pythinker_code/__main__.py +92 -0
- pythinker_code/acp/AGENTS.md +93 -0
- pythinker_code/acp/__init__.py +13 -0
- pythinker_code/acp/convert.py +128 -0
- pythinker_code/acp/host.py +298 -0
- pythinker_code/acp/mcp.py +46 -0
- pythinker_code/acp/server.py +497 -0
- pythinker_code/acp/session.py +496 -0
- pythinker_code/acp/tools.py +167 -0
- pythinker_code/acp/types.py +13 -0
- pythinker_code/acp/version.py +45 -0
- pythinker_code/agents/default/agent.yaml +36 -0
- pythinker_code/agents/default/coder.yaml +25 -0
- pythinker_code/agents/default/explore.yaml +46 -0
- pythinker_code/agents/default/plan.yaml +30 -0
- pythinker_code/agents/default/system.md +164 -0
- pythinker_code/agents/okabe/agent.yaml +22 -0
- pythinker_code/agentspec.py +163 -0
- pythinker_code/app.py +820 -0
- pythinker_code/approval_runtime/__init__.py +29 -0
- pythinker_code/approval_runtime/models.py +42 -0
- pythinker_code/approval_runtime/runtime.py +235 -0
- pythinker_code/auth/__init__.py +25 -0
- pythinker_code/auth/anthropic_direct.py +207 -0
- pythinker_code/auth/deepseek.py +192 -0
- pythinker_code/auth/lm_studio.py +418 -0
- pythinker_code/auth/minimax.py +203 -0
- pythinker_code/auth/oauth.py +1122 -0
- pythinker_code/auth/ollama.py +293 -0
- pythinker_code/auth/openai.py +771 -0
- pythinker_code/auth/opencode_go.py +203 -0
- pythinker_code/auth/openrouter.py +225 -0
- pythinker_code/auth/platforms.py +466 -0
- pythinker_code/background/__init__.py +36 -0
- pythinker_code/background/agent_runner.py +231 -0
- pythinker_code/background/ids.py +19 -0
- pythinker_code/background/manager.py +650 -0
- pythinker_code/background/models.py +105 -0
- pythinker_code/background/store.py +237 -0
- pythinker_code/background/summary.py +66 -0
- pythinker_code/background/worker.py +209 -0
- pythinker_code/cli/__init__.py +1326 -0
- pythinker_code/cli/__main__.py +19 -0
- pythinker_code/cli/_lazy_group.py +238 -0
- pythinker_code/cli/export.py +322 -0
- pythinker_code/cli/info.py +62 -0
- pythinker_code/cli/mcp.py +349 -0
- pythinker_code/cli/plugin.py +351 -0
- pythinker_code/cli/toad.py +74 -0
- pythinker_code/cli/vis.py +38 -0
- pythinker_code/cli/web.py +80 -0
- pythinker_code/config.py +453 -0
- pythinker_code/constant.py +33 -0
- pythinker_code/exception.py +43 -0
- pythinker_code/hooks/__init__.py +4 -0
- pythinker_code/hooks/config.py +34 -0
- pythinker_code/hooks/engine.py +371 -0
- pythinker_code/hooks/events.py +190 -0
- pythinker_code/hooks/runner.py +89 -0
- pythinker_code/llm.py +412 -0
- pythinker_code/metadata.py +79 -0
- pythinker_code/notifications/__init__.py +33 -0
- pythinker_code/notifications/llm.py +77 -0
- pythinker_code/notifications/manager.py +145 -0
- pythinker_code/notifications/models.py +50 -0
- pythinker_code/notifications/notifier.py +41 -0
- pythinker_code/notifications/store.py +118 -0
- pythinker_code/notifications/wire.py +21 -0
- pythinker_code/plugin/__init__.py +124 -0
- pythinker_code/plugin/manager.py +153 -0
- pythinker_code/plugin/tool.py +173 -0
- pythinker_code/prompts/__init__.py +6 -0
- pythinker_code/prompts/compact.md +73 -0
- pythinker_code/prompts/init.md +21 -0
- pythinker_code/py.typed +0 -0
- pythinker_code/session.py +319 -0
- pythinker_code/session_fork.py +325 -0
- pythinker_code/session_state.py +132 -0
- pythinker_code/share.py +14 -0
- pythinker_code/skill/__init__.py +727 -0
- pythinker_code/skill/flow/__init__.py +99 -0
- pythinker_code/skill/flow/d2.py +482 -0
- pythinker_code/skill/flow/mermaid.py +266 -0
- pythinker_code/skills/pythinker-code-help/SKILL.md +54 -0
- pythinker_code/skills/skill-creator/SKILL.md +367 -0
- pythinker_code/soul/__init__.py +304 -0
- pythinker_code/soul/agent.py +520 -0
- pythinker_code/soul/approval.py +267 -0
- pythinker_code/soul/btw.py +214 -0
- pythinker_code/soul/compaction.py +189 -0
- pythinker_code/soul/context.py +339 -0
- pythinker_code/soul/denwarenji.py +39 -0
- pythinker_code/soul/dynamic_injection.py +84 -0
- pythinker_code/soul/dynamic_injections/__init__.py +0 -0
- pythinker_code/soul/dynamic_injections/auto_mode.py +72 -0
- pythinker_code/soul/dynamic_injections/plan_mode.py +239 -0
- pythinker_code/soul/message.py +92 -0
- pythinker_code/soul/pythinkersoul.py +1613 -0
- pythinker_code/soul/slash.py +340 -0
- pythinker_code/soul/toolset.py +788 -0
- pythinker_code/subagents/__init__.py +21 -0
- pythinker_code/subagents/builder.py +42 -0
- pythinker_code/subagents/core.py +86 -0
- pythinker_code/subagents/git_context.py +172 -0
- pythinker_code/subagents/models.py +54 -0
- pythinker_code/subagents/output.py +71 -0
- pythinker_code/subagents/registry.py +28 -0
- pythinker_code/subagents/runner.py +428 -0
- pythinker_code/subagents/store.py +196 -0
- pythinker_code/telemetry/__init__.py +211 -0
- pythinker_code/telemetry/config.py +54 -0
- pythinker_code/telemetry/crash.py +157 -0
- pythinker_code/telemetry/metrics.py +208 -0
- pythinker_code/telemetry/otel.py +240 -0
- pythinker_code/telemetry/sentry.py +167 -0
- pythinker_code/telemetry/sink.py +189 -0
- pythinker_code/tools/AGENTS.md +6 -0
- pythinker_code/tools/__init__.py +105 -0
- pythinker_code/tools/agent/__init__.py +277 -0
- pythinker_code/tools/agent/description.md +41 -0
- pythinker_code/tools/ask_user/__init__.py +159 -0
- pythinker_code/tools/ask_user/description.md +19 -0
- pythinker_code/tools/background/__init__.py +318 -0
- pythinker_code/tools/background/list.md +10 -0
- pythinker_code/tools/background/output.md +11 -0
- pythinker_code/tools/background/stop.md +8 -0
- pythinker_code/tools/display.py +46 -0
- pythinker_code/tools/dmail/__init__.py +38 -0
- pythinker_code/tools/dmail/dmail.md +17 -0
- pythinker_code/tools/file/__init__.py +30 -0
- pythinker_code/tools/file/glob.md +17 -0
- pythinker_code/tools/file/glob.py +160 -0
- pythinker_code/tools/file/grep.md +6 -0
- pythinker_code/tools/file/grep_local.py +589 -0
- pythinker_code/tools/file/plan_mode.py +45 -0
- pythinker_code/tools/file/read.md +16 -0
- pythinker_code/tools/file/read.py +300 -0
- pythinker_code/tools/file/read_media.md +24 -0
- pythinker_code/tools/file/read_media.py +217 -0
- pythinker_code/tools/file/replace.md +7 -0
- pythinker_code/tools/file/replace.py +195 -0
- pythinker_code/tools/file/utils.py +257 -0
- pythinker_code/tools/file/write.md +5 -0
- pythinker_code/tools/file/write.py +177 -0
- pythinker_code/tools/plan/__init__.py +327 -0
- pythinker_code/tools/plan/description.md +29 -0
- pythinker_code/tools/plan/enter.py +190 -0
- pythinker_code/tools/plan/enter_description.md +35 -0
- pythinker_code/tools/plan/heroes.py +277 -0
- pythinker_code/tools/shell/__init__.py +253 -0
- pythinker_code/tools/shell/bash.md +35 -0
- pythinker_code/tools/shell/powershell.md +30 -0
- pythinker_code/tools/test.py +55 -0
- pythinker_code/tools/think/__init__.py +21 -0
- pythinker_code/tools/think/think.md +1 -0
- pythinker_code/tools/todo/__init__.py +168 -0
- pythinker_code/tools/todo/set_todo_list.md +23 -0
- pythinker_code/tools/utils.py +199 -0
- pythinker_code/tools/web/__init__.py +4 -0
- pythinker_code/tools/web/fetch.md +1 -0
- pythinker_code/tools/web/fetch.py +189 -0
- pythinker_code/tools/web/search.md +1 -0
- pythinker_code/tools/web/search.py +163 -0
- pythinker_code/ui/__init__.py +0 -0
- pythinker_code/ui/acp/__init__.py +99 -0
- pythinker_code/ui/print/__init__.py +474 -0
- pythinker_code/ui/print/visualize.py +185 -0
- pythinker_code/ui/shell/__init__.py +1696 -0
- pythinker_code/ui/shell/console.py +109 -0
- pythinker_code/ui/shell/debug.py +190 -0
- pythinker_code/ui/shell/echo.py +17 -0
- pythinker_code/ui/shell/export_import.py +117 -0
- pythinker_code/ui/shell/keyboard.py +300 -0
- pythinker_code/ui/shell/mcp_status.py +113 -0
- pythinker_code/ui/shell/model_picker.py +318 -0
- pythinker_code/ui/shell/oauth.py +272 -0
- pythinker_code/ui/shell/placeholders.py +531 -0
- pythinker_code/ui/shell/prompt.py +2278 -0
- pythinker_code/ui/shell/replay.py +215 -0
- pythinker_code/ui/shell/session_picker.py +227 -0
- pythinker_code/ui/shell/setup.py +212 -0
- pythinker_code/ui/shell/slash.py +898 -0
- pythinker_code/ui/shell/startup.py +32 -0
- pythinker_code/ui/shell/task_browser.py +486 -0
- pythinker_code/ui/shell/update.py +350 -0
- pythinker_code/ui/shell/usage.py +291 -0
- pythinker_code/ui/shell/usage_adapters/__init__.py +50 -0
- pythinker_code/ui/shell/usage_adapters/anthropic_admin.py +233 -0
- pythinker_code/ui/shell/usage_adapters/base.py +72 -0
- pythinker_code/ui/shell/usage_adapters/deepseek.py +137 -0
- pythinker_code/ui/shell/usage_adapters/minimax.py +236 -0
- pythinker_code/ui/shell/usage_adapters/openai_admin.py +225 -0
- pythinker_code/ui/shell/usage_adapters/openai_chatgpt.py +241 -0
- pythinker_code/ui/shell/usage_adapters/opencode_go.py +232 -0
- pythinker_code/ui/shell/usage_adapters/openrouter.py +105 -0
- pythinker_code/ui/shell/usage_adapters/pythinker.py +189 -0
- pythinker_code/ui/shell/usage_adapters/pythinker_ai.py +50 -0
- pythinker_code/ui/shell/usage_render.py +150 -0
- pythinker_code/ui/shell/visualize/__init__.py +165 -0
- pythinker_code/ui/shell/visualize/_approval_panel.py +505 -0
- pythinker_code/ui/shell/visualize/_blocks.py +629 -0
- pythinker_code/ui/shell/visualize/_btw_panel.py +224 -0
- pythinker_code/ui/shell/visualize/_input_router.py +48 -0
- pythinker_code/ui/shell/visualize/_interactive.py +523 -0
- pythinker_code/ui/shell/visualize/_live_view.py +826 -0
- pythinker_code/ui/shell/visualize/_question_panel.py +586 -0
- pythinker_code/ui/theme.py +241 -0
- pythinker_code/usage_ratelimit_cache.py +175 -0
- pythinker_code/utils/__init__.py +0 -0
- pythinker_code/utils/aiohttp.py +24 -0
- pythinker_code/utils/aioqueue.py +72 -0
- pythinker_code/utils/broadcast.py +37 -0
- pythinker_code/utils/changelog.py +108 -0
- pythinker_code/utils/clipboard.py +246 -0
- pythinker_code/utils/datetime.py +64 -0
- pythinker_code/utils/diff.py +135 -0
- pythinker_code/utils/editor.py +91 -0
- pythinker_code/utils/environment.py +73 -0
- pythinker_code/utils/envvar.py +22 -0
- pythinker_code/utils/export.py +696 -0
- pythinker_code/utils/file_filter.py +375 -0
- pythinker_code/utils/frontmatter.py +70 -0
- pythinker_code/utils/io.py +27 -0
- pythinker_code/utils/logging.py +146 -0
- pythinker_code/utils/media_tags.py +29 -0
- pythinker_code/utils/message.py +24 -0
- pythinker_code/utils/path.py +199 -0
- pythinker_code/utils/proctitle.py +33 -0
- pythinker_code/utils/proxy.py +31 -0
- pythinker_code/utils/pyinstaller.py +45 -0
- pythinker_code/utils/rich/__init__.py +33 -0
- pythinker_code/utils/rich/columns.py +99 -0
- pythinker_code/utils/rich/diff_render.py +481 -0
- pythinker_code/utils/rich/markdown.py +900 -0
- pythinker_code/utils/rich/markdown_sample.md +108 -0
- pythinker_code/utils/rich/markdown_sample_short.md +2 -0
- pythinker_code/utils/rich/syntax.py +114 -0
- pythinker_code/utils/sensitive.py +54 -0
- pythinker_code/utils/server.py +121 -0
- pythinker_code/utils/signals.py +43 -0
- pythinker_code/utils/slashcmd.py +124 -0
- pythinker_code/utils/string.py +41 -0
- pythinker_code/utils/subprocess_env.py +73 -0
- pythinker_code/utils/term.py +168 -0
- pythinker_code/utils/typing.py +20 -0
- pythinker_code/vis/__init__.py +0 -0
- pythinker_code/vis/api/__init__.py +5 -0
- pythinker_code/vis/api/sessions.py +687 -0
- pythinker_code/vis/api/statistics.py +209 -0
- pythinker_code/vis/api/system.py +19 -0
- pythinker_code/vis/app.py +175 -0
- pythinker_code/vis/static/assets/highlighted-body-B3W2YXNL-D2MTYyJz.js +1 -0
- pythinker_code/vis/static/assets/index-CezafTt_.js +185 -0
- pythinker_code/vis/static/assets/index-DSRInNnm.css +1 -0
- pythinker_code/vis/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- pythinker_code/vis/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- pythinker_code/vis/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- pythinker_code/vis/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- pythinker_code/vis/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- pythinker_code/vis/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- pythinker_code/vis/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- pythinker_code/vis/static/index.html +17 -0
- pythinker_code/web/__init__.py +5 -0
- pythinker_code/web/api/__init__.py +15 -0
- pythinker_code/web/api/config.py +208 -0
- pythinker_code/web/api/open_in.py +199 -0
- pythinker_code/web/api/sessions.py +1225 -0
- pythinker_code/web/app.py +451 -0
- pythinker_code/web/auth.py +191 -0
- pythinker_code/web/models.py +98 -0
- pythinker_code/web/runner/__init__.py +5 -0
- pythinker_code/web/runner/messages.py +57 -0
- pythinker_code/web/runner/process.py +754 -0
- pythinker_code/web/runner/worker.py +97 -0
- pythinker_code/web/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- pythinker_code/web/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- pythinker_code/web/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- pythinker_code/web/static/assets/_baseUniq--dyU3g5v.js +1 -0
- pythinker_code/web/static/assets/abap-BdImnpbu.js +1 -0
- pythinker_code/web/static/assets/actionscript-3-CfeIJUat.js +1 -0
- pythinker_code/web/static/assets/ada-bCR0ucgS.js +1 -0
- pythinker_code/web/static/assets/andromeeda-C-Jbm3Hp.js +1 -0
- pythinker_code/web/static/assets/angular-html-CU67Zn6k.js +1 -0
- pythinker_code/web/static/assets/angular-ts-BwZT4LLn.js +1 -0
- pythinker_code/web/static/assets/apache-Pmp26Uib.js +1 -0
- pythinker_code/web/static/assets/apex-D8_7TLub.js +1 -0
- pythinker_code/web/static/assets/apl-dKokRX4l.js +1 -0
- pythinker_code/web/static/assets/applescript-Co6uUVPk.js +1 -0
- pythinker_code/web/static/assets/ara-BRHolxvo.js +1 -0
- pythinker_code/web/static/assets/arc-DkMjLpYa.js +1 -0
- pythinker_code/web/static/assets/architectureDiagram-VXUJARFQ-CHWVaGo9.js +36 -0
- pythinker_code/web/static/assets/asciidoc-Dv7Oe6Be.js +1 -0
- pythinker_code/web/static/assets/asm-D_Q5rh1f.js +1 -0
- pythinker_code/web/static/assets/astro-CbQHKStN.js +1 -0
- pythinker_code/web/static/assets/aurora-x-D-2ljcwZ.js +1 -0
- pythinker_code/web/static/assets/awk-DMzUqQB5.js +1 -0
- pythinker_code/web/static/assets/ayu-dark-CmMr59Fi.js +1 -0
- pythinker_code/web/static/assets/ballerina-BFfxhgS-.js +1 -0
- pythinker_code/web/static/assets/bat-BkioyH1T.js +1 -0
- pythinker_code/web/static/assets/beancount-k_qm7-4y.js +1 -0
- pythinker_code/web/static/assets/berry-uYugtg8r.js +1 -0
- pythinker_code/web/static/assets/bibtex-CHM0blh-.js +1 -0
- pythinker_code/web/static/assets/bicep-Bmn6On1c.js +1 -0
- pythinker_code/web/static/assets/blade-D4QpJJKB.js +1 -0
- pythinker_code/web/static/assets/blockDiagram-VD42YOAC-DzdKe497.js +122 -0
- pythinker_code/web/static/assets/bsl-BO_Y6i37.js +1 -0
- pythinker_code/web/static/assets/c-BIGW1oBm.js +1 -0
- pythinker_code/web/static/assets/c3-VCDPK7BO.js +1 -0
- pythinker_code/web/static/assets/c4Diagram-YG6GDRKO-D84Blotg.js +10 -0
- pythinker_code/web/static/assets/cadence-Bv_4Rxtq.js +1 -0
- pythinker_code/web/static/assets/cairo-KRGpt6FW.js +1 -0
- pythinker_code/web/static/assets/catppuccin-frappe-DFWUc33u.js +1 -0
- pythinker_code/web/static/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
- pythinker_code/web/static/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
- pythinker_code/web/static/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
- pythinker_code/web/static/assets/channel-CllSjjdl.js +1 -0
- pythinker_code/web/static/assets/chunk-4BX2VUAB-C9w8wleE.js +1 -0
- pythinker_code/web/static/assets/chunk-55IACEB6-YlYJ8HnF.js +1 -0
- pythinker_code/web/static/assets/chunk-B4BG7PRW-Bwtz_AHU.js +165 -0
- pythinker_code/web/static/assets/chunk-DI55MBZ5-BbEHkl8h.js +220 -0
- pythinker_code/web/static/assets/chunk-FMBD7UC4-BKPbvjLC.js +15 -0
- pythinker_code/web/static/assets/chunk-QN33PNHL-D73dQvKf.js +1 -0
- pythinker_code/web/static/assets/chunk-QZHKN3VN-zGiLKes_.js +1 -0
- pythinker_code/web/static/assets/chunk-TZMSLE5B-LHJCi2fy.js +1 -0
- pythinker_code/web/static/assets/clarity-D53aC0YG.js +1 -0
- pythinker_code/web/static/assets/classDiagram-2ON5EDUG-vX27iZwa.js +1 -0
- pythinker_code/web/static/assets/classDiagram-v2-WZHVMYZB-vX27iZwa.js +1 -0
- pythinker_code/web/static/assets/clojure-P80f7IUj.js +1 -0
- pythinker_code/web/static/assets/clone-DYBkaPm2.js +1 -0
- pythinker_code/web/static/assets/cmake-D1j8_8rp.js +1 -0
- pythinker_code/web/static/assets/cobol-nwyudZeR.js +1 -0
- pythinker_code/web/static/assets/code-block-IT6T5CEO-NtKViZGl.js +2 -0
- pythinker_code/web/static/assets/codeowners-Bp6g37R7.js +1 -0
- pythinker_code/web/static/assets/codeql-DsOJ9woJ.js +1 -0
- pythinker_code/web/static/assets/coffee-Ch7k5sss.js +1 -0
- pythinker_code/web/static/assets/common-lisp-Cg-RD9OK.js +1 -0
- pythinker_code/web/static/assets/coq-DkFqJrB1.js +1 -0
- pythinker_code/web/static/assets/cose-bilkent-S5V4N54A-DialjZpd.js +1 -0
- pythinker_code/web/static/assets/cpp-CofmeUqb.js +1 -0
- pythinker_code/web/static/assets/crystal-tKQVLTB8.js +1 -0
- pythinker_code/web/static/assets/csharp-K5feNrxe.js +1 -0
- pythinker_code/web/static/assets/css-DPfMkruS.js +1 -0
- pythinker_code/web/static/assets/csv-fuZLfV_i.js +1 -0
- pythinker_code/web/static/assets/cue-D82EKSYY.js +1 -0
- pythinker_code/web/static/assets/cypher-COkxafJQ.js +1 -0
- pythinker_code/web/static/assets/cytoscape.esm-C_Fzpdck.js +321 -0
- pythinker_code/web/static/assets/d-85-TOEBH.js +1 -0
- pythinker_code/web/static/assets/dagre-6UL2VRFP-DfuvkZZ7.js +4 -0
- pythinker_code/web/static/assets/dark-plus-C3mMm8J8.js +1 -0
- pythinker_code/web/static/assets/dart-CF10PKvl.js +1 -0
- pythinker_code/web/static/assets/dax-CEL-wOlO.js +1 -0
- pythinker_code/web/static/assets/defaultLocale-DX6XiGOO.js +1 -0
- pythinker_code/web/static/assets/desktop-BmXAJ9_W.js +1 -0
- pythinker_code/web/static/assets/diagram-PSM6KHXK-DLGctX3v.js +24 -0
- pythinker_code/web/static/assets/diagram-QEK2KX5R-DnxN6S0F.js +43 -0
- pythinker_code/web/static/assets/diagram-S2PKOQOG-Caq_Set9.js +24 -0
- pythinker_code/web/static/assets/diff-D97Zzqfu.js +1 -0
- pythinker_code/web/static/assets/docker-BcOcwvcX.js +1 -0
- pythinker_code/web/static/assets/dotenv-Da5cRb03.js +1 -0
- pythinker_code/web/static/assets/dracula-BzJJZx-M.js +1 -0
- pythinker_code/web/static/assets/dracula-soft-BXkSAIEj.js +1 -0
- pythinker_code/web/static/assets/dream-maker-BtqSS_iP.js +1 -0
- pythinker_code/web/static/assets/edge-BkV0erSs.js +1 -0
- pythinker_code/web/static/assets/elixir-CDX3lj18.js +1 -0
- pythinker_code/web/static/assets/elm-DbKCFpqz.js +1 -0
- pythinker_code/web/static/assets/emacs-lisp-C9XAeP06.js +1 -0
- pythinker_code/web/static/assets/erDiagram-Q2GNP2WA-BgTfALoK.js +60 -0
- pythinker_code/web/static/assets/erb-BOJIQeun.js +1 -0
- pythinker_code/web/static/assets/erlang-DsQrWhSR.js +1 -0
- pythinker_code/web/static/assets/everforest-dark-BgDCqdQA.js +1 -0
- pythinker_code/web/static/assets/everforest-light-C8M2exoo.js +1 -0
- pythinker_code/web/static/assets/fennel-BYunw83y.js +1 -0
- pythinker_code/web/static/assets/fish-BvzEVeQv.js +1 -0
- pythinker_code/web/static/assets/flowDiagram-NV44I4VS-QjW_fnGi.js +162 -0
- pythinker_code/web/static/assets/fluent-C4IJs8-o.js +1 -0
- pythinker_code/web/static/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
- pythinker_code/web/static/assets/fortran-free-form-BxgE0vQu.js +1 -0
- pythinker_code/web/static/assets/fsharp-CXgrBDvD.js +1 -0
- pythinker_code/web/static/assets/ganttDiagram-JELNMOA3-fqi8JFof.js +267 -0
- pythinker_code/web/static/assets/gdresource-B7Tvp0Sc.js +1 -0
- pythinker_code/web/static/assets/gdscript-DTMYz4Jt.js +1 -0
- pythinker_code/web/static/assets/gdshader-DkwncUOv.js +1 -0
- pythinker_code/web/static/assets/genie-D0YGMca9.js +1 -0
- pythinker_code/web/static/assets/gherkin-DyxjwDmM.js +1 -0
- pythinker_code/web/static/assets/git-commit-F4YmCXRG.js +1 -0
- pythinker_code/web/static/assets/git-rebase-r7XF79zn.js +1 -0
- pythinker_code/web/static/assets/gitGraphDiagram-NY62KEGX-i7o6VQ8x.js +65 -0
- pythinker_code/web/static/assets/github-dark-DHJKELXO.js +1 -0
- pythinker_code/web/static/assets/github-dark-default-Cuk6v7N8.js +1 -0
- pythinker_code/web/static/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- pythinker_code/web/static/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- pythinker_code/web/static/assets/github-light-DAi9KRSo.js +1 -0
- pythinker_code/web/static/assets/github-light-default-D7oLnXFd.js +1 -0
- pythinker_code/web/static/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- pythinker_code/web/static/assets/gleam-BspZqrRM.js +1 -0
- pythinker_code/web/static/assets/glimmer-js-Rg0-pVw9.js +1 -0
- pythinker_code/web/static/assets/glimmer-ts-U6CK756n.js +1 -0
- pythinker_code/web/static/assets/glsl-DplSGwfg.js +1 -0
- pythinker_code/web/static/assets/gn-n2N0HUVH.js +1 -0
- pythinker_code/web/static/assets/gnuplot-DdkO51Og.js +1 -0
- pythinker_code/web/static/assets/go-Dn2_MT6a.js +1 -0
- pythinker_code/web/static/assets/graph-C0vZK2pT.js +1 -0
- pythinker_code/web/static/assets/graphql-ChdNCCLP.js +1 -0
- pythinker_code/web/static/assets/groovy-gcz8RCvz.js +1 -0
- pythinker_code/web/static/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
- pythinker_code/web/static/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
- pythinker_code/web/static/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
- pythinker_code/web/static/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
- pythinker_code/web/static/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
- pythinker_code/web/static/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
- pythinker_code/web/static/assets/hack-CaT9iCJl.js +1 -0
- pythinker_code/web/static/assets/haml-B8DHNrY2.js +1 -0
- pythinker_code/web/static/assets/handlebars-BL8al0AC.js +1 -0
- pythinker_code/web/static/assets/haskell-Df6bDoY_.js +1 -0
- pythinker_code/web/static/assets/haxe-CzTSHFRz.js +1 -0
- pythinker_code/web/static/assets/hcl-BWvSN4gD.js +1 -0
- pythinker_code/web/static/assets/hjson-D5-asLiD.js +1 -0
- pythinker_code/web/static/assets/hlsl-D3lLCCz7.js +1 -0
- pythinker_code/web/static/assets/houston-DnULxvSX.js +1 -0
- pythinker_code/web/static/assets/html-GMplVEZG.js +1 -0
- pythinker_code/web/static/assets/html-derivative-BFtXZ54Q.js +1 -0
- pythinker_code/web/static/assets/http-jrhK8wxY.js +1 -0
- pythinker_code/web/static/assets/hurl-irOxFIW8.js +1 -0
- pythinker_code/web/static/assets/hxml-Bvhsp5Yf.js +1 -0
- pythinker_code/web/static/assets/hy-DFXneXwc.js +1 -0
- pythinker_code/web/static/assets/imba-DGztddWO.js +1 -0
- pythinker_code/web/static/assets/index-BYCCk6-K.js +153 -0
- pythinker_code/web/static/assets/index-BpoLgcEt.js +1 -0
- pythinker_code/web/static/assets/index-Cpy4G3uJ.js +2 -0
- pythinker_code/web/static/assets/index-CzV_vCfu.css +1 -0
- pythinker_code/web/static/assets/index-DI2oedCt.js +19 -0
- pythinker_code/web/static/assets/index-DdIkp80K.js +5 -0
- pythinker_code/web/static/assets/infoDiagram-WHAUD3N6-BMPpeZSM.js +2 -0
- pythinker_code/web/static/assets/ini-BEwlwnbL.js +1 -0
- pythinker_code/web/static/assets/init-Gi6I4Gst.js +1 -0
- pythinker_code/web/static/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- pythinker_code/web/static/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- pythinker_code/web/static/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- pythinker_code/web/static/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- pythinker_code/web/static/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- pythinker_code/web/static/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- pythinker_code/web/static/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- pythinker_code/web/static/assets/java-CylS5w8V.js +1 -0
- pythinker_code/web/static/assets/javascript-wDzz0qaB.js +1 -0
- pythinker_code/web/static/assets/jinja-4LBKfQ-Z.js +1 -0
- pythinker_code/web/static/assets/jison-wvAkD_A8.js +1 -0
- pythinker_code/web/static/assets/journeyDiagram-XKPGCS4Q-DAM7gngo.js +139 -0
- pythinker_code/web/static/assets/json-Cp-IABpG.js +1 -0
- pythinker_code/web/static/assets/json5-C9tS-k6U.js +1 -0
- pythinker_code/web/static/assets/jsonc-Des-eS-w.js +1 -0
- pythinker_code/web/static/assets/jsonl-DcaNXYhu.js +1 -0
- pythinker_code/web/static/assets/jsonnet-DFQXde-d.js +1 -0
- pythinker_code/web/static/assets/jssm-C2t-YnRu.js +1 -0
- pythinker_code/web/static/assets/jsx-g9-lgVsj.js +1 -0
- pythinker_code/web/static/assets/julia-CxzCAyBv.js +1 -0
- pythinker_code/web/static/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
- pythinker_code/web/static/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
- pythinker_code/web/static/assets/kanagawa-wave-DWedfzmr.js +1 -0
- pythinker_code/web/static/assets/kanban-definition-3W4ZIXB7-ChpBpV0k.js +89 -0
- pythinker_code/web/static/assets/katex-D2lIc1rk.css +1 -0
- pythinker_code/web/static/assets/kdl-DV7GczEv.js +1 -0
- pythinker_code/web/static/assets/kotlin-BdnUsdx6.js +1 -0
- pythinker_code/web/static/assets/kusto-DZf3V79B.js +1 -0
- pythinker_code/web/static/assets/laserwave-DUszq2jm.js +1 -0
- pythinker_code/web/static/assets/latex-B4uzh10-.js +1 -0
- pythinker_code/web/static/assets/layout-C3Jp1gKO.js +1 -0
- pythinker_code/web/static/assets/lean-BZvkOJ9d.js +1 -0
- pythinker_code/web/static/assets/less-B1dDrJ26.js +1 -0
- pythinker_code/web/static/assets/light-plus-B7mTdjB0.js +1 -0
- pythinker_code/web/static/assets/linear-BGHtL1N4.js +1 -0
- pythinker_code/web/static/assets/liquid-DYVedYrR.js +1 -0
- pythinker_code/web/static/assets/llvm-BtvRca6l.js +1 -0
- pythinker_code/web/static/assets/log-2UxHyX5q.js +1 -0
- pythinker_code/web/static/assets/logo-BtOb2qkB.js +1 -0
- pythinker_code/web/static/assets/lua-BbnMAYS6.js +1 -0
- pythinker_code/web/static/assets/luau-C-HG3fhB.js +1 -0
- pythinker_code/web/static/assets/make-CHLpvVh8.js +1 -0
- pythinker_code/web/static/assets/markdown-Cvjx9yec.js +1 -0
- pythinker_code/web/static/assets/marko-DZsq8hO1.js +1 -0
- pythinker_code/web/static/assets/material-theme-D5KoaKCx.js +1 -0
- pythinker_code/web/static/assets/material-theme-darker-BfHTSMKl.js +1 -0
- pythinker_code/web/static/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- pythinker_code/web/static/assets/material-theme-ocean-CyktbL80.js +1 -0
- pythinker_code/web/static/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- pythinker_code/web/static/assets/matlab-D7o27uSR.js +1 -0
- pythinker_code/web/static/assets/mdc-DUICxH0z.js +1 -0
- pythinker_code/web/static/assets/mdx-Cmh6b_Ma.js +1 -0
- pythinker_code/web/static/assets/mermaid-VLURNSYL-B2P5VJ9v.css +1 -0
- pythinker_code/web/static/assets/mermaid-VLURNSYL-C_HW6koB.js +465 -0
- pythinker_code/web/static/assets/mermaid-mWjccvbQ.js +1 -0
- pythinker_code/web/static/assets/mermaid.core-CnT4VrPC.js +191 -0
- pythinker_code/web/static/assets/min-Dn5VRVmX.js +1 -0
- pythinker_code/web/static/assets/min-dark-CafNBF8u.js +1 -0
- pythinker_code/web/static/assets/min-light-CTRr51gU.js +1 -0
- pythinker_code/web/static/assets/mindmap-definition-VGOIOE7T-x8EwhfIt.js +68 -0
- pythinker_code/web/static/assets/mipsasm-CKIfxQSi.js +1 -0
- pythinker_code/web/static/assets/mojo-B93PlW-d.js +1 -0
- pythinker_code/web/static/assets/monokai-D4h5O-jR.js +1 -0
- pythinker_code/web/static/assets/moonbit-Ba13S78F.js +1 -0
- pythinker_code/web/static/assets/move-Bu9oaDYs.js +1 -0
- pythinker_code/web/static/assets/narrat-DRg8JJMk.js +1 -0
- pythinker_code/web/static/assets/nextflow-BrzmwbiE.js +1 -0
- pythinker_code/web/static/assets/nginx-DknmC5AR.js +1 -0
- pythinker_code/web/static/assets/night-owl-C39BiMTA.js +1 -0
- pythinker_code/web/static/assets/nim-CVrawwO9.js +1 -0
- pythinker_code/web/static/assets/nix-CwoSXNpI.js +1 -0
- pythinker_code/web/static/assets/nord-Ddv68eIx.js +1 -0
- pythinker_code/web/static/assets/nushell-C-sUppwS.js +1 -0
- pythinker_code/web/static/assets/objective-c-DXmwc3jG.js +1 -0
- pythinker_code/web/static/assets/objective-cpp-CLxacb5B.js +1 -0
- pythinker_code/web/static/assets/ocaml-C0hk2d4L.js +1 -0
- pythinker_code/web/static/assets/one-dark-pro-DVMEJ2y_.js +1 -0
- pythinker_code/web/static/assets/one-light-PoHY5YXO.js +1 -0
- pythinker_code/web/static/assets/openscad-C4EeE6gA.js +1 -0
- pythinker_code/web/static/assets/ordinal-Cboi1Yqb.js +1 -0
- pythinker_code/web/static/assets/pascal-D93ZcfNL.js +1 -0
- pythinker_code/web/static/assets/perl-C0TMdlhV.js +1 -0
- pythinker_code/web/static/assets/php-CDn_0X-4.js +1 -0
- pythinker_code/web/static/assets/pieDiagram-ADFJNKIX-DgxBKGz2.js +30 -0
- pythinker_code/web/static/assets/pkl-u5AG7uiY.js +1 -0
- pythinker_code/web/static/assets/plastic-3e1v2bzS.js +1 -0
- pythinker_code/web/static/assets/plsql-ChMvpjG-.js +1 -0
- pythinker_code/web/static/assets/po-BTJTHyun.js +1 -0
- pythinker_code/web/static/assets/poimandres-CS3Unz2-.js +1 -0
- pythinker_code/web/static/assets/polar-C0HS_06l.js +1 -0
- pythinker_code/web/static/assets/postcss-CXtECtnM.js +1 -0
- pythinker_code/web/static/assets/powerquery-CEu0bR-o.js +1 -0
- pythinker_code/web/static/assets/powershell-Dpen1YoG.js +1 -0
- pythinker_code/web/static/assets/prisma-Dd19v3D-.js +1 -0
- pythinker_code/web/static/assets/prolog-CbFg5uaA.js +1 -0
- pythinker_code/web/static/assets/proto-C7zT0LnQ.js +1 -0
- pythinker_code/web/static/assets/pug-CGlum2m_.js +1 -0
- pythinker_code/web/static/assets/puppet-BMWR74SV.js +1 -0
- pythinker_code/web/static/assets/purescript-CklMAg4u.js +1 -0
- pythinker_code/web/static/assets/python-B6aJPvgy.js +1 -0
- pythinker_code/web/static/assets/qml-3beO22l8.js +1 -0
- pythinker_code/web/static/assets/qmldir-C8lEn-DE.js +1 -0
- pythinker_code/web/static/assets/qss-IeuSbFQv.js +1 -0
- pythinker_code/web/static/assets/quadrantDiagram-AYHSOK5B-DSpe_dqk.js +7 -0
- pythinker_code/web/static/assets/r-Dspwwk_N.js +1 -0
- pythinker_code/web/static/assets/racket-BqYA7rlc.js +1 -0
- pythinker_code/web/static/assets/raku-DXvB9xmW.js +1 -0
- pythinker_code/web/static/assets/razor-C1TweQQi.js +1 -0
- pythinker_code/web/static/assets/red-bN70gL4F.js +1 -0
- pythinker_code/web/static/assets/reg-C-SQnVFl.js +1 -0
- pythinker_code/web/static/assets/regexp-CDVJQ6XC.js +1 -0
- pythinker_code/web/static/assets/rel-C3B-1QV4.js +1 -0
- pythinker_code/web/static/assets/requirementDiagram-UZGBJVZJ-8o9hozL-.js +64 -0
- pythinker_code/web/static/assets/riscv-BM1_JUlF.js +1 -0
- pythinker_code/web/static/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
- pythinker_code/web/static/assets/rose-pine-moon-D4_iv3hh.js +1 -0
- pythinker_code/web/static/assets/rose-pine-qdsjHGoJ.js +1 -0
- pythinker_code/web/static/assets/rosmsg-BJDFO7_C.js +1 -0
- pythinker_code/web/static/assets/rst-B0xPkSld.js +1 -0
- pythinker_code/web/static/assets/ruby-BvKwtOVI.js +1 -0
- pythinker_code/web/static/assets/rust-B1yitclQ.js +1 -0
- pythinker_code/web/static/assets/sankeyDiagram-TZEHDZUN-BLOSUixH.js +10 -0
- pythinker_code/web/static/assets/sas-cz2c8ADy.js +1 -0
- pythinker_code/web/static/assets/sass-Cj5Yp3dK.js +1 -0
- pythinker_code/web/static/assets/scala-C151Ov-r.js +1 -0
- pythinker_code/web/static/assets/scheme-C98Dy4si.js +1 -0
- pythinker_code/web/static/assets/scss-OYdSNvt2.js +1 -0
- pythinker_code/web/static/assets/sdbl-DVxCFoDh.js +1 -0
- pythinker_code/web/static/assets/sequenceDiagram-WL72ISMW-6F2G8JTU.js +145 -0
- pythinker_code/web/static/assets/shaderlab-Dg9Lc6iA.js +1 -0
- pythinker_code/web/static/assets/shellscript-Yzrsuije.js +1 -0
- pythinker_code/web/static/assets/shellsession-BADoaaVG.js +1 -0
- pythinker_code/web/static/assets/slack-dark-BthQWCQV.js +1 -0
- pythinker_code/web/static/assets/slack-ochin-DqwNpetd.js +1 -0
- pythinker_code/web/static/assets/smalltalk-BERRCDM3.js +1 -0
- pythinker_code/web/static/assets/snazzy-light-Bw305WKR.js +1 -0
- pythinker_code/web/static/assets/solarized-dark-DXbdFlpD.js +1 -0
- pythinker_code/web/static/assets/solarized-light-L9t79GZl.js +1 -0
- pythinker_code/web/static/assets/solidity-rGO070M0.js +1 -0
- pythinker_code/web/static/assets/soy-Brmx7dQM.js +1 -0
- pythinker_code/web/static/assets/sparql-rVzFXLq3.js +1 -0
- pythinker_code/web/static/assets/splunk-BtCnVYZw.js +1 -0
- pythinker_code/web/static/assets/sql-BLtJtn59.js +1 -0
- pythinker_code/web/static/assets/ssh-config-_ykCGR6B.js +1 -0
- pythinker_code/web/static/assets/stata-BH5u7GGu.js +1 -0
- pythinker_code/web/static/assets/stateDiagram-FKZM4ZOC-DP8xP0iJ.js +1 -0
- pythinker_code/web/static/assets/stateDiagram-v2-4FDKWEC3-1l6-EZNX.js +1 -0
- pythinker_code/web/static/assets/stylus-BEDo0Tqx.js +1 -0
- pythinker_code/web/static/assets/svelte-zxCyuUbr.js +1 -0
- pythinker_code/web/static/assets/swift-Dg5xB15N.js +1 -0
- pythinker_code/web/static/assets/synthwave-84-CbfX1IO0.js +1 -0
- pythinker_code/web/static/assets/system-verilog-CnnmHF94.js +1 -0
- pythinker_code/web/static/assets/systemd-4A_iFExJ.js +1 -0
- pythinker_code/web/static/assets/talonscript-CkByrt1z.js +1 -0
- pythinker_code/web/static/assets/tasl-QIJgUcNo.js +1 -0
- pythinker_code/web/static/assets/tcl-dwOrl1Do.js +1 -0
- pythinker_code/web/static/assets/templ-W15q3VgB.js +1 -0
- pythinker_code/web/static/assets/terraform-BETggiCN.js +1 -0
- pythinker_code/web/static/assets/tex-CvyZ59Mk.js +1 -0
- pythinker_code/web/static/assets/timeline-definition-IT6M3QCI-DMgruDfK.js +61 -0
- pythinker_code/web/static/assets/tokyo-night-hegEt444.js +1 -0
- pythinker_code/web/static/assets/toml-vGWfd6FD.js +1 -0
- pythinker_code/web/static/assets/treemap-KMMF4GRG-Bo9ZkrAK.js +128 -0
- pythinker_code/web/static/assets/ts-tags-zn1MmPIZ.js +1 -0
- pythinker_code/web/static/assets/tsv-B_m7g4N7.js +1 -0
- pythinker_code/web/static/assets/tsx-COt5Ahok.js +1 -0
- pythinker_code/web/static/assets/turtle-BsS91CYL.js +1 -0
- pythinker_code/web/static/assets/twig-CO9l9SDP.js +1 -0
- pythinker_code/web/static/assets/typescript-BPQ3VLAy.js +1 -0
- pythinker_code/web/static/assets/typespec-BGHnOYBU.js +1 -0
- pythinker_code/web/static/assets/typst-DHCkPAjA.js +1 -0
- pythinker_code/web/static/assets/v-BcVCzyr7.js +1 -0
- pythinker_code/web/static/assets/vala-CsfeWuGM.js +1 -0
- pythinker_code/web/static/assets/vb-D17OF-Vu.js +1 -0
- pythinker_code/web/static/assets/verilog-BQ8w6xss.js +1 -0
- pythinker_code/web/static/assets/vesper-DU1UobuO.js +1 -0
- pythinker_code/web/static/assets/vhdl-CeAyd5Ju.js +1 -0
- pythinker_code/web/static/assets/viml-CJc9bBzg.js +1 -0
- pythinker_code/web/static/assets/vitesse-black-Bkuqu6BP.js +1 -0
- pythinker_code/web/static/assets/vitesse-dark-D0r3Knsf.js +1 -0
- pythinker_code/web/static/assets/vitesse-light-CVO1_9PV.js +1 -0
- pythinker_code/web/static/assets/vue-DN_0RTcg.js +1 -0
- pythinker_code/web/static/assets/vue-html-AaS7Mt5G.js +1 -0
- pythinker_code/web/static/assets/vue-vine-CQOfvN7w.js +1 -0
- pythinker_code/web/static/assets/vyper-CDx5xZoG.js +1 -0
- pythinker_code/web/static/assets/wasm-CG6Dc4jp.js +1 -0
- pythinker_code/web/static/assets/wasm-MzD3tlZU.js +1 -0
- pythinker_code/web/static/assets/wenyan-BV7otONQ.js +1 -0
- pythinker_code/web/static/assets/wgsl-Dx-B1_4e.js +1 -0
- pythinker_code/web/static/assets/wikitext-BhOHFoWU.js +1 -0
- pythinker_code/web/static/assets/wit-5i3qLPDT.js +1 -0
- pythinker_code/web/static/assets/wolfram-lXgVvXCa.js +1 -0
- pythinker_code/web/static/assets/xml-sdJ4AIDG.js +1 -0
- pythinker_code/web/static/assets/xsl-CtQFsRM5.js +1 -0
- pythinker_code/web/static/assets/xychartDiagram-PRI3JC2R-GeF2johi.js +7 -0
- pythinker_code/web/static/assets/yaml-Buea-lGh.js +1 -0
- pythinker_code/web/static/assets/zenscript-DVFEvuxE.js +1 -0
- pythinker_code/web/static/assets/zig-VOosw3JB.js +1 -0
- pythinker_code/web/static/brand/apple-touch-icon.png +0 -0
- pythinker_code/web/static/brand/arctecture.webp +0 -0
- pythinker_code/web/static/brand/bimi-logo.svg +46 -0
- pythinker_code/web/static/brand/favicon.ico +0 -0
- pythinker_code/web/static/brand/fonts/dm-sans-latin-ext.woff2 +0 -0
- pythinker_code/web/static/brand/fonts/dm-sans-latin.woff2 +0 -0
- pythinker_code/web/static/brand/fonts/instrument-sans-latin-ext.woff2 +0 -0
- pythinker_code/web/static/brand/fonts/instrument-sans-latin.woff2 +0 -0
- pythinker_code/web/static/brand/fonts/instrument-serif-latin-ext.woff2 +0 -0
- pythinker_code/web/static/brand/fonts/instrument-serif-latin.woff2 +0 -0
- pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin-ext.woff2 +0 -0
- pythinker_code/web/static/brand/fonts/libre-baskerville-italic-latin.woff2 +0 -0
- pythinker_code/web/static/brand/fonts/libre-baskerville-latin-ext.woff2 +0 -0
- pythinker_code/web/static/brand/fonts/libre-baskerville-latin.woff2 +0 -0
- pythinker_code/web/static/brand/fonts/roboto-latin-ext.woff2 +0 -0
- pythinker_code/web/static/brand/fonts/roboto-latin.woff2 +0 -0
- pythinker_code/web/static/brand/icon-192.png +0 -0
- pythinker_code/web/static/brand/icon-512.png +0 -0
- pythinker_code/web/static/brand/icon.svg +1 -0
- pythinker_code/web/static/brand/logo.png +0 -0
- pythinker_code/web/static/brand/pythinker_animated.svg +79 -0
- pythinker_code/web/static/brand/robots.txt +4 -0
- pythinker_code/web/static/index.html +15 -0
- pythinker_code/web/static/logo.png +0 -0
- pythinker_code/web/store/__init__.py +1 -0
- pythinker_code/web/store/sessions.py +432 -0
- pythinker_code/wire/__init__.py +148 -0
- pythinker_code/wire/file.py +151 -0
- pythinker_code/wire/jsonrpc.py +263 -0
- pythinker_code/wire/protocol.py +2 -0
- pythinker_code/wire/root_hub.py +27 -0
- pythinker_code/wire/serde.py +26 -0
- pythinker_code/wire/server.py +1069 -0
- pythinker_code/wire/types.py +698 -0
- pythinker_code-2.0.0.dist-info/METADATA +660 -0
- pythinker_code-2.0.0.dist-info/RECORD +731 -0
- pythinker_code-2.0.0.dist-info/WHEEL +4 -0
- pythinker_code-2.0.0.dist-info/entry_points.txt +4 -0
- pythinker_code-2.0.0.dist-info/licenses/LICENSE +202 -0
- pythinker_code-2.0.0.dist-info/licenses/NOTICE +14 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"""Plan file slug generation using Marvel and DC hero names."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import secrets
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
PLANS_DIR = Path.home() / ".pythinker" / "plans"
|
|
9
|
+
|
|
10
|
+
HERO_NAMES: list[str] = [
|
|
11
|
+
# --- Marvel ---
|
|
12
|
+
"iron-man",
|
|
13
|
+
"spider-man",
|
|
14
|
+
"captain-america",
|
|
15
|
+
"thor",
|
|
16
|
+
"hulk",
|
|
17
|
+
"black-widow",
|
|
18
|
+
"hawkeye",
|
|
19
|
+
"black-panther",
|
|
20
|
+
"doctor-strange",
|
|
21
|
+
"scarlet-witch",
|
|
22
|
+
"vision",
|
|
23
|
+
"falcon",
|
|
24
|
+
"war-machine",
|
|
25
|
+
"ant-man",
|
|
26
|
+
"wasp",
|
|
27
|
+
"captain-marvel",
|
|
28
|
+
"gamora",
|
|
29
|
+
"star-lord",
|
|
30
|
+
"groot",
|
|
31
|
+
"rocket",
|
|
32
|
+
"drax",
|
|
33
|
+
"mantis",
|
|
34
|
+
"nebula",
|
|
35
|
+
"shang-chi",
|
|
36
|
+
"moon-knight",
|
|
37
|
+
"ms-marvel",
|
|
38
|
+
"she-hulk",
|
|
39
|
+
"echo",
|
|
40
|
+
"wolverine",
|
|
41
|
+
"cyclops",
|
|
42
|
+
"storm",
|
|
43
|
+
"jean-grey",
|
|
44
|
+
"rogue",
|
|
45
|
+
"beast",
|
|
46
|
+
"nightcrawler",
|
|
47
|
+
"colossus",
|
|
48
|
+
"shadowcat",
|
|
49
|
+
"jubilee",
|
|
50
|
+
"cable",
|
|
51
|
+
"deadpool",
|
|
52
|
+
"bishop",
|
|
53
|
+
"magik",
|
|
54
|
+
"iceman",
|
|
55
|
+
"archangel",
|
|
56
|
+
"psylocke",
|
|
57
|
+
"dazzler",
|
|
58
|
+
"forge",
|
|
59
|
+
"havok",
|
|
60
|
+
"polaris",
|
|
61
|
+
"emma-frost",
|
|
62
|
+
"namor",
|
|
63
|
+
"silver-surfer",
|
|
64
|
+
"adam-warlock",
|
|
65
|
+
"nova",
|
|
66
|
+
"quasar",
|
|
67
|
+
"sentry",
|
|
68
|
+
"blue-marvel",
|
|
69
|
+
"spectrum",
|
|
70
|
+
"squirrel-girl",
|
|
71
|
+
"cloak",
|
|
72
|
+
"dagger",
|
|
73
|
+
"punisher",
|
|
74
|
+
"elektra",
|
|
75
|
+
"luke-cage",
|
|
76
|
+
"iron-fist",
|
|
77
|
+
"jessica-jones",
|
|
78
|
+
"daredevil",
|
|
79
|
+
"blade",
|
|
80
|
+
"ghost-rider",
|
|
81
|
+
"morbius",
|
|
82
|
+
"venom",
|
|
83
|
+
"carnage",
|
|
84
|
+
"silk",
|
|
85
|
+
"spider-gwen",
|
|
86
|
+
"miles-morales",
|
|
87
|
+
"america-chavez",
|
|
88
|
+
"kate-bishop",
|
|
89
|
+
"yelena-belova",
|
|
90
|
+
"white-tiger",
|
|
91
|
+
"moon-girl",
|
|
92
|
+
"devil-dinosaur",
|
|
93
|
+
"amadeus-cho",
|
|
94
|
+
"riri-williams",
|
|
95
|
+
"kamala-khan",
|
|
96
|
+
"sam-alexander",
|
|
97
|
+
"nova-prime",
|
|
98
|
+
"medusa",
|
|
99
|
+
"black-bolt",
|
|
100
|
+
"crystal",
|
|
101
|
+
"karnak",
|
|
102
|
+
"gorgon",
|
|
103
|
+
"lockjaw",
|
|
104
|
+
"quake",
|
|
105
|
+
"mockingbird",
|
|
106
|
+
"bobbi-morse",
|
|
107
|
+
"maria-hill",
|
|
108
|
+
"nick-fury",
|
|
109
|
+
"phil-coulson",
|
|
110
|
+
"winter-soldier",
|
|
111
|
+
"us-agent",
|
|
112
|
+
"patriot",
|
|
113
|
+
"speed",
|
|
114
|
+
"wiccan",
|
|
115
|
+
"hulkling",
|
|
116
|
+
"stature",
|
|
117
|
+
"yellowjacket",
|
|
118
|
+
"tigra",
|
|
119
|
+
"hellcat",
|
|
120
|
+
"valkyrie",
|
|
121
|
+
"sif",
|
|
122
|
+
"beta-ray-bill",
|
|
123
|
+
"hercules",
|
|
124
|
+
"wonder-man",
|
|
125
|
+
"taskmaster",
|
|
126
|
+
"domino",
|
|
127
|
+
"cannonball",
|
|
128
|
+
"sunspot",
|
|
129
|
+
"wolfsbane",
|
|
130
|
+
"warpath",
|
|
131
|
+
"multiple-man",
|
|
132
|
+
"banshee",
|
|
133
|
+
"siryn",
|
|
134
|
+
"monet",
|
|
135
|
+
"rictor",
|
|
136
|
+
"shatterstar",
|
|
137
|
+
"longshot",
|
|
138
|
+
"daken",
|
|
139
|
+
"x-23",
|
|
140
|
+
"fantomex",
|
|
141
|
+
"batman",
|
|
142
|
+
"superman",
|
|
143
|
+
"wonder-woman",
|
|
144
|
+
"flash",
|
|
145
|
+
"aquaman",
|
|
146
|
+
"green-lantern",
|
|
147
|
+
"martian-manhunter",
|
|
148
|
+
"cyborg",
|
|
149
|
+
"hawkgirl",
|
|
150
|
+
"green-arrow",
|
|
151
|
+
"black-canary",
|
|
152
|
+
"zatanna",
|
|
153
|
+
"constantine",
|
|
154
|
+
"shazam",
|
|
155
|
+
"blue-beetle",
|
|
156
|
+
"booster-gold",
|
|
157
|
+
"firestorm",
|
|
158
|
+
"atom",
|
|
159
|
+
"hawkman",
|
|
160
|
+
"plastic-man",
|
|
161
|
+
"red-tornado",
|
|
162
|
+
"starfire",
|
|
163
|
+
"raven",
|
|
164
|
+
"beast-boy",
|
|
165
|
+
"robin",
|
|
166
|
+
"nightwing",
|
|
167
|
+
"batgirl",
|
|
168
|
+
"batwoman",
|
|
169
|
+
"red-hood",
|
|
170
|
+
"signal",
|
|
171
|
+
"orphan",
|
|
172
|
+
"spoiler",
|
|
173
|
+
"catwoman",
|
|
174
|
+
"huntress",
|
|
175
|
+
"supergirl",
|
|
176
|
+
"superboy",
|
|
177
|
+
"power-girl",
|
|
178
|
+
"steel",
|
|
179
|
+
"stargirl",
|
|
180
|
+
"wildcat",
|
|
181
|
+
"doctor-fate",
|
|
182
|
+
"mister-terrific",
|
|
183
|
+
"hourman",
|
|
184
|
+
"sandman",
|
|
185
|
+
"spectre",
|
|
186
|
+
"phantom-stranger",
|
|
187
|
+
"swamp-thing",
|
|
188
|
+
"animal-man",
|
|
189
|
+
"deadman",
|
|
190
|
+
"vixen",
|
|
191
|
+
"black-lightning",
|
|
192
|
+
"static",
|
|
193
|
+
"icon",
|
|
194
|
+
"rocket-dc",
|
|
195
|
+
"captain-atom",
|
|
196
|
+
"fire",
|
|
197
|
+
"ice",
|
|
198
|
+
"elongated-man",
|
|
199
|
+
"metamorpho",
|
|
200
|
+
"black-hawk",
|
|
201
|
+
"crimson-avenger",
|
|
202
|
+
"doctor-mid-nite",
|
|
203
|
+
"jakeem-thunder",
|
|
204
|
+
"mister-miracle",
|
|
205
|
+
"big-barda",
|
|
206
|
+
"orion",
|
|
207
|
+
"lightray",
|
|
208
|
+
"forager",
|
|
209
|
+
"killer-frost",
|
|
210
|
+
"jessica-cruz",
|
|
211
|
+
"simon-baz",
|
|
212
|
+
"john-stewart",
|
|
213
|
+
"guy-gardner",
|
|
214
|
+
"kyle-rayner",
|
|
215
|
+
"hal-jordan",
|
|
216
|
+
"wally-west",
|
|
217
|
+
"barry-allen",
|
|
218
|
+
"jay-garrick",
|
|
219
|
+
"impulse",
|
|
220
|
+
"kid-flash",
|
|
221
|
+
"donna-troy",
|
|
222
|
+
"tempest",
|
|
223
|
+
"aqualad",
|
|
224
|
+
"miss-martian",
|
|
225
|
+
"terra",
|
|
226
|
+
"jericho",
|
|
227
|
+
"ravager",
|
|
228
|
+
"red-star",
|
|
229
|
+
"pantha",
|
|
230
|
+
"argent",
|
|
231
|
+
"damage",
|
|
232
|
+
"jade",
|
|
233
|
+
"obsidian",
|
|
234
|
+
"cyclone",
|
|
235
|
+
"atom-smasher",
|
|
236
|
+
"maxima",
|
|
237
|
+
"starman",
|
|
238
|
+
"liberty-belle",
|
|
239
|
+
]
|
|
240
|
+
|
|
241
|
+
_slug_cache: dict[str, str] = {}
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
def seed_slug_cache(session_id: str, slug: str) -> None:
|
|
245
|
+
"""Pre-warm the in-process slug cache with a previously persisted slug."""
|
|
246
|
+
_slug_cache[session_id] = slug
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def get_or_create_slug(session_id: str) -> str:
|
|
250
|
+
"""Get or create a plan file slug for the given session."""
|
|
251
|
+
if session_id in _slug_cache:
|
|
252
|
+
return _slug_cache[session_id]
|
|
253
|
+
PLANS_DIR.mkdir(parents=True, exist_ok=True)
|
|
254
|
+
slug = ""
|
|
255
|
+
for _ in range(20):
|
|
256
|
+
words = [secrets.choice(HERO_NAMES) for _ in range(3)]
|
|
257
|
+
slug = "-".join(words)
|
|
258
|
+
if not (PLANS_DIR / f"{slug}.md").exists():
|
|
259
|
+
break
|
|
260
|
+
else:
|
|
261
|
+
# All 20 attempts collided; append session prefix for uniqueness
|
|
262
|
+
slug = f"{slug}-{session_id[:8]}"
|
|
263
|
+
_slug_cache[session_id] = slug
|
|
264
|
+
return slug
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def get_plan_file_path(session_id: str) -> Path:
|
|
268
|
+
"""Get the plan file path for the given session."""
|
|
269
|
+
return PLANS_DIR / f"{get_or_create_slug(session_id)}.md"
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def read_plan_file(session_id: str) -> str | None:
|
|
273
|
+
"""Read the plan file content for the given session, or None if not found."""
|
|
274
|
+
path = get_plan_file_path(session_id)
|
|
275
|
+
if path.exists():
|
|
276
|
+
return path.read_text(encoding="utf-8", errors="replace")
|
|
277
|
+
return None
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from collections.abc import Callable
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Self, override
|
|
5
|
+
|
|
6
|
+
import pythinker_host
|
|
7
|
+
from pydantic import BaseModel, Field, model_validator
|
|
8
|
+
from pythinker_core.tooling import CallableTool2, ToolReturnValue
|
|
9
|
+
from pythinker_host import AsyncReadable
|
|
10
|
+
|
|
11
|
+
from pythinker_code.background import TaskView, format_task
|
|
12
|
+
from pythinker_code.soul.agent import Runtime
|
|
13
|
+
from pythinker_code.soul.approval import Approval
|
|
14
|
+
from pythinker_code.soul.toolset import get_current_tool_call_or_none
|
|
15
|
+
from pythinker_code.tools.display import BackgroundTaskDisplayBlock, ShellDisplayBlock
|
|
16
|
+
from pythinker_code.tools.utils import ToolResultBuilder, load_desc
|
|
17
|
+
from pythinker_code.utils.environment import Environment
|
|
18
|
+
from pythinker_code.utils.logging import logger
|
|
19
|
+
from pythinker_code.utils.subprocess_env import get_noninteractive_env
|
|
20
|
+
|
|
21
|
+
MAX_FOREGROUND_TIMEOUT = 5 * 60
|
|
22
|
+
MAX_BACKGROUND_TIMEOUT = 24 * 60 * 60
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class Params(BaseModel):
|
|
26
|
+
command: str = Field(description="The command to execute.")
|
|
27
|
+
timeout: int = Field(
|
|
28
|
+
description=(
|
|
29
|
+
"The timeout in seconds for the command to execute. "
|
|
30
|
+
"If the command takes longer than this, it will be killed."
|
|
31
|
+
),
|
|
32
|
+
default=60,
|
|
33
|
+
ge=1,
|
|
34
|
+
le=MAX_BACKGROUND_TIMEOUT,
|
|
35
|
+
)
|
|
36
|
+
run_in_background: bool = Field(
|
|
37
|
+
default=False,
|
|
38
|
+
description="Whether to run the command as a background task.",
|
|
39
|
+
)
|
|
40
|
+
description: str = Field(
|
|
41
|
+
default="",
|
|
42
|
+
description=(
|
|
43
|
+
"A short description for the background task. Required when run_in_background=true."
|
|
44
|
+
),
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
@model_validator(mode="after")
|
|
48
|
+
def _validate_background_fields(self) -> Self:
|
|
49
|
+
if self.run_in_background and not self.description.strip():
|
|
50
|
+
raise ValueError("description is required when run_in_background is true")
|
|
51
|
+
if not self.run_in_background and self.timeout > MAX_FOREGROUND_TIMEOUT:
|
|
52
|
+
raise ValueError(
|
|
53
|
+
f"timeout must be <= {MAX_FOREGROUND_TIMEOUT}s for foreground commands; "
|
|
54
|
+
f"use run_in_background=true for longer timeouts (up to {MAX_BACKGROUND_TIMEOUT}s)"
|
|
55
|
+
)
|
|
56
|
+
return self
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class Shell(CallableTool2[Params]):
|
|
60
|
+
name: str = "Shell"
|
|
61
|
+
params: type[Params] = Params
|
|
62
|
+
|
|
63
|
+
def __init__(self, approval: Approval, environment: Environment, runtime: Runtime):
|
|
64
|
+
is_powershell = environment.shell_name == "Windows PowerShell"
|
|
65
|
+
super().__init__(
|
|
66
|
+
description=load_desc(
|
|
67
|
+
Path(__file__).parent / ("powershell.md" if is_powershell else "bash.md"),
|
|
68
|
+
{"SHELL": f"{environment.shell_name} (`{environment.shell_path}`)"},
|
|
69
|
+
)
|
|
70
|
+
)
|
|
71
|
+
self._approval = approval
|
|
72
|
+
self._is_powershell = is_powershell
|
|
73
|
+
self._shell_path = environment.shell_path
|
|
74
|
+
self._runtime = runtime
|
|
75
|
+
|
|
76
|
+
@override
|
|
77
|
+
async def __call__(self, params: Params) -> ToolReturnValue:
|
|
78
|
+
builder = ToolResultBuilder()
|
|
79
|
+
|
|
80
|
+
if not params.command:
|
|
81
|
+
return builder.error("Command cannot be empty.", brief="Empty command")
|
|
82
|
+
|
|
83
|
+
if params.run_in_background:
|
|
84
|
+
return await self._run_in_background(params)
|
|
85
|
+
|
|
86
|
+
result = await self._approval.request(
|
|
87
|
+
self.name,
|
|
88
|
+
"run command",
|
|
89
|
+
f"Run command `{params.command}`",
|
|
90
|
+
display=[
|
|
91
|
+
ShellDisplayBlock(
|
|
92
|
+
language="powershell" if self._is_powershell else "bash",
|
|
93
|
+
command=params.command,
|
|
94
|
+
)
|
|
95
|
+
],
|
|
96
|
+
)
|
|
97
|
+
if not result:
|
|
98
|
+
return result.rejection_error()
|
|
99
|
+
|
|
100
|
+
def stdout_cb(line: bytes):
|
|
101
|
+
line_str = line.decode(encoding="utf-8", errors="replace")
|
|
102
|
+
builder.write(line_str)
|
|
103
|
+
|
|
104
|
+
def stderr_cb(line: bytes):
|
|
105
|
+
line_str = line.decode(encoding="utf-8", errors="replace")
|
|
106
|
+
builder.write(line_str)
|
|
107
|
+
|
|
108
|
+
try:
|
|
109
|
+
exitcode = await self._run_shell_command(
|
|
110
|
+
params.command, stdout_cb, stderr_cb, params.timeout
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
if exitcode == 0:
|
|
114
|
+
return builder.ok("Command executed successfully.")
|
|
115
|
+
else:
|
|
116
|
+
return builder.error(
|
|
117
|
+
f"Command failed with exit code: {exitcode}.",
|
|
118
|
+
brief=f"Failed with exit code: {exitcode}",
|
|
119
|
+
)
|
|
120
|
+
except TimeoutError:
|
|
121
|
+
return builder.error(
|
|
122
|
+
f"Command killed by timeout ({params.timeout}s)",
|
|
123
|
+
brief=f"Killed by timeout ({params.timeout}s)",
|
|
124
|
+
)
|
|
125
|
+
except Exception as e:
|
|
126
|
+
logger.error(
|
|
127
|
+
"Shell command execution failed: {command}: {error}",
|
|
128
|
+
command=params.command,
|
|
129
|
+
error=e,
|
|
130
|
+
)
|
|
131
|
+
return builder.error(
|
|
132
|
+
f"Command execution failed: {e}",
|
|
133
|
+
brief="Execution failed",
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
async def _run_in_background(self, params: Params) -> ToolReturnValue:
|
|
137
|
+
tool_call = get_current_tool_call_or_none()
|
|
138
|
+
if tool_call is None:
|
|
139
|
+
return ToolResultBuilder().error(
|
|
140
|
+
"Background shell requires a tool call context.",
|
|
141
|
+
brief="No tool call context",
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
result = await self._approval.request(
|
|
145
|
+
self.name,
|
|
146
|
+
"run background command",
|
|
147
|
+
f"Run background command `{params.command}`",
|
|
148
|
+
display=[
|
|
149
|
+
ShellDisplayBlock(
|
|
150
|
+
language="powershell" if self._is_powershell else "bash",
|
|
151
|
+
command=params.command,
|
|
152
|
+
)
|
|
153
|
+
],
|
|
154
|
+
)
|
|
155
|
+
if not result:
|
|
156
|
+
return result.rejection_error()
|
|
157
|
+
|
|
158
|
+
try:
|
|
159
|
+
view = self._runtime.background_tasks.create_bash_task(
|
|
160
|
+
command=params.command,
|
|
161
|
+
description=params.description.strip(),
|
|
162
|
+
timeout_s=params.timeout,
|
|
163
|
+
tool_call_id=tool_call.id,
|
|
164
|
+
shell_name="Windows PowerShell" if self._is_powershell else "bash",
|
|
165
|
+
shell_path=str(self._shell_path),
|
|
166
|
+
cwd=str(self._runtime.session.work_dir),
|
|
167
|
+
)
|
|
168
|
+
except Exception as exc:
|
|
169
|
+
logger.error(
|
|
170
|
+
"Failed to start background shell task: {command}: {error}",
|
|
171
|
+
command=params.command,
|
|
172
|
+
error=exc,
|
|
173
|
+
)
|
|
174
|
+
builder = ToolResultBuilder()
|
|
175
|
+
return builder.error(f"Failed to start background task: {exc}", brief="Start failed")
|
|
176
|
+
|
|
177
|
+
return self._background_ok(view)
|
|
178
|
+
|
|
179
|
+
def _background_ok(self, view: TaskView) -> ToolReturnValue:
|
|
180
|
+
builder = ToolResultBuilder()
|
|
181
|
+
builder.write(
|
|
182
|
+
"\n".join(
|
|
183
|
+
[
|
|
184
|
+
format_task(view, include_command=True),
|
|
185
|
+
"automatic_notification: true",
|
|
186
|
+
"next_step: You will be automatically notified when it completes.",
|
|
187
|
+
(
|
|
188
|
+
"next_step: Use TaskOutput with this task_id for a non-blocking "
|
|
189
|
+
"status/output snapshot. Only set block=true when you intentionally "
|
|
190
|
+
"want to wait."
|
|
191
|
+
),
|
|
192
|
+
"next_step: Use TaskStop only if the task must be cancelled.",
|
|
193
|
+
(
|
|
194
|
+
"human_shell_hint: For users in the interactive shell, "
|
|
195
|
+
"the only task-management slash command is /task. "
|
|
196
|
+
"Do not suggest /task list, /task output, /task stop, or /tasks."
|
|
197
|
+
),
|
|
198
|
+
]
|
|
199
|
+
)
|
|
200
|
+
)
|
|
201
|
+
builder.display(
|
|
202
|
+
BackgroundTaskDisplayBlock(
|
|
203
|
+
task_id=view.spec.id,
|
|
204
|
+
kind=view.spec.kind,
|
|
205
|
+
status=view.runtime.status,
|
|
206
|
+
description=view.spec.description,
|
|
207
|
+
)
|
|
208
|
+
)
|
|
209
|
+
return builder.ok("Background task started", brief=f"Started {view.spec.id}")
|
|
210
|
+
|
|
211
|
+
async def _run_shell_command(
|
|
212
|
+
self,
|
|
213
|
+
command: str,
|
|
214
|
+
stdout_cb: Callable[[bytes], None],
|
|
215
|
+
stderr_cb: Callable[[bytes], None],
|
|
216
|
+
timeout: int,
|
|
217
|
+
) -> int:
|
|
218
|
+
async def _read_stream(stream: AsyncReadable, cb: Callable[[bytes], None]):
|
|
219
|
+
while True:
|
|
220
|
+
line = await stream.readline()
|
|
221
|
+
if line:
|
|
222
|
+
cb(line)
|
|
223
|
+
else:
|
|
224
|
+
break
|
|
225
|
+
|
|
226
|
+
process = await pythinker_host.exec(
|
|
227
|
+
*self._shell_args(command), env=get_noninteractive_env()
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
# Close stdin immediately so interactive prompts (e.g. git password) get
|
|
231
|
+
# EOF instead of hanging forever waiting for input that will never come.
|
|
232
|
+
process.stdin.close()
|
|
233
|
+
|
|
234
|
+
try:
|
|
235
|
+
await asyncio.wait_for(
|
|
236
|
+
asyncio.gather(
|
|
237
|
+
_read_stream(process.stdout, stdout_cb),
|
|
238
|
+
_read_stream(process.stderr, stderr_cb),
|
|
239
|
+
),
|
|
240
|
+
timeout,
|
|
241
|
+
)
|
|
242
|
+
return await process.wait()
|
|
243
|
+
except asyncio.CancelledError:
|
|
244
|
+
await process.kill()
|
|
245
|
+
raise
|
|
246
|
+
except TimeoutError:
|
|
247
|
+
await process.kill()
|
|
248
|
+
raise
|
|
249
|
+
|
|
250
|
+
def _shell_args(self, command: str) -> tuple[str, ...]:
|
|
251
|
+
if self._is_powershell:
|
|
252
|
+
return (str(self._shell_path), "-command", command)
|
|
253
|
+
return (str(self._shell_path), "-c", command)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
Execute a ${SHELL} command. Use this tool to explore the filesystem, edit files, run scripts, get system information, etc.
|
|
2
|
+
|
|
3
|
+
**Output:**
|
|
4
|
+
The stdout and stderr will be combined and returned as a string. The output may be truncated if it is too long. If the command failed, the exit code will be provided in a system tag.
|
|
5
|
+
|
|
6
|
+
If `run_in_background=true`, the command will be started as a background task and this tool will return a task ID instead of waiting for command completion. When doing that, you must provide a short `description`. You will be automatically notified when the task completes. Use `TaskOutput` for a non-blocking status/output snapshot, and only set `block=true` when you explicitly want to wait for completion. Use `TaskStop` only if the task must be cancelled. For human users in the interactive shell, background tasks are managed through `/task` only; do not suggest `/task list`, `/task output`, `/task stop`, `/tasks`, or any other invented shell subcommands.
|
|
7
|
+
|
|
8
|
+
**Guidelines for safety and security:**
|
|
9
|
+
- Each shell tool call will be executed in a fresh shell environment. The shell variables, current working directory changes, and the shell history is not preserved between calls.
|
|
10
|
+
- The tool call will return after the command is finished. You shall not use this tool to execute an interactive command or a command that may run forever. For possibly long-running commands, you shall set `timeout` argument to a reasonable value.
|
|
11
|
+
- Avoid using `..` to access files or directories outside of the working directory.
|
|
12
|
+
- Avoid modifying files outside of the working directory unless explicitly instructed to do so.
|
|
13
|
+
- Never run commands that require superuser privileges unless explicitly instructed to do so.
|
|
14
|
+
|
|
15
|
+
**Guidelines for efficiency:**
|
|
16
|
+
- For multiple related commands, use `&&` to chain them in a single call, e.g. `cd /path && ls -la`
|
|
17
|
+
- Use `;` to run commands sequentially regardless of success/failure
|
|
18
|
+
- Use `||` for conditional execution (run second command only if first fails)
|
|
19
|
+
- Use pipe operations (`|`) and redirections (`>`, `>>`) to chain input and output between commands
|
|
20
|
+
- Always quote file paths containing spaces with double quotes (e.g., cd "/path with spaces/")
|
|
21
|
+
- Use `if`, `case`, `for`, `while` control flows to execute complex logic in a single call.
|
|
22
|
+
- Verify directory structure before create/edit/delete files or directories to reduce the risk of failure.
|
|
23
|
+
- Prefer `run_in_background=true` for long-running builds, tests, watchers, or servers when you need the conversation to continue before the command finishes.
|
|
24
|
+
- After starting a background task, do not guess its outcome. Rely on the automatic completion notification whenever possible. Use `TaskOutput` for non-blocking progress snapshots by default, and set `block=true` only when you intentionally want to wait.
|
|
25
|
+
- If you need to tell a human shell user how to manage background tasks, only mention `/task`. Do not invent `/task list`, `/task output`, `/task stop`, or `/tasks`.
|
|
26
|
+
|
|
27
|
+
**Commands available:**
|
|
28
|
+
- Shell environment: cd, pwd, export, unset, env
|
|
29
|
+
- File system operations: ls, find, mkdir, rm, cp, mv, touch, chmod, chown
|
|
30
|
+
- File viewing/editing: cat, grep, head, tail, diff, patch
|
|
31
|
+
- Text processing: awk, sed, sort, uniq, wc
|
|
32
|
+
- System information/operations: ps, kill, top, df, free, uname, whoami, id, date
|
|
33
|
+
- Network operations: curl, wget, ping, telnet, ssh
|
|
34
|
+
- Archive operations: tar, zip, unzip
|
|
35
|
+
- Other: Other commands available in the shell environment. Check the existence of a command by running `which <command>` before using it.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
Execute a ${SHELL} command. Use this tool to explore the filesystem, inspect or edit files, run Windows scripts, collect system information, etc., whenever the agent is running on Windows.
|
|
2
|
+
|
|
3
|
+
Note that you are running on Windows, so make sure to use Windows commands, paths, and conventions.
|
|
4
|
+
|
|
5
|
+
**Output:**
|
|
6
|
+
The stdout and stderr streams are combined and returned as a single string. Extremely long output may be truncated. When a command fails, the exit code is provided in a system tag.
|
|
7
|
+
|
|
8
|
+
If `run_in_background=true`, the command will be started as a background task and this tool will return a task ID instead of waiting for completion. When doing that, you must provide a short `description`. You will be automatically notified when the task completes. Use `TaskOutput` for a non-blocking status/output snapshot, and only set `block=true` when you explicitly want to wait for completion. Use `TaskStop` only if the task must be cancelled. For human users in the interactive shell, background tasks are managed through `/task` only; do not suggest `/task list`, `/task output`, `/task stop`, `/tasks`, or any other invented shell subcommands.
|
|
9
|
+
|
|
10
|
+
**Guidelines for safety and security:**
|
|
11
|
+
- Every tool call starts a fresh ${SHELL} session. Environment variables, `cd` changes, and command history do not persist between calls.
|
|
12
|
+
- Do not launch interactive programs or anything that is expected to block indefinitely; ensure each command finishes promptly. Provide a `timeout` argument for potentially long runs.
|
|
13
|
+
- Avoid using `..` to leave the working directory, and never touch files outside that directory unless explicitly instructed.
|
|
14
|
+
- Never attempt commands that require elevated (Administrator) privileges unless explicitly authorized.
|
|
15
|
+
|
|
16
|
+
**Guidelines for efficiency:**
|
|
17
|
+
- Chain related commands with `;` and use `if ($?)` or `if (-not $?)` to conditionally execute commands based on the success or failure of previous ones.
|
|
18
|
+
- Redirect or pipe output with `>`, `>>`, `|`, and leverage `for /f`, `if`, and `set` to build richer one-liners instead of multiple tool calls.
|
|
19
|
+
- Reuse built-in utilities (e.g., `findstr`, `where`) to filter, transform, or locate data in a single invocation.
|
|
20
|
+
- Prefer `run_in_background=true` for long-running builds, tests, watchers, or servers when you need the conversation to continue before the command finishes.
|
|
21
|
+
- After starting a background task, do not guess its outcome. Rely on the automatic completion notification whenever possible. Use `TaskOutput` for non-blocking progress snapshots by default, and set `block=true` only when you intentionally want to wait.
|
|
22
|
+
- If you need to tell a human shell user how to manage background tasks, only mention `/task`. Do not invent `/task list`, `/task output`, `/task stop`, or `/tasks`.
|
|
23
|
+
|
|
24
|
+
**Commands available:**
|
|
25
|
+
- Shell environment: `cd`, `dir`, `set`, `setlocal`, `echo`, `call`, `where`
|
|
26
|
+
- File operations: `type`, `copy`, `move`, `del`, `erase`, `mkdir`, `rmdir`, `attrib`, `mklink`
|
|
27
|
+
- Text/search: `find`, `findstr`, `more`, `sort`, `Get-Content`
|
|
28
|
+
- System info: `ver`, `systeminfo`, `tasklist`, `wmic`, `hostname`
|
|
29
|
+
- Archives/scripts: `tar`, `Compress-Archive`, `powershell`, `python`, `node`
|
|
30
|
+
- Other: Any other binaries available on the system PATH; run `where <command>` first if unsure.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from typing import override
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel
|
|
5
|
+
from pythinker_core.tooling import CallableTool2, ToolOk, ToolReturnValue
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class PlusParams(BaseModel):
|
|
9
|
+
a: float
|
|
10
|
+
b: float
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Plus(CallableTool2[PlusParams]):
|
|
14
|
+
name: str = "plus"
|
|
15
|
+
description: str = "Add two numbers"
|
|
16
|
+
params: type[PlusParams] = PlusParams
|
|
17
|
+
|
|
18
|
+
@override
|
|
19
|
+
async def __call__(self, params: PlusParams) -> ToolReturnValue:
|
|
20
|
+
return ToolOk(output=str(params.a + params.b))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class CompareParams(BaseModel):
|
|
24
|
+
a: float
|
|
25
|
+
b: float
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Compare(CallableTool2[CompareParams]):
|
|
29
|
+
name: str = "compare"
|
|
30
|
+
description: str = "Compare two numbers"
|
|
31
|
+
params: type[CompareParams] = CompareParams
|
|
32
|
+
|
|
33
|
+
@override
|
|
34
|
+
async def __call__(self, params: CompareParams) -> ToolReturnValue:
|
|
35
|
+
if params.a > params.b:
|
|
36
|
+
return ToolOk(output="greater")
|
|
37
|
+
elif params.a < params.b:
|
|
38
|
+
return ToolOk(output="less")
|
|
39
|
+
else:
|
|
40
|
+
return ToolOk(output="equal")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class PanicParams(BaseModel):
|
|
44
|
+
message: str
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class Panic(CallableTool2[PanicParams]):
|
|
48
|
+
name: str = "panic"
|
|
49
|
+
description: str = "Raise an exception to cause the tool call to fail."
|
|
50
|
+
params: type[PanicParams] = PanicParams
|
|
51
|
+
|
|
52
|
+
@override
|
|
53
|
+
async def __call__(self, params: PanicParams) -> ToolReturnValue:
|
|
54
|
+
await asyncio.sleep(2)
|
|
55
|
+
raise Exception(f"panicked with a message with {len(params.message)} characters")
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import override
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
from pythinker_core.tooling import CallableTool2, ToolOk, ToolReturnValue
|
|
6
|
+
|
|
7
|
+
from pythinker_code.tools.utils import load_desc
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Params(BaseModel):
|
|
11
|
+
thought: str = Field(description=("A thought to think about."))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Think(CallableTool2[Params]):
|
|
15
|
+
name: str = "Think"
|
|
16
|
+
description: str = load_desc(Path(__file__).parent / "think.md", {})
|
|
17
|
+
params: type[Params] = Params
|
|
18
|
+
|
|
19
|
+
@override
|
|
20
|
+
async def __call__(self, params: Params) -> ToolReturnValue:
|
|
21
|
+
return ToolOk(output="", message="Thought logged")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Use the tool to think about something. It will not obtain new information or change the database, but just append the thought to the log. Use it when complex reasoning or some cache memory is needed.
|