The agent that learns how you decide - and proves it by never deciding for you. A local-first, loop-native runtime for a team of AI agents on your machine.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http · http counts 6 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
click
-
get_screen_size
-
move
-
press_key
-
screenshot
-
type_text
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 0a4f90a · analyzer v33 · 6h ago
skills & prompt files 8
- skill Caprista-KarvyLoop-0a4f90a/.claude/skills/security-review/SKILL.md
- skill Caprista-KarvyLoop-0a4f90a/karvyloop/demo_instances/lin-en/skills/draft-digital-nomad-debunk/SKILL.md
- skill Caprista-KarvyLoop-0a4f90a/karvyloop/demo_instances/lin-zh/skills/draft-digital-nomad-debunk/SKILL.md
- skill Caprista-KarvyLoop-0a4f90a/karvyloop/system_skills/data-analyst/SKILL.md
- skill Caprista-KarvyLoop-0a4f90a/karvyloop/system_skills/expense/SKILL.md
- skill Caprista-KarvyLoop-0a4f90a/karvyloop/system_skills/file-butler/SKILL.md
- skill Caprista-KarvyLoop-0a4f90a/karvyloop/system_skills/meeting-notes/SKILL.md
- skill Caprista-KarvyLoop-0a4f90a/karvyloop/system_skills/study-buddy/SKILL.md
danger signals8
- suspicious endpoint 169.254.169.254 (cloud metadata) Caprista-KarvyLoop-0a4f90a/tests/security/test_ssrf.py :36
"http://169.254.169.254/latest/meta-data/iam/security-credentials/", - suspicious endpoint 93.184.216.34 Caprista-KarvyLoop-0a4f90a/tests/security/test_ssrf.py :74
check_url("http://93.184.216.34/") # 公网 IP(不解析 DNS,离线可判) - suspicious endpoint 1.1.1.1 Caprista-KarvyLoop-0a4f90a/tests/security/test_ssrf.py :75
check_url("https://1.1.1.1/") # Cloudflare 公共 DNS,公网 - suspicious endpoint 169.254.169.254 (cloud metadata) Caprista-KarvyLoop-0a4f90a/tests/test_distill_fetch_ssrf.py :51
"http://169.254.169.254/latest/meta-data/", - committed secret Anthropic key Caprista-KarvyLoop-0a4f90a/tests/test_init_wizard.py :103
sk-ant…(31 chars, redacted) - committed secret OpenAI key Caprista-KarvyLoop-0a4f90a/tests/test_model_onboarding.py :120
sk-LEA…(26 chars, redacted) - committed secret Anthropic key Caprista-KarvyLoop-0a4f90a/tests/test_provider_registry.py :377
sk-ant…(32 chars, redacted) - committed secret OpenAI key Caprista-KarvyLoop-0a4f90a/tests/test_readiness.py :116
sk-LEA…(26 chars, redacted)
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 972
filesystem 350
- fs Caprista-KarvyLoop-0a4f90a/karvyloop/adapter/applier.py :14
import pathlib - fs Caprista-KarvyLoop-0a4f90a/karvyloop/adapter/planner.py :242
import pathlib - fs Caprista-KarvyLoop-0a4f90a/karvyloop/adapter/source.py :14
import pathlib - fs Caprista-KarvyLoop-0a4f90a/karvyloop/adapter/validator.py :13
import pathlib - fs Caprista-KarvyLoop-0a4f90a/karvyloop/atoms/registry.py :22
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/capability/fs_grants.py :21
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/channels/email_channel.py :29
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/channels/inbox_pipe.py :37
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/channels/webhook_channel.py :48
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/_runtime.py :15
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/chat.py :15
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/computer_use_e2e.py :45
from pathlib import Path
show 28 more
- fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/computer_use_setup.py :22
import shutil - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/export_cmd.py :22
from pathlib import Path, PurePosixPath - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/import_cmd.py :31
import shutil - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/init.py :11
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/intent_pump.py :26
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/main.py :355
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/manage.py :19
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/minimax_login_cmd.py :13
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/replay.py :29
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/run.py :16
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/run_loop.py :26
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cli/wizard.py :25
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/coding/coding_config.py :12
import pathlib - fs Caprista-KarvyLoop-0a4f90a/karvyloop/coding/paradigm_prompt.py :16
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/coding/prompt.py :95
content = open(p, "r", encoding="utf-8", errors="replace").read() - fs Caprista-KarvyLoop-0a4f90a/karvyloop/coding/session.py :22
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/coding/tools/mcp_tool.py :281
import pathlib - fs Caprista-KarvyLoop-0a4f90a/karvyloop/coding/tools/web.py :60
import pathlib - fs Caprista-KarvyLoop-0a4f90a/karvyloop/coding/web_verify.py :22
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cognition/belief_store.py :14
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cognition/concepts.py :27
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cognition/conversation.py :29
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cognition/distill_session.py :16
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cognition/pursuit.py :22
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cognition/pursuit_store.py :22
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cognition/recall.py :20
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cognition/sqlite_trace.py :26
from pathlib import Path - fs Caprista-KarvyLoop-0a4f90a/karvyloop/cognition/weekly_digest.py :27
from pathlib import Path
310 more not shown — this panel samples each group; the count above is the real total.
shell / exec 30
- shell Caprista-KarvyLoop-0a4f90a/karvyloop/cli/computer_use_setup.py :23
import subprocess - shell Caprista-KarvyLoop-0a4f90a/karvyloop/coding/prompt.py :17
import subprocess - shell Caprista-KarvyLoop-0a4f90a/karvyloop/console/capability_install.py :21
import subprocess - shell Caprista-KarvyLoop-0a4f90a/karvyloop/console/routes_ops.py :117
import subprocess as _sp - shell Caprista-KarvyLoop-0a4f90a/karvyloop/console/upgrade_runner.py :19
import subprocess - shell Caprista-KarvyLoop-0a4f90a/karvyloop/external_runtime/bridge.py :26
import subprocess - shell Caprista-KarvyLoop-0a4f90a/karvyloop/karvy/slash.py :16
import subprocess - shell Caprista-KarvyLoop-0a4f90a/karvyloop/platform/linux/egress_proxy.py :37
import subprocess - shell Caprista-KarvyLoop-0a4f90a/karvyloop/platform/win/degraded.py :24
import subprocess - shell Caprista-KarvyLoop-0a4f90a/karvyloop/platform/win/restricted.py :59
import subprocess - shell Caprista-KarvyLoop-0a4f90a/karvyloop/update.py :14
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/external_runtime/test_bridge.py :114
import subprocess
show 18 more
- shell (weak) Caprista-KarvyLoop-0a4f90a/tests/integration/test_console_linux_smoke.py :22
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_cli_console.py :13
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_console_lazy_ui_playwright.py :30
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_console_takeover.py :13
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_conversation.py :17
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_desk_soul_playwright.py :26
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_distribution.py :22
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_fastbrain_trace_habit.py :17
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_fastbrain_trace_index.py :20
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_landlock.py :152
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_mcp_hotload.py :19
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_mcp_remote.py :26
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_relay_e2e_interop.py :12
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_sqlite_persistence.py :18
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_win_sandbox.py :209
"import subprocess,sys\n" - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_workbench_e2e.py :10
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_workbench_serve.py :15
import subprocess - shell (weak) Caprista-KarvyLoop-0a4f90a/tests/test_workbench_widgets.py :11
import subprocess
network 71
- net Caprista-KarvyLoop-0a4f90a/karvyloop/atoms/terminal.py :69
"""从 httpx.HTTPStatusError 一类异常上取状态码(拿不到 = None)。""" - net Caprista-KarvyLoop-0a4f90a/karvyloop/channels/email_channel.py :31
from urllib.parse import quote - net Caprista-KarvyLoop-0a4f90a/karvyloop/channels/webhook_channel.py :51
from urllib.parse import quote, urlsplit - net Caprista-KarvyLoop-0a4f90a/karvyloop/cli/main.py :529
import socket as _socket - net Caprista-KarvyLoop-0a4f90a/karvyloop/coding/tools/mcp_tool.py :246
import urllib.parse as _up - net Caprista-KarvyLoop-0a4f90a/karvyloop/coding/tools/urlguard.py :26
import socket - net Caprista-KarvyLoop-0a4f90a/karvyloop/coding/tools/web.py :23
from urllib.parse import urljoin - net Caprista-KarvyLoop-0a4f90a/karvyloop/coding/web_verify.py :17
import socket - net Caprista-KarvyLoop-0a4f90a/karvyloop/console/access.py :16
import socket - net Caprista-KarvyLoop-0a4f90a/karvyloop/console/entry.py :33
import socket - net Caprista-KarvyLoop-0a4f90a/karvyloop/console/mcp_presets.py :430
import urllib.parse as _up - net Caprista-KarvyLoop-0a4f90a/karvyloop/console/oauth_broker.py :20
from urllib.parse import parse_qs, urlsplit
show 28 more
- net Caprista-KarvyLoop-0a4f90a/karvyloop/console/routes_memory.py :91
from urllib.parse import unquote - net Caprista-KarvyLoop-0a4f90a/karvyloop/console/routes_models.py :286
import httpx - net Caprista-KarvyLoop-0a4f90a/karvyloop/console/upgrade_runner.py :18
import socket - net Caprista-KarvyLoop-0a4f90a/karvyloop/doctor.py :14
import socket - net Caprista-KarvyLoop-0a4f90a/karvyloop/doctor_liveness.py :21
import socket - net Caprista-KarvyLoop-0a4f90a/karvyloop/external_runtime/connector.py :24
import urllib.error - net Caprista-KarvyLoop-0a4f90a/karvyloop/gateway/providers/anthropic.py :90
import httpx # 延迟导入 - net Caprista-KarvyLoop-0a4f90a/karvyloop/gateway/providers/openai_completions.py :161
import httpx # 延迟导入(测试走 mock 不需要) - net Caprista-KarvyLoop-0a4f90a/karvyloop/karvy/slash.py :122
"import socket,time,subprocess,json\n" - net Caprista-KarvyLoop-0a4f90a/karvyloop/llm/minimax_oauth.py :96
import httpx - net Caprista-KarvyLoop-0a4f90a/karvyloop/mcp_client.py :164
import httpx - net Caprista-KarvyLoop-0a4f90a/karvyloop/mcp_oauth.py :5
`httpx.Auth`,直接塞进我们现有的 remote 连接的 httpx client 即可)。我们只写**属于自己 - net Caprista-KarvyLoop-0a4f90a/karvyloop/mcp_registry.py :83
import httpx - net Caprista-KarvyLoop-0a4f90a/karvyloop/notifications/dingtalk.py :91
import httpx - net Caprista-KarvyLoop-0a4f90a/karvyloop/platform/linux/egress_proxy.py :35
import socket - net Caprista-KarvyLoop-0a4f90a/karvyloop/registry/skill_catalog.py :39
import httpx - net Caprista-KarvyLoop-0a4f90a/karvyloop/registry/skill_import.py :61
import httpx # 延迟导入:不触网就不需要 - net Caprista-KarvyLoop-0a4f90a/karvyloop/relay/client.py :91
from urllib.parse import quote - net Caprista-KarvyLoop-0a4f90a/karvyloop/update.py :17
import urllib.request - net (weak) Caprista-KarvyLoop-0a4f90a/tests/external_runtime/test_claim_handshake.py :399
import urllib.request - net (weak) Caprista-KarvyLoop-0a4f90a/tests/integration/test_anthropic_request_shape.py :105
return_value=httpx.Response(200, text=_min_sse_response(), - net (weak) Caprista-KarvyLoop-0a4f90a/tests/security/test_ssrf.py :128
import httpx - net (weak) Caprista-KarvyLoop-0a4f90a/tests/test_anthropic_adapter_auth.py :52
return_value=httpx.Response(200, text="") - net (weak) Caprista-KarvyLoop-0a4f90a/tests/test_away_bundle.py :75
import urllib.request - net (weak) Caprista-KarvyLoop-0a4f90a/tests/test_console_access.py :79
import socket - net (weak) Caprista-KarvyLoop-0a4f90a/tests/test_console_browser.py :13
import socket - net (weak) Caprista-KarvyLoop-0a4f90a/tests/test_console_browser_first10.py :16
import socket - net (weak) Caprista-KarvyLoop-0a4f90a/tests/test_console_browser_pending.py :13
import socket
31 more not shown — this panel samples each group; the count above is the real total.
secrets 3
- secrets Caprista-KarvyLoop-0a4f90a/karvyloop/coding/tools/web.py :72
env_key = (os.environ.get("KARVYLOOP_SEARCH_API_KEY") or "").strip() - secrets Caprista-KarvyLoop-0a4f90a/karvyloop/external_runtime/connector.py :109
secret = args.secret or os.environ.get("KARVYLOOP_CLAIM_SECRET", "") - secrets (weak) Caprista-KarvyLoop-0a4f90a/tests/test_gateway.py :124
os.environ["TEST_KEY"] = "sk-secret-DO-NOT-LEAK"
database 16
- db Caprista-KarvyLoop-0a4f90a/karvyloop/a2a/transport/__init__.py :77
"""Lazy import:避免 transport 顶层强制 import redis。""" - db Caprista-KarvyLoop-0a4f90a/karvyloop/a2a/transport/bus_redis.py :50
import redis # type: ignore - db Caprista-KarvyLoop-0a4f90a/karvyloop/cognition/sqlite_trace.py :23
import sqlite3 - db (weak) Caprista-KarvyLoop-0a4f90a/karvyloop/console/routes_demo.py :17
import sqlite3 - db Caprista-KarvyLoop-0a4f90a/karvyloop/crystallize/sqlite_store.py :27
import sqlite3 - db Caprista-KarvyLoop-0a4f90a/karvyloop/karvy/fastbrain/trace_habit.py :30
import sqlite3 - db Caprista-KarvyLoop-0a4f90a/karvyloop/karvy/fastbrain/trace_index.py :29
import sqlite3 - db Caprista-KarvyLoop-0a4f90a/karvyloop/llm/token_ledger.py :23
import sqlite3 - db Caprista-KarvyLoop-0a4f90a/karvyloop/notifications/outbox.py :3
import sqlite3 - db (weak) Caprista-KarvyLoop-0a4f90a/tests/test_a2a_tier2.py :299
import redis # type: ignore - db (weak) Caprista-KarvyLoop-0a4f90a/tests/test_crystallize_cluster.py :97
import sqlite3 - db (weak) Caprista-KarvyLoop-0a4f90a/tests/test_demo_instance.py :17
import sqlite3
show 4 more
- db (weak) Caprista-KarvyLoop-0a4f90a/tests/test_gateway_token_recording.py :116
import sqlite3 - db (weak) Caprista-KarvyLoop-0a4f90a/tests/test_run_id_thread.py :18
import sqlite3 - db (weak) Caprista-KarvyLoop-0a4f90a/tests/test_sqlite_persistence.py :412
import sqlite3 - db (weak) Caprista-KarvyLoop-0a4f90a/tests/test_token_ledger_rollup.py :216
import sqlite3
tool registrations 6
- screenshot Caprista-KarvyLoop-0a4f90a/karvyloop/computer/native_server.py :147
- get_screen_size Caprista-KarvyLoop-0a4f90a/karvyloop/computer/native_server.py :151
- move Caprista-KarvyLoop-0a4f90a/karvyloop/computer/native_server.py :156
- click Caprista-KarvyLoop-0a4f90a/karvyloop/computer/native_server.py :160
- type_text Caprista-KarvyLoop-0a4f90a/karvyloop/computer/native_server.py :164
- press_key Caprista-KarvyLoop-0a4f90a/karvyloop/computer/native_server.py :168
declared dependencies 26
- mcp@>=1.9,<2
- pydantic@>=2.0,<3
- pyyaml@>=6.0,<7
- httpx@>=0.27,<1
- textual@>=0.50,<9
- textual-serve@>=0.5,<2
- fastapi@>=0.115,<1
- uvicorn@>=0.30,<1
- croniter@>=2.0,<7
- playwright@>=1.40,<2
- pyautogui@>=0.9.54,<1
- pillow@>=10,<12
show 14 more
- redis@>=5.0,<9
- pypdf@>=4.0,<7
- python-docx@>=1.1,<2
- openpyxl@>=3.1,<4
- faster-whisper@>=1.1,<2
- rapidocr-onnxruntime@>=1.2,<2
- dingtalk-stream@>=0.20,<1
- cryptography@>=42,<48
- pytest@>=8.0
- pytest-asyncio@>=0.23
- respx@>=0.21
- psutil@>=5.9
- hypothesis@>=6.100
- ruff@>=0.6
transport_posture 2
- network-listening, binds all interfaces, no auth detected Caprista-KarvyLoop-0a4f90a/tests/test_cli_console.py :88
host="0.0.0.0", - binds all interfaces (0.0.0.0) Caprista-KarvyLoop-0a4f90a/tests/test_workbench_serve.py :60
host="0.0.0.0",