{
  "sources": [
    {
      "url": "https://gist.githubusercontent.com/gtmcknight/594c47336546c8763e641b46cf9af4ec/raw/field.json",
      "quote": "\"done-bell\",\"repo\":\"https://github.com/aydnOktay/hermes-done-bell-\",\"sha\":\"3fa519a291d91b0e6c44bd42762190363ce80c39\",\"subdir\":\"\"},{\"name\":\"homeassistant\",\"repo\":\"https://github.com/NousResearch/hermes-official-plugins\",\"sha\":\"e7a218f26db88426ab3e7376"
    },
    {
      "url": "https://raw.githubusercontent.com/aydnOktay/hermes-done-bell-/3fa519a291d91b0e6c44bd42762190363ce80c39/README.md",
      "quote": "## Install (dev)\n\n```powershell\nhermes plugins install C:\\Users\\aydin\\Desktop\\nous-puling\\plugins\\done-bell\nhermes plugins enable done-bell\n```\n\nCopy the pane (Hermes 0.21 installer may skip it):\n\n```powershell\nNew-Item -ItemType Directory -Force -Path \"$env:LOCALAPPDATA\\hermes\\desktop-plugins\\done-bell\" | Out-Null\nCopy-Item \"$env:LOCALAPPDATA\\hermes\\plugins\\done-bell\\desktop\\plugin.js\" \"$env:LOCALAPPDATA\\hermes\\desktop-plugins\\done-bell\\plugin.j"
    },
    {
      "url": "https://raw.githubusercontent.com/aydnOktay/hermes-done-bell-/3fa519a291d91b0e6c44bd42762190363ce80c39/tests/test_bell.py",
      "quote": "def test_needs_you_cycle() -> None:\n    bell_hooks.on_pre_approval_request(platform=\"cli\", session_key=\"s2\")\n    snap = bell_store.snapshot()\n    assert snap[\"needs_you\"] is True\n    assert snap[\"events\"][-1][\"kind\"] == \"needs_you\"\n    bell_hooks.on_post_approval_response(approved=True)\n    assert bell_store.snapshot()[\"needs_you\"] is False\n\n\ndef test_session_end_completed() -> None:\n    bell_hooks.on_session_end(session_id=\"s3\", completed=True, "
    },
    {
      "url": "https://raw.githubusercontent.com/NousResearch/hermes-official-plugins/e7a218f26db88426ab3e7376f0e000b6e356f5e7/homeassistant/tools.py",
      "quote": "_BLOCKED_DOMAINS = frozenset({\n    \"shell_command\",    # arbitrary shell commands as root in HA container\n    \"command_line\",     # sensors/switches that execute shell commands\n    \"python_script\",    # sandboxed but can escalate via hass.services.call()\n    \"pyscript\",         # scripting integration with broader access\n    \"hassio\",           # addon control, host shutdown/reboot, stdin to containers\n    \"rest_command\",     "
    },
    {
      "url": "https://raw.githubusercontent.com/NousResearch/hermes-official-plugins/e7a218f26db88426ab3e7376f0e000b6e356f5e7/homeassistant/adapter.py",
      "quote": "    async def _ws_connect(self) -> bool:\n        \"\"\"Open the WebSocket, authenticate, and subscribe to ``state_changed``.\"\"\"\n        ws_url = self._hass_url.replace(\"https://\", \"wss://\").replace(\"http://\", \"ws://\")\n        self._session = self._new_session()\n        self._ws = await self._session.ws_connect(\n            f\"{ws_url}/api/websocket\", heartbeat=self._ws_heartbeat, timeout=30)\n        msg = await self._ws.receive_json()\n        if msg.get(\"type\") != \"auth_requ"
    },
    {
      "url": "https://raw.githubusercontent.com/lumizone/postsider-agent-plugin/4ddb64abfb18a7ea3d9c38703854b351fb1cfbc0/README.md",
      "quote": "- **Local process and credentials:** `npx` downloads and runs `mcp-remote@0.15.2` from npm. On first\n  use it starts a local callback server on a localhost port, opens the browser, and stores the OAuth\n  tokens for PostSider under `~/.mcp-auth`. Without a stored token, an unattended run fails when\n  Hermes's connect timeout expires (about a minute) instead of hanging.\n- **No telemetry** from this package, no bundled credentials, no background processes beyond the MCP\n  server"
    },
    {
      "url": "https://raw.githubusercontent.com/MelMayssonOwen/hermes-plugins/f203c3f897784d731ef48bc0974104a4d08cf5f8/makeirl/README.md",
      "quote": "Sign in with OAuth. The bundled `mcp.json` alone returns 401:\n\n```sh\nhermes mcp add makeirl --url https://makeirl.com/api/mcp --auth oauth\n```\n\n## What this package contains\n\nA portable Agent Plugins v1 package: `plugin.json`, `mcp.json` and workflow skills under `skills/`. It has no background process and no self-updating code.\n\n## Disclosure\n\nEvery tool call goes to `makeirl.com` and needs a MakeIRL account. Uploading a release sends your KiCad project files to Ma"
    },
    {
      "url": "https://raw.githubusercontent.com/rkfshakti/hermes-glassbox/2b070ee7fc94d880929fea3743f1ad8e97b66f15/provider.py",
      "quote": "        self.policy = build_policy(\n            self.workspace,\n            self._settings,\n            scratch=self.run_dir,\n        )\n        self.profile_path = self.run_dir / \"profile.sb\"\n        self.profile_path.write_text(self.policy.render(), encoding=\"utf-8\")\n        try:\n            os.chmod(self.profile_path, 0o600)\n        except OSError:\n            pass\n\n        self.audit = AuditLog(\n            self.data_dir,\n            enabled=b"
    },
    {
      "url": "https://raw.githubusercontent.com/rkfshakti/hermes-glassbox/2b070ee7fc94d880929fea3743f1ad8e97b66f15/policy.py",
      "quote": "    def write_paths(self) -> tuple[Path, ...]:\n        paths = [self.scratch, *self.allowed_write]\n        if self.workspace_writable:\n            paths.append(self.workspace)\n        return _dedupe(paths)\n\n    def as_dict(self) -> dict[str, Any]:\n        return {\n            \"workspace\": str(self.workspace),\n            \"scratch\": str(self.scratch),\n       "
    },
    {
      "url": "https://raw.githubusercontent.com/ToniAdreal/delivery-gate/9665a67ba77bd41290faec61b0899bf3e8a353b7/__init__.py",
      "quote": "    dispatch = getattr(ctx, \"dispatch_tool\", None)\n    verify = functools.partial(\n        tools.delivery_gate_verify, _config=config, _dispatch=dispatch,\n    )\n    ctx.register_tool(\n        name=\"delivery_gate_verify\",\n        toolset=\"delivery-gate\",\n        schema=schemas.DELIVERY_GATE_VERIFY,\n        handler=verify,\n    )\n    ctx.register_tool(\n        name=\"delivery_gate_evidence\",\n        toolset=\"delivery-gate\",\n        schema=schemas.DELIVERY_GATE_EVIDENCE,\n    "
    },
    {
      "url": "https://raw.githubusercontent.com/ToniAdreal/delivery-gate/9665a67ba77bd41290faec61b0899bf3e8a353b7/gate.py",
      "quote": "    if not RUN_ID_RE.fullmatch(rid):\n        raise ValueError(f\"Invalid run_id: {run_id!r}\")\n    path = root / f\"{rid}.json\"\n    if path.resolve().parent != root.resolve():\n        raise ValueError(f\"Invalid run_id: {run_id!r}\")\n    if not path.is_file():\n        raise FileNotFoundError(f\"No evidence record {rid!r} in {root}\")\n    try:\n        record = json.loads(path.read_text(encoding=\"utf-8\"))\n    except json.JSONDecodeError as exc:\n        raise ValueError(f\"Evidence reco"
    },
    {
      "url": "https://raw.githubusercontent.com/EmailFig/mcp/c9ca5df81169f6470dc0099a4e53f214076d6e41/hermes/README.md",
      "quote": "## What the plugin contains\n\n- `mcp.json`: the EmailFig server, reached through the pinned `mcp-remote@0.15.2` sign-in bridge.\n- `plugin.json`: marks the server `untrusted`, so Hermes asks before every tool the server doesn't mark read-only.\n\nNo hooks, scripts or skills. It asks for no key or password and reads no files, environment variables or saved logins.\n\n## Install\n\nYou need Hermes Agent 0.21.6 or newer and Node.js 20.18.1 or newer with `npx` on your `PAT"
    },
    {
      "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/engine.py",
      "quote": "    def _fail(self, request: Any, session: str, exc: Exception) -> dict[str, Any] | None:\n        logger.warning(\"redactgate: redaction failed (%s)\", type(exc).__name__, exc_info=True)\n        self.errors.append(f\"{time.strftime('%H:%M:%S')} {type(exc).__name__}\")\n        del self.errors[:-20]\n        try:\n            self.audit.append(\"error\", session=session_ref(session), error=type(exc).__name__, fail_mode=self.settings.fail_mode)\n        except Exception:\n            pass"
    },
    {
      "url": "https://raw.githubusercontent.com/Cam-Smith-One/hermes-homegrown/11ff8cbefd5a945f3a9730907d289de4dc557aa6/README.md",
      "quote": "## What you get\n\n- **Apps that persist.** Each app is one self-contained HTML document plus its own SQLite data. Everything lives under `<hermes home>/plugin-data/homegrown/`, so backing up is copying a folder.\n- **Hermes can use them too.** `homegrown_app_data` reads and writes an app's records from any chat or platform, and every open copy of the app refreshes live.\n- **Safe to change.** Every code change is a new version. Roll back with one call, and the data is never touc"
    },
    {
      "url": "https://raw.githubusercontent.com/Cam-Smith-One/hermes-homegrown/11ff8cbefd5a945f3a9730907d289de4dc557aa6/store.py",
      "quote": "def inject_runtime(html: str) -> str:\n    \"\"\"Put the CSP and window.app runtime first in <head>, after any doctype so standards mode holds.\"\"\"\n    prelude = f'<meta http-equiv=\"Content-Security-Policy\" content=\"{CSP}\"><script>{RUNTIME_JS}</script>'\n    head = re.search(r\"<head[^>]*>\", html, re.I)\n    if head:\n        return html[: head.end()] + prelude + html[head.end():]\n    doctype = re.match(r\"\\s*<!doctype[^>]*>\", html, re.I)\n    at = doctype.end() if doctype els"
    },
    {
      "url": "https://raw.githubusercontent.com/k-reeeee/hermes-flower-shop/8eb1764d4434770c3bd031a4dc982560582f6d69/README.md",
      "quote": "## How it works\n\n```\n+------------------------------------------------------------------+\n| Hermes Desktop (Flower Shop workspace)                           |\n|  Overview . Orders . Inventory . Production . Shop Floor 3D      |\n|  Delivery . Finance . AI Team . Approvals                        |\n+----------------------^-----------------------+-------------------+\n                       | REST /api/plugins/   | plugin.flower-shop.changed\n                       | flow"
    },
    {
      "url": "https://raw.githubusercontent.com/k-reeeee/hermes-flower-shop/8eb1764d4434770c3bd031a4dc982560582f6d69/flowershop_core/tools/handlers.py",
      "quote": "    if not owner_statement:\n        return _err(error=\"validation_error\",\n                    message=\"owner_statement is required: quote the owner's exact words confirming the decision.\",\n                    field=\"owner_statement\")\n    try:\n        if decision == \"approve\":\n            a = approvals.approve(s, approval_id, \"owner(chat)\", note=owner_statement)\n        else:\n            a = approvals.reject(s, approval_id, \"owner(chat)\", reason=owner_statement)\n        return"
    },
    {
      "url": "https://raw.githubusercontent.com/sergio-dev1-py/multibot_telegram/52dc0735ea8cb1fe8402c4cc6671c2328963a92c/README.md",
      "quote": "## What it does\n\n- **One platform, N bots.** `telegram_multi` is a single Hermes platform with an\n  arbitrary number of supervised PTB runtimes.\n- **Exact reply routing.** Inbound message ids are prefixed with the bot id\n  (`<bot_id>:<telegram_id>`) and persisted in the session origin. Final replies,\n  edits, media, status and error notices resolve the correct transport. There\n  is no process-global \"last active bot\".\n- **Genuine shared transcripts.** Bots in the same `shared"
    },
    {
      "url": "https://raw.githubusercontent.com/tuanpv47/spanwall/dcd8456c3c861ba6c80ee89c4edd9753ccc5ecfa/plugin/spanwall/desktop/plugin.js",
      "quote": "  async function answer(uid, req, result) {\n    try {\n      let r\n      if (req.via === 'approval.respond') {\n        r = await sessionRpc(uid, 'approval.respond', { choice: result.choice, all: Boolean(result.all), request_id: req.params?.request_id })\n      } else {\n        const route = routeOf(state.sessions.get(uid)?._routeKey)\n        r = await rpc(route?.route, 'request.answer', { id: req.id, result }, true)\n      }\n      removeRequest(x => x.id === req.id)\n      emit()"
    }
  ]
}
