{"id":"bf5bf7b9-0d4c-4ce3-803e-16837a597e82","entityType":"agent","slug":"clawhub-lraivisto-researchvault","name":"ResearchVault","canonicalUrl":"https://www.xpersona.co/agent/clawhub-lraivisto-researchvault","canonicalPath":"/agent/clawhub-lraivisto-researchvault","generatedAt":"2026-10-09T17:32:23.126Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T04:00:47.039Z","emptyReason":null},"description":"Local-first research orchestration engine. Manages state, synthesis, and optional background services (MCP/Watchdog).","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 5.4K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17bn1wpkp680gff3pyzyw2v1s84c3ne:researchvault","sourceUrl":"https://clawhub.ai/lraivisto/researchvault","homepage":"https://clawhub.ai/lraivisto/skills/researchvault","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/lraivisto/researchvault","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/lraivisto/skills/researchvault","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":75,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"ResearchVault technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T04:00:47.039Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T04:00:47.039Z","emptyReason":null},"stars":null,"forks":null,"downloads":5448,"packageName":null,"latestVersion":"3.0.5","tractionLabel":"5.4K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T04:00:47.039Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T04:00:47.039Z","lastCrawledAt":"2026-10-09T04:00:47.039Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T04:00:47.039Z","lastVerifiedAt":null,"highlights":[{"version":"3.0.5","createdAt":"2026-02-16T12:38:20.096Z","changelog":"Removed install action mismatch, removed OpenClaw DB access from portal, and removed subprocess secret injection behavior.","fileCount":74,"zipByteSize":159390},{"version":"3.0.4","createdAt":"2026-02-16T12:12:40.143Z","changelog":"Manifest schema alignment, DB root policy hardening, strict OpenClaw scan gating, and env-only secret handling.","fileCount":74,"zipByteSize":162423},{"version":"v3.0.3","createdAt":"2026-02-16T11:53:02.264Z","changelog":"**v3.0.3: Portal authentication, secret management, and environment revamp** - Switched Portal backend authentication to rely solely on the RESEARCHVAULT_PORTAL_TOKEN environment variable. - Added/updated environment variables for finer-grained Portal control (state dir, PID dir, allowlist bypass, cookie settings, etc). - Enhanced secret management: new options for persisting and injecting provider secrets, plus improved secrets storage location and test coverage. - Expanded documentation of environment variables in SKILL.md for clarity and precision. - Updated backend/frontend components to support improved configuration, diagnostics, and secret handling. - Added a test file for Portal secret controls (tests/test_portal_secret_controls.py).","fileCount":73,"zipByteSize":162009},{"version":"v3.0.1","createdAt":"2026-02-16T11:17:19.338Z","changelog":"- Added new environment variables for Portal configuration, including options for scanning workspace memory, persisting and injecting secrets, fixed authentication tokens, and additional search providers (SERPER_API_KEY, SEARXNG_BASE_URL). - Updated SKILL.md to document the new environment variables and their descriptions. - Minor backend and test adjustments to support new configuration options and enhance flexibility.","fileCount":72,"zipByteSize":157632},{"version":"v3.0.0","createdAt":"2026-02-16T10:47:19.083Z","changelog":"Major release: introduces a local web portal for managing ResearchVault. - Added new web portal with separate backend (FastAPI) and frontend (Vite/React) for local research management. - Frontend and backend can be started via `./start_portal.sh` with browser-based token login. - Portal enforces the same strong SSRF/networking protections as the CLI, with explicit user opt-in to private network access. - Updated documentation to cover portal usage, endpoints, and parity with CLI security. - Internal codebase expanded and refactored to support portal APIs, state management, and secure token handling.","fileCount":72,"zipByteSize":157105},{"version":"2.6.2","createdAt":"2026-02-10T20:36:03.783Z","changelog":"Security hardening: strict SSRF protection, isolated background services, and finalized metadata transparency for ClawHub.","fileCount":18,"zipByteSize":42479},{"version":"2.6.1","createdAt":"2026-02-10T20:22:13.043Z","changelog":"Security hardening: formalized environment requirements, gated network services, and improved metadata transparency.","fileCount":38,"zipByteSize":55470},{"version":"2.6.0","createdAt":"2026-02-10T20:04:03.580Z","changelog":"Security hardening: removed portal, added strict I/O contracts, disabled autonomous model invocation, and formalized local-first storage.","fileCount":16,"zipByteSize":40435}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17bn1wpkp680gff3pyzyw2v1s84c3ne:researchvault","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17bn1wpkp680gff3pyzyw2v1s84c3ne:researchvault` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/lraivisto/researchvault before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lraivisto-researchvault/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lraivisto-researchvault/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lraivisto-researchvault/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-lraivisto-researchvault/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-lraivisto-researchvault/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-lraivisto-researchvault/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T17:32:23.122Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lraivisto-researchvault/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lraivisto-researchvault/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lraivisto-researchvault/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-lraivisto-researchvault/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T04:00:47.039Z","emptyReason":null},"readme":"Skill: ResearchVault\n\nOwner: lraivisto\n\nSummary: Local-first research orchestration engine. Manages state, synthesis, and optional background services (MCP/Watchdog).\n\nTags: agent:2.4.1, latest:3.0.5, memory:2.4.1, research:2.4.1\n\nVersion history:\n\nv3.0.5 | 2026-02-16T12:38:20.096Z | user\n\nRemoved install action mismatch, removed OpenClaw DB access from portal, and removed subprocess secret injection behavior.\n\nv3.0.4 | 2026-02-16T12:12:40.143Z | user\n\nManifest schema alignment, DB root policy hardening, strict OpenClaw scan gating, and env-only secret handling.\n\nvv3.0.3 | 2026-02-16T11:53:02.264Z | auto\n\n**v3.0.3: Portal authentication, secret management, and environment revamp**\n\n- Switched Portal backend authentication to rely solely on the RESEARCHVAULT_PORTAL_TOKEN environment variable.\n- Added/updated environment variables for finer-grained Portal control (state dir, PID dir, allowlist bypass, cookie settings, etc).\n- Enhanced secret management: new options for persisting and injecting provider secrets, plus improved secrets storage location and test coverage.\n- Expanded documentation of environment variables in SKILL.md for clarity and precision.\n- Updated backend/frontend components to support improved configuration, diagnostics, and secret handling.\n- Added a test file for Portal secret controls (tests/test_portal_secret_controls.py).\n\nvv3.0.1 | 2026-02-16T11:17:19.338Z | auto\n\n- Added new environment variables for Portal configuration, including options for scanning workspace memory, persisting and injecting secrets, fixed authentication tokens, and additional search providers (SERPER_API_KEY, SEARXNG_BASE_URL).\n- Updated SKILL.md to document the new environment variables and their descriptions.\n- Minor backend and test adjustments to support new configuration options and enhance flexibility.\n\nvv3.0.0 | 2026-02-16T10:47:19.083Z | auto\n\nMajor release: introduces a local web portal for managing ResearchVault.\n\n- Added new web portal with separate backend (FastAPI) and frontend (Vite/React) for local research management.\n- Frontend and backend can be started via `./start_portal.sh` with browser-based token login.\n- Portal enforces the same strong SSRF/networking protections as the CLI, with explicit user opt-in to private network access.\n- Updated documentation to cover portal usage, endpoints, and parity with CLI security.\n- Internal codebase expanded and refactored to support portal APIs, state management, and secure token handling.\n\nv2.6.2 | 2026-02-10T20:36:03.783Z | user\n\nSecurity hardening: strict SSRF protection, isolated background services, and finalized metadata transparency for ClawHub.\n\nv2.6.1 | 2026-02-10T20:22:13.043Z | user\n\nSecurity hardening: formalized environment requirements, gated network services, and improved metadata transparency.\n\nv2.6.0 | 2026-02-10T20:04:03.580Z | user\n\nSecurity hardening: removed portal, added strict I/O contracts, disabled autonomous model invocation, and formalized local-first storage.\n\nv2.5.2 | 2026-02-07T16:25:38.116Z | user\n\nSecurity Hardening: path sanitization and enhanced scrubbing\n\nv2.5.1 | 2026-02-07T12:34:21.689Z | user\n\nFixing display name.\n\nv2.5.0 | 2026-02-07T12:31:15.180Z | user\n\nAutonomous Strategist release.\n\nv2.4.1 | 2026-02-05T20:59:09.814Z | user\n\nStandardized metadata.\n\nv2.3.5 | 2026-02-05T20:51:45.360Z | user\n\nFinal sync.\n\nv2.3.4 | 2026-02-05T20:51:30.161Z | user\n\nFinal sync.\n\nv2.3.3 | 2026-02-05T20:51:17.711Z | user\n\nFinal sync.\n\nv2.3.2 | 2026-02-05T20:51:02.781Z | user\n\nFinal sync.\n\nv2.3.1 | 2026-02-05T20:50:52.485Z | user\n\nFinal sync.\n\nv2.3.0 | 2026-02-05T20:50:19.089Z | user\n\nFinal sync.\n\nv2.2.9 | 2026-02-05T20:50:02.982Z | user\n\nFinal sync.\n\nv2.2.8 | 2026-02-05T20:49:52.754Z | user\n\nFinal sync.\n\nv2.2.7 | 2026-02-05T20:49:31.500Z | user\n\nFinal sync.\n\nv2.2.6 | 2026-02-05T20:49:20.114Z | user\n\nFinal sync.\n\nv2.2.5 | 2026-02-05T20:49:05.816Z | user\n\nFinal sync.\n\nv2.2.4 | 2026-02-05T20:48:55.201Z | user\n\nFinal sync.\n\nv2.2.3 | 2026-02-05T20:48:05.813Z | user\n\nFinal sync.\n\nv2.2.2 | 2026-02-05T20:47:52.637Z | user\n\nFinal sync.\n\nv2.2.1 | 2026-02-05T20:47:15.005Z | user\n\nFinal metadata sync.\n\nv2.2.0 | 2026-02-05T20:47:02.431Z | user\n\nFinal v2 metadata sync.\n\nv2.1.9 | 2026-02-05T20:46:48.595Z | user\n\nFinal sync.\n\nv2.1.8 | 2026-02-05T20:46:34.752Z | user\n\nFinal attempt.\n\nv2.1.7 | 2026-02-05T20:46:17.883Z | user\n\nMetadata update.\n\nv2.1.6 | 2026-02-05T20:46:01.537Z | user\n\nFinal sync.\n\nv2.1.5 | 2026-02-05T20:45:26.381Z | user\n\nFinal attempt.\n\nv2.1.4 | 2026-02-05T20:45:11.371Z | user\n\nMetadata finalization.\n\nv2.1.3 | 2026-02-05T20:45:00.668Z | user\n\nFinal v2 sync.\n\nv2.1.2 | 2026-02-05T20:44:30.625Z | user\n\nMetadata sync.\n\nv2.1.1 | 2026-02-05T20:43:45.225Z | user\n\nMetadata update.\n\nv2.1.0 | 2026-02-05T20:42:00.867Z | user\n\nv2.1.0: Full Skill integration. Added OpenClaw metadata, automated venv installation steps, and finalized Mind Update feature docs in SKILL.md.\n\nv2.0.5 | 2026-02-05T20:22:26.976Z | user\n\nRegistry recovery sync.\n\nv2.0.3 | 2026-02-05T20:15:58.821Z | user\n\nClawHub Sync\n\nv2.0.2 | 2026-02-05T20:15:39.963Z | user\n\nFinal v2 sync.\n\nv2.0.1 | 2026-02-05T20:15:23.125Z | user\n\nMetadata sync + v2.0.0 features.\n\nv2.0.0 | 2026-02-05T20:11:51.511Z | user\n\nv2.0.0 (The Mind Update): Full autonomous research brain features including Divergent Reasoning (Branches), Synthesis Engine, Active Verification Protocol, Watchdog Mode, and native MCP Server support.\n\nv1.2.0 | 2026-02-03T20:45:30.394Z | user\n\nv1.2.0 - Security & Orchestration Update\n\nv1.1.2 | 2026-02-02T18:28:27.775Z | user\n\nv1.1.2: Unified Ingestion Engine, Grokipedia/YouTube Connectors, and Schema v3.\n\nv1.0.0 | 2026-02-02T11:17:10.630Z | auto\n\n- Initial release of Vault, a local orchestration engine for managing long-running research tasks.\n- Core functions include project initialization, multi-source research workflows, and sub-agent pulse logging.\n- Integrates with X (Twitter), Reddit, and Moltbook for diversified research inputs, including a unique \"Suspicion Protocol\" for Moltbook data.\n- Provides status monitoring and maintains all research events in a local SQLite database.\n- Ensures research data privacy by excluding the database from version control.\n\nArchive index:\n\nArchive v3.0.5: 74 files, 159390 bytes\n\nFiles: CHANGELOG.md (2613b), CONTRIBUTING.md (550b), main.py (92b), portal/backend/app/auth.py (3263b), portal/backend/app/db_resolver.py (8839b), portal/backend/app/db_roots.py (2082b), portal/backend/app/main.py (1772b), portal/backend/app/portal_secrets.py (2624b), portal/backend/app/portal_state.py (2202b), portal/backend/app/routers/auth.py (1272b), portal/backend/app/routers/system.py (19003b), portal/backend/app/routers/vault.py (14203b), portal/backend/app/vault_exec.py (4312b), portal/frontend/eslint.config.js (489b), portal/frontend/index.html (397b), portal/frontend/package-lock.json (165304b), portal/frontend/package.json (1016b), portal/frontend/postcss.config.js (93b), portal/frontend/src/App.tsx (77924b), portal/frontend/src/components/DecryptedText.tsx (2200b), portal/frontend/src/components/DiagnosticsPanel.tsx (15283b), portal/frontend/src/components/GraphView.tsx (10153b), portal/frontend/src/components/ResearchPulseBar.tsx (6438b), portal/frontend/src/components/SpotlightCard.tsx (1349b), portal/frontend/src/config.ts (392b), portal/frontend/src/index.css (794b), portal/frontend/src/lib/api.ts (5401b), portal/frontend/src/lib/usePortalStream.ts (5037b), portal/frontend/src/main.tsx (245b), portal/frontend/src/vite-env.d.ts (39b), portal/frontend/tailwind.config.js (1297b), portal/frontend/tsconfig.json (887b), portal/frontend/tsconfig.node.json (252b), portal/frontend/vite.config.ts (291b), pyproject.toml (584b), README.md (4043b), run_portal.py (542b), scripts/__init__.py (0b), scripts/core.py (32701b), scripts/db.py (14601b), scripts/scuttle.py (13649b), scripts/services/heartbeat_scuttle.py (757b), scripts/services/mcp_server.py (5938b), scripts/services/watchdog.py (6860b), scripts/strategy.py (22786b), scripts/synthesis.py (9387b), scripts/vault.py (51628b), SECURITY.md (1039b), SKILL.md (6093b), start_portal.sh (12590b), tests/__init__.py (0b), tests/conftest.py (1360b), tests/exploit_ssrf.py (2479b), tests/test_branches.py (1954b), tests/test_core.py (2392b), tests/test_db.py (4394b), tests/test_grokipedia.py (1187b), tests/test_ingest_service.py (1543b), tests/test_lock.py (1147b), tests/test_mcp_server.py (2113b), tests/test_portal_auth.py (1741b), tests/test_portal_cors.py (1115b), tests/test_portal_db_resolver.py (6316b), tests/test_portal_logic.py (352b), tests/test_portal_secret_controls.py (4786b), tests/test_scrubbing.py (1344b), tests/test_scuttle.py (782b), tests/test_smoke_cli.py (3828b), tests/test_strategy.py (4613b), tests/test_synthesis.py (2113b), tests/test_verification.py (1792b), tests/test_watchdog.py (2686b), tests/test_youtube.py (1308b), _meta.json (132b)\n\nFile v3.0.5:SKILL.md\n\n---\nname: researchvault\ndescription: \"Local-first research orchestration engine. Manages state, synthesis, and optional background services (MCP/Watchdog).\"\nhomepage: https://github.com/lraivisto/ResearchVault\ndisable-model-invocation: true\nuser-invocable: true\nmetadata:\n  openclaw:\n    emoji: \"🦞\"\n    requires:\n      python: \">=3.13\"\n      env:\n        RESEARCHVAULT_DB:\n          description: \"Optional: Custom path to the SQLite database file.\"\n          required: false\n        BRAVE_API_KEY:\n          description: \"Optional: Brave Search API key.\"\n          required: false\n        SERPER_API_KEY:\n          description: \"Optional: Serper API key.\"\n          required: false\n        SEARXNG_BASE_URL:\n          description: \"Optional: SearXNG base URL.\"\n          required: false\n        RESEARCHVAULT_PORTAL_TOKEN:\n          description: \"Optional: static portal token. If unset, start_portal.sh sources/generates .portal_auth and exports this env var.\"\n          required: false\n        RESEARCHVAULT_PORTAL_ALLOWED_DB_ROOTS:\n          description: \"Optional: comma-separated absolute DB roots. Default: ~/.researchvault,/tmp.\"\n          required: false\n        RESEARCHVAULT_PORTAL_STATE_DIR:\n          description: \"Optional: portal state directory (default ~/.researchvault/portal).\"\n          required: false\n        RESEARCHVAULT_PORTAL_HOST:\n          description: \"Optional: backend bind host.\"\n          required: false\n        RESEARCHVAULT_PORTAL_PORT:\n          description: \"Optional: backend bind port.\"\n          required: false\n        RESEARCHVAULT_PORTAL_FRONTEND_HOST:\n          description: \"Optional: frontend bind host.\"\n          required: false\n        RESEARCHVAULT_PORTAL_FRONTEND_PORT:\n          description: \"Optional: frontend bind port.\"\n          required: false\n        RESEARCHVAULT_PORTAL_CORS_ORIGINS:\n          description: \"Optional: comma-separated CORS origins for backend.\"\n          required: false\n        RESEARCHVAULT_PORTAL_RELOAD:\n          description: \"Optional: set to 'true' for backend auto-reload.\"\n          required: false\n        RESEARCHVAULT_PORTAL_COOKIE_SECURE:\n          description: \"Optional: set to 'true' to mark auth cookie Secure.\"\n          required: false\n        RESEARCHVAULT_PORTAL_PID_DIR:\n          description: \"Optional: start_portal.sh PID/log directory.\"\n          required: false\n        RESEARCHVAULT_PORTAL_SHOW_TOKEN:\n          description: \"Optional: set to '1' to print tokenized portal URLs.\"\n          required: false\n        RESEARCHVAULT_SEARCH_PROVIDERS:\n          description: \"Optional: search provider order override.\"\n          required: false\n        RESEARCHVAULT_WATCHDOG_INGEST_TOP:\n          description: \"Optional: watchdog ingest top-k override.\"\n          required: false\n        RESEARCHVAULT_VERIFY_INGEST_TOP:\n          description: \"Optional: verify ingest top-k override.\"\n          required: false\n        RESEARCHVAULT_MCP_TRANSPORT:\n          description: \"Optional: MCP server transport override.\"\n          required: false\n        REQUESTS_CA_BUNDLE:\n          description: \"Optional: custom CA bundle for HTTPS verification.\"\n          required: false\n        SSL_CERT_FILE:\n          description: \"Optional: custom CA certificate file.\"\n          required: false\n---\n\n# ResearchVault 🦞\n\n**Local-first research orchestration engine.**\n\nResearchVault manages persistent state, synthesis, and autonomous verification for agents.\n\n## Security & Privacy (Local First)\n\n- **Local Storage**: All data is stored in a local SQLite database (~/.researchvault/research_vault.db). No cloud sync.\n- **Network Transparency**: Outbound connections occur ONLY for user-requested research or Brave Search (if configured). \n- **SSRF Hardening**: Strict internal network blocking by default. Local/private IPs (localhost, 10.0.0.0/8, etc.) are blocked. Use `--allow-private-networks` to override.\n- **Manual Opt-in Services**: Background watchers and MCP servers are in `scripts/services/` and must be started manually.\n- **Strict Control**: `disable-model-invocation: true` prevents the model from autonomously starting background tasks.\n\n## Installation\n\n```bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -e .\n```\n\n## Quick Start\n\n1. **Initialize Project**:\n   ```bash\n   python scripts/vault.py init --objective \"Analyze AI trends\" --name \"Trends-2026\"\n   ```\n\n2. **Ingest Data**:\n   ```bash\n   python scripts/vault.py scuttle \"https://example.com\" --id \"trends-2026\"\n   ```\n\n3. **Autonomous Strategist**:\n   ```bash\n   python scripts/vault.py strategy --id \"trends-2026\"\n   ```\n\n## Portal (Manual Opt-In)\n\nStart the portal explicitly:\n\n```bash\n./start_portal.sh\n```\n\n- Backend: `127.0.0.1:8000`\n- Frontend: `127.0.0.1:5173`\n- Backend auth strictly uses `RESEARCHVAULT_PORTAL_TOKEN`\n- `./start_portal.sh` loads/generates `.portal_auth` and exports `RESEARCHVAULT_PORTAL_TOKEN` before backend launch\n- Token login: URL hash `#token=<token>` (token from `.portal_auth`)\n- Allowed DB roots are controlled by `RESEARCHVAULT_PORTAL_ALLOWED_DB_ROOTS` (default `~/.researchvault,/tmp`)\n- OpenClaw workspace DBs are never discovered or selectable in Portal mode\n- Provider secrets are env-only (`BRAVE_API_KEY`, `SERPER_API_KEY`, `SEARXNG_BASE_URL`) and are not injected into vault subprocesses\n- Both hosts are supported for browser access:\n  - `http://127.0.0.1:5173/#token=<token>`\n  - `http://localhost:5173/#token=<token>`\n\nOperational commands:\n\n```bash\n./start_portal.sh --status\n./start_portal.sh --stop\n```\n\nSecurity parity with CLI:\n- SSRF blocking is on by default (private/local/link-local targets denied).\n- Portal toggle **Allow private networks** is equivalent to CLI `--allow-private-networks`.\n\n## Optional Services (Manual Start)\n\n- **MCP Server**: `python scripts/services/mcp_server.py`\n- **Watchdog**: `python scripts/services/watchdog.py --once`\n\n## Provenance & Maintenance\n\n- **Maintainer**: lraivisto\n- **License**: MIT\n- **Issues**: [GitHub Issues](https://github.com/lraivisto/ResearchVault/issues)\n- **Security**: See [SECURITY.md](SECURITY.md)\n\nFile v3.0.5:README.md\n\n# ResearchVault 🦞\n\n**The local-first orchestration engine for high-velocity AI research.**\n\nResearchVault is a local-first state manager and orchestration framework for long-running investigations. It lets you persist projects, findings, evidence, and automation state into a local SQLite \"Vault\".\n\nVault is built CLI-first to close the loop between planning, ingestion, verification, and synthesis.\n\n## 🛡️ Security & Privacy\n\nResearchVault is designed with a **Local-First, Privacy-First** posture:\n\n*   **Local Persistence**: All research data stays on your machine in a local SQLite database (~/.researchvault/research_vault.db). No telemetry or auto-sync.\n*   **SSRF Protection**: Strict internal network blocking by default. The tool resolves DNS and blocks private/local/link-local IPs (RFC1918, 127.0.0.1, 169.254.169.254, etc.).\n*   **Network Transparency**: Outbound connections are limited to user-requested scuttling or Brave Search API (if configured).\n*   **Zero Auto-Start**: No background processes or servers start during installation. Services must be explicitly invoked from `scripts/services/`.\n*   **Restricted Model Invocation**: The `disable-model-invocation: true` flag prevents the AI from autonomously triggering side-effects without a direct user prompt.\n\n## 🚀 Installation\n\n### Standard (Recommended)\n```bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -e .\n```\n\n## 🌐 Portal (v3)\n\nRun the portal manually (nothing auto-starts in the background):\n\n```bash\n./start_portal.sh\n```\n\n- Backend binds to `127.0.0.1:8000`\n- Frontend binds to `127.0.0.1:5173`\n- Backend auth strictly uses `RESEARCHVAULT_PORTAL_TOKEN`.\n- `./start_portal.sh` loads token from `.portal_auth` (or generates it) and exports `RESEARCHVAULT_PORTAL_TOKEN` before launching the backend.\n- Use either host for login:\n  - `http://127.0.0.1:5173/#token=<token>`\n  - `http://localhost:5173/#token=<token>`\n- Tokenized URLs are hidden in terminal output by default; read `.portal_auth` (chmod 600) to paste the token manually, or set `RESEARCHVAULT_PORTAL_SHOW_TOKEN=1` to print tokenized URLs.\n- Allowed DB roots are constrained by `RESEARCHVAULT_PORTAL_ALLOWED_DB_ROOTS` (default `~/.researchvault,/tmp`).\n- OpenClaw workspace DB discovery and selection are disabled in Portal mode (paths under `~/.openclaw/workspace` are rejected).\n- Search provider secrets are env-only (read-only in Portal): configure `BRAVE_API_KEY`, `SERPER_API_KEY`, and/or `SEARXNG_BASE_URL` in the backend process environment.\n- Provider secrets are never injected by Portal into vault subprocesses.\n\nProcess controls:\n\n```bash\n./start_portal.sh --status\n./start_portal.sh --stop\n```\n\nIngest SSRF behavior matches CLI defaults:\n- Private/local/link-local targets are blocked by default.\n- Portal checkbox **Allow private networks** maps to CLI `--allow-private-networks`.\n\n## 🛠️ Key Workflows\n\n### 1. Project Management\n```bash\npython scripts/vault.py init --id \"ai-research\" --name \"AI Research\" --objective \"Monitor 2026 trends\"\n```\n\n### 2. Multi-Source Ingestion\n```bash\npython scripts/vault.py scuttle \"https://example.com\" --id \"ai-research\"\n```\n\n### 3. Synthesis & Verification\n```bash\npython scripts/vault.py synthesize --id \"ai-research\"\npython scripts/vault.py verify run --id \"ai-research\"\n```\n\n### 4. Optional Services (Manual Opt-in)\n*   **MCP Server**: `python scripts/services/mcp_server.py`\n*   **Watchdog**: `python scripts/services/watchdog.py`\n\n## 📦 Dependencies\n\n*   `requests` & `beautifulsoup4`: Targeted web ingestion.\n*   `rich`: CLI output formatting.\n*   `mcp`: Standard protocol for agent-tool communication.\n*   `pytest`: Local integrity verification.\n\n## ⚖️ License & Provenance\n\n- **Maintainer**: lraivisto\n- **License**: MIT\n- **Issues**: [GitHub Issues](https://github.com/lraivisto/ResearchVault/issues)\n- **Releases**: [Changelog](CHANGELOG.md)\n\n---\n*This project is 100% developed by AI agents (OpenClaw / Google Antigravity / OpenAI Codex), carefully orchestrated and reviewed by **Luka Raivisto**.*\n\nFile v3.0.5:_meta.json\n\n{\n  \"ownerId\": \"kn74ffp19fwws5d0f9mr856weh80a5n5\",\n  \"slug\": \"researchvault\",\n  \"version\": \"3.0.5\",\n  \"publishedAt\": 1771245500096\n}\n\nFile v3.0.5:CHANGELOG.md\n\n# Changelog\n\n## [3.0.5] - 2026-02-16\n\n### Security\n- Manifest coherence hardening: removed the frontmatter install action from `SKILL.md`, leaving installation as explicit documentation-only shell steps.\n- Removed Portal OpenClaw workspace DB behavior: paths under `~/.openclaw/workspace` are denylisted and cannot be discovered or selected, even when custom DB roots are configured.\n- Removed Portal provider secret injection behavior: Portal no longer forwards provider secrets into vault subprocess environments.\n- Updated portal diagnostics/frontend/docs to match the stricter defaults and removed stale OpenClaw/injection status surfaces.\n- Added/updated regression tests covering OpenClaw path denylisting and no-secret-injection subprocess behavior.\n\n## [3.0.4] - 2026-02-16\n\n### Security\n- Registry manifest transparency: moved install/env metadata to `metadata.openclaw.install` and `metadata.openclaw.requires.env` so ClawHub-visible fields match behavior.\n- DB root enforcement hardened: removed `RESEARCHVAULT_PORTAL_ALLOW_ANY_DB` bypass and introduced `RESEARCHVAULT_PORTAL_ALLOWED_DB_ROOTS` as the only DB root policy input.\n- OpenClaw DB scope tightened with explicit gating under allowed DB roots.\n- Secrets handling hardened: portal secret persistence/write APIs are disabled; provider secrets are env-only.\n- Portal auth consistency: backend remains strict on `RESEARCHVAULT_PORTAL_TOKEN`; `start_portal.sh` now always initializes/exports the token from `.portal_auth` and avoids printing tokenized URLs unless explicitly requested.\n- Added regression tests for DB root enforcement, token strictness, and env-only secret behavior.\n\n## [2.6.2] - 2026-02-10\n\n### Security\n- **SSRF Hardening**: Implemented strict DNS resolution and IP verification in `scuttle`. Blocks private, local, and link-local addresses by default.\n- **Service Isolation**: Moved background services (MCP, Watchdog) to `scripts/services/` to reduce default capability surface.\n- **Transparency**: Added `SECURITY.md` and updated `SKILL.md` manifest to explicitly declare optional environment variables.\n- **Model Gating**: Explicitly set `disable-model-invocation: true` at the registry manifest level to prevent autonomous AI side-effects.\n\n### Added\n- `--allow-private-networks` flag for `vault scuttle` to allow fetching from local addresses when explicitly requested by user.\n- Comprehensive provenance info: `LICENSE`, `CONTRIBUTING.md`, and project `homepage`.\n\n### Fixed\n- Registry metadata mismatch: standardized frontmatter keys for ClawHub compatibility.\n- Removed `uv` requirement from primary installation path.\n\nFile v3.0.5:CONTRIBUTING.md\n\n# Contributing to ResearchVault\n\nWelcome! We appreciate your help in making ResearchVault better.\n\n## How to Contribute\n\n1.  **Report Bugs**: Open an issue on GitHub.\n2.  **Suggest Features**: Open an issue to discuss.\n3.  **Submit Pull Requests**:\n    *   Fork the repository.\n    *   Create a feature branch.\n    *   Ensure all tests pass (`pytest`).\n    *   Submit a PR with a clear description of changes.\n\n## Security Considerations\n\nSince this tool handles web ingestion, please prioritize SSRF safety and data scrubbing in your contributions.\n\nFile v3.0.5:SECURITY.md\n\n# Security Policy\n\n## Reporting a Vulnerability\n\nWe take security seriously. If you find a vulnerability, please report it via [GitHub Issues](https://github.com/lraivisto/ResearchVault/issues) or contact the maintainer directly.\n\n## Local-First Design\n\nResearchVault is designed to run entirely on your local machine. \n\n*   **SQLite Storage**: Data is stored locally. No cloud synchronization or hidden telemetry.\n*   **SSRF Protection**: The `scuttle` tool resolve DNS and blocks access to internal/private network addresses (RFC1918, localhost, link-local) by default.\n*   **Opt-in Services**: All background processes (Watchdog, MCP server) require manual invocation.\n*   **Restricted Invocation**: The `disable-model-invocation: true` flag is set to prevent AI models from autonomously triggering side-effects without a direct user prompt.\n\n## Network Access\n\nOutbound connections are limited to:\n1. User-provided research URLs.\n2. The Brave Search API (if an API key is explicitly configured).\n\nNo hidden background crawling occurs.\n\nFile v3.0.5:portal/frontend/package-lock.json\n\n{\n    \"name\": \"researchvault-portal\",\n    \"version\": \"0.0.0\",\n    \"lockfileVersion\": 3,\n    \"requires\": true,\n    \"packages\": {\n        \"\": {\n            \"name\": \"researchvault-portal\",\n            \"version\": \"0.0.0\",\n            \"dependencies\": {\n                \"@tanstack/react-query\": \"^5.0.0\",\n                \"clsx\": \"^2.0.0\",\n                \"framer-motion\": \"^10.16.4\",\n                \"lucide-react\": \"^0.292.0\",\n                \"react\": \"^18.2.0\",\n                \"react-dom\": \"^18.2.0\",\n                \"tailwind-merge\": \"^2.0.0\"\n            },\n            \"devDependencies\": {\n                \"@types/react\": \"^18.2.37\",\n                \"@types/react-dom\": \"^18.2.15\",\n                \"@typescript-eslint/parser\": \"^8.46.3\",\n                \"@vitejs/plugin-react\": \"^4.2.0\",\n                \"autoprefixer\": \"^10.4.16\",\n                \"eslint\": \"^9.39.1\",\n                \"eslint-plugin-react-hooks\": \"^7.0.0\",\n                \"postcss\": \"^8.4.31\",\n                \"tailwindcss\": \"^3.3.5\",\n                \"typescript\": \"^5.2.2\",\n                \"vite\": \"^5.0.0\"\n            }\n        },\n        \"node_modules/@alloc/quick-lru\": {\n            \"version\": \"5.2.0\",\n            \"resolved\": \"https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz\",\n            \"integrity\": \"sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=10\"\n            },\n            \"funding\": {\n                \"url\": \"https://github.com/sponsors/sindresorhus\"\n            }\n        },\n        \"node_modules/@babel/code-frame\": {\n            \"version\": \"7.29.0\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz\",\n            \"integrity\": \"sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/helper-validator-identifier\": \"^7.28.5\",\n                \"js-tokens\": \"^4.0.0\",\n                \"picocolors\": \"^1.1.1\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/compat-data\": {\n            \"version\": \"7.29.0\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz\",\n            \"integrity\": \"sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/core\": {\n            \"version\": \"7.29.0\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz\",\n            \"integrity\": \"sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/code-frame\": \"^7.29.0\",\n                \"@babel/generator\": \"^7.29.0\",\n                \"@babel/helper-compilation-targets\": \"^7.28.6\",\n                \"@babel/helper-module-transforms\": \"^7.28.6\",\n                \"@babel/helpers\": \"^7.28.6\",\n                \"@babel/parser\": \"^7.29.0\",\n                \"@babel/template\": \"^7.28.6\",\n                \"@babel/traverse\": \"^7.29.0\",\n                \"@babel/types\": \"^7.29.0\",\n                \"@jridgewell/remapping\": \"^2.3.5\",\n                \"convert-source-map\": \"^2.0.0\",\n                \"debug\": \"^4.1.0\",\n                \"gensync\": \"^1.0.0-beta.2\",\n                \"json5\": \"^2.2.3\",\n                \"semver\": \"^6.3.1\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            },\n            \"funding\": {\n                \"type\": \"opencollective\",\n                \"url\": \"https://opencollective.com/babel\"\n            }\n        },\n        \"node_modules/@babel/generator\": {\n            \"version\": \"7.29.1\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz\",\n            \"integrity\": \"sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/parser\": \"^7.29.0\",\n                \"@babel/types\": \"^7.29.0\",\n                \"@jridgewell/gen-mapping\": \"^0.3.12\",\n                \"@jridgewell/trace-mapping\": \"^0.3.28\",\n                \"jsesc\": \"^3.0.2\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helper-compilation-targets\": {\n            \"version\": \"7.28.6\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz\",\n            \"integrity\": \"sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/compat-data\": \"^7.28.6\",\n                \"@babel/helper-validator-option\": \"^7.27.1\",\n                \"browserslist\": \"^4.24.0\",\n                \"lru-cache\": \"^5.1.1\",\n                \"semver\": \"^6.3.1\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helper-globals\": {\n            \"version\": \"7.28.0\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz\",\n            \"integrity\": \"sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helper-module-imports\": {\n            \"version\": \"7.28.6\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz\",\n            \"integrity\": \"sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/traverse\": \"^7.28.6\",\n                \"@babel/types\": \"^7.28.6\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helper-module-transforms\": {\n            \"version\": \"7.28.6\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz\",\n            \"integrity\": \"sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/helper-module-imports\": \"^7.28.6\",\n                \"@babel/helper-validator-identifier\": \"^7.28.5\",\n                \"@babel/traverse\": \"^7.28.6\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            },\n            \"peerDependencies\": {\n                \"@babel/core\": \"^7.0.0\"\n            }\n        },\n        \"node_modules/@babel/helper-plugin-utils\": {\n            \"version\": \"7.28.6\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz\",\n            \"integrity\": \"sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helper-string-parser\": {\n            \"version\": \"7.27.1\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz\",\n            \"integrity\": \"sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helper-validator-identifier\": {\n            \"version\": \"7.28.5\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz\",\n            \"integrity\": \"sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helper-validator-option\": {\n            \"version\": \"7.27.1\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz\",\n            \"integrity\": \"sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helpers\": {\n            \"version\": \"7.28.6\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz\",\n            \"integrity\": \"sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/template\": \"^7.28.6\",\n                \"@babel/types\": \"^7.28.6\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/parser\": {\n            \"version\": \"7.29.0\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz\",\n            \"integrity\": \"sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/types\": \"^7.29.0\"\n            },\n            \"bin\": {\n                \"parser\": \"bin/babel-parser.js\"\n            },\n            \"engines\": {\n                \"node\": \">=6.0.0\"\n            }\n        },\n        \"node_modules/@babel/plugin-transform-react-jsx-self\": {\n            \"version\": \"7.27.1\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz\",\n            \"integrity\": \"sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/helper-plugin-utils\": \"^7.27.1\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            },\n            \"peerDependencies\": {\n                \"@babel/core\": \"^7.0.0-0\"\n            }\n        },\n        \"node_modules/@babel/plugin-transform-react-jsx-source\": {\n            \"version\": \"7.27.1\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz\",\n            \"integrity\": \"sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/helper-plugin-utils\": \"^7.27.1\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            },\n            \"peerDependencies\": {\n                \"@babel/core\": \"^7.0.0-0\"\n            }\n        },\n        \"node_modules/@babel/template\": {\n            \"version\": \"7.28.6\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz\",\n            \"integrity\": \"sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/code-frame\": \"^7.28.6\",\n                \"@babel/parser\": \"^7.28.6\",\n                \"@babel/types\": \"^7.28.6\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/traverse\": {\n            \"version\": \"7.29.0\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz\",\n            \"integrity\": \"sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/code-frame\": \"^7.29.0\",\n                \"@babel/generator\": \"^7.29.0\",\n                \"@babel/helper-globals\": \"^7.28.0\",\n                \"@babel/parser\": \"^7.29.0\",\n                \"@babel/template\": \"^7.28.6\",\n                \"@babel/types\": \"^7.29.0\",\n                \"debug\": \"^4.3.1\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/types\": {\n            \"version\": \"7.29.0\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz\",\n            \"integrity\": \"sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/helper-string-parser\": \"^7.27.1\",\n                \"@babel/helper-validator-identifier\": \"^7.28.5\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@emotion/is-prop-valid\": {\n            \"version\": \"0.8.8\",\n            \"resolved\": \"https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz\",\n            \"integrity\": \"sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==\",\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"dependencies\": {\n                \"@emotion/memoize\": \"0.7.4\"\n            }\n        },\n        \"node_modules/@emotion/memoize\": {\n            \"version\": \"0.7.4\",\n            \"resolved\": \"https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz\",\n            \"integrity\": \"sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==\",\n            \"license\": \"MIT\",\n            \"optional\": true\n        },\n        \"node_modules/@esbuild/aix-ppc64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz\",\n            \"integrity\": \"sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==\",\n            \"cpu\": [\n                \"ppc64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"aix\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/android-arm\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz\",\n            \"integrity\": \"sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==\",\n            \"cpu\": [\n                \"arm\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"android\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/android-arm64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz\",\n            \"integrity\": \"sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"android\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/android-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"android\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/darwin-arm64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz\",\n            \"integrity\": \"sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"darwin\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/darwin-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"darwin\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/freebsd-arm64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz\",\n            \"integrity\": \"sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"freebsd\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/freebsd-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"freebsd\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-arm\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz\",\n            \"integrity\": \"sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==\",\n            \"cpu\": [\n                \"arm\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-arm64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz\",\n            \"integrity\": \"sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-ia32\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz\",\n            \"integrity\": \"sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==\",\n            \"cpu\": [\n                \"ia32\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-loong64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz\",\n            \"integrity\": \"sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==\",\n            \"cpu\": [\n                \"loong64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-mips64el\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz\",\n            \"integrity\": \"sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==\",\n            \"cpu\": [\n                \"mips64el\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-ppc64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz\",\n            \"integrity\": \"sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==\",\n            \"cpu\": [\n                \"ppc64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-riscv64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz\",\n            \"integrity\": \"sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==\",\n            \"cpu\": [\n                \"riscv64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-s390x\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz\",\n            \"integrity\": \"sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==\",\n            \"cpu\": [\n                \"s390x\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/netbsd-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"netbsd\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/openbsd-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"openbsd\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/sunos-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"sunos\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/win32-arm64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz\",\n            \"integrity\": \"sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"win32\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/win32-ia32\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz\",\n            \"integrity\": \"sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==\",\n            \"cpu\": [\n                \"ia32\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"win32\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/win32-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"win32\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@eslint-community/eslint-utils\": {\n            \"version\": \"4.9.1\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz\",\n            \"integrity\": \"sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"eslint-visitor-keys\": \"^3.4.3\"\n            },\n            \"engines\": {\n                \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n            },\n            \"funding\": {\n                \"url\": \"https://opencollective.com/eslint\"\n            },\n            \"peerDependencies\": {\n                \"eslint\": \"^6.0.0 || ^7.0.0 || >=8.0.0\"\n            }\n        },\n        \"node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys\": {\n            \"version\": \"3.4.3\",\n            \"resolved\": \"https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz\",\n            \"integrity\": \"sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"engines\": {\n                \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n            },\n            \"funding\": {\n                \"url\": \"https://opencollective.com/eslint\"\n            }\n        },\n        \"node_modules/@eslint-community/regexpp\": {\n            \"version\": \"4.12.2\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz\",\n            \"integrity\": \"sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \"^12.0.0 || ^14.0.0 || >=16.0.0\"\n            }\n        },\n        \"node_modules/@eslint/config-array\": {\n            \"version\": \"0.21.1\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz\",\n            \"integrity\": \"sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"dependencies\": {\n                \"@eslint/object-schema\": \"^2.1.7\",\n                \"debug\": \"^4.3.1\",\n                \"minimatch\": \"^3.1.2\"\n            },\n            \"engines\": {\n                \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n            }\n        },\n        \"node_modules/@eslint/config-array/node_modules/brace-expansion\": {\n            \"version\": \"1.1.12\",\n            \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz\",\n            \"integrity\": \"sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"balanced-match\": \"^1.0.0\",\n                \"concat-map\": \"0.0.1\"\n            }\n        },\n        \"node_modules/@eslint/config-array/node_modules/minimatch\": {\n            \"version\": \"3.1.2\",\n            \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz\",\n            \"integrity\": \"sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==\",\n            \"dev\": true,\n            \"license\": \"ISC\",\n            \"dependencies\": {\n                \"brace-expansion\": \"^1.1.7\"\n            },\n            \"engines\": {\n                \"node\": \"*\"\n            }\n        },\n        \"node_modules/@eslint/config-helpers\": {\n            \"version\": \"0.4.2\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz\",\n            \"integrity\": \"sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"dependencies\": {\n                \"@eslint/core\": \"^0.17.0\"\n            },\n            \"engines\": {\n                \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n            }\n        },\n        \"node_modules/@eslint/core\": {\n            \"version\": \"0.17.0\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz\",\n            \"integrity\": \"sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"dependencies\": {\n                \"@types/json-schema\": \"^7.0.15\"\n            },\n            \"engines\": {\n                \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n            }\n        },\n        \"node_modules/@eslint/eslintrc\": {\n            \"version\": \"3.3.3\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz\",\n            \"integrity\": \"sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"ajv\": \"^6.12.4\",\n                \"debug\": \"^4.3.2\",\n                \"espree\": \"^10.0.1\",\n                \"globals\": \"^14.0.0\",\n                \"ignore\": \"^5.2.0\",\n                \"import-fresh\": \"^3.2.1\",\n                \"js-yaml\": \"^4.1.1\",\n                \"minimatch\": \"^3.1.2\",\n                \"strip-json-comments\": \"^3.1.1\"\n            },\n            \"engines\": {\n                \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n            },\n            \"funding\": {\n                \"url\": \"https://opencollective.com/eslint\"\n            }\n        },\n        \"node_modules/@eslint/eslintrc/node_modules/brace-expansion\": {\n            \"version\": \"1.1.12\",\n            \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz\",\n            \"integrity\": \"sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"balanced-match\": \"^1.0.0\",\n                \"concat-map\": \"0.0.1\"\n            }\n        },\n        \"node_modules/@eslint/eslintrc/node_modules/minimatch\": {\n            \"version\": \"3.1.2\",\n            \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz\",\n            \"integrity\": \"sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==\",\n            \"dev\": true,\n            \"license\": \"ISC\",\n            \"dependencies\": {\n                \"brace-expansion\": \"^1.1.7\"\n            },\n            \"engines\": {\n                \"node\": \"*\"\n            }\n        },\n        \"node_modules/@eslint/js\": {\n            \"version\": \"9.39.2\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz\",\n            \"integrity\": \"sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n            },\n            \"funding\": {\n                \"url\": \"https://eslint.org/donate\"\n            }\n        },\n        \"node_modules/@eslint/object-schema\": {\n            \"version\": \"2.1.7\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz\",\n            \"integrity\": \"sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"engines\": {\n                \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n            }\n        },\n        \"node_modules/@eslint/plugin-kit\": {\n            \"version\": \"0.4.1\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz\",\n            \"integrity\": \"sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"dependencies\": {\n                \"@eslint/core\": \"^0.17.0\",\n                \"levn\": \"^0.4.1\"\n            },\n            \"engines\": {\n                \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n            }\n        },\n        \"node_modules/@humanfs/core\": {\n            \"version\": \"0.19.1\",\n            \"resolved\": \"https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz\",\n            \"integrity\": \"sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"engines\": {\n                \"node\": \">=18.18.0\"\n            }\n        },\n        \"node_modules/@humanfs/node\": {\n            \"version\": \"0.16.7\",\n            \"resolved\": \"https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz\",\n            \"integrity\": \"sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"dependencies\": {\n                \"@humanfs/core\": \"^0.19.1\",\n                \"@humanwhocodes/retry\": \"^0.4.0\"\n            },\n            \"engines\": {\n                \"node\": \">=18.18.0\"\n            }\n        },\n        \"node_modules/@humanwhocodes/module-importer\": {\n            \"version\": \"1.0.1\",\n            \"resolved\": \"https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz\",\n            \"integrity\": \"sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"engines\": {\n                \"node\": \">=12.22\"\n            },\n            \"funding\": {\n                \"type\": \"github\",\n                \"url\": \"https://github.com/sponsors/nzakas\"\n            }\n        },\n        \"node_modules/@humanwhocodes/retry\": {\n            \"version\": \"0.4.3\",\n            \"resolved\": \"https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz\",\n            \"integrity\": \"sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"engines\": {\n                \"node\": \">=18.18\"\n            },\n            \"funding\": {\n                \"type\": \"github\",\n                \"url\": \"https://github.com/sponsors/nzakas\"\n            }\n        },\n        \"node_modules/@jridgewell/gen-mapping\": {\n            \"version\": \"0.3.13\",\n            \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz\",\n            \"integrity\": \"sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n                \"@jridgewell/trace-mapping\": \"^0.3.24\"\n            }\n        },\n        \"node_modules/@jridgewell/remapping\": {\n            \"version\": \"2.3.5\",\n            \"resolved\": \"https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz\",\n            \"integrity\": \"sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@jridgewell/gen-mapping\": \"^0.3.5\",\n                \"@jridgewell/trace-mapping\": \"^0.3.24\"\n            }\n        },\n        \"node_modules/@jridgewell/resolve-uri\": {\n            \"version\": \"3.1.2\",\n            \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n            \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=6.0.0\"\n            }\n        },\n        \"node_modules/@jridgewell/sourcemap-codec\": {\n            \"version\": \"1.5.5\",\n            \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz\",\n            \"integrity\": \"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==\",\n            \"dev\": true,\n            \"license\": \"MIT\"\n        },\n        \"node_modules/@jridgewell/trace-mapping\": {\n            \"version\": \"0.3.31\",\n            \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz\",\n            \"integrity\": \"sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@jridgewell/resolve-uri\": \"^3.1.0\",\n                \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n            }\n        },\n        \"node_modules/@nodelib/fs.scandir\": {\n            \"version\": \"2.1.5\",\n            \"resolved\": \"https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz\",\n            \"integrity\": \"sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@nodelib/fs.stat\": \"2.0.5\",\n                \"run-parallel\": \"^1.1.9\"\n            },\n            \"engines\": {\n                \"node\": \">= 8\"\n            }\n        },\n        \"node_modules/@nodelib/fs.stat\": {\n            \"version\": \"2.0.5\",\n            \"resolved\": \"https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz\",\n            \"integrity\": \"sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">= 8\"\n            }\n        },\n        \"node_modules/@nodelib/fs.walk\": {\n            \"version\": \"1.2.8\",\n            \"resolved\": \"https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz\",\n            \"integrity\": \"sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@nodelib/fs.scandir\": \"2.1.5\",\n                \"fastq\": \"^1.6.0\"\n            },\n            \"engines\": {\n                \"node\": \">= 8\"\n            }\n        },\n        \"node_modules/@rolldown/pluginutils\": {\n            \"version\": \"1.0.0-beta.27\",\n            \"resolved\": \"https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz\",\n            \"integrity\": \"sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==\",\n            \"dev\": true,\n            \"license\": \"MIT\"\n        },\n        \"node_modules/@rollup/rollup-android-arm-eabi\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz\",\n            \"integrity\": \"sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==\",\n            \"cpu\": [\n                \"arm\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"android\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-android-arm64\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz\",\n            \"integrity\": \"sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"android\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-darwin-arm64\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz\",\n            \"integrity\": \"sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"darwin\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-darwin-x64\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz\",\n            \"integrity\": \"sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"darwin\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-freebsd-arm64\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz\",\n            \"integrity\": \"sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"freebsd\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-freebsd-x64\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz\",\n            \"integrity\": \"sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"freebsd\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz\",\n            \"integrity\": \"sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==\",\n            \"cpu\": [\n                \"arm\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz\",\n            \"integrity\": \"sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==\",\n            \"cpu\": [\n                \"arm\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz\",\n            \"integrity\": \"sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz\",\n            \"integrity\": \"sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-linux-loong64-gnu\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz\",\n            \"integrity\": \"sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==\",\n            \"cpu\": [\n                \"loong64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-linux-loong64-musl\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz\",\n            \"integrity\": \"sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==\",\n            \"cpu\": [\n                \"loong64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-linux-ppc64-gnu\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz\",\n            \"integrity\": \"sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==\",\n            \"cpu\": [\n                \"ppc64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n\n\nFile v3.0.5:portal/frontend/package.json\n\n{\n    \"name\": \"researchvault-portal\",\n    \"private\": true,\n    \"version\": \"0.0.0\",\n    \"type\": \"module\",\n    \"scripts\": {\n        \"dev\": \"vite\",\n        \"build\": \"tsc && vite build\",\n        \"lint\": \"eslint . --ext ts,tsx --max-warnings 0\",\n        \"typecheck\": \"tsc --noEmit\",\n        \"preview\": \"vite preview\"\n    },\n    \"dependencies\": {\n        \"react\": \"^18.2.0\",\n        \"react-dom\": \"^18.2.0\",\n        \"@tanstack/react-query\": \"^5.0.0\",\n        \"lucide-react\": \"^0.292.0\",\n        \"clsx\": \"^2.0.0\",\n        \"tailwind-merge\": \"^2.0.0\",\n        \"framer-motion\": \"^10.16.4\"\n    },\n    \"devDependencies\": {\n        \"@types/react\": \"^18.2.37\",\n        \"@types/react-dom\": \"^18.2.15\",\n        \"@typescript-eslint/parser\": \"^8.46.3\",\n        \"@vitejs/plugin-react\": \"^4.2.0\",\n        \"typescript\": \"^5.2.2\",\n        \"vite\": \"^5.0.0\",\n        \"autoprefixer\": \"^10.4.16\",\n        \"eslint\": \"^9.39.1\",\n        \"eslint-plugin-react-hooks\": \"^7.0.0\",\n        \"postcss\": \"^8.4.31\",\n        \"tailwindcss\": \"^3.3.5\"\n    }\n}\n\nFile v3.0.5:portal/frontend/tsconfig.json\n\n{\n    \"compilerOptions\": {\n        \"target\": \"ES2020\",\n        \"useDefineForClassFields\": true,\n        \"lib\": [\n            \"ES2020\",\n            \"DOM\",\n            \"DOM.Iterable\"\n        ],\n        \"module\": \"ESNext\",\n        \"skipLibCheck\": true,\n        /* Bundler mode */\n        \"moduleResolution\": \"bundler\",\n        \"allowImportingTsExtensions\": true,\n        \"resolveJsonModule\": true,\n        \"isolatedModules\": true,\n        \"noEmit\": true,\n        \"jsx\": \"react-jsx\",\n        /* Linting */\n        \"strict\": true,\n        \"noUnusedLocals\": true,\n        \"noUnusedParameters\": true,\n        \"noFallthroughCasesInSwitch\": true,\n        \"baseUrl\": \".\",\n        \"paths\": {\n            \"@/*\": [\n                \"./src/*\"\n            ]\n        }\n    },\n    \"include\": [\n        \"src\"\n    ],\n    \"references\": [\n        {\n            \"path\": \"./tsconfig.node.json\"\n        }\n    ]\n}\n\nFile v3.0.5:portal/frontend/tsconfig.node.json\n\n{\n    \"compilerOptions\": {\n        \"composite\": true,\n        \"skipLibCheck\": true,\n        \"module\": \"ESNext\",\n        \"moduleResolution\": \"bundler\",\n        \"allowSyntheticDefaultImports\": true\n    },\n    \"include\": [\n        \"vite.config.ts\"\n    ]\n}\n\nFile v3.0.5:pyproject.toml\n\n[project]\nname = \"researchvault\"\nversion = \"3.0.5\"\ndescription = \"Local-first orchestration engine for high-velocity AI research\"\nauthors = [\n    { name = \"lraivisto\", email = \"lraivisto@outlook.com\" }\n]\nreadme = \"README.md\"\nrequires-python = \">=3.13\"\ndependencies = [\n    \"requests>=2.32.0\",\n    \"beautifulsoup4>=4.12.0\",\n    \"rich>=13.9.0\",\n    \"pytest>=9.0.2\",\n    \"pytest-mock>=3.15.1\",\n    \"responses>=0.25.8\",\n    \"fastapi>=0.100.0\",\n    \"uvicorn[standard]>=0.23.0\",\n]\n\n[project.optional-dependencies]\nmcp = [\n    \"mcp>=0.9.0\",\n]\n\n[project.scripts]\nvault = \"scripts.vault:main\"\n\nArchive v3.0.4: 74 files, 162423 bytes\n\nFiles: CHANGELOG.md (2063b), CONTRIBUTING.md (550b), main.py (92b), portal/backend/app/auth.py (3263b), portal/backend/app/db_resolver.py (11524b), portal/backend/app/db_roots.py (1433b), portal/backend/app/main.py (1772b), portal/backend/app/portal_secrets.py (2624b), portal/backend/app/portal_state.py (2202b), portal/backend/app/routers/auth.py (1272b), portal/backend/app/routers/system.py (20644b), portal/backend/app/routers/vault.py (14203b), portal/backend/app/vault_exec.py (4783b), portal/frontend/eslint.config.js (489b), portal/frontend/index.html (397b), portal/frontend/package-lock.json (165304b), portal/frontend/package.json (1016b), portal/frontend/postcss.config.js (93b), portal/frontend/src/App.tsx (77924b), portal/frontend/src/components/DecryptedText.tsx (2200b), portal/frontend/src/components/DiagnosticsPanel.tsx (16454b), portal/frontend/src/components/GraphView.tsx (10153b), portal/frontend/src/components/ResearchPulseBar.tsx (6544b), portal/frontend/src/components/SpotlightCard.tsx (1349b), portal/frontend/src/config.ts (392b), portal/frontend/src/index.css (794b), portal/frontend/src/lib/api.ts (5514b), portal/frontend/src/lib/usePortalStream.ts (5037b), portal/frontend/src/main.tsx (245b), portal/frontend/src/vite-env.d.ts (39b), portal/frontend/tailwind.config.js (1297b), portal/frontend/tsconfig.json (887b), portal/frontend/tsconfig.node.json (252b), portal/frontend/vite.config.ts (291b), pyproject.toml (584b), README.md (4133b), run_portal.py (542b), scripts/__init__.py (0b), scripts/core.py (32826b), scripts/db.py (17501b), scripts/scuttle.py (13649b), scripts/services/heartbeat_scuttle.py (757b), scripts/services/mcp_server.py (5938b), scripts/services/watchdog.py (6860b), scripts/strategy.py (22786b), scripts/synthesis.py (9387b), scripts/vault.py (51758b), SECURITY.md (1039b), SKILL.md (6722b), start_portal.sh (14780b), tests/__init__.py (0b), tests/conftest.py (1360b), tests/exploit_ssrf.py (2479b), tests/test_branches.py (1954b), tests/test_core.py (2392b), tests/test_db.py (4394b), tests/test_grokipedia.py (1187b), tests/test_ingest_service.py (1543b), tests/test_lock.py (1147b), tests/test_mcp_server.py (2113b), tests/test_portal_auth.py (1741b), tests/test_portal_cors.py (1115b), tests/test_portal_db_resolver.py (10239b), tests/test_portal_logic.py (352b), tests/test_portal_secret_controls.py (4732b), tests/test_scrubbing.py (1344b), tests/test_scuttle.py (782b), tests/test_smoke_cli.py (3828b), tests/test_strategy.py (4613b), tests/test_synthesis.py (2113b), tests/test_verification.py (1792b), tests/test_watchdog.py (2686b), tests/test_youtube.py (1308b), _meta.json (132b)\n\nFile v3.0.4:SKILL.md\n\n---\nname: researchvault\ndescription: \"Local-first research orchestration engine. Manages state, synthesis, and optional background services (MCP/Watchdog).\"\nhomepage: https://github.com/lraivisto/ResearchVault\ndisable-model-invocation: true\nuser-invocable: true\nmetadata:\n  openclaw:\n    emoji: \"🦞\"\n    install:\n      - id: vault-venv\n        kind: exec\n        command: python3 -m venv .venv && . .venv/bin/activate && pip install -e .\n        label: Initialize ResearchVault (Standard)\n    requires:\n      python: \">=3.13\"\n      env:\n        RESEARCHVAULT_DB:\n          description: \"Optional: Custom path to the SQLite database file.\"\n          required: false\n        BRAVE_API_KEY:\n          description: \"Optional: Brave Search API key.\"\n          required: false\n        SERPER_API_KEY:\n          description: \"Optional: Serper API key.\"\n          required: false\n        SEARXNG_BASE_URL:\n          description: \"Optional: SearXNG base URL.\"\n          required: false\n        RESEARCHVAULT_PORTAL_TOKEN:\n          description: \"Optional: static portal token. If unset, start_portal.sh sources/generates .portal_auth and exports this env var.\"\n          required: false\n        RESEARCHVAULT_PORTAL_SCAN_OPENCLAW:\n          description: \"Optional: set to '1' to request OpenClaw workspace DB scan.\"\n          required: false\n        RESEARCHVAULT_PORTAL_ALLOWED_DB_ROOTS:\n          description: \"Optional: comma-separated absolute DB roots. Default: ~/.researchvault,/tmp.\"\n          required: false\n        RESEARCHVAULT_PORTAL_INJECT_SECRETS:\n          description: \"Optional: set to '1' to inject configured provider env vars into vault subprocesses.\"\n          required: false\n        RESEARCHVAULT_PORTAL_STATE_DIR:\n          description: \"Optional: portal state directory (default ~/.researchvault/portal).\"\n          required: false\n        RESEARCHVAULT_PORTAL_HOST:\n          description: \"Optional: backend bind host.\"\n          required: false\n        RESEARCHVAULT_PORTAL_PORT:\n          description: \"Optional: backend bind port.\"\n          required: false\n        RESEARCHVAULT_PORTAL_FRONTEND_HOST:\n          description: \"Optional: frontend bind host.\"\n          required: false\n        RESEARCHVAULT_PORTAL_FRONTEND_PORT:\n          description: \"Optional: frontend bind port.\"\n          required: false\n        RESEARCHVAULT_PORTAL_CORS_ORIGINS:\n          description: \"Optional: comma-separated CORS origins for backend.\"\n          required: false\n        RESEARCHVAULT_PORTAL_RELOAD:\n          description: \"Optional: set to 'true' for backend auto-reload.\"\n          required: false\n        RESEARCHVAULT_PORTAL_COOKIE_SECURE:\n          description: \"Optional: set to 'true' to mark auth cookie Secure.\"\n          required: false\n        RESEARCHVAULT_PORTAL_PID_DIR:\n          description: \"Optional: start_portal.sh PID/log directory.\"\n          required: false\n        RESEARCHVAULT_PORTAL_SHOW_TOKEN:\n          description: \"Optional: set to '1' to print tokenized portal URLs.\"\n          required: false\n        RESEARCHVAULT_SEARCH_PROVIDERS:\n          description: \"Optional: search provider order override.\"\n          required: false\n        RESEARCHVAULT_WATCHDOG_INGEST_TOP:\n          description: \"Optional: watchdog ingest top-k override.\"\n          required: false\n        RESEARCHVAULT_VERIFY_INGEST_TOP:\n          description: \"Optional: verify ingest top-k override.\"\n          required: false\n        RESEARCHVAULT_MCP_TRANSPORT:\n          description: \"Optional: MCP server transport override.\"\n          required: false\n        REQUESTS_CA_BUNDLE:\n          description: \"Optional: custom CA bundle for HTTPS verification.\"\n          required: false\n        SSL_CERT_FILE:\n          description: \"Optional: custom CA certificate file.\"\n          required: false\n---\n\n# ResearchVault 🦞\n\n**Local-first research orchestration engine.**\n\nResearchVault manages persistent state, synthesis, and autonomous verification for agents.\n\n## Security & Privacy (Local First)\n\n- **Local Storage**: All data is stored in a local SQLite database (~/.researchvault/research_vault.db). No cloud sync.\n- **Network Transparency**: Outbound connections occur ONLY for user-requested research or Brave Search (if configured). \n- **SSRF Hardening**: Strict internal network blocking by default. Local/private IPs (localhost, 10.0.0.0/8, etc.) are blocked. Use `--allow-private-networks` to override.\n- **Manual Opt-in Services**: Background watchers and MCP servers are in `scripts/services/` and must be started manually.\n- **Strict Control**: `disable-model-invocation: true` prevents the model from autonomously starting background tasks.\n\n## Installation\n\n```bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -e .\n```\n\n## Quick Start\n\n1. **Initialize Project**:\n   ```bash\n   python scripts/vault.py init --objective \"Analyze AI trends\" --name \"Trends-2026\"\n   ```\n\n2. **Ingest Data**:\n   ```bash\n   python scripts/vault.py scuttle \"https://example.com\" --id \"trends-2026\"\n   ```\n\n3. **Autonomous Strategist**:\n   ```bash\n   python scripts/vault.py strategy --id \"trends-2026\"\n   ```\n\n## Portal (Manual Opt-In)\n\nStart the portal explicitly:\n\n```bash\n./start_portal.sh\n```\n\n- Backend: `127.0.0.1:8000`\n- Frontend: `127.0.0.1:5173`\n- Backend auth strictly uses `RESEARCHVAULT_PORTAL_TOKEN`\n- `./start_portal.sh` loads/generates `.portal_auth` and exports `RESEARCHVAULT_PORTAL_TOKEN` before backend launch\n- Token login: URL hash `#token=<token>` (token from `.portal_auth`)\n- Allowed DB roots are controlled by `RESEARCHVAULT_PORTAL_ALLOWED_DB_ROOTS` (default `~/.researchvault,/tmp`)\n- OpenClaw workspace scan is effective only when `RESEARCHVAULT_PORTAL_SCAN_OPENCLAW=1` and `~/.openclaw/workspace` is inside allowed DB roots\n- Provider secrets are env-only (`BRAVE_API_KEY`, `SERPER_API_KEY`, `SEARXNG_BASE_URL`) and injected into subprocesses only when `RESEARCHVAULT_PORTAL_INJECT_SECRETS=1`\n- Both hosts are supported for browser access:\n  - `http://127.0.0.1:5173/#token=<token>`\n  - `http://localhost:5173/#token=<token>`\n\nOperational commands:\n\n```bash\n./start_portal.sh --status\n./start_portal.sh --stop\n```\n\nSecurity parity with CLI:\n- SSRF blocking is on by default (private/local/link-local targets denied).\n- Portal toggle **Allow private networks** is equivalent to CLI `--allow-private-networks`.\n\n## Optional Services (Manual Start)\n\n- **MCP Server**: `python scripts/services/mcp_server.py`\n- **Watchdog**: `python scripts/services/watchdog.py --once`\n\n## Provenance & Maintenance\n\n- **Maintainer**: lraivisto\n- **License**: MIT\n- **Issues**: [GitHub Issues](https://github.com/lraivisto/ResearchVault/issues)\n- **Security**: See [SECURITY.md](SECURITY.md)\n\nFile v3.0.4:README.md\n\n# ResearchVault 🦞\n\n**The local-first orchestration engine for high-velocity AI research.**\n\nResearchVault is a local-first state manager and orchestration framework for long-running investigations. It lets you persist projects, findings, evidence, and automation state into a local SQLite \"Vault\".\n\nVault is built CLI-first to close the loop between planning, ingestion, verification, and synthesis.\n\n## 🛡️ Security & Privacy\n\nResearchVault is designed with a **Local-First, Privacy-First** posture:\n\n*   **Local Persistence**: All research data stays on your machine in a local SQLite database (~/.researchvault/research_vault.db). No telemetry or auto-sync.\n*   **SSRF Protection**: Strict internal network blocking by default. The tool resolves DNS and blocks private/local/link-local IPs (RFC1918, 127.0.0.1, 169.254.169.254, etc.).\n*   **Network Transparency**: Outbound connections are limited to user-requested scuttling or Brave Search API (if configured).\n*   **Zero Auto-Start**: No background processes or servers start during installation. Services must be explicitly invoked from `scripts/services/`.\n*   **Restricted Model Invocation**: The `disable-model-invocation: true` flag prevents the AI from autonomously triggering side-effects without a direct user prompt.\n\n## 🚀 Installation\n\n### Standard (Recommended)\n```bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -e .\n```\n\n## 🌐 Portal (v3)\n\nRun the portal manually (nothing auto-starts in the background):\n\n```bash\n./start_portal.sh\n```\n\n- Backend binds to `127.0.0.1:8000`\n- Frontend binds to `127.0.0.1:5173`\n- Backend auth strictly uses `RESEARCHVAULT_PORTAL_TOKEN`.\n- `./start_portal.sh` loads token from `.portal_auth` (or generates it) and exports `RESEARCHVAULT_PORTAL_TOKEN` before launching the backend.\n- Use either host for login:\n  - `http://127.0.0.1:5173/#token=<token>`\n  - `http://localhost:5173/#token=<token>`\n- Tokenized URLs are hidden in terminal output by default; read `.portal_auth` (chmod 600) to paste the token manually, or set `RESEARCHVAULT_PORTAL_SHOW_TOKEN=1` to print tokenized URLs.\n- Allowed DB roots are constrained by `RESEARCHVAULT_PORTAL_ALLOWED_DB_ROOTS` (default `~/.researchvault,/tmp`).\n- OpenClaw workspace DB discovery is disabled by default; it only becomes effective when `RESEARCHVAULT_PORTAL_SCAN_OPENCLAW=1` and `~/.openclaw/workspace` is inside allowed DB roots.\n- Search provider secrets are env-only (read-only in Portal): configure `BRAVE_API_KEY`, `SERPER_API_KEY`, and/or `SEARXNG_BASE_URL` in the backend process environment.\n- Provider secrets are injected into vault subprocesses only when `RESEARCHVAULT_PORTAL_INJECT_SECRETS=1`.\n\nProcess controls:\n\n```bash\n./start_portal.sh --status\n./start_portal.sh --stop\n```\n\nIngest SSRF behavior matches CLI defaults:\n- Private/local/link-local targets are blocked by default.\n- Portal checkbox **Allow private networks** maps to CLI `--allow-private-networks`.\n\n## 🛠️ Key Workflows\n\n### 1. Project Management\n```bash\npython scripts/vault.py init --id \"ai-research\" --name \"AI Research\" --objective \"Monitor 2026 trends\"\n```\n\n### 2. Multi-Source Ingestion\n```bash\npython scripts/vault.py scuttle \"https://example.com\" --id \"ai-research\"\n```\n\n### 3. Synthesis & Verification\n```bash\npython scripts/vault.py synthesize --id \"ai-research\"\npython scripts/vault.py verify run --id \"ai-research\"\n```\n\n### 4. Optional Services (Manual Opt-in)\n*   **MCP Server**: `python scripts/services/mcp_server.py`\n*   **Watchdog**: `python scripts/services/watchdog.py`\n\n## 📦 Dependencies\n\n*   `requests` & `beautifulsoup4`: Targeted web ingestion.\n*   `rich`: CLI output formatting.\n*   `mcp`: Standard protocol for agent-tool communication.\n*   `pytest`: Local integrity verification.\n\n## ⚖️ License & Provenance\n\n- **Maintainer**: lraivisto\n- **License**: MIT\n- **Issues**: [GitHub Issues](https://github.com/lraivisto/ResearchVault/issues)\n- **Releases**: [Changelog](CHANGELOG.md)\n\n---\n*This project is 100% developed by AI agents (OpenClaw / Google Antigravity / OpenAI Codex), carefully orchestrated and reviewed by **Luka Raivisto**.*\n\nFile v3.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn74ffp19fwws5d0f9mr856weh80a5n5\",\n  \"slug\": \"researchvault\",\n  \"version\": \"3.0.4\",\n  \"publishedAt\": 1771243960143\n}\n\nFile v3.0.4:CHANGELOG.md\n\n# Changelog\n\n## [3.0.4] - 2026-02-16\n\n### Security\n- Registry manifest transparency: moved install/env metadata to `metadata.openclaw.install` and `metadata.openclaw.requires.env` so ClawHub-visible fields match behavior.\n- DB root enforcement hardened: removed `RESEARCHVAULT_PORTAL_ALLOW_ANY_DB` bypass and introduced `RESEARCHVAULT_PORTAL_ALLOWED_DB_ROOTS` as the only DB root policy input.\n- OpenClaw DB scope tightened: `RESEARCHVAULT_PORTAL_SCAN_OPENCLAW=1` only takes effect when `~/.openclaw/workspace` is inside allowed DB roots.\n- Secrets handling hardened: portal secret persistence/write APIs are disabled; provider secrets are env-only and subprocess injection remains explicit opt-in via `RESEARCHVAULT_PORTAL_INJECT_SECRETS=1`.\n- Portal auth consistency: backend remains strict on `RESEARCHVAULT_PORTAL_TOKEN`; `start_portal.sh` now always initializes/exports the token from `.portal_auth` and avoids printing tokenized URLs unless explicitly requested.\n- Added regression tests for DB root enforcement, OpenClaw scan gating, token strictness, and env-only secret/injection behavior.\n\n## [2.6.2] - 2026-02-10\n\n### Security\n- **SSRF Hardening**: Implemented strict DNS resolution and IP verification in `scuttle`. Blocks private, local, and link-local addresses by default.\n- **Service Isolation**: Moved background services (MCP, Watchdog) to `scripts/services/` to reduce default capability surface.\n- **Transparency**: Added `SECURITY.md` and updated `SKILL.md` manifest to explicitly declare optional environment variables.\n- **Model Gating**: Explicitly set `disable-model-invocation: true` at the registry manifest level to prevent autonomous AI side-effects.\n\n### Added\n- `--allow-private-networks` flag for `vault scuttle` to allow fetching from local addresses when explicitly requested by user.\n- Comprehensive provenance info: `LICENSE`, `CONTRIBUTING.md`, and project `homepage`.\n\n### Fixed\n- Registry metadata mismatch: standardized frontmatter keys for ClawHub compatibility.\n- Removed `uv` requirement from primary installation path.\n\nFile v3.0.4:CONTRIBUTING.md\n\n# Contributing to ResearchVault\n\nWelcome! We appreciate your help in making ResearchVault better.\n\n## How to Contribute\n\n1.  **Report Bugs**: Open an issue on GitHub.\n2.  **Suggest Features**: Open an issue to discuss.\n3.  **Submit Pull Requests**:\n    *   Fork the repository.\n    *   Create a feature branch.\n    *   Ensure all tests pass (`pytest`).\n    *   Submit a PR with a clear description of changes.\n\n## Security Considerations\n\nSince this tool handles web ingestion, please prioritize SSRF safety and data scrubbing in your contributions.\n\nFile v3.0.4:SECURITY.md\n\n# Security Policy\n\n## Reporting a Vulnerability\n\nWe take security seriously. If you find a vulnerability, please report it via [GitHub Issues](https://github.com/lraivisto/ResearchVault/issues) or contact the maintainer directly.\n\n## Local-First Design\n\nResearchVault is designed to run entirely on your local machine. \n\n*   **SQLite Storage**: Data is stored locally. No cloud synchronization or hidden telemetry.\n*   **SSRF Protection**: The `scuttle` tool resolve DNS and blocks access to internal/private network addresses (RFC1918, localhost, link-local) by default.\n*   **Opt-in Services**: All background processes (Watchdog, MCP server) require manual invocation.\n*   **Restricted Invocation**: The `disable-model-invocation: true` flag is set to prevent AI models from autonomously triggering side-effects without a direct user prompt.\n\n## Network Access\n\nOutbound connections are limited to:\n1. User-provided research URLs.\n2. The Brave Search API (if an API key is explicitly configured).\n\nNo hidden background crawling occurs.\n\nFile v3.0.4:portal/frontend/package-lock.json\n\n{\n    \"name\": \"researchvault-portal\",\n    \"version\": \"0.0.0\",\n    \"lockfileVersion\": 3,\n    \"requires\": true,\n    \"packages\": {\n        \"\": {\n            \"name\": \"researchvault-portal\",\n            \"version\": \"0.0.0\",\n            \"dependencies\": {\n                \"@tanstack/react-query\": \"^5.0.0\",\n                \"clsx\": \"^2.0.0\",\n                \"framer-motion\": \"^10.16.4\",\n                \"lucide-react\": \"^0.292.0\",\n                \"react\": \"^18.2.0\",\n                \"react-dom\": \"^18.2.0\",\n                \"tailwind-merge\": \"^2.0.0\"\n            },\n            \"devDependencies\": {\n                \"@types/react\": \"^18.2.37\",\n                \"@types/react-dom\": \"^18.2.15\",\n                \"@typescript-eslint/parser\": \"^8.46.3\",\n                \"@vitejs/plugin-react\": \"^4.2.0\",\n                \"autoprefixer\": \"^10.4.16\",\n                \"eslint\": \"^9.39.1\",\n                \"eslint-plugin-react-hooks\": \"^7.0.0\",\n                \"postcss\": \"^8.4.31\",\n                \"tailwindcss\": \"^3.3.5\",\n                \"typescript\": \"^5.2.2\",\n                \"vite\": \"^5.0.0\"\n            }\n        },\n        \"node_modules/@alloc/quick-lru\": {\n            \"version\": \"5.2.0\",\n            \"resolved\": \"https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz\",\n            \"integrity\": \"sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=10\"\n            },\n            \"funding\": {\n                \"url\": \"https://github.com/sponsors/sindresorhus\"\n            }\n        },\n        \"node_modules/@babel/code-frame\": {\n            \"version\": \"7.29.0\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz\",\n            \"integrity\": \"sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/helper-validator-identifier\": \"^7.28.5\",\n                \"js-tokens\": \"^4.0.0\",\n                \"picocolors\": \"^1.1.1\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/compat-data\": {\n            \"version\": \"7.29.0\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz\",\n            \"integrity\": \"sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/core\": {\n            \"version\": \"7.29.0\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz\",\n            \"integrity\": \"sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/code-frame\": \"^7.29.0\",\n                \"@babel/generator\": \"^7.29.0\",\n                \"@babel/helper-compilation-targets\": \"^7.28.6\",\n                \"@babel/helper-module-transforms\": \"^7.28.6\",\n                \"@babel/helpers\": \"^7.28.6\",\n                \"@babel/parser\": \"^7.29.0\",\n                \"@babel/template\": \"^7.28.6\",\n                \"@babel/traverse\": \"^7.29.0\",\n                \"@babel/types\": \"^7.29.0\",\n                \"@jridgewell/remapping\": \"^2.3.5\",\n                \"convert-source-map\": \"^2.0.0\",\n                \"debug\": \"^4.1.0\",\n                \"gensync\": \"^1.0.0-beta.2\",\n                \"json5\": \"^2.2.3\",\n                \"semver\": \"^6.3.1\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            },\n            \"funding\": {\n                \"type\": \"opencollective\",\n                \"url\": \"https://opencollective.com/babel\"\n            }\n        },\n        \"node_modules/@babel/generator\": {\n            \"version\": \"7.29.1\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz\",\n            \"integrity\": \"sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/parser\": \"^7.29.0\",\n                \"@babel/types\": \"^7.29.0\",\n                \"@jridgewell/gen-mapping\": \"^0.3.12\",\n                \"@jridgewell/trace-mapping\": \"^0.3.28\",\n                \"jsesc\": \"^3.0.2\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helper-compilation-targets\": {\n            \"version\": \"7.28.6\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz\",\n            \"integrity\": \"sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/compat-data\": \"^7.28.6\",\n                \"@babel/helper-validator-option\": \"^7.27.1\",\n                \"browserslist\": \"^4.24.0\",\n                \"lru-cache\": \"^5.1.1\",\n                \"semver\": \"^6.3.1\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helper-globals\": {\n            \"version\": \"7.28.0\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz\",\n            \"integrity\": \"sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helper-module-imports\": {\n            \"version\": \"7.28.6\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz\",\n            \"integrity\": \"sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/traverse\": \"^7.28.6\",\n                \"@babel/types\": \"^7.28.6\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helper-module-transforms\": {\n            \"version\": \"7.28.6\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz\",\n            \"integrity\": \"sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/helper-module-imports\": \"^7.28.6\",\n                \"@babel/helper-validator-identifier\": \"^7.28.5\",\n                \"@babel/traverse\": \"^7.28.6\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            },\n            \"peerDependencies\": {\n                \"@babel/core\": \"^7.0.0\"\n            }\n        },\n        \"node_modules/@babel/helper-plugin-utils\": {\n            \"version\": \"7.28.6\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz\",\n            \"integrity\": \"sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helper-string-parser\": {\n            \"version\": \"7.27.1\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz\",\n            \"integrity\": \"sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helper-validator-identifier\": {\n            \"version\": \"7.28.5\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz\",\n            \"integrity\": \"sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helper-validator-option\": {\n            \"version\": \"7.27.1\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz\",\n            \"integrity\": \"sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/helpers\": {\n            \"version\": \"7.28.6\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz\",\n            \"integrity\": \"sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/template\": \"^7.28.6\",\n                \"@babel/types\": \"^7.28.6\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/parser\": {\n            \"version\": \"7.29.0\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz\",\n            \"integrity\": \"sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/types\": \"^7.29.0\"\n            },\n            \"bin\": {\n                \"parser\": \"bin/babel-parser.js\"\n            },\n            \"engines\": {\n                \"node\": \">=6.0.0\"\n            }\n        },\n        \"node_modules/@babel/plugin-transform-react-jsx-self\": {\n            \"version\": \"7.27.1\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz\",\n            \"integrity\": \"sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/helper-plugin-utils\": \"^7.27.1\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            },\n            \"peerDependencies\": {\n                \"@babel/core\": \"^7.0.0-0\"\n            }\n        },\n        \"node_modules/@babel/plugin-transform-react-jsx-source\": {\n            \"version\": \"7.27.1\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz\",\n            \"integrity\": \"sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/helper-plugin-utils\": \"^7.27.1\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            },\n            \"peerDependencies\": {\n                \"@babel/core\": \"^7.0.0-0\"\n            }\n        },\n        \"node_modules/@babel/template\": {\n            \"version\": \"7.28.6\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz\",\n            \"integrity\": \"sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/code-frame\": \"^7.28.6\",\n                \"@babel/parser\": \"^7.28.6\",\n                \"@babel/types\": \"^7.28.6\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/traverse\": {\n            \"version\": \"7.29.0\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz\",\n            \"integrity\": \"sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/code-frame\": \"^7.29.0\",\n                \"@babel/generator\": \"^7.29.0\",\n                \"@babel/helper-globals\": \"^7.28.0\",\n                \"@babel/parser\": \"^7.29.0\",\n                \"@babel/template\": \"^7.28.6\",\n                \"@babel/types\": \"^7.29.0\",\n                \"debug\": \"^4.3.1\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@babel/types\": {\n            \"version\": \"7.29.0\",\n            \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz\",\n            \"integrity\": \"sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@babel/helper-string-parser\": \"^7.27.1\",\n                \"@babel/helper-validator-identifier\": \"^7.28.5\"\n            },\n            \"engines\": {\n                \"node\": \">=6.9.0\"\n            }\n        },\n        \"node_modules/@emotion/is-prop-valid\": {\n            \"version\": \"0.8.8\",\n            \"resolved\": \"https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz\",\n            \"integrity\": \"sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==\",\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"dependencies\": {\n                \"@emotion/memoize\": \"0.7.4\"\n            }\n        },\n        \"node_modules/@emotion/memoize\": {\n            \"version\": \"0.7.4\",\n            \"resolved\": \"https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz\",\n            \"integrity\": \"sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==\",\n            \"license\": \"MIT\",\n            \"optional\": true\n        },\n        \"node_modules/@esbuild/aix-ppc64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz\",\n            \"integrity\": \"sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==\",\n            \"cpu\": [\n                \"ppc64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"aix\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/android-arm\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz\",\n            \"integrity\": \"sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==\",\n            \"cpu\": [\n                \"arm\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"android\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/android-arm64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz\",\n            \"integrity\": \"sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"android\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/android-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"android\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/darwin-arm64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz\",\n            \"integrity\": \"sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"darwin\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/darwin-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"darwin\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/freebsd-arm64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz\",\n            \"integrity\": \"sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"freebsd\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/freebsd-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"freebsd\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-arm\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz\",\n            \"integrity\": \"sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==\",\n            \"cpu\": [\n                \"arm\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-arm64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz\",\n            \"integrity\": \"sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-ia32\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz\",\n            \"integrity\": \"sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==\",\n            \"cpu\": [\n                \"ia32\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-loong64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz\",\n            \"integrity\": \"sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==\",\n            \"cpu\": [\n                \"loong64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-mips64el\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz\",\n            \"integrity\": \"sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==\",\n            \"cpu\": [\n                \"mips64el\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-ppc64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz\",\n            \"integrity\": \"sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==\",\n            \"cpu\": [\n                \"ppc64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-riscv64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz\",\n            \"integrity\": \"sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==\",\n            \"cpu\": [\n                \"riscv64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-s390x\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz\",\n            \"integrity\": \"sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==\",\n            \"cpu\": [\n                \"s390x\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/linux-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/netbsd-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"netbsd\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/openbsd-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"openbsd\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/sunos-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"sunos\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/win32-arm64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz\",\n            \"integrity\": \"sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"win32\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/win32-ia32\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz\",\n            \"integrity\": \"sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==\",\n            \"cpu\": [\n                \"ia32\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"win32\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@esbuild/win32-x64\": {\n            \"version\": \"0.21.5\",\n            \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz\",\n            \"integrity\": \"sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"win32\"\n            ],\n            \"engines\": {\n                \"node\": \">=12\"\n            }\n        },\n        \"node_modules/@eslint-community/eslint-utils\": {\n            \"version\": \"4.9.1\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz\",\n            \"integrity\": \"sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"eslint-visitor-keys\": \"^3.4.3\"\n            },\n            \"engines\": {\n                \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n            },\n            \"funding\": {\n                \"url\": \"https://opencollective.com/eslint\"\n            },\n            \"peerDependencies\": {\n                \"eslint\": \"^6.0.0 || ^7.0.0 || >=8.0.0\"\n            }\n        },\n        \"node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys\": {\n            \"version\": \"3.4.3\",\n            \"resolved\": \"https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz\",\n            \"integrity\": \"sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"engines\": {\n                \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n            },\n            \"funding\": {\n                \"url\": \"https://opencollective.com/eslint\"\n            }\n        },\n        \"node_modules/@eslint-community/regexpp\": {\n            \"version\": \"4.12.2\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz\",\n            \"integrity\": \"sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \"^12.0.0 || ^14.0.0 || >=16.0.0\"\n            }\n        },\n        \"node_modules/@eslint/config-array\": {\n            \"version\": \"0.21.1\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz\",\n            \"integrity\": \"sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"dependencies\": {\n                \"@eslint/object-schema\": \"^2.1.7\",\n                \"debug\": \"^4.3.1\",\n                \"minimatch\": \"^3.1.2\"\n            },\n            \"engines\": {\n                \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n            }\n        },\n        \"node_modules/@eslint/config-array/node_modules/brace-expansion\": {\n            \"version\": \"1.1.12\",\n            \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz\",\n            \"integrity\": \"sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"balanced-match\": \"^1.0.0\",\n                \"concat-map\": \"0.0.1\"\n            }\n        },\n        \"node_modules/@eslint/config-array/node_modules/minimatch\": {\n            \"version\": \"3.1.2\",\n            \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz\",\n            \"integrity\": \"sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==\",\n            \"dev\": true,\n            \"license\": \"ISC\",\n            \"dependencies\": {\n                \"brace-expansion\": \"^1.1.7\"\n            },\n            \"engines\": {\n                \"node\": \"*\"\n            }\n        },\n        \"node_modules/@eslint/config-helpers\": {\n            \"version\": \"0.4.2\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz\",\n            \"integrity\": \"sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"dependencies\": {\n                \"@eslint/core\": \"^0.17.0\"\n            },\n            \"engines\": {\n                \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n            }\n        },\n        \"node_modules/@eslint/core\": {\n            \"version\": \"0.17.0\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz\",\n            \"integrity\": \"sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"dependencies\": {\n                \"@types/json-schema\": \"^7.0.15\"\n            },\n            \"engines\": {\n                \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n            }\n        },\n        \"node_modules/@eslint/eslintrc\": {\n            \"version\": \"3.3.3\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz\",\n            \"integrity\": \"sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"ajv\": \"^6.12.4\",\n                \"debug\": \"^4.3.2\",\n                \"espree\": \"^10.0.1\",\n                \"globals\": \"^14.0.0\",\n                \"ignore\": \"^5.2.0\",\n                \"import-fresh\": \"^3.2.1\",\n                \"js-yaml\": \"^4.1.1\",\n                \"minimatch\": \"^3.1.2\",\n                \"strip-json-comments\": \"^3.1.1\"\n            },\n            \"engines\": {\n                \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n            },\n            \"funding\": {\n                \"url\": \"https://opencollective.com/eslint\"\n            }\n        },\n        \"node_modules/@eslint/eslintrc/node_modules/brace-expansion\": {\n            \"version\": \"1.1.12\",\n            \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz\",\n            \"integrity\": \"sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"balanced-match\": \"^1.0.0\",\n                \"concat-map\": \"0.0.1\"\n            }\n        },\n        \"node_modules/@eslint/eslintrc/node_modules/minimatch\": {\n            \"version\": \"3.1.2\",\n            \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz\",\n            \"integrity\": \"sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==\",\n            \"dev\": true,\n            \"license\": \"ISC\",\n            \"dependencies\": {\n                \"brace-expansion\": \"^1.1.7\"\n            },\n            \"engines\": {\n                \"node\": \"*\"\n            }\n        },\n        \"node_modules/@eslint/js\": {\n            \"version\": \"9.39.2\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz\",\n            \"integrity\": \"sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n            },\n            \"funding\": {\n                \"url\": \"https://eslint.org/donate\"\n            }\n        },\n        \"node_modules/@eslint/object-schema\": {\n            \"version\": \"2.1.7\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz\",\n            \"integrity\": \"sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"engines\": {\n                \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n            }\n        },\n        \"node_modules/@eslint/plugin-kit\": {\n            \"version\": \"0.4.1\",\n            \"resolved\": \"https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz\",\n            \"integrity\": \"sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"dependencies\": {\n                \"@eslint/core\": \"^0.17.0\",\n                \"levn\": \"^0.4.1\"\n            },\n            \"engines\": {\n                \"node\": \"^18.18.0 || ^20.9.0 || >=21.1.0\"\n            }\n        },\n        \"node_modules/@humanfs/core\": {\n            \"version\": \"0.19.1\",\n            \"resolved\": \"https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz\",\n            \"integrity\": \"sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"engines\": {\n                \"node\": \">=18.18.0\"\n            }\n        },\n        \"node_modules/@humanfs/node\": {\n            \"version\": \"0.16.7\",\n            \"resolved\": \"https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz\",\n            \"integrity\": \"sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"dependencies\": {\n                \"@humanfs/core\": \"^0.19.1\",\n                \"@humanwhocodes/retry\": \"^0.4.0\"\n            },\n            \"engines\": {\n                \"node\": \">=18.18.0\"\n            }\n        },\n        \"node_modules/@humanwhocodes/module-importer\": {\n            \"version\": \"1.0.1\",\n            \"resolved\": \"https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz\",\n            \"integrity\": \"sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"engines\": {\n                \"node\": \">=12.22\"\n            },\n            \"funding\": {\n                \"type\": \"github\",\n                \"url\": \"https://github.com/sponsors/nzakas\"\n            }\n        },\n        \"node_modules/@humanwhocodes/retry\": {\n            \"version\": \"0.4.3\",\n            \"resolved\": \"https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz\",\n            \"integrity\": \"sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==\",\n            \"dev\": true,\n            \"license\": \"Apache-2.0\",\n            \"engines\": {\n                \"node\": \">=18.18\"\n            },\n            \"funding\": {\n                \"type\": \"github\",\n                \"url\": \"https://github.com/sponsors/nzakas\"\n            }\n        },\n        \"node_modules/@jridgewell/gen-mapping\": {\n            \"version\": \"0.3.13\",\n            \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz\",\n            \"integrity\": \"sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n                \"@jridgewell/trace-mapping\": \"^0.3.24\"\n            }\n        },\n        \"node_modules/@jridgewell/remapping\": {\n            \"version\": \"2.3.5\",\n            \"resolved\": \"https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz\",\n            \"integrity\": \"sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@jridgewell/gen-mapping\": \"^0.3.5\",\n                \"@jridgewell/trace-mapping\": \"^0.3.24\"\n            }\n        },\n        \"node_modules/@jridgewell/resolve-uri\": {\n            \"version\": \"3.1.2\",\n            \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n            \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">=6.0.0\"\n            }\n        },\n        \"node_modules/@jridgewell/sourcemap-codec\": {\n            \"version\": \"1.5.5\",\n            \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz\",\n            \"integrity\": \"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==\",\n            \"dev\": true,\n            \"license\": \"MIT\"\n        },\n        \"node_modules/@jridgewell/trace-mapping\": {\n            \"version\": \"0.3.31\",\n            \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz\",\n            \"integrity\": \"sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@jridgewell/resolve-uri\": \"^3.1.0\",\n                \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n            }\n        },\n        \"node_modules/@nodelib/fs.scandir\": {\n            \"version\": \"2.1.5\",\n            \"resolved\": \"https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz\",\n            \"integrity\": \"sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@nodelib/fs.stat\": \"2.0.5\",\n                \"run-parallel\": \"^1.1.9\"\n            },\n            \"engines\": {\n                \"node\": \">= 8\"\n            }\n        },\n        \"node_modules/@nodelib/fs.stat\": {\n            \"version\": \"2.0.5\",\n            \"resolved\": \"https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz\",\n            \"integrity\": \"sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"engines\": {\n                \"node\": \">= 8\"\n            }\n        },\n        \"node_modules/@nodelib/fs.walk\": {\n            \"version\": \"1.2.8\",\n            \"resolved\": \"https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz\",\n            \"integrity\": \"sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==\",\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"dependencies\": {\n                \"@nodelib/fs.scandir\": \"2.1.5\",\n                \"fastq\": \"^1.6.0\"\n            },\n            \"engines\": {\n                \"node\": \">= 8\"\n            }\n        },\n        \"node_modules/@rolldown/pluginutils\": {\n            \"version\": \"1.0.0-beta.27\",\n            \"resolved\": \"https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz\",\n            \"integrity\": \"sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==\",\n            \"dev\": true,\n            \"license\": \"MIT\"\n        },\n        \"node_modules/@rollup/rollup-android-arm-eabi\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz\",\n            \"integrity\": \"sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==\",\n            \"cpu\": [\n                \"arm\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"android\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-android-arm64\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz\",\n            \"integrity\": \"sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"android\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-darwin-arm64\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz\",\n            \"integrity\": \"sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"darwin\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-darwin-x64\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz\",\n            \"integrity\": \"sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"darwin\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-freebsd-arm64\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz\",\n            \"integrity\": \"sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"freebsd\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-freebsd-x64\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz\",\n            \"integrity\": \"sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==\",\n            \"cpu\": [\n                \"x64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"freebsd\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz\",\n            \"integrity\": \"sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==\",\n            \"cpu\": [\n                \"arm\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz\",\n            \"integrity\": \"sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==\",\n            \"cpu\": [\n                \"arm\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz\",\n            \"integrity\": \"sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz\",\n            \"integrity\": \"sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==\",\n            \"cpu\": [\n                \"arm64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-linux-loong64-gnu\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz\",\n            \"integrity\": \"sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==\",\n            \"cpu\": [\n                \"loong64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-linux-loong64-musl\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz\",\n            \"integrity\": \"sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==\",\n            \"cpu\": [\n                \"loong64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n            ]\n        },\n        \"node_modules/@rollup/rollup-linux-ppc64-gnu\": {\n            \"version\": \"4.57.1\",\n            \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz\",\n            \"integrity\": \"sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==\",\n            \"cpu\": [\n                \"ppc64\"\n            ],\n            \"dev\": true,\n            \"license\": \"MIT\",\n            \"optional\": true,\n            \"os\": [\n                \"linux\"\n\n\nFile v3.0.4:portal/frontend/package.json\n\n{\n    \"name\": \"researchvault-portal\",\n    \"private\": true,\n    \"version\": \"0.0.0\",\n    \"type\": \"module\",\n    \"scripts\": {\n        \"dev\": \"vite\",\n        \"build\": \"tsc && vite build\",\n        \"lint\": \"eslint . --ext ts,tsx --max-warnings 0\",\n        \"typecheck\": \"tsc --noEmit\",\n        \"preview\": \"vite preview\"\n    },\n    \"dependencies\": {\n        \"react\": \"^18.2.0\",\n        \"react-dom\": \"^18.2.0\",\n        \"@tanstack/react-query\": \"^5.0.0\",\n        \"lucide-react\": \"^0.292.0\",\n        \"clsx\": \"^2.0.0\",\n        \"tailwind-merge\": \"^2.0.0\",\n        \"framer-motion\": \"^10.16.4\"\n    },\n    \"devDependencies\": {\n        \"@types/react\": \"^18.2.37\",\n        \"@types/react-dom\": \"^18.2.15\",\n        \"@typescript-eslint/parser\": \"^8.46.3\",\n        \"@vitejs/plugin-react\": \"^4.2.0\",\n        \"typescript\": \"^5.2.2\",\n        \"vite\": \"^5.0.0\",\n        \"autoprefixer\": \"^10.4.16\",\n        \"eslint\": \"^9.39.1\",\n        \"eslint-plugin-react-hooks\": \"^7.0.0\",\n        \"postcss\": \"^8.4.31\",\n        \"tailwindcss\": \"^3.3.5\"\n    }\n}\n\nFile v3.0.4:portal/frontend/tsconfig.json\n\n{\n    \"compilerOptions\": {\n        \"target\": \"ES2020\",\n        \"useDefineForClassFields\": true,\n        \"lib\": [\n            \"ES2020\",\n            \"DOM\",\n            \"DOM.Iterable\"\n        ],\n        \"module\": \"ESNext\",\n        \"skipLibCheck\": true,\n        /* Bundler mode */\n        \"moduleResolution\": \"bundler\",\n        \"allowImportingTsExtensions\": true,\n        \"resolveJsonModule\": true,\n        \"isolatedModules\": true,\n        \"noEmit\": true,\n        \"jsx\": \"react-jsx\",\n        /* Linting */\n        \"strict\": true,\n        \"noUnusedLocals\": true,\n        \"noUnusedParameters\": true,\n        \"noFallthroughCasesInSwitch\": true,\n        \"baseUrl\": \".\",\n        \"paths\": {\n            \"@/*\": [\n                \"./src/*\"\n            ]\n        }\n    },\n    \"include\": [\n        \"src\"\n    ],\n    \"references\": [\n        {\n            \"path\": \"./tsconfig.node.json\"\n        }\n    ]\n}\n\nFile v3.0.4:portal/frontend/tsconfig.node.json\n\n{\n    \"compilerOptions\": {\n        \"composite\": true,\n        \"skipLibCheck\": true,\n        \"module\": \"ESNext\",\n        \"moduleResolution\": \"bundler\",\n        \"allowSyntheticDefaultImports\": true\n    },\n    \"include\": [\n        \"vite.config.ts\"\n    ]\n}\n\nFile v3.0.4:pyproject.toml\n\n[project]\nname = \"researchvault\"\nversion = \"3.0.4\"\ndescription = \"Local-first orchestration engine for high-velocity AI research\"\nauthors = [\n    { name = \"lraivisto\", email = \"lraivisto@outlook.com\" }\n]\nreadme = \"README.md\"\nrequires-python = \">=3.13\"\ndependencies = [\n    \"requests>=2.32.0\",\n    \"beautifulsoup4>=4.12.0\",\n    \"rich>=13.9.0\",\n    \"pytest>=9.0.2\",\n    \"pytest-mock>=3.15.1\",\n    \"responses>=0.25.8\",\n    \"fastapi>=0.100.0\",\n    \"uvicorn[standard]>=0.23.0\",\n]\n\n[project.optional-dependencies]\nmcp = [\n    \"mcp>=0.9.0\",\n]\n\n[project.scripts]\nvault = \"scripts.vault:main\"\n\nArchive vv3.0.3: 73 files, 162009 bytes\n\nFiles: CHANGELOG.md (1962b), CONTRIBUTING.md (550b), main.py (92b), portal/backend/app/auth.py (3263b), portal/backend/app/db_resolver.py (10626b), portal/backend/app/main.py (1772b), portal/backend/app/portal_secrets.py (7631b), portal/backend/app/portal_state.py (2202b), portal/backend/app/routers/auth.py (1272b), portal/backend/app/routers/system.py (20922b), portal/backend/app/routers/vault.py (14203b), portal/backend/app/vault_exec.py (4928b), portal/frontend/eslint.config.js (489b), portal/frontend/index.html (397b), portal/frontend/package-lock.json (165304b), portal/frontend/package.json (1016b), portal/frontend/postcss.config.js (93b), portal/frontend/src/App.tsx (77924b), portal/frontend/src/components/DecryptedText.tsx (2200b), portal/frontend/src/components/DiagnosticsPanel.tsx (22289b), portal/frontend/src/components/GraphView.tsx (10153b), portal/frontend/src/components/ResearchPulseBar.tsx (6544b), portal/frontend/src/components/SpotlightCard.tsx (1349b), portal/frontend/src/config.ts (392b), portal/frontend/src/index.css (794b), portal/frontend/src/lib/api.ts (5470b), portal/frontend/src/lib/usePortalStream.ts (5037b), portal/frontend/src/main.tsx (245b), portal/frontend/src/vite-env.d.ts (39b), portal/frontend/tailwind.config.js (1297b), portal/frontend/tsconfig.json (887b), portal/frontend/tsconfig.node.json (252b), portal/frontend/vite.config.ts (291b), pyproject.toml (584b), README.md (3975b), run_portal.py (542b), scripts/__init__.py (0b), scripts/core.py (32826b), scripts/db.py (17501b), scripts/scuttle.py (13649b), scripts/services/heartbeat_scuttle.py (757b), scripts/services/mcp_server.py (5938b), scripts/services/watchdog.py (6860b), scripts/strategy.py (22786b), scripts/synthesis.py (9387b), scripts/vault.py (51758b), SECURITY.md (1039b), SKILL.md (5496b), start_portal.sh (13851b), tests/__init__.py (0b), tests/conftest.py (1360b), tests/exploit_ssrf.py (2479b), tests/test_branches.py (1954b), tests/test_core.py (2392b), tests/test_db.py (4394b), tests/test_grokipedia.py (1187b), tests/test_ingest_service.py (1543b), tests/test_lock.py (1147b), tests/test_mcp_server.py (2113b), tests/test_portal_auth.py (1741b), tests/test_portal_cors.py (1115b), tests/test_portal_db_resolver.py (7441b), tests/test_portal_logic.py (352b), tests/test_portal_secret_controls.py (4312b), tests/test_scrubbing.py (1344b), tests/test_scuttle.py (782b), tests/test_smoke_cli.py (3828b), tests/test_strategy.py (4613b), tests/test_synthesis.py (2113b), tests/test_verification.py (1792b), tests/test_watchdog.py (2686b), tests/test_youtube.py (1308b), _meta.json (133b)\n\nFile vv3.0.3:SKILL.md\n\n---\nname: researchvault\ndescription: \"Local-first research orchestration engine. Manages state, synthesis, and optional background services (MCP/Watchdog).\"\nhomepage: https://github.com/lraivisto/ResearchVault\ndisable-model-invocation: true\nuser-invocable: true\ninstall:\n  - id: vault-venv\n    kind: exec\n    command: python3 -m venv .venv && . .venv/bin/activate && pip install -e .\n    label: Initialize ResearchVault (Standard)\nenv:\n  RESEARCHVAULT_DB:\n    description: \"Optional: Custom path to the SQLite database file.\"\n    required: false\n  RESEARCHVAULT_PORTAL_TOKEN:\n    description: \"Optional: Static token for Portal authentication. If unset, start_portal.sh generates .portal_auth and exports this variable for the backend.\"\n    required: false\n  BRAVE_API_KEY:\n    description: \"Optional: API key for Brave Search.\"\n    required: false\n  SERPER_API_KEY:\n    description: \"Optional: API key for Serper.dev search.\"\n    required: false\n  SEARXNG_BASE_URL:\n    description: \"Optional: Base URL for a SearXNG instance.\"\n    required: false\n  RESEARCHVAULT_PORTAL_SCAN_OPENCLAW:\n    description: \"Optional: Set to '1' to allow Portal DB discovery and DB selection under ~/.openclaw/workspace.\"\n    required: false\n  RESEARCHVAULT_PORTAL_PERSIST_SECRETS:\n    description: \"Optional: Set to '1' to persist Portal-entered provider secrets to ~/.researchvault/portal/secrets.json.\"\n    required: false\n  RESEARCHVAULT_PORTAL_INJECT_SECRETS:\n    description: \"Optional: Set to '1' to inject Portal-managed provider secrets into vault subprocess environments.\"\n    required: false\n  RESEARCHVAULT_PORTAL_STATE_DIR:\n    description: \"Optional: Directory for portal local state and secrets files (default ~/.researchvault/portal).\"\n    required: false\n  RESEARCHVAULT_PORTAL_ALLOW_ANY_DB:\n    description: \"Optional: Set to 'true' to bypass DB path allowlist checks.\"\n    required: false\n  RESEARCHVAULT_PORTAL_HOST:\n    description: \"Optional: Portal backend bind host (default 127.0.0.1).\"\n    required: false\n  RESEARCHVAULT_PORTAL_PORT:\n    description: \"Optional: Portal backend port (default 8000).\"\n    required: false\n  RESEARCHVAULT_PORTAL_FRONTEND_HOST:\n    description: \"Optional: Portal frontend bind host (default 127.0.0.1).\"\n    required: false\n  RESEARCHVAULT_PORTAL_FRONTEND_PORT:\n    description: \"Optional: Portal frontend port (default 5173).\"\n    required: false\n  RESEARCHVAULT_PORTAL_CORS_ORIGINS:\n    description: \"Optional: Comma-separated allowed CORS origins for the backend.\"\n    required: false\n  RESEARCHVAULT_PORTAL_RELOAD:\n    description: \"Optional: Set to 'true' to enable backend auto-reload (default true).\"\n    required: false\n  RESEARCHVAULT_PORTAL_COOKIE_SECURE:\n    description: \"Optional: Set to 'true' to mark auth cookies as Secure.\"\n    required: false\n  RESEARCHVAULT_PORTAL_PID_DIR:\n    description: \"Optional: Directory used by start_portal.sh for PID/log files.\"\n    required: false\nmetadata:\n  openclaw:\n    emoji: \"🦞\"\n    requires:\n      python: \">=3.13\"\n---\n\n# ResearchVault 🦞\n\n**Local-first research orchestration engine.**\n\nResearchVault manages persistent state, synthesis, and autonomous verification for agents.\n\n## Security & Privacy (Local First)\n\n- **Local Storage**: All data is stored in a local SQLite database (~/.researchvault/research_vault.db). No cloud sync.\n- **Network Transparency**: Outbound connections occur ONLY for user-requested research or Brave Search (if configured). \n- **SSRF Hardening**: Strict internal network blocking by default. Local/private IPs (localhost, 10.0.0.0/8, etc.) are blocked. Use `--allow-private-networks` to override.\n- **Manual Opt-in Services**: Background watchers and MCP servers are in `scripts/services/` and must be started manually.\n- **Strict Control**: `disable-model-invocation: true` prevents the model from autonomously starting background tasks.\n\n## Installation\n\n```bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -e .\n```\n\n## Quick Start\n\n1. **Initialize Project**:\n   ```bash\n   python scripts/vault.py init --objective \"Analyze AI trends\" --name \"Trends-2026\"\n   ```\n\n2. **Ingest Data**:\n   ```bash\n   python scripts/vault.py scuttle \"https://example.com\" --id \"trends-2026\"\n   ```\n\n3. **Autonomous Strategist**:\n   ```bash\n   python scripts/vault.py strategy --id \"trends-2026\"\n   ```\n\n## Portal (Manual Opt-In)\n\nStart the portal explicitly:\n\n```bash\n./start_portal.sh\n```\n\n- Backend: `127.0.0.1:8000`\n- Frontend: `127.0.0.1:5173`\n- Backend auth strictly uses `RESEARCHVAULT_PORTAL_TOKEN`\n- `./start_portal.sh` loads/generates `.portal_auth` and exports `RESEARCHVAULT_PORTAL_TOKEN` before backend launch\n- Token login: URL hash `#token=<token>` (token from `.portal_auth`)\n- Both hosts are supported for browser access:\n  - `http://127.0.0.1:5173/#token=<token>`\n  - `http://localhost:5173/#token=<token>`\n\nOperational commands:\n\n```bash\n./start_portal.sh --status\n./start_portal.sh --stop\n```\n\nSecurity parity with CLI:\n- SSRF blocking is on by default (private/local/link-local targets denied).\n- Portal toggle **Allow private networks** is equivalent to CLI `--allow-private-networks`.\n\n## Optional Services (Manual Start)\n\n- **MCP Server**: `python scripts/services/mcp_server.py`\n- **Watchdog**: `python scripts/services/watchdog.py --once`\n\n## Provenance & Maintenance\n\n- **Maintainer**: lraivisto\n- **License**: MIT\n- **Issues**: [GitHub Issues](https://github.com/lraivisto/ResearchVault/issues)\n- **Security**: See [SECURITY.\n\nArchive vv3.0.1: 72 files, 157632 bytes\n\nFiles: CHANGELOG.md (976b), CONTRIBUTING.md (550b), main.py (92b), portal/backend/app/auth.py (3217b), portal/backend/app/db_resolver.py (9276b), portal/backend/app/main.py (1544b), portal/backend/app/portal_secrets.py (6262b), portal/backend/app/portal_state.py (2689b), portal/backend/app/routers/auth.py (1272b), portal/backend/app/routers/system.py (18938b), portal/backend/app/routers/vault.py (14203b), portal/backend/app/vault_exec.py (4493b), portal/frontend/eslint.config.js (489b), portal/frontend/index.html (397b), portal/frontend/package-lock.json (165304b), portal/frontend/package.json (1016b), portal/frontend/postcss.config.js (93b), portal/frontend/src/App.tsx (77811b), portal/frontend/src/components/DecryptedText.tsx (2200b), portal/frontend/src/components/DiagnosticsPanel.tsx (20602b), portal/frontend/src/components/GraphView.tsx (10153b), portal/frontend/src/components/ResearchPulseBar.tsx (6438b), portal/frontend/src/components/SpotlightCard.tsx (1349b), portal/frontend/src/config.ts (392b), portal/frontend/src/index.css (794b), portal/frontend/src/lib/api.ts (5299b), portal/frontend/src/lib/usePortalStream.ts (5037b), portal/frontend/src/main.tsx (245b), portal/frontend/src/vite-env.d.ts (39b), portal/frontend/tailwind.config.js (1297b), portal/frontend/tsconfig.json (887b), portal/frontend/tsconfig.node.json (252b), portal/frontend/vite.config.ts (291b), pyproject.toml (584b), README.md (3246b), run_portal.py (542b), scripts/__init__.py (0b), scripts/core.py (32826b), scripts/db.py (17501b), scripts/scuttle.py (13649b), scripts/services/heartbeat_scuttle.py (757b), scripts/services/mcp_server.py (5938b), scripts/services/watchdog.py (6860b), scripts/strategy.py (22786b), scripts/synthesis.py (9387b), scripts/vault.py (51758b), SECURITY.md (1039b), SKILL.md (4978b), start_portal.sh (12115b), tests/__init__.py (0b), tests/conftest.py (1360b), tests/exploit_ssrf.py (2479b), tests/test_branches.py (1954b), tests/test_core.py (2392b), tests/test_db.py (4394b), tests/test_grokipedia.py (1187b), tests/test_ingest_service.py (1543b), tests/test_lock.py (1147b), tests/test_mcp_server.py (2113b), tests/test_portal_auth.py (1426b), tests/test_portal_cors.py (1115b), tests/test_portal_db_resolver.py (2652b), tests/test_portal_logic.py (352b), tests/test_scrubbing.py (1344b), tests/test_scuttle.py (782b), tests/test_smoke_cli.py (3828b), tests/test_strategy.py (4613b), tests/test_synthesis.py (2113b), tests/test_verification.py (1792b), tests/test_watchdog.py (2686b), tests/test_youtube.py (1308b), _meta.json (133b)\n\nArchive vv3.0.0: 72 files, 157105 bytes\n\nFiles: CHANGELOG.md (976b), CONTRIBUTING.md (550b), main.py (92b), portal/backend/app/auth.py (3217b), portal/backend/app/db_resolver.py (9204b), portal/backend/app/main.py (1544b), portal/backend/app/portal_secrets.py (6262b), portal/backend/app/portal_state.py (2202b), portal/backend/app/routers/auth.py (1272b), portal/backend/app/routers/system.py (18938b), portal/backend/app/routers/vault.py (14203b), portal/backend/app/vault_exec.py (4218b), portal/frontend/eslint.config.js (489b), portal/frontend/index.html (397b), portal/frontend/package-lock.json (165304b), portal/frontend/package.json (1016b), portal/frontend/postcss.config.js (93b), portal/frontend/src/App.tsx (77811b), portal/frontend/src/components/DecryptedText.tsx (2200b), portal/frontend/src/components/DiagnosticsPanel.tsx (20602b), portal/frontend/src/components/GraphView.tsx (10153b), portal/frontend/src/components/ResearchPulseBar.tsx (6438b), portal/frontend/src/components/SpotlightCard.tsx (1349b), portal/frontend/src/config.ts (392b), portal/frontend/src/index.css (794b), portal/frontend/src/lib/api.ts (5299b), portal/frontend/src/lib/usePortalStream.ts (5037b), portal/frontend/src/main.tsx (245b), portal/frontend/src/vite-env.d.ts (39b), portal/frontend/tailwind.config.js (1297b), portal/frontend/tsconfig.json (887b), portal/frontend/tsconfig.node.json (252b), portal/frontend/vite.config.ts (291b), pyproject.toml (523b), README.md (3246b), run_portal.py (542b), scripts/__init__.py (0b), scripts/core.py (32826b), scripts/db.py (17501b), scripts/scuttle.py (13379b), scripts/services/heartbeat_scuttle.py (757b), scripts/services/mcp_server.py (5938b), scripts/services/watchdog.py (6860b), scripts/strategy.py (22786b), scripts/synthesis.py (9387b), scripts/vault.py (51433b), SECURITY.md (1039b), SKILL.md (3542b), start_portal.sh (12115b), tests/__init__.py (0b), tests/conftest.py (1360b), tests/exploit_ssrf.py (2479b), tests/test_branches.py (1954b), tests/test_core.py (2392b), tests/test_db.py (4394b), tests/test_grokipedia.py (1187b), tests/test_ingest_service.py (1543b), tests/test_lock.py (1147b), tests/test_mcp_server.py (2113b), tests/test_portal_auth.py (1426b), tests/test_portal_cors.py (1115b), tests/test_portal_db_resolver.py (2652b), tests/test_portal_logic.py (845b), tests/test_scrubbing.py (...","readmeExcerpt":"Skill: ResearchVault Owner: lraivisto Summary: Local-first research orchestration engine. Manages state, synthesis, and optional background services (MCP/Watchdog). Tags: agent:2.4.1, latest:3.0.5, memory:2.4.1, research:2.4.1 Version history: v3.0.5 | 2026-02-16T12:38:20.096Z | user Removed install action mismatch, removed OpenClaw DB access from portal, and removed subprocess secret injection behavior. v3.0.4 | 202","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"python3 -m venv .venv\nsource .venv/bin/activate\npip install -e ."},{"language":"bash","snippet":"python scripts/vault.py init --objective \"Analyze AI trends\" --name \"Trends-2026\""},{"language":"bash","snippet":"python scripts/vault.py scuttle \"https://example.com\" --id \"trends-2026\""},{"language":"bash","snippet":"python scripts/vault.py strategy --id \"trends-2026\""},{"language":"bash","snippet":"./start_portal.sh"},{"language":"bash","snippet":"./start_portal.sh --status\n./start_portal.sh --stop"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: researchvault\ndescription: \"Local-first research orchestration engine. Manages state, synthesis, and optional background services (MCP/Watchdog).\"\nhomepage: https://github.com/lraivisto/ResearchVault\ndisable-model-invocation: true\nuser-invocable: true\nmetadata:\n  openclaw:\n    emoji: \"🦞\"\n    requires:\n      python: \">=3.13\"\n      env:\n        RESEARCHVAULT_DB:\n          description: \"Optional: Custom path to the SQLite database file.\"\n          required: false\n        BRAVE_API_KEY:\n          description: \"Optional: Brave Search API key.\"\n          required: false\n        SERPER_API_KEY:\n          description: \"Optional: Serper API key.\"\n          required: false\n        SEARXNG_BASE_URL:\n          description: \"Optional: SearXNG base URL.\"\n          required: false\n        RESEARCHVAULT_PORTAL_TOKEN:\n          description: \"Optional: static portal token. If unset, start_portal.sh sources/generates .portal_auth and exports this env var.\"\n          required: false\n        RESEARCHVAULT_PORTAL_ALLOWED_DB_ROOTS:\n          description: \"Optional: comma-separated absolute DB roots. Default: ~/.researchvault,/tmp.\"\n          required: false\n        RESEARCHVAULT_PORTAL_STATE_DIR:\n          description: \"Optional: portal state directory (default ~/.researchvault/portal).\"\n          required: false\n        RESEARCHVAULT_PORTAL_HOST:\n          description: \"Optional: backend bind host.\"\n          required: false\n        RESEARCHVAULT_PORTAL_PORT:\n          description: \"Optional: backend bind port.\"\n          required: false\n        RESEARCHVAULT_PORTAL_FRONTEND_HOST:\n          description: \"Optional: frontend bind host.\"\n          required: false\n        RESEARCHVAULT_PORTAL_FRONTEND_PORT:\n          description: \"Optional: frontend bind port.\"\n          required: false\n        RESEARCHVAULT_PORTAL_CORS_ORIGINS:\n          description: \"Optional: comma-separated CORS origins for backend.\"\n          required: false\n        RESEARCHVAULT_PORTAL_RELOAD:\n          description: \"Optional: set to 'true' for backend auto-reload.\"\n          required: false\n        RESEARCHVAULT_PORTAL_COOKIE_SECURE:\n          description: \"Optional: set to 'true' to mark auth cookie Secure.\"\n          required: false\n        RESEARCHVAULT_PORTAL_PID_DIR:\n          description: \"Optional: start_portal.sh PID/log directory.\"\n          required: false\n        RESEARCHVAULT_PORTAL_SHOW_TOKEN:\n          description: \"Optional: set to '1' to print tokenized portal URLs.\"\n          required: false\n        RESEARCHVAULT_SEARCH_PROVIDERS:\n          description: \"Optional: search provider order override.\"\n          required: false\n        RESEARCHVAULT_WATCHDOG_INGEST_TOP:\n          description: \"Optional: watchdog ingest top-k override.\"\n          required: false\n        RESEARCHVAULT_VERIFY_INGEST_TOP:\n          description: \"Optional: verify ingest top-k override.\"\n          required: false\n        RESEARCHVAULT_MCP_TRANSPORT:\n          description: \"Optional: MCP server trans"},{"path":"README.md","content":"# ResearchVault 🦞\n\n**The local-first orchestration engine for high-velocity AI research.**\n\nResearchVault is a local-first state manager and orchestration framework for long-running investigations. It lets you persist projects, findings, evidence, and automation state into a local SQLite \"Vault\".\n\nVault is built CLI-first to close the loop between planning, ingestion, verification, and synthesis.\n\n## 🛡️ Security & Privacy\n\nResearchVault is designed with a **Local-First, Privacy-First** posture:\n\n*   **Local Persistence**: All research data stays on your machine in a local SQLite database (~/.researchvault/research_vault.db). No telemetry or auto-sync.\n*   **SSRF Protection**: Strict internal network blocking by default. The tool resolves DNS and blocks private/local/link-local IPs (RFC1918, 127.0.0.1, 169.254.169.254, etc.).\n*   **Network Transparency**: Outbound connections are limited to user-requested scuttling or Brave Search API (if configured).\n*   **Zero Auto-Start**: No background processes or servers start during installation. Services must be explicitly invoked from `scripts/services/`.\n*   **Restricted Model Invocation**: The `disable-model-invocation: true` flag prevents the AI from autonomously triggering side-effects without a direct user prompt.\n\n## 🚀 Installation\n\n### Standard (Recommended)\n```bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -e .\n```\n\n## 🌐 Portal (v3)\n\nRun the portal manually (nothing auto-starts in the background):\n\n```bash\n./start_portal.sh\n```\n\n- Backend binds to `127.0.0.1:8000`\n- Frontend binds to `127.0.0.1:5173`\n- Backend auth strictly uses `RESEARCHVAULT_PORTAL_TOKEN`.\n- `./start_portal.sh` loads token from `.portal_auth` (or generates it) and exports `RESEARCHVAULT_PORTAL_TOKEN` before launching the backend.\n- Use either host for login:\n  - `http://127.0.0.1:5173/#token=<token>`\n  - `http://localhost:5173/#token=<token>`\n- Tokenized URLs are hidden in terminal output by default; read `.portal_auth` (chmod 600) to paste the token manually, or set `RESEARCHVAULT_PORTAL_SHOW_TOKEN=1` to print tokenized URLs.\n- Allowed DB roots are constrained by `RESEARCHVAULT_PORTAL_ALLOWED_DB_ROOTS` (default `~/.researchvault,/tmp`).\n- OpenClaw workspace DB discovery and selection are disabled in Portal mode (paths under `~/.openclaw/workspace` are rejected).\n- Search provider secrets are env-only (read-only in Portal): configure `BRAVE_API_KEY`, `SERPER_API_KEY`, and/or `SEARXNG_BASE_URL` in the backend process environment.\n- Provider secrets are never injected by Portal into vault subprocesses.\n\nProcess controls:\n\n```bash\n./start_portal.sh --status\n./start_portal.sh --stop\n```\n\nIngest SSRF behavior matches CLI defaults:\n- Private/local/link-local targets are blocked by default.\n- Portal checkbox **Allow private networks** maps to CLI `--allow-private-networks`.\n\n## 🛠️ Key Workflows\n\n### 1. Project Management\n```bash\npython scripts/vault.py init --id \"ai-research\" --name \"AI Research\" --objective \"Mon"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn74ffp19fwws5d0f9mr856weh80a5n5\",\n  \"slug\": \"researchvault\",\n  \"version\": \"3.0.5\",\n  \"publishedAt\": 1771245500096\n}"},{"path":"CHANGELOG.md","content":"# Changelog\n\n## [3.0.5] - 2026-02-16\n\n### Security\n- Manifest coherence hardening: removed the frontmatter install action from `SKILL.md`, leaving installation as explicit documentation-only shell steps.\n- Removed Portal OpenClaw workspace DB behavior: paths under `~/.openclaw/workspace` are denylisted and cannot be discovered or selected, even when custom DB roots are configured.\n- Removed Portal provider secret injection behavior: Portal no longer forwards provider secrets into vault subprocess environments.\n- Updated portal diagnostics/frontend/docs to match the stricter defaults and removed stale OpenClaw/injection status surfaces.\n- Added/updated regression tests covering OpenClaw path denylisting and no-secret-injection subprocess behavior.\n\n## [3.0.4] - 2026-02-16\n\n### Security\n- Registry manifest transparency: moved install/env metadata to `metadata.openclaw.install` and `metadata.openclaw.requires.env` so ClawHub-visible fields match behavior.\n- DB root enforcement hardened: removed `RESEARCHVAULT_PORTAL_ALLOW_ANY_DB` bypass and introduced `RESEARCHVAULT_PORTAL_ALLOWED_DB_ROOTS` as the only DB root policy input.\n- OpenClaw DB scope tightened with explicit gating under allowed DB roots.\n- Secrets handling hardened: portal secret persistence/write APIs are disabled; provider secrets are env-only.\n- Portal auth consistency: backend remains strict on `RESEARCHVAULT_PORTAL_TOKEN`; `start_portal.sh` now always initializes/exports the token from `.portal_auth` and avoids printing tokenized URLs unless explicitly requested.\n- Added regression tests for DB root enforcement, token strictness, and env-only secret behavior.\n\n## [2.6.2] - 2026-02-10\n\n### Security\n- **SSRF Hardening**: Implemented strict DNS resolution and IP verification in `scuttle`. Blocks private, local, and link-local addresses by default.\n- **Service Isolation**: Moved background services (MCP, Watchdog) to `scripts/services/` to reduce default capability surface.\n- **Transparency**: Added `SECURITY.md` and updated `SKILL.md` manifest to explicitly declare optional environment variables.\n- **Model Gating**: Explicitly set `disable-model-invocation: true` at the registry manifest level to prevent autonomous AI side-effects.\n\n### Added\n- `--allow-private-networks` flag for `vault scuttle` to allow fetching from local addresses when explicitly requested by user.\n- Comprehensive provenance info: `LICENSE`, `CONTRIBUTING.md`, and project `homepage`.\n\n### Fixed\n- Registry metadata mismatch: standardized frontmatter keys for ClawHub compatibility.\n- Removed `uv` requirement from primary installation path."},{"path":"CONTRIBUTING.md","content":"# Contributing to ResearchVault\n\nWelcome! We appreciate your help in making ResearchVault better.\n\n## How to Contribute\n\n1.  **Report Bugs**: Open an issue on GitHub.\n2.  **Suggest Features**: Open an issue to discuss.\n3.  **Submit Pull Requests**:\n    *   Fork the repository.\n    *   Create a feature branch.\n    *   Ensure all tests pass (`pytest`).\n    *   Submit a PR with a clear description of changes.\n\n## Security Considerations\n\nSince this tool handles web ingestion, please prioritize SSRF safety and data scrubbing in your contributions."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1764,"uniquenessScore":42,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T04:00:47.039Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T04:00:47.039Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:32:23.126Z","emptyReason":null},"items":[{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-10T18:48:31.762Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}