github Python analyzed 61adba9

winterop-com/kodo

github

Local, on-box LLM platform: build a model library, then run, chat, and serve it with MCP tools. Ships a DHIS2 assistant Chrome side panel. Source-available, proprietary.

maintainer
winterop-com
licence
NOASSERTION
first seen
2026-07-11
last seen
2026-07-12
releases · 30d
0
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 70 tools
transport stdio · http counts 70 tools · 0 res · 0 prompts permission surface via code analysis

tools

  • add_to_date
  • base64_decode
  • base64_encode
  • calc
  • char_count
  • convert_time
  • current_datetime
  • day_of_week
  • days_between
  • factorial
  • from_base
  • gcd
  • git_blame
  • git_branches
  • git_diff
  • git_log
  • git_ls_files
  • git_show
  • git_status
  • hex_decode
  • hex_encode
  • http_get
  • http_head
  • is_leap_year
  • is_prime
  • json_format
  • json_keys
  • json_minify
  • lcm
  • list_files
  • list_timezones
  • local_timezone
  • location
  • md5
  • mean
  • median
  • memory_delete
  • memory_get
  • memory_list
  • memory_search
  • memory_set
  • month_calendar
  • public_ip
  • read_file
  • read_url
  • reverse_text
  • run
  • run_python
  • search
  • search_files
  • sha256
  • slugify
  • tailscale_host
  • tailscale_ip
  • tailscale_status
  • time_in
  • timezone_offset
  • title_case
  • to_base
  • to_lower
  • to_upper
  • today
  • total
  • url_decode
  • url_encode
  • weather_forecast
  • weather_forecast_at
  • week_number
  • word_count
  • write_file
skills & danger signals github-tarball
prompt-surface shipped agent-instruction files + hidden-content / dangerous-code findings — quoted from the analyzed source

analyzed commit 61adba9 · analyzer v33 · 4d ago

skills & prompt files 1

danger signals3

code evidence vHEAD · github-tarball
evidence-backed findings quoted directly from the published source artifact — not inferred

code files: 358

filesystem 124

  • fs winterop-com-stabbur-61adba9/packages/stabbur-sandbox/src/stabbur_sandbox/__init__.py :14 from pathlib import Path
  • fs (weak) winterop-com-stabbur-61adba9/packages/stabbur-sandbox/tests/test_sandbox.py :72 root = run_code("python", "open('/oops', 'w'); print('WROTE')")
  • fs (weak) winterop-com-stabbur-61adba9/scripts/capture_hero.py :27 import shutil
  • fs (weak) winterop-com-stabbur-61adba9/scripts/check_ui_classes.py :23 from pathlib import Path
  • fs (weak) winterop-com-stabbur-61adba9/scripts/gen_extension_icons.py :34 from pathlib import Path
  • fs (weak) winterop-com-stabbur-61adba9/scripts/gen_tui_logo.py :14 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/arch.py :13 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/attach.py :12 from pathlib import Path
  • fs (weak) winterop-com-stabbur-61adba9/src/stabbur/benchmark/core.py :15 from pathlib import Path
  • fs (weak) winterop-com-stabbur-61adba9/src/stabbur/benchmark/dhis2_state.py :21 from pathlib import Path
  • fs (weak) winterop-com-stabbur-61adba9/src/stabbur/benchmark/plugin.py :14 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/capabilities.py :26 from pathlib import Path
