Open-source multi-protocol casting fabric for LAN audio devices and AI agents
Drift inferred · capture-to-capture
- HIGH code analysis flagged committed secret ×3 in DjangoAILab/CastFabric
- HIGH code analysis flagged committed secret ×3 in DjangoAILab/CastFabric
- HIGH code analysis flagged committed secret ×3 in DjangoAILab/CastFabric
- HIGH code analysis flagged committed secret ×3 in DjangoAILab/CastFabric
transport stdio · streamable-http counts 26 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
archive_playlist
-
begin_media_upload
-
control_playlist_run
-
create_playlist
-
create_url_media_asset
-
delete_media_asset
-
get_media_asset
-
get_playback_status
-
get_playlist
-
get_playlist_progress
-
get_playlist_run
-
get_system_status
-
list_media_assets
-
list_playlist_runs
-
list_playlists
-
mutate_playlist_items
-
pause
-
play_media_asset
-
query_playback_history
-
resume
-
scan_outputs
-
set_volume
-
start_playlist
-
stop
-
update_media_asset
-
update_playlist
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 5b7733e · analyzer v33 · 2d ago
skills & prompt files 2
danger signals4
- dynamic code execution __import__() DjangoAILab-CastFabric-5b7733e/miair.py :22
__import__(import_name) - committed secret private key DjangoAILab-CastFabric-5b7733e/miair/airplay/airplay1.py :26
PEM private key block (redacted) - committed secret private key DjangoAILab-CastFabric-5b7733e/miair/airplay/playfair.py :8
PEM private key block (redacted) - committed secret private key DjangoAILab-CastFabric-5b7733e/miair/airplay/server.py :248
PEM private key block (redacted)
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 132
filesystem 22
- fs (weak) DjangoAILab-CastFabric-5b7733e/docs/prototypes/validate_console_prototype.py :9
from pathlib import Path - fs DjangoAILab-CastFabric-5b7733e/miair/airplay/connections/audio.py :455
self.sink = self.pa.open(format=self.pa.get_format_from_width(2), - fs DjangoAILab-CastFabric-5b7733e/miair/airplay/connections/event.py :35
event_file = open(self.file, "wb") - fs DjangoAILab-CastFabric-5b7733e/miair/airplay/fairplay3.py :24
sys.stdout = open(os.devnull, 'w') - fs DjangoAILab-CastFabric-5b7733e/miair/airplay/pairing/hap.py :139
with open(path, mode="r", encoding="utf-8") as f: - fs DjangoAILab-CastFabric-5b7733e/miair/airplay/server.py :976
self._codec_context.open() - fs DjangoAILab-CastFabric-5b7733e/miair/app.py :1220
open(self.config.log_file, "w", encoding="utf-8").close() - fs DjangoAILab-CastFabric-5b7733e/miair/auth.py :31
with open(self.token_path, encoding="utf-8") as handle: - fs DjangoAILab-CastFabric-5b7733e/miair/config.py :465
with open(self.config_file, "w", encoding="utf-8") as f: - fs DjangoAILab-CastFabric-5b7733e/miair/content/media.py :11
from pathlib import Path, PurePath - fs DjangoAILab-CastFabric-5b7733e/miair/content/repository.py :10
from pathlib import Path - fs DjangoAILab-CastFabric-5b7733e/miair/dlna/device_server.py :8
import shutil
show 10 more
- fs DjangoAILab-CastFabric-5b7733e/miair/dlna/media_buffer.py :316
with open(output_path, 'rb') as f: - fs DjangoAILab-CastFabric-5b7733e/miair/playback/files.py :10
from pathlib import Path, PurePath - fs DjangoAILab-CastFabric-5b7733e/miair/runtime/events.py :10
from pathlib import Path - fs DjangoAILab-CastFabric-5b7733e/miair/web/api.py :242
with open('/proc/1/cgroup', 'r') as f: - fs (weak) DjangoAILab-CastFabric-5b7733e/tests/test_api_v1.py :6
from pathlib import Path - fs (weak) DjangoAILab-CastFabric-5b7733e/tests/test_audio_seek.py :284
with open(out_path, "rb") as f: - fs (weak) DjangoAILab-CastFabric-5b7733e/tests/test_auth_persistence.py :106
with open(token_path, "w", encoding="utf-8") as handle: - fs (weak) DjangoAILab-CastFabric-5b7733e/tests/test_console_contract.py :3
from pathlib import Path - fs (weak) DjangoAILab-CastFabric-5b7733e/tests/test_media_assets.py :12
with wave.open(output, "wb") as audio: - fs (weak) DjangoAILab-CastFabric-5b7733e/tests/test_miplay_media.py :2
import shutil
shell / exec 8
- shell DjangoAILab-CastFabric-5b7733e/miair.py :4
import subprocess - shell DjangoAILab-CastFabric-5b7733e/miair/airplay/audio_stream.py :13
import subprocess - shell DjangoAILab-CastFabric-5b7733e/miair/airplay/server.py :15
import subprocess - shell DjangoAILab-CastFabric-5b7733e/miair/airplay/utils.py :6
import subprocess - shell DjangoAILab-CastFabric-5b7733e/miair/config.py :9
import subprocess - shell DjangoAILab-CastFabric-5b7733e/miair/web/api.py :275
import subprocess - shell (weak) DjangoAILab-CastFabric-5b7733e/tests/test_audio_seek.py :262
import subprocess - shell (weak) DjangoAILab-CastFabric-5b7733e/tests/test_miplay_media.py :4
import subprocess
network 33
- net DjangoAILab-CastFabric-5b7733e/miair/airplay/airplay1.py :21
import socket # noqa - net DjangoAILab-CastFabric-5b7733e/miair/airplay/audio_stream.py :17
from aiohttp import web - net DjangoAILab-CastFabric-5b7733e/miair/airplay/connections/audio.py :1
import socket - net DjangoAILab-CastFabric-5b7733e/miair/airplay/connections/control.py :2
import socket - net DjangoAILab-CastFabric-5b7733e/miair/airplay/connections/event.py :1
import socket - net DjangoAILab-CastFabric-5b7733e/miair/airplay/mdns.py :8
import socket - net DjangoAILab-CastFabric-5b7733e/miair/airplay/pairing/hap.py :2
import socket - net DjangoAILab-CastFabric-5b7733e/miair/airplay/server.py :13
import socket - net DjangoAILab-CastFabric-5b7733e/miair/airplay/utils.py :2
import socket - net DjangoAILab-CastFabric-5b7733e/miair/app.py :10
from aiohttp import web - net DjangoAILab-CastFabric-5b7733e/miair/auth.py :13
import aiohttp - net DjangoAILab-CastFabric-5b7733e/miair/config.py :8
import socket
show 21 more
- net DjangoAILab-CastFabric-5b7733e/miair/content/media.py :13
from urllib.parse import urlsplit - net DjangoAILab-CastFabric-5b7733e/miair/conversation.py :16
import aiohttp - net DjangoAILab-CastFabric-5b7733e/miair/dlna/client.py :9
import socket - net DjangoAILab-CastFabric-5b7733e/miair/dlna/device_server.py :12
import aiohttp - net DjangoAILab-CastFabric-5b7733e/miair/dlna/eventing.py :8
import aiohttp - net DjangoAILab-CastFabric-5b7733e/miair/dlna/media_buffer.py :7
import aiohttp - net DjangoAILab-CastFabric-5b7733e/miair/dlna/ssdp.py :8
import socket - net DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :7
from urllib.parse import urlsplit - net DjangoAILab-CastFabric-5b7733e/miair/miplay/receiver.py :10
import socket - net DjangoAILab-CastFabric-5b7733e/miair/runtime/redaction.py :8
from urllib.parse import urlsplit, urlunsplit - net DjangoAILab-CastFabric-5b7733e/miair/web/api.py :9
import urllib.request - net DjangoAILab-CastFabric-5b7733e/miair/web/api_v1.py :9
from urllib.parse import urlsplit - net DjangoAILab-CastFabric-5b7733e/miair/web/origin.py :7
from aiohttp import web - net (weak) DjangoAILab-CastFabric-5b7733e/tests/test_api_v1.py :9
from urllib.parse import urlsplit - net (weak) DjangoAILab-CastFabric-5b7733e/tests/test_auth_persistence.py :9
import aiohttp - net (weak) DjangoAILab-CastFabric-5b7733e/tests/test_dlna_output_poc.py :9
import aiohttp - net (weak) DjangoAILab-CastFabric-5b7733e/tests/test_local_dlna_client.py :6
import aiohttp - net (weak) DjangoAILab-CastFabric-5b7733e/tests/test_mcp_transport.py :5
from aiohttp.test_utils import TestClient, TestServer - net (weak) DjangoAILab-CastFabric-5b7733e/tests/test_miplay_mdns.py :2
import socket - net (weak) DjangoAILab-CastFabric-5b7733e/tests/test_miplay_sink.py :4
import aiohttp - net (weak) DjangoAILab-CastFabric-5b7733e/tests/test_playlist_dmr_integration.py :4
import aiohttp
database 2
- db DjangoAILab-CastFabric-5b7733e/miair/content/repository.py :6
import sqlite3 - db (weak) DjangoAILab-CastFabric-5b7733e/tests/test_content_repository.py :1
import sqlite3
tool registrations 26
- get_system_status DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :61
- scan_outputs DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :85
- list_media_assets DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :202
- get_media_asset DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :215
- create_url_media_asset DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :222
- update_media_asset DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :234
- delete_media_asset DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :251
- play_media_asset DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :258
- begin_media_upload DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :270
- list_playlists DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :284
- get_playlist DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :288
- create_playlist DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :295
show 14 more
- update_playlist DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :308
- mutate_playlist_items DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :328
- archive_playlist DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :359
- start_playlist DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :371
- get_playlist_run DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :388
- list_playlist_runs DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :395
- control_playlist_run DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :399
- get_playlist_progress DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :412
- query_playback_history DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :422
- get_playback_status DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :457
- pause DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :467
- resume DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :474
- stop DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :503
- set_volume DjangoAILab-CastFabric-5b7733e/miair/mcp/server.py :513
declared dependencies 8
- mcp@>=2.1.1,<3
- aiohttp@>=3.9.0
- miservice-fork@*
- zeroconf@>=0.38.0
- pycryptodome@>=3.15.0
- av@>=10.0.0
- pytest@>=8.0
- pytest-asyncio@>=0.23
transport_posture 1
- network-listening, binds all interfaces, no auth detected DjangoAILab-CastFabric-5b7733e/miair/app.py :757
host="0.0.0.0",