{
  "sources": [
    {
      "url": "https://gist.githubusercontent.com/gtmcknight/594c47336546c8763e641b46cf9af4ec/raw/field.json",
      "quote": "\"pr\":149968,\"name\":\"lahja\",\"repo\":\"https://github.com/Tarekkharsa/hermes-lahja\",\"sha\":\"a7a43b1389a1ae169ff5c7401e9ec2ec9a53b51d\",\"subdir\":\"lahja\"},{\"pr\":149977,\"name\":\"webnovel-studio\",\"repo\":\"https://github.com/wyi006636-cyber/hermes-webnovel-studio\",\"sha\":\"1446c1ba14b4e999614cdece6010720db526d77b\",\"subdir\":\"webnovel_studio\"},{\"pr\":149978,\"name\":\""
    },
    {
      "url": "https://gist.githubusercontent.com/gtmcknight/594c47336546c8763e641b46cf9af4ec/raw/RUN.md",
      "quote": "## 1. Hermes, once\n\n    git clone --depth 1 https://github.com/NousResearch/hermes-agent test/scratch/hermes\n    cd test/scratch/hermes && uv sync --locked --python 3.14 && cd -\n    test/scratch/hermes/.venv/bin/hermes plugins --help\n\nThe last line must list `install`, `validate` and `doctor`. `uv sync --locked` is how Nous's own CI builds Hermes; it fetches Python 3.14 itself when the machine lacks it. No uv on this machine: `curl -LsS"
    },
    {
      "url": "https://raw.githubusercontent.com/NousResearch/hermes-agent/a84025ade22d2a4085f575d4353072e5b702635d/plugin-catalog/README.md",
      "quote": "11. **Credentials come through Hermes, never from files.** A plugin gets\n   secrets only through Hermes's routes. Its declared `requires_env` and\n   `config_schema` secrets are read with `agent.secret_scope.get_secret(NAME)`,\n   which honours the active profile (a bare `os.environ` read can pick up another\n   profile's key under multiplexing). A subscription sign-in (Codex / ChatGPT\n   today) is used only through `credentialed_provider_request` with\n   `requires_auth`, so Her"
    },
    {
      "url": "https://raw.githubusercontent.com/NousResearch/hermes-agent/a84025ade22d2a4085f575d4353072e5b702635d/pyproject.toml",
      "quote": "[project]\nname = \"hermes-agent\"\nversion = \"0.0.0\"\ndescription = \"The self-improving AI agent — creates skills from experience, improves them during use, and runs anywhere\"\nreadme = \"README.md\"\n# 3.14 is the newest python we know we have wheels for.\n# we *only* support 3.14, BUT we need to allow old hermes installs on <3.14\n# to get thru their update step on old python.\n# Shortly after they do, we update to our latest python.\n# See tests/compat/README.md for the updater contra"
    },
    {
      "url": "https://raw.githubusercontent.com/Tarekkharsa/hermes-lahja/a7a43b1389a1ae169ff5c7401e9ec2ec9a53b51d/README.md",
      "quote": "Send Hermes a voice note in Levantine, Gulf, Egyptian, Iraqi or Maghrebi Arabic and get back **what you\nactually said**: in your dialect, not rewritten as formal Arabic, and not translated.\n\nFully local. No API keys. Stores no audio and no transcripts.\n\n```\nvoice note ─▶ ffmpeg 16 kHz ─▶ Silero VAD ─▶ dialect Whisper (whisper.cpp, Metal)\n"
    },
    {
      "url": "https://raw.githubusercontent.com/Tarekkharsa/hermes-lahja/a7a43b1389a1ae169ff5c7401e9ec2ec9a53b51d/lahja/__init__.py",
      "quote": "def register(ctx) -> None:\n    ctx.register_transcription_provider(LahjaProvider(ctx))\n    ctx.register_command(\n        \"stt-fix\", make_stt_fix(lambda: ctx.state),\n        description=\"Teach Lahja a speech-to-text correction (e.g. جي إلي تي => JLT)\",\n        args_hint=\"<heard> => <meant> | list | remove N\",\n    )\n    ctx.register_cli_command(\n        \"lahja\", help=\"Lahja Arabic speech-to-text: setup, models, status, test\",\n        setup_fn=_cli_setup, handler_fn=make_cli_han"
    },
    {
      "url": "https://raw.githubusercontent.com/Tarekkharsa/hermes-lahja/a7a43b1389a1ae169ff5c7401e9ec2ec9a53b51d/tests/test_real_engine.py",
      "quote": "pytestmark = pytest.mark.skipif(\n    not (MODEL and VAD and SAMPLE and shutil.which(\"whisper-cli\") and shutil.which(\"ffmpeg\")),\n    reason=\"set LAHJA_REAL_MODEL, LAHJA_REAL_VAD, LAHJA_REAL_SAMPLE; needs whisper-cli and ffmpeg\")\n\n\n@pytest.fixture\ndef engine(lahja):\n    import hermes_plugins.lahja.engine as e\n    return e\n\n\ndef _opts(engine, language=\"auto\"):\n"
    },
    {
      "url": "https://raw.githubusercontent.com/0xsaltylollipop/vellum/286b44d587500bd4792decdc73370791262aec0b/README.md",
      "quote": "## Why a plugin and not a prompt\nA prompt can ask a model to explain a passage. It can't do the rest:\n- **Draw inside the page you're reading.** That takes the Desktop half (the card under the paragraph) and the canvas tools.\n- **Keep the drawing in step with the voice.** The hooks on Hermes's stream voice each sentence as it is written, and each drawing step is held back until its sentence starts playing.\n- **Know the paper, on the right turns only.** `pre_llm_call` hands th"
    },
    {
      "url": "https://raw.githubusercontent.com/0xsaltylollipop/vellum/286b44d587500bd4792decdc73370791262aec0b/paper_anim/canvas.py",
      "quote": "def _request(event: str, payload: dict, timeout: float) -> dict:\n    \"\"\"Push a request to the paper and wait for its answer.\"\"\"\n    prune()\n    if not is_on():  # fail at once (cron, messaging, a closed Desktop) instead of waiting for a paper that isn't there\n        return {\"ok\": False, \"error\": \"Vellum is off: there is no paper canvas to draw on. Answer in text.\"}\n    from hermes_cli.plugin_events import broadcast_plugin_event\n    req = uuid.uuid4().hex[:16]\n    path = rela"
    },
    {
      "url": "https://raw.githubusercontent.com/0xsaltylollipop/vellum/286b44d587500bd4792decdc73370791262aec0b/tests/test_vellum.py",
      "quote": "def test_the_figure_page_runs_only_its_own_two_scripts():\n    html = _figure_page()\n    csp = re.search(r'http-equiv=\"Content-Security-Policy\" content=\"([^\"]+)\"', html).group(1)\n    rules = dict(part.strip().split(\" \", 1) for part in csp.split(\";\") if part.strip())\n    assert rules[\"default-src\"] == \"'none'\" and \"connect-src\" not in rules and \"frame-src\" not in rules\n    scripts = re.findall(r\"<script>(.*?)</script>\", html, re.S)\n    hashes = [\"'sha256-\" + base64.b64encode(ha"
    },
    {
      "url": "https://raw.githubusercontent.com/SilentKnight87/shadow-army/aa340f06ffe10dce5c63cfabc0e0c6de3e9d1e41/shadow-army/README.md",
      "quote": "**The push guard fails open, and it is new.** On any error or anything it cannot read, the command runs without the prompt. It is covered by tests through Hermes's own plugin manager and was recorded once in a real session, where the owner declined. Approving the prompt was not exercised in that run.\n- **A running gateway keeps the plugin code it started with.** After updating the plugin's files, run `hermes gateway restart`. Until then Hermes runs the older copy: our first p"
    },
    {
      "url": "https://raw.githubusercontent.com/SilentKnight87/shadow-army/aa340f06ffe10dce5c63cfabc0e0c6de3e9d1e41/shadow-army/bridge.py",
      "quote": "for name in ('army_gate', 'army_verdict'):\n        props = dict(common)\n        if name == 'army_verdict':\n            props.update(verdict={'type': 'string', 'enum': ['PASS', 'FAIL']}, findings={\n                'type': 'array', 'items': {'type': 'object', 'properties': {'file': {'type': 'string'},\n                    'line': {'type': 'integer'}, 'text': {'type': 'string'}}, 'required': ['file', 'line', 'text']}})\n        def handler(args, session_id='', _name=name, **kwargs"
    },
    {
      "url": "https://raw.githubusercontent.com/SilentKnight87/shadow-army/aa340f06ffe10dce5c63cfabc0e0c6de3e9d1e41/host_probe.py",
      "quote": "def test_08_session_path_check_and_nonlocal_refusal(self):\n        import shlex\n        repo = self.repo\n        venv = self.home / 'venv-bin'\n        venv.mkdir()\n        check = venv / 'projcheck'\n        check.write_text('#!/bin/sh\\nmkdir -p __pycache__\\nprintf cache > __pycache__/check.pyc\\nprintf \"session path works\"\\n')\n        check.chmod(0o755)\n        card = self.fresh_card(repo)\n        _, child, _ = self.bind_card(card, 'projcheck')\n        exported = self.call('te"
    },
    {
      "url": "https://raw.githubusercontent.com/SilentKnight87/shadow-army/aa340f06ffe10dce5c63cfabc0e0c6de3e9d1e41/shadow-army/setup.py",
      "quote": "def missing_host_contexts():\n    expected = {\n        'agent.runtime_cwd': ('HERMES_SESSION_CWD',),\n        'tools.terminal_scope': ('hermes_terminal_scope',),\n        'agent.delegation_context': ('hermes_delegated_child_context',),\n        'hermes_cli.kanban_db': ('hermes_kanban_current_board_override', 'hermes_kanban_pin_first_board_resolution'),\n    }\n    missing = []\n    for module_name, names in expected.items():\n        try:\n            module = importlib.import_module("
    },
    {
      "url": "https://raw.githubusercontent.com/GodlyDeveloper1/hermes/f5f69e215dad54c06d2977320a080ab1c68f10ca/README.md",
      "quote": "## Security model\n\nUSSD gateways do not sign their callbacks, so the plugin is built around that:\n\n- **The callback URL is the credential.** Requests to any path other than `/ussd/<secret>` get a 404, compared in constant time. The adapter refuses to start with a secret shorter than 16 characters and never writes the path to the access log. Use an HTTPS tunnel or reverse proxy in front of it.\n- **Phone numbers come from the network, not the caller.** The number in a callback "
    },
    {
      "url": "https://raw.githubusercontent.com/GodlyDeveloper1/hermes/f5f69e215dad54c06d2977320a080ab1c68f10ca/adapter.py",
      "quote": "if len(self._secret) < MIN_SECRET_LENGTH:\n            message = (\n                f\"[ussd] Refusing to start: USSD_WEBHOOK_SECRET must be at least {MIN_SECRET_LENGTH} characters. \"\n                \"USSD gateways do not sign their callbacks, so this secret in the callback URL is what \"\n                \"stops anyone else from posting as your phone. Generate one with: openssl rand -hex 24\")\n            logger.error(message)\n            self._set_fatal_error(\"ussd_weak_secret\", m"
    },
    {
      "url": "https://raw.githubusercontent.com/GodlyDeveloper1/hermes/f5f69e215dad54c06d2977320a080ab1c68f10ca/tests/test_adapter_live.py",
      "quote": "def test_real_approval_entry_is_settled_from_the_keypad(monkeypatch):\n    async def scenario():\n        from tools import approval\n        from tools.approval_gateway_wait import _ApprovalEntry\n        adapter, _, base = await _rig(monkeypatch)\n        session_key = \"ussd-test-session\"\n        entry = _ApprovalEntry({\"request_id\": \"req-42\", \"command\": \"rm -rf ./build\"})\n        entry.card_deny_only = True  # every request starts Deny-only until its card shows the whole comman"
    },
    {
      "url": "https://raw.githubusercontent.com/ctmakc/hermes-redactgate/d4bb87d78381d0514cd8dd74525fea98a5b46d62/README.md",
      "quote": "**What no plugin can rewrite, and what RedactGate does about it.** Hermes runs auxiliary\nmodel calls (session titles, context compression, vision, approvals) without request\nmiddleware. In a live test, Hermes's title generator sent the raw first message, name, e-mail,\nphone and card, to the same provider. RedactGate:\n\n* watches every auxiliary call through the `pre_auxiliary_call` observer and records an\n  `aux_unprotected` event with the entity counts when one carried person"
    },
    {
      "url": "https://raw.githubusercontent.com/ctmakc/hermes-redactgate/d4bb87d78381d0514cd8dd74525fea98a5b46d62/vault.py",
      "quote": "    def token(self, entity_type: str, value: str) -> str:\n        canon = canonical(entity_type, value)\n        digest = hmac.new(self.key, f\"{entity_type}\\x00{canon}\".encode(), hashlib.sha256).hexdigest()[:6]\n        tok = f\"[[{entity_type}_{digest}]]\"\n        with self.lock:\n            if tok not in self.by_token:\n                self.by_token[tok] = (entity_type, value.strip())\n                if len(self.by_token) > self.max_entries:\n                    self.by_token.pop"
    },
    {
      "url": "https://raw.githubusercontent.com/ctmakc/hermes-redactgate/d4bb87d78381d0514cd8dd74525fea98a5b46d62/tests/test_hermes_integration.py",
      "quote": "def test_round_trip_through_hermes_call_sites(manager):\n    req = {\"model\": \"m\", \"messages\": [\n        {\"role\": \"system\", \"content\": \"You are helpful.\"},\n        {\"role\": \"user\", \"content\": \"Email Jane Doe at jane.doe@acme-corp.com about invoice 7.\"},\n    ]}\n    res = middleware.apply_llm_request_middleware(req, session_id=\"sess-int\", provider=\"openrouter\",\n                                                  base_url=\"https://openrouter.ai/api/v1\", model=\"m\")\n    wire = json.du"
    }
  ]
}