show 28 more
  • fs winterop-com-stabbur-61adba9/src/stabbur/cards.py :15 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/catalog.py :3 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/chat_tui/app.py :7 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/cli/_common.py :4 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/cli/chat.py :5 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/cli/config.py :3 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/cli/ext_dev.py :11 import shutil
  • fs winterop-com-stabbur-61adba9/src/stabbur/cli/health.py :3 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/cli/library.py :5 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/cli/mcp.py :3 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/cli/project.py :4 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/cli/serve.py :229 # single address to open ("" printed as `http://:2222`), so name the loopback route to the
  • fs winterop-com-stabbur-61adba9/src/stabbur/cli/voice.py :5 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/config.py :26 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/consumers.py :18 import shutil
  • fs winterop-com-stabbur-61adba9/src/stabbur/doctor.py :20 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/fsatomic.py :14 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/gguf.py :21 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/hfcache.py :19 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/host.py :12 import shutil
  • fs winterop-com-stabbur-61adba9/src/stabbur/library/_manage.py :3 import shutil
  • fs winterop-com-stabbur-61adba9/src/stabbur/library/_model.py :5 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/library/_roots.py :3 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/library/_scan.py :4 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/locking.py :21 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/mcp_catalog.py :29 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/datetime/app.py :22 from pathlib import Path
  • fs winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/files/core.py :10 from pathlib import Path

84 more not shown — this panel samples each group; the count above is the real total.

shell / exec 20

  • shell winterop-com-stabbur-61adba9/packages/stabbur-sandbox/src/stabbur_sandbox/__init__.py :11 import subprocess
  • shell (weak) winterop-com-stabbur-61adba9/scripts/capture_hero.py :29 import subprocess
  • shell winterop-com-stabbur-61adba9/src/stabbur/cli/ext_dev.py :12 import subprocess
  • shell winterop-com-stabbur-61adba9/src/stabbur/cli/health.py :152 import subprocess # noqa: PLC0415
  • shell winterop-com-stabbur-61adba9/src/stabbur/cli/voice.py :240 import subprocess # noqa: PLC0415
  • shell winterop-com-stabbur-61adba9/src/stabbur/consumers.py :19 import subprocess
  • shell winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/git/app.py :23 import subprocess
  • shell winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/network/app.py :19 import subprocess
  • shell winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/shell/app.py :25 import subprocess
  • shell winterop-com-stabbur-61adba9/src/stabbur/project/scaffold.py :15 import subprocess
  • shell winterop-com-stabbur-61adba9/src/stabbur/runtime/serve_registry.py :15 import subprocess
  • shell winterop-com-stabbur-61adba9/src/stabbur/runtime/supervisor.py :33 import subprocess
show 8 more
  • shell winterop-com-stabbur-61adba9/src/stabbur/voice/audio.py :13 import subprocess
  • shell (weak) winterop-com-stabbur-61adba9/tests/mcp_servers/git/test_git.py :4 import subprocess
  • shell (weak) winterop-com-stabbur-61adba9/tests/test_api.py :1103 "import subprocess, sys, time\n"
  • shell (weak) winterop-com-stabbur-61adba9/tests/test_chat_tui.py :5 import subprocess
  • shell (weak) winterop-com-stabbur-61adba9/tests/test_chat_tui_confirm.py :8 import subprocess
  • shell (weak) winterop-com-stabbur-61adba9/tests/test_e2e.py :9 import subprocess
  • shell (weak) winterop-com-stabbur-61adba9/tests/test_server.py :3 import subprocess
  • shell (weak) winterop-com-stabbur-61adba9/tests/test_supervisor.py :12 import subprocess

network 55

  • net (weak) winterop-com-stabbur-61adba9/packages/stabbur-sandbox/tests/test_sandbox.py :64 r = run_code("python", "import socket; socket.create_connection(('1.1.1.1', 80), 2); print('LEAK')")
  • net (weak) winterop-com-stabbur-61adba9/scripts/capture_hero.py :28 import socket
  • net winterop-com-stabbur-61adba9/src/stabbur/agent.py :13 import httpx
  • net winterop-com-stabbur-61adba9/src/stabbur/app.py :8 from urllib.parse import urlsplit
  • net winterop-com-stabbur-61adba9/src/stabbur/backends.py :412 Both managers list synchronously (a filesystem walk; a blocking ``httpx.get``), so each
  • net (weak) winterop-com-stabbur-61adba9/src/stabbur/benchmark/dhis2_state.py :23 import httpx
  • net winterop-com-stabbur-61adba9/src/stabbur/chat_tui/app.py :464 import httpx # noqa: PLC0415 - keep the TUI module import-light
  • net winterop-com-stabbur-61adba9/src/stabbur/cli/chat.py :8 import httpx
  • net winterop-com-stabbur-61adba9/src/stabbur/cli/init_wizard.py :159 import httpx # noqa: PLC0415 - only this path makes a request
  • net winterop-com-stabbur-61adba9/src/stabbur/cli/serve.py :86 import socket # noqa: PLC0415
  • net winterop-com-stabbur-61adba9/src/stabbur/config.py :28 from urllib.parse import urlparse
  • net winterop-com-stabbur-61adba9/src/stabbur/doctor.py :18 import socket
