shadowcat 2.0.0__tar.gz → 2.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- shadowcat-2.2.0/.clineignore +23 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/.env.example +43 -35
- {shadowcat-2.0.0 → shadowcat-2.2.0}/.gitignore +165 -151
- shadowcat-2.2.0/.mcp.json +8 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/CLAUDE.md +170 -161
- {shadowcat-2.0.0 → shadowcat-2.2.0}/Dockerfile +101 -101
- {shadowcat-2.0.0 → shadowcat-2.2.0}/LICENSE.md +21 -21
- {shadowcat-2.0.0 → shadowcat-2.2.0}/Makefile +292 -292
- {shadowcat-2.0.0 → shadowcat-2.2.0}/PKG-INFO +35 -7
- {shadowcat-2.0.0 → shadowcat-2.2.0}/README.md +350 -322
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/__init__.py +17 -17
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/benchmark/__init__.py +11 -11
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/benchmark/cli.py +179 -179
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/benchmark/config.py +15 -15
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/benchmark/docker.py +192 -192
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/benchmark/registry.py +99 -99
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/core/agent.py +376 -362
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/core/backend.py +1667 -1667
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/core/config.py +106 -106
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/core/controller.py +638 -638
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/core/events.py +177 -177
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/core/langfuse.py +326 -320
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/core/phantom.py +2327 -2327
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/core/planner.py +491 -493
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/core/profiling.py +58 -58
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/core/sanitizer.py +104 -104
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/core/session.py +238 -228
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/core/tracer.py +137 -137
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/interface/components/activity_feed.py +202 -202
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/interface/components/renderers.py +149 -149
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/interface/components/splash.py +112 -112
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/interface/main.py +1091 -1126
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/interface/styles.tcss +421 -421
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/interface/tui.py +508 -508
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/parsing/html_distiller.py +230 -230
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/parsing/tool_parser.py +115 -115
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/prompts/pentesting.py +238 -238
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/rag_module/knowledge_base.py +116 -116
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/tests/benchmark_phantom.py +455 -455
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/tools/__init__.py +14 -14
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/tools/base.py +99 -99
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/tools/executor.py +343 -345
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/tools/registry.py +47 -47
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/README.md +244 -244
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/__init__.py +10 -10
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/api/__init__.py +1 -1
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/api/routes_scan.py +1114 -932
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/authz.py +75 -75
- shadowcat-2.2.0/backend/cli.py +243 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/compliance/__init__.py +1 -1
- shadowcat-2.2.0/backend/compliance/pdpa_mapping.py +115 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/core/__init__.py +1 -1
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/core/coverage.py +93 -93
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/core/events.py +166 -166
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/core/llm_client.py +632 -614
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/core/orchestrator.py +490 -402
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/core/scan_memory.py +238 -236
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/crawler/__init__.py +1 -1
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/crawler/csrf.py +75 -75
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/crawler/headless.py +232 -232
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/crawler/js_analyzer.py +133 -133
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/crawler/spider.py +555 -550
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/crawler/subdomains.py +279 -279
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/daemon.py +262 -252
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/db/README.md +86 -86
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/db/__init__.py +17 -17
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/db/engine.py +87 -87
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/db/models.py +206 -206
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/db/repository.py +316 -316
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/db/schema.sql +247 -247
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/modes/__init__.py +5 -5
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/modes/base.py +178 -178
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/modes/ctf.py +39 -39
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/modes/enterprise.py +255 -210
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/modes/general.py +345 -226
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/modes/registry.py +37 -34
- shadowcat-2.2.0/backend/reporting/generator.py +428 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/schemas/__init__.py +1 -1
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/schemas/api.py +423 -423
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/tools/__init__.py +62 -62
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/tools/dirbrute_tool.py +304 -304
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/tools/general_report_tool.py +151 -135
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/tools/http_tool.py +424 -351
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/tools/nuclei_tool.py +20 -20
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/tools/report_tool.py +162 -145
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/tools/shell_tools.py +23 -23
- shadowcat-2.2.0/backend/user_config.py +78 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/verification/__init__.py +1 -1
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/verification/evidence_store.py +197 -125
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/verification/general_oracle.py +515 -369
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/verification/idor_oracle.py +131 -131
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/waf/detector.py +147 -147
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/waf/evasion.py +117 -117
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/workspace.py +182 -182
- {shadowcat-2.0.0 → shadowcat-2.2.0}/custom_exploits/example_exploit.py +8 -8
- {shadowcat-2.0.0 → shadowcat-2.2.0}/docker-compose.yml +66 -66
- shadowcat-2.2.0/docs/CHANGES_SUMMARY_TH.md +211 -0
- shadowcat-2.2.0/docs/DASHBOARD_IMPROVEMENTS_TH.md +434 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/docs/ENTERPRISE_ARCH.md +171 -171
- shadowcat-2.2.0/docs/HOW_TO_RUN_TH.md +322 -0
- shadowcat-2.2.0/docs/NSC_PREP_TH.md +643 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/docs/PROGRESS.md +359 -345
- {shadowcat-2.0.0 → shadowcat-2.2.0}/docs/ROADMAP.md +1096 -1096
- shadowcat-2.2.0/docs/ShadowCat_/340/271/200/340/270/255/340/270/201/340/270/252/340/270/262/340/270/243/340/270/233/340/270/243/340/270/260/340/270/201/340/270/255/340/270/232/340/271/202/340/270/233/340/270/243/340/271/200/340/270/210/340/270/204_NSC2026.pdf +0 -0
- shadowcat-2.2.0/docs/TECHNICAL_DEEP_DIVE_TH.md +917 -0
- shadowcat-2.2.0/docs/WEBSITE_SPEC.md +226 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/docs/nsc-shadowcat-pitch.md +134 -134
- shadowcat-2.2.0/docs/research/README.md +0 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/fix-workspace-permissions.sh +39 -39
- shadowcat-2.2.0/frontend/next.config.ts +15 -0
- shadowcat-2.2.0/frontend/postcss.config.mjs +7 -0
- shadowcat-2.2.0/frontend/public/logo-mark.png +0 -0
- shadowcat-2.2.0/frontend/public/logo.png +0 -0
- shadowcat-2.2.0/frontend/src/app/globals.css +20 -0
- shadowcat-2.2.0/frontend/src/app/layout.tsx +17 -0
- shadowcat-2.2.0/frontend/src/app/page.tsx +5 -0
- shadowcat-2.2.0/frontend/src/components/AppShell.tsx +130 -0
- shadowcat-2.2.0/frontend/src/components/EmptyBlock.tsx +18 -0
- shadowcat-2.2.0/frontend/src/components/NewScanModal.tsx +152 -0
- shadowcat-2.2.0/frontend/src/components/PageHeader.tsx +19 -0
- shadowcat-2.2.0/frontend/src/components/ReportButtons.tsx +50 -0
- shadowcat-2.2.0/frontend/src/components/Sidebar.tsx +164 -0
- shadowcat-2.2.0/frontend/src/components/StatusChip.tsx +26 -0
- shadowcat-2.2.0/frontend/src/components/Topbar.tsx +82 -0
- shadowcat-2.2.0/frontend/src/components/charts/SeverityBarChart.tsx +66 -0
- shadowcat-2.2.0/frontend/src/components/charts/VerdictBar.tsx +55 -0
- shadowcat-2.2.0/frontend/src/components/icons.tsx +161 -0
- shadowcat-2.2.0/frontend/src/components/views/FindingsView.tsx +83 -0
- shadowcat-2.2.0/frontend/src/components/views/LiveFeedView.tsx +374 -0
- shadowcat-2.2.0/frontend/src/components/views/MemoryView.tsx +107 -0
- shadowcat-2.2.0/frontend/src/components/views/OverviewView.tsx +159 -0
- shadowcat-2.2.0/frontend/src/components/views/SessionsView.tsx +71 -0
- shadowcat-2.2.0/frontend/src/components/views/SettingsView.tsx +350 -0
- shadowcat-2.2.0/frontend/src/lib/api.ts +294 -0
- shadowcat-2.2.0/frontend/src/lib/severity.ts +34 -0
- shadowcat-2.2.0/frontend/src/lib/useActiveScan.ts +149 -0
- shadowcat-2.2.0/frontend/src/lib/useScanDetails.ts +43 -0
- shadowcat-2.2.0/frontend/tsconfig.json +41 -0
- shadowcat-2.2.0/hatch_build.py +51 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/pyproject.toml +203 -195
- {shadowcat-2.0.0 → shadowcat-2.2.0}/scripts/config.sh +202 -202
- {shadowcat-2.0.0 → shadowcat-2.2.0}/scripts/entrypoint.sh +80 -80
- {shadowcat-2.0.0 → shadowcat-2.2.0}/scripts/gen_report.js +254 -254
- {shadowcat-2.0.0 → shadowcat-2.2.0}/scripts/test_client.py +106 -106
- {shadowcat-2.0.0 → shadowcat-2.2.0}/setup.sh +130 -130
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/__init__.py +1 -1
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/conftest.py +137 -123
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/docker/__init__.py +1 -1
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/docker/test_container_health.py +167 -167
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/docker/test_docker_build.py +111 -111
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/integration/__init__.py +1 -1
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/integration/test_benchmark_cli.py +279 -279
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/integration/test_controller.py +174 -174
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/test_config_cli.py +80 -82
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/test_coverage_ledger.py +56 -56
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/test_daemon_cli.py +361 -331
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/test_db_persistence.py +233 -233
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/test_enterprise_api.py +562 -422
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/test_enterprise_engine.py +350 -248
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/test_executor.py +256 -256
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/test_general_oracle.py +202 -120
- shadowcat-2.2.0/tests/test_general_report_tool.py +143 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/test_headless.py +84 -84
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/test_llm_wiring.py +442 -376
- shadowcat-2.2.0/tests/test_memory_briefing.py +132 -0
- shadowcat-2.2.0/tests/test_pdpa_mapping.py +31 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/test_scan_memory.py +87 -87
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/test_sse_replay.py +133 -133
- shadowcat-2.2.0/tests/test_user_config.py +142 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/unit/__init__.py +1 -1
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/unit/test_backend_interface.py +145 -145
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/unit/test_benchmark_registry.py +91 -91
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/unit/test_config.py +173 -173
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/unit/test_events.py +160 -160
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/unit/test_flag_detection.py +164 -164
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/unit/test_langfuse.py +533 -506
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/unit/test_phantom_two_tier.py +415 -415
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/unit/test_planner_context.py +179 -179
- {shadowcat-2.0.0 → shadowcat-2.2.0}/tests/unit/test_session.py +204 -172
- shadowcat-2.2.0/uv.lock +2155 -0
- shadowcat-2.0.0/LEARNING.md +0 -61
- shadowcat-2.0.0/backend/cli.py +0 -261
- shadowcat-2.0.0/backend/compliance/pdpa_mapping.py +0 -16
- shadowcat-2.0.0/backend/reporting/generator.py +0 -285
- shadowcat-2.0.0/backend/webui/index.html +0 -713
- shadowcat-2.0.0/uv.lock +0 -2061
- {shadowcat-2.0.0 → shadowcat-2.2.0}/.gitmodules +0 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/core/__init__.py +0 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/interface/__init__.py +0 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/interface/components/__init__.py +0 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/agent/prompts/__init__.py +0 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/reporting/__init__.py +0 -0
- {shadowcat-2.0.0 → shadowcat-2.2.0}/backend/waf/__init__.py +0 -0
- /shadowcat-2.0.0/docs/research/README.md → /shadowcat-2.2.0/backend/webui/index.html +0 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Ignore dependency directories
|
|
2
|
+
node_modules/
|
|
3
|
+
**/node_modules/
|
|
4
|
+
|
|
5
|
+
# Ignore build and cache directories
|
|
6
|
+
.next/
|
|
7
|
+
.venv/
|
|
8
|
+
.pytest_cache/
|
|
9
|
+
.ruff_cache/
|
|
10
|
+
dist/
|
|
11
|
+
build/
|
|
12
|
+
|
|
13
|
+
# Ignore lock files if they are too large
|
|
14
|
+
package-lock.json
|
|
15
|
+
uv.lock
|
|
16
|
+
|
|
17
|
+
# Ignore environment files
|
|
18
|
+
.env
|
|
19
|
+
.env.*
|
|
20
|
+
!.env.example
|
|
21
|
+
|
|
22
|
+
# Ignore internal logs or metadata
|
|
23
|
+
*.log
|
|
@@ -1,35 +1,43 @@
|
|
|
1
|
-
# ShadowCat Configuration
|
|
2
|
-
# Copy this file to .env and fill in your values.
|
|
3
|
-
|
|
4
|
-
# =============================================================================
|
|
5
|
-
# LLM API Key (required)
|
|
6
|
-
#
|
|
7
|
-
# Option A — PSU Blue (university gateway, recommended on campus):
|
|
8
|
-
# Key format: sk-user-... — auto-routed to https://ai.psu.blue/v1
|
|
9
|
-
# Models: qwen/qwen3.6-plus, qwen/qwen3.6-flash, openai/gpt-4o-mini, deepseek/deepseek-chat
|
|
10
|
-
#
|
|
11
|
-
# Option B — OpenRouter (public gateway):
|
|
12
|
-
# Get your key at https://openrouter.ai/keys (format: sk-or-...)
|
|
13
|
-
# Models: any slug from https://openrouter.ai/models
|
|
14
|
-
#
|
|
15
|
-
# Both use the same OPENROUTER_API_KEY variable — the system auto-detects the gateway.
|
|
16
|
-
# =============================================================================
|
|
17
|
-
OPENROUTER_API_KEY=sk-user-your-psu-key-here
|
|
18
|
-
|
|
19
|
-
# Model slug — must be available on whichever gateway your key targets.
|
|
20
|
-
# PSU Blue examples: qwen/qwen3.6-plus | openai/gpt-4o-mini | deepseek/deepseek-chat
|
|
21
|
-
# OpenRouter examples: anthropic/claude-3-5-sonnet | openai/gpt-4o
|
|
22
|
-
MODEL=qwen/qwen3.6-plus
|
|
23
|
-
|
|
24
|
-
# Override the API base URL (optional — auto-detected from key prefix).
|
|
25
|
-
# Set this only if you need to point at a non-standard endpoint.
|
|
26
|
-
# OPENROUTER_BASE_URL=https://ai.psu.blue/v1
|
|
27
|
-
|
|
28
|
-
# =============================================================================
|
|
29
|
-
# Database (optional) — Enterprise API persistence (app/db)
|
|
30
|
-
# When unset, the API runs in-memory and persists nothing. When set, scans,
|
|
31
|
-
# HTTP evidence, findings, and verdicts are written to PostgreSQL.
|
|
32
|
-
# Standard SQLAlchemy async URL (a plain postgresql:// is upgraded to asyncpg).
|
|
33
|
-
# Percent-encode any @ : / ? characters in the password. Never commit a real one.
|
|
34
|
-
# =============================================================================
|
|
35
|
-
# DATABASE_URL=postgresql+asyncpg://postgres:your-password@127.0.0.1:5432/shadowcat
|
|
1
|
+
# ShadowCat Configuration
|
|
2
|
+
# Copy this file to .env and fill in your values.
|
|
3
|
+
|
|
4
|
+
# =============================================================================
|
|
5
|
+
# LLM API Key (required)
|
|
6
|
+
#
|
|
7
|
+
# Option A — PSU Blue (university gateway, recommended on campus):
|
|
8
|
+
# Key format: sk-user-... — auto-routed to https://ai.psu.blue/v1
|
|
9
|
+
# Models: qwen/qwen3.6-plus, qwen/qwen3.6-flash, openai/gpt-4o-mini, deepseek/deepseek-chat
|
|
10
|
+
#
|
|
11
|
+
# Option B — OpenRouter (public gateway):
|
|
12
|
+
# Get your key at https://openrouter.ai/keys (format: sk-or-...)
|
|
13
|
+
# Models: any slug from https://openrouter.ai/models
|
|
14
|
+
#
|
|
15
|
+
# Both use the same OPENROUTER_API_KEY variable — the system auto-detects the gateway.
|
|
16
|
+
# =============================================================================
|
|
17
|
+
OPENROUTER_API_KEY=sk-user-your-psu-key-here
|
|
18
|
+
|
|
19
|
+
# Model slug — must be available on whichever gateway your key targets.
|
|
20
|
+
# PSU Blue examples: qwen/qwen3.6-plus | openai/gpt-4o-mini | deepseek/deepseek-chat
|
|
21
|
+
# OpenRouter examples: anthropic/claude-3-5-sonnet | openai/gpt-4o
|
|
22
|
+
MODEL=qwen/qwen3.6-plus
|
|
23
|
+
|
|
24
|
+
# Override the API base URL (optional — auto-detected from key prefix).
|
|
25
|
+
# Set this only if you need to point at a non-standard endpoint.
|
|
26
|
+
# OPENROUTER_BASE_URL=https://ai.psu.blue/v1
|
|
27
|
+
|
|
28
|
+
# =============================================================================
|
|
29
|
+
# Database (optional) — Enterprise API persistence (app/db)
|
|
30
|
+
# When unset, the API runs in-memory and persists nothing. When set, scans,
|
|
31
|
+
# HTTP evidence, findings, and verdicts are written to PostgreSQL.
|
|
32
|
+
# Standard SQLAlchemy async URL (a plain postgresql:// is upgraded to asyncpg).
|
|
33
|
+
# Percent-encode any @ : / ? characters in the password. Never commit a real one.
|
|
34
|
+
# =============================================================================
|
|
35
|
+
# DATABASE_URL=postgresql+asyncpg://postgres:your-password@127.0.0.1:5432/shadowcat
|
|
36
|
+
|
|
37
|
+
# =============================================================================
|
|
38
|
+
# Telemetry (optional) — Langfuse observability for the agentic TUI
|
|
39
|
+
# Opt-in: unset by default, so telemetry stays off unless both keys are
|
|
40
|
+
# provided. Never commit real values here. Get keys at https://cloud.langfuse.com
|
|
41
|
+
# =============================================================================
|
|
42
|
+
# LANGFUSE_PUBLIC_KEY=pk-lf-your-key-here
|
|
43
|
+
# LANGFUSE_SECRET_KEY=sk-lf-your-key-here
|
|
@@ -1,151 +1,165 @@
|
|
|
1
|
-
# ============================================================================
|
|
2
|
-
# Python
|
|
3
|
-
# ============================================================================
|
|
4
|
-
|
|
5
|
-
# Byte-compiled / optimized / DLL files
|
|
6
|
-
__pycache__/
|
|
7
|
-
*.py[cod]
|
|
8
|
-
*$py.class
|
|
9
|
-
*.so
|
|
10
|
-
|
|
11
|
-
# Distribution / packaging
|
|
12
|
-
.Python
|
|
13
|
-
build/
|
|
14
|
-
develop-eggs/
|
|
15
|
-
dist/
|
|
16
|
-
downloads/
|
|
17
|
-
eggs/
|
|
18
|
-
.eggs/
|
|
19
|
-
lib/
|
|
20
|
-
lib64/
|
|
21
|
-
parts/
|
|
22
|
-
sdist/
|
|
23
|
-
var/
|
|
24
|
-
wheels/
|
|
25
|
-
share/python-wheels/
|
|
26
|
-
*.egg-info/
|
|
27
|
-
.installed.cfg
|
|
28
|
-
*.egg
|
|
29
|
-
MANIFEST
|
|
30
|
-
|
|
31
|
-
# Installer logs
|
|
32
|
-
pip-log.txt
|
|
33
|
-
pip-delete-this-directory.txt
|
|
34
|
-
|
|
35
|
-
# ============================================================================
|
|
36
|
-
# Virtual Environments
|
|
37
|
-
# ============================================================================
|
|
38
|
-
|
|
39
|
-
.venv/
|
|
40
|
-
venv/
|
|
41
|
-
ENV/
|
|
42
|
-
env/
|
|
43
|
-
env.bak/
|
|
44
|
-
venv.bak/
|
|
45
|
-
|
|
46
|
-
# ============================================================================
|
|
47
|
-
# Poetry / PDM
|
|
48
|
-
# ============================================================================
|
|
49
|
-
|
|
50
|
-
poetry.lock
|
|
51
|
-
.pdm.toml
|
|
52
|
-
.pdm-build/
|
|
53
|
-
|
|
54
|
-
# ============================================================================
|
|
55
|
-
# Testing
|
|
56
|
-
# ============================================================================
|
|
57
|
-
|
|
58
|
-
.pytest_cache/
|
|
59
|
-
.coverage
|
|
60
|
-
.coverage.*
|
|
61
|
-
htmlcov/
|
|
62
|
-
.tox/
|
|
63
|
-
.nox/
|
|
64
|
-
.cache
|
|
65
|
-
nosetests.xml
|
|
66
|
-
coverage.xml
|
|
67
|
-
*.cover
|
|
68
|
-
*.py,cover
|
|
69
|
-
.hypothesis/
|
|
70
|
-
cover/
|
|
71
|
-
|
|
72
|
-
# ============================================================================
|
|
73
|
-
# Type Checking & Linting
|
|
74
|
-
# ============================================================================
|
|
75
|
-
|
|
76
|
-
.mypy_cache/
|
|
77
|
-
.dmypy.json
|
|
78
|
-
dmypy.json
|
|
79
|
-
.pytype/
|
|
80
|
-
.pyre/
|
|
81
|
-
.ruff_cache/
|
|
82
|
-
cython_debug/
|
|
83
|
-
|
|
84
|
-
# ============================================================================
|
|
85
|
-
# IDEs & Editors
|
|
86
|
-
# ============================================================================
|
|
87
|
-
|
|
88
|
-
.idea/
|
|
89
|
-
.vscode/
|
|
90
|
-
*.swp
|
|
91
|
-
*.swo
|
|
92
|
-
*~
|
|
93
|
-
.aider*
|
|
94
|
-
|
|
95
|
-
# ============================================================================
|
|
96
|
-
# OS Files
|
|
97
|
-
# ============================================================================
|
|
98
|
-
|
|
99
|
-
.DS_Store
|
|
100
|
-
Thumbs.db
|
|
101
|
-
|
|
102
|
-
# ============================================================================
|
|
103
|
-
# Project Specific
|
|
104
|
-
# ============================================================================
|
|
105
|
-
|
|
106
|
-
# Runtime workspace - NEVER commit (contains VPN configs, exploits, sensitive data)
|
|
107
|
-
workspace/*
|
|
108
|
-
!workspace/.gitkeep
|
|
109
|
-
|
|
110
|
-
# VPN configuration files (extra safety - never commit these anywhere)
|
|
111
|
-
*.ovpn
|
|
112
|
-
|
|
113
|
-
# Logs
|
|
114
|
-
*.log
|
|
115
|
-
logs/
|
|
116
|
-
|
|
117
|
-
# Environment
|
|
118
|
-
.env
|
|
119
|
-
.env.auth
|
|
120
|
-
|
|
121
|
-
# Agent runs
|
|
122
|
-
agent_runs/
|
|
123
|
-
|
|
124
|
-
# Legacy project files (when running from legacy/)
|
|
125
|
-
config/chatgpt_config.py
|
|
126
|
-
outputs/
|
|
127
|
-
test_history/
|
|
128
|
-
archive/
|
|
129
|
-
|
|
130
|
-
# ============================================================================
|
|
131
|
-
# Local Docker Overrides (for regional mirrors, etc.)
|
|
132
|
-
# ============================================================================
|
|
133
|
-
|
|
134
|
-
Dockerfile.vpn
|
|
135
|
-
docker-compose.override.yml
|
|
136
|
-
vpn-mode.sh
|
|
137
|
-
|
|
138
|
-
# ============================================================================
|
|
139
|
-
# Documentation
|
|
140
|
-
# ============================================================================
|
|
141
|
-
|
|
142
|
-
docs/_build/
|
|
143
|
-
/site
|
|
144
|
-
|
|
145
|
-
# ============================================================================
|
|
146
|
-
# Jupyter
|
|
147
|
-
# ============================================================================
|
|
148
|
-
|
|
149
|
-
.ipynb_checkpoints
|
|
150
|
-
profile_default/
|
|
151
|
-
ipython_config.py
|
|
1
|
+
# ============================================================================
|
|
2
|
+
# Python
|
|
3
|
+
# ============================================================================
|
|
4
|
+
|
|
5
|
+
# Byte-compiled / optimized / DLL files
|
|
6
|
+
__pycache__/
|
|
7
|
+
*.py[cod]
|
|
8
|
+
*$py.class
|
|
9
|
+
*.so
|
|
10
|
+
|
|
11
|
+
# Distribution / packaging
|
|
12
|
+
.Python
|
|
13
|
+
build/
|
|
14
|
+
develop-eggs/
|
|
15
|
+
dist/
|
|
16
|
+
downloads/
|
|
17
|
+
eggs/
|
|
18
|
+
.eggs/
|
|
19
|
+
/lib/
|
|
20
|
+
/lib64/
|
|
21
|
+
parts/
|
|
22
|
+
sdist/
|
|
23
|
+
var/
|
|
24
|
+
wheels/
|
|
25
|
+
share/python-wheels/
|
|
26
|
+
*.egg-info/
|
|
27
|
+
.installed.cfg
|
|
28
|
+
*.egg
|
|
29
|
+
MANIFEST
|
|
30
|
+
|
|
31
|
+
# Installer logs
|
|
32
|
+
pip-log.txt
|
|
33
|
+
pip-delete-this-directory.txt
|
|
34
|
+
|
|
35
|
+
# ============================================================================
|
|
36
|
+
# Virtual Environments
|
|
37
|
+
# ============================================================================
|
|
38
|
+
|
|
39
|
+
.venv/
|
|
40
|
+
venv/
|
|
41
|
+
ENV/
|
|
42
|
+
env/
|
|
43
|
+
env.bak/
|
|
44
|
+
venv.bak/
|
|
45
|
+
|
|
46
|
+
# ============================================================================
|
|
47
|
+
# Poetry / PDM
|
|
48
|
+
# ============================================================================
|
|
49
|
+
|
|
50
|
+
poetry.lock
|
|
51
|
+
.pdm.toml
|
|
52
|
+
.pdm-build/
|
|
53
|
+
|
|
54
|
+
# ============================================================================
|
|
55
|
+
# Testing
|
|
56
|
+
# ============================================================================
|
|
57
|
+
|
|
58
|
+
.pytest_cache/
|
|
59
|
+
.coverage
|
|
60
|
+
.coverage.*
|
|
61
|
+
htmlcov/
|
|
62
|
+
.tox/
|
|
63
|
+
.nox/
|
|
64
|
+
.cache
|
|
65
|
+
nosetests.xml
|
|
66
|
+
coverage.xml
|
|
67
|
+
*.cover
|
|
68
|
+
*.py,cover
|
|
69
|
+
.hypothesis/
|
|
70
|
+
cover/
|
|
71
|
+
|
|
72
|
+
# ============================================================================
|
|
73
|
+
# Type Checking & Linting
|
|
74
|
+
# ============================================================================
|
|
75
|
+
|
|
76
|
+
.mypy_cache/
|
|
77
|
+
.dmypy.json
|
|
78
|
+
dmypy.json
|
|
79
|
+
.pytype/
|
|
80
|
+
.pyre/
|
|
81
|
+
.ruff_cache/
|
|
82
|
+
cython_debug/
|
|
83
|
+
|
|
84
|
+
# ============================================================================
|
|
85
|
+
# IDEs & Editors
|
|
86
|
+
# ============================================================================
|
|
87
|
+
|
|
88
|
+
.idea/
|
|
89
|
+
.vscode/
|
|
90
|
+
*.swp
|
|
91
|
+
*.swo
|
|
92
|
+
*~
|
|
93
|
+
.aider*
|
|
94
|
+
|
|
95
|
+
# ============================================================================
|
|
96
|
+
# OS Files
|
|
97
|
+
# ============================================================================
|
|
98
|
+
|
|
99
|
+
.DS_Store
|
|
100
|
+
Thumbs.db
|
|
101
|
+
|
|
102
|
+
# ============================================================================
|
|
103
|
+
# Project Specific
|
|
104
|
+
# ============================================================================
|
|
105
|
+
|
|
106
|
+
# Runtime workspace - NEVER commit (contains VPN configs, exploits, sensitive data)
|
|
107
|
+
workspace/*
|
|
108
|
+
!workspace/.gitkeep
|
|
109
|
+
|
|
110
|
+
# VPN configuration files (extra safety - never commit these anywhere)
|
|
111
|
+
*.ovpn
|
|
112
|
+
|
|
113
|
+
# Logs
|
|
114
|
+
*.log
|
|
115
|
+
logs/
|
|
116
|
+
|
|
117
|
+
# Environment
|
|
118
|
+
.env
|
|
119
|
+
.env.auth
|
|
120
|
+
|
|
121
|
+
# Agent runs
|
|
122
|
+
agent_runs/
|
|
123
|
+
|
|
124
|
+
# Legacy project files (when running from legacy/)
|
|
125
|
+
config/chatgpt_config.py
|
|
126
|
+
outputs/
|
|
127
|
+
test_history/
|
|
128
|
+
archive/
|
|
129
|
+
|
|
130
|
+
# ============================================================================
|
|
131
|
+
# Local Docker Overrides (for regional mirrors, etc.)
|
|
132
|
+
# ============================================================================
|
|
133
|
+
|
|
134
|
+
Dockerfile.vpn
|
|
135
|
+
docker-compose.override.yml
|
|
136
|
+
vpn-mode.sh
|
|
137
|
+
|
|
138
|
+
# ============================================================================
|
|
139
|
+
# Documentation
|
|
140
|
+
# ============================================================================
|
|
141
|
+
|
|
142
|
+
docs/_build/
|
|
143
|
+
/site
|
|
144
|
+
|
|
145
|
+
# ============================================================================
|
|
146
|
+
# Jupyter
|
|
147
|
+
# ============================================================================
|
|
148
|
+
|
|
149
|
+
.ipynb_checkpoints
|
|
150
|
+
profile_default/
|
|
151
|
+
ipython_config.py
|
|
152
|
+
|
|
153
|
+
# ============================================================================
|
|
154
|
+
# Node / Frontend
|
|
155
|
+
# ============================================================================
|
|
156
|
+
|
|
157
|
+
node_modules/
|
|
158
|
+
rag_db/
|
|
159
|
+
frontend/.next/
|
|
160
|
+
frontend/out/
|
|
161
|
+
frontend/next-env.d.ts
|
|
162
|
+
frontend/*.tsbuildinfo
|
|
163
|
+
|
|
164
|
+
# Dashboard copy bundled into the wheel by hatch_build.py at build time.
|
|
165
|
+
/backend/_dashboard/
|