show 28 more
  • net winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/http/app.py :35 import socket
  • net winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/network/app.py :22 import httpx
  • net winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/search/app.py :24 from urllib.parse import parse_qs, urlparse
  • net winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/utils/app.py :22 import urllib.parse
  • net winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/weather_yr/core.py :18 import httpx
  • net winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/web/app.py :33 import socket
  • net winterop-com-stabbur-61adba9/src/stabbur/pageactions.py :32 from urllib.parse import urlparse
  • net winterop-com-stabbur-61adba9/src/stabbur/routers/serving/_base.py :8 import httpx
  • net winterop-com-stabbur-61adba9/src/stabbur/routers/serving/proxy.py :20 import httpx
  • net winterop-com-stabbur-61adba9/src/stabbur/runtime/__init__.py :21 import httpx
  • net winterop-com-stabbur-61adba9/src/stabbur/runtime/supervisor.py :32 import socket
  • net winterop-com-stabbur-61adba9/src/stabbur/server.py :16 import httpx
  • net winterop-com-stabbur-61adba9/src/stabbur/targets.py :16 from urllib.parse import urlsplit
  • net winterop-com-stabbur-61adba9/src/stabbur/voice/kokoro.py :21 import httpx
  • net (weak) winterop-com-stabbur-61adba9/tests/benchmark/tests/test_benchmark.py :323 net = core.run_code("python", "import socket; socket.create_connection(('1.1.1.1', 53), 2)")
  • net (weak) winterop-com-stabbur-61adba9/tests/mcp_servers/http/test_http.py :9 import httpx
  • net (weak) winterop-com-stabbur-61adba9/tests/mcp_servers/network/test_network.py :5 import httpx
  • net (weak) winterop-com-stabbur-61adba9/tests/mcp_servers/weather_yr/test_weather.py :51 """A stand-in for ``httpx.Client``: records request params, returns the sample forecast."""
  • net (weak) winterop-com-stabbur-61adba9/tests/mcp_servers/web/test_web.py :9 from urllib.parse import urlparse
  • net (weak) winterop-com-stabbur-61adba9/tests/test_agent_stream.py :6 coverage. These drive the real parser through an ``httpx.AsyncClient`` backed by a
  • net (weak) winterop-com-stabbur-61adba9/tests/test_api.py :9 from httpx import ASGITransport, AsyncClient
  • net (weak) winterop-com-stabbur-61adba9/tests/test_assistants_registry.py :16 from httpx import ASGITransport, AsyncClient
  • net (weak) winterop-com-stabbur-61adba9/tests/test_backend_listing.py :10 from httpx import ASGITransport, AsyncClient
  • net (weak) winterop-com-stabbur-61adba9/tests/test_backend_load.py :14 from httpx import ASGITransport, AsyncClient
  • net (weak) winterop-com-stabbur-61adba9/tests/test_backend_release.py :16 from httpx import ASGITransport, AsyncClient
  • net (weak) winterop-com-stabbur-61adba9/tests/test_chat_confirm.py :19 from httpx import ASGITransport, AsyncClient
  • net (weak) winterop-com-stabbur-61adba9/tests/test_chat_target.py :17 from httpx import ASGITransport, AsyncClient
  • net (weak) winterop-com-stabbur-61adba9/tests/test_chat_tui.py :836 # `/model <name>` on a remote attach listed the server's models with a blocking httpx.get (5s

15 more not shown — this panel samples each group; the count above is the real total.

secrets 4

  • secrets (weak) winterop-com-stabbur-61adba9/src/stabbur/benchmark/dhis2_state.py :68 password=os.environ.get("STABBUR_BENCH_DHIS2_PASSWORD", "district"),
  • secrets winterop-com-stabbur-61adba9/src/stabbur/cli/serve.py :241 os.environ["STABBUR_AUTH_TOKEN"] = auth_token # part of the serve→worker env API (_export_serve_env)
  • secrets (weak) winterop-com-stabbur-61adba9/tests/test_api.py :960 "open(sys.argv[1],'w').write(os.environ.get('MY_SECRET','')+'|'+sys.argv[2])\n"
  • secrets (weak) winterop-com-stabbur-61adba9/tests/test_cli.py :912 token = os.environ.get("STABBUR_AUTH_TOKEN", "")

tool registrations 70

  • current_datetime winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/datetime/app.py :179
  • today winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/datetime/app.py :188
  • day_of_week winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/datetime/app.py :194
  • time_in winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/datetime/app.py :201
  • local_timezone winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/datetime/app.py :213
  • timezone_offset winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/datetime/app.py :228
  • convert_time winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/datetime/app.py :237
  • list_timezones winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/datetime/app.py :259
  • days_between winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/datetime/app.py :277
  • add_to_date winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/datetime/app.py :283
  • week_number winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/datetime/app.py :298
  • is_leap_year winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/datetime/app.py :305
show 28 more
  • month_calendar winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/datetime/app.py :312
  • run_python winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/exec/app.py :21
  • list_files winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/files/app.py :21
  • read_file winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/files/app.py :32
  • search_files winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/files/app.py :38
  • write_file winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/files/app.py :48
  • git_status winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/git/app.py :136
  • git_log winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/git/app.py :146
  • git_diff winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/git/app.py :160
  • git_show winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/git/app.py :175
  • git_branches winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/git/app.py :185
  • git_ls_files winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/git/app.py :192
  • git_blame winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/git/app.py :211
  • http_get winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/http/app.py :251
  • http_head winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/http/app.py :266
  • memory_set winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/memory/app.py :33
  • memory_get winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/memory/app.py :46
  • memory_list winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/memory/app.py :53
  • memory_search winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/memory/app.py :60
  • memory_delete winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/memory/app.py :67
  • public_ip winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/network/app.py :36
  • location winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/network/app.py :51
  • tailscale_ip winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/network/app.py :112
  • tailscale_host winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/network/app.py :119
  • tailscale_status winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/network/app.py :131
  • search winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/search/app.py :160
  • run winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/shell/app.py :167
  • reverse_text winterop-com-stabbur-61adba9/src/stabbur/mcp_servers/utils/app.py :35

30 more not shown — this panel samples each group; the count above is the real total.

declared dependencies 19

  • fastmcp@>=3.4.2
  • fastapi@>=0.138.2
  • hf-xet@>=1.5.1
  • httpx@>=0.28.1
  • huggingface-hub@>=1.21.0
  • pydantic@>=2.0
  • Listen@*
  • textual@>=8.0
  • typer@>=0.25.1
  • uvicorn@>=0.49.0
  • mlx-lm@>=0.31.3; sys_platform ==
  • and@platform_machine ==
show 7 more
  • darwin@*
  • arm64@*
  • s@# voice-design model). An older wheel resolves fine and then 404s on the model type.
  • soxr@*
  • .@*
  • playwright@>=1.47
  • trafilatura@>=1.12

perm:untrusted 1

  • untrusted winterop-com-stabbur-61adba9/src/stabbur/chat_tui/app.py :467 data = httpx.get(f"{self._base}/v1/models", timeout=5).json()

transport_posture 1

  • network-listening, binds all interfaces, no auth detected winterop-com-stabbur-61adba9/tests/test_manager_surface.py :158 assert ServerManager(host="0.0.0.0", port=1).base_url == "http://0.0.0.0:1"