{
  "sources": [
    {
      "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:LOCA"
    },
    {
      "url": "https://raw.githubusercontent.com/aydnOktay/hermes-done-bell-/3fa519a291d91b0e6c44bd42762190363ce80c39/bell_hooks.py",
      "quote": "def on_session_end(\n    session_id: str = \"\",\n    completed: bool = False,\n    interrupted: bool = False,\n    platform: str = \"\",\n    **kwargs,\n) -> None:\n    del kwargs\n    try:\n        if interrupted:\n            kind = \"interrupted\"\n            detail = \"interrupted\"\n            title = \"Hermes stopped\"\n            body = \"The turn was interrupted.\"\n        elif completed:\n            kind = \"done\"\n            detail = \"completed\"\n  "
    },
    {
      "url": "https://raw.githubusercontent.com/NousResearch/hermes-official-plugins/e7a218f26db88426ab3e7376f0e000b6e356f5e7/homeassistant/README.md",
      "quote": "1. **Gateway platform `homeassistant`**: subscribes to Home Assistant's WebSocket event bus and\n   forwards `state_changed` events to the agent, with domain/entity filters and per-entity cooldowns.\n   The agent's replies show up as Home Assistant persistent notifications titled \"Hermes Agent\".\n   Cron jobs can deliver to `deliver=homeassistant[:target]` through the target's own notify service\n   (`notify.mobile_app_my_phone` for `target=mobile_app_my_phone`), without a runnin"
    },
    {
      "url": "https://raw.githubusercontent.com/NousResearch/hermes-official-plugins/e7a218f26db88426ab3e7376f0e000b6e356f5e7/homeassistant/tools.py",
      "quote": "def _service_call_violation(domain: str, service: str, payload: Any) -> Optional[str]:\n    \"\"\"Why the operator allow/deny lists refuse this service call, or ``None``.\n\n    With neither list set nothing is checked (behaviour unchanged). Otherwise:\n\n    1. Every entity the payload names, and the script selected by a custom\n       ``script.<name>`` service, must pass the same check as ha_get_state\n       (deny is a final veto; with an allowlist, every entity must match"
    },
    {
      "url": "https://raw.githubusercontent.com/Adebisi1111/hermes-research-notes/200e099690c0896dba7cf24aeddd35f2720ae3a2/__init__.py",
      "quote": "        # Read at most MAX_RESPONSE_BYTES\n        raw_bytes = resp.content\n        if len(raw_bytes) > MAX_RESPONSE_BYTES:\n            return f\"Error: response too large ({len(raw_bytes)} bytes, max {MAX_RESPONSE_BYTES})\"\n\n        raw = raw_bytes.decode(\"utf-8\", errors=\"replace\")\n    excep"
    },
    {
      "url": "https://raw.githubusercontent.com/stupidburgers/hermes-bim-studio/1eef602bbee93b5893b9cd769d0d8d2b2d9a12a8/plugin/README.md",
      "quote": "## Disclosure\n\n- Reads the IFC path supplied to a tool and the viewer scripts bundled with the plugin.\n- Writes a workbook (`bim_takeoff_5d.xlsx`) and/or viewer (`bim_viewer_3d.html`) beside the IFC by default; caller-supplied output paths override these locations. Existing output files at those paths are overwritten.\n- Generated files can contain project metadata, the IFC path and SHA-256, quantities, element IDs, and (in the viewer) selected model geometry. Treat them as po"
    },
    {
      "url": "https://raw.githubusercontent.com/stupidburgers/hermes-bim-studio/1eef602bbee93b5893b9cd769d0d8d2b2d9a12a8/plugin/bim_engine.py",
      "quote": "def _guard_output_path(name: Optional[str], suffix: str, overwrite: bool = False) -> str:\n    \"\"\"Validate a model-supplied output name and resolve it to a confined path.\n\n    ``name`` is treated as a BARE FILE NAME only. Absolute paths, drive letters,\n    path separators and ``..`` are rejected before anything is written. The\n    required ``.html``/``.xlsx`` suffix is enforced. The final path is always\n    under ``<HERMES_HOME>/plugin-data/hermes-bim-studio/``. Existing files"
    },
    {
      "url": "https://raw.githubusercontent.com/mbaradad/omp-sessions/ba26902a97378d376941f1883d3f4b3c624ec4a5/integrations/hermes/omp-sessions/README.md",
      "quote": "- **Tools** (toolset `omp_sessions`, 14 tools): list sessions, projects and models; start a session now, queue it, or schedule it for later in a folder, a known project or a board's folder; add to or reschedule a session's queue; check, wait on, answer, steer, switch the mode or model of, and stop a session; check the omp Sessions server. Approval dialogs stay with people unless `agent_approvals: true`.\n- **Notifications**: when a session a Hermes chat started finishes or needs input, "
    },
    {
      "url": "https://raw.githubusercontent.com/mbaradad/omp-sessions/ba26902a97378d376941f1883d3f4b3c624ec4a5/integrations/hermes/tests/test_plugin.py",
      "quote": "    def test_comments_never_answer_an_approval_and_wait_for_it(self) -> None:\n        card = self.create(\"asking\", \"write d.txt hi\")\n        self.tick(\"asking\")\n        sid = self.session_of(card)\n        self.tick_until(\"asking\", card, lambda t: t.status == \"blocked\", \"needs_input block\")\n        self.comment(\"asking\", card, \"1\")\n        self.tick(\"asking\")\n        self.tick(\"asking\")\n        self.assertEqual(self.report(sid)[\"state\"], \"needs_input\", \"sti"
    },
    {
      "url": "https://raw.githubusercontent.com/0xNoramiya/hypnos/0a809b9085fdeaed63fd909b927afcc41de512de/README.md",
      "quote": "## Limitations\n\n- Habits, not facts. Hypnos teaches procedures, and it will not make a small model know your codebase.\n- Small personal data. A day of work is tens of turns. The exam's confidence bounds are honest about that,\n  and many nights end as bad nights until enough data exists.\n- The brain answers whole, not streamed, and only for families it mastered. Everything else goes to your\n  normal model.\n- Brain tokens are counted by Hermes as tokens of your normal"
    },
    {
      "url": "https://raw.githubusercontent.com/0xNoramiya/hypnos/0a809b9085fdeaed63fd909b927afcc41de512de/hypnos/router.py",
      "quote": "The user's normal model (the frontier) stays Hermes's provider. For every LLM call Hypnos either:\n\n- passes it through (``next_call(request)``): no promoted brain, routing off, a family the brain has not\n  mastered, an unsupported wire format, or a context too large for the brain;\n- runs the brain in *shadow*: the frontier answers, the brain's answer is compared in the background;\n- lets the brain answer (*live*): the brain sees a compact prompt with consolidated habits pruned; its\n  o"
    },
    {
      "url": "https://raw.githubusercontent.com/Nnadijoshuac/Hermes-chalk/05a66d02b830ddb255315a0df9ff527f9a82992c/lesson.py",
      "quote": "def _speak(text: str, out: Path, voice: str | None) -> Path | None:\n    \"\"\"Voice one step through the user's own Hermes text_to_speech tool (their provider and voice).\"\"\"\n    if DISPATCH is None:\n        return None\n    args = {\"text\": text, \"output_path\": str(out)}\n    if voice:\n        args[\"voice_id\"] = voice\n    try:\n        res = json.loads(DISPATCH(\"text_to_speech\", args))\n    except Exception:\n        logger.debug(\"chalk: tts failed\", exc_info=True)\n        r"
    },
    {
      "url": "https://raw.githubusercontent.com/Nnadijoshuac/Hermes-chalk/05a66d02b830ddb255315a0df9ff527f9a82992c/desktop/plugin.js",
      "quote": "// A tiny recursive-descent parser: numbers, x, + - * / ^, parentheses, a few functions.\nfunction compileFn(src) {\n  const s = String(src).toLowerCase().replace(/\\s+/g, '').replace(/\\*\\*/g, '^')\n  let i = 0\n  const peek = () => s[i]\n  const eat = c => (s[i] === c ? (i++, true) : false)\n  const FN = { sin: Math.sin, cos: Math.cos, tan: Math.tan, exp: Math.exp, log: Math.log, sqrt: Math.sqrt, abs: Math.abs }\n  function primary() {\n    if "
    },
    {
      "url": "https://raw.githubusercontent.com/cogitor/hermes-hostyourai/e86d5bf242166cb53dd0362cf960d91e7741194a/README.md",
      "quote": "The setting sticks until you change it, and it is shared: it applies to every\nchat on the same Hermes profile, and anyone who can use `/hyai` there can\nchange it. `/hyai` itself never checks which model the chat is on — it always\naccepts the setting. The setting only has an effect when a chat is actually on\n`hyai/auto`: that check lives in the `hostyourai` provider profile at request\ntime, not in `/hyai` itself. Any other model or provider never receives it.\nSwitch models with `/model`"
    },
    {
      "url": "https://raw.githubusercontent.com/cogitor/hermes-hostyourai/e86d5bf242166cb53dd0362cf960d91e7741194a/hostyourai/__init__.py",
      "quote": "def _api_key() -> str:\n    \"\"\"The key for the profile being served, read through Hermes's secret scope.\n\n    One Hermes process may serve several profiles, so ``os.environ`` could hold another\n    profile's key. The environment is used only when running outside Hermes (no\n    ``agent.secret_scope``). A scope error (unscoped read while multiplexing) fails closed.\n    \"\"\"\n    try:\n        from agent.secret_scope import get_secret\n    except ImportError:\n        return os.enviro"
    },
    {
      "url": "https://raw.githubusercontent.com/minutechreview/hermes-motion-index/0a510494589d83e865a771b4e6139b8cfab04933/tools.py",
      "quote": "def _brief_text(entry: dict, topic: str, seconds: int, aspect: str, notes: str) -> str:\n    width, height = FORMATS[aspect]\n    spec = (\n        f\"Make it {seconds} seconds long at {width}x{height} ({aspect}), 30 fps, \"\n        \"unless the project calls for another format.\"\n    )\n    text = entry[\"prompt\"].replace(catalog.PLACEHOLDER, topic).replace(DEFAULT_LOOP_LINE, spec)\n    if spec not in text:\n        text = f\"{text}\\n\\n{spec}\"\n    if notes:\n        text = f\"{text}\\n\\nExtra notes "
    },
    {
      "url": "https://raw.githubusercontent.com/landenjackson/hermes-kaggle-plugin/c5f2dadc9b6358efd09ac5b8b28ff62e74c5f7da/tools.py",
      "quote": "def _child_env() -> dict:\n    \"\"\"Minimal, explicit environment for the kaggle CLI child process — never the\n    inherited environment. Auth: KAGGLE_API_TOKEN via Hermes's secret scope\n    (declared secret in plugin.yaml). If absent, the CLI reads\n    ~/.kaggle/kaggle.json itself. The token value is never logged or echoed.\"\"\"\n    env: dict[str, str] = {}\n    for key in (\"PATH\", \"HOME\", \"LANG\", \"LC_ALL\",\n                \"HTTP_PROXY\", \"HTTPS_PROXY\", \"NO_PROXY\",\n                \""
    },
    {
      "url": "https://raw.githubusercontent.com/landenjackson/hermes-kaggle-plugin/c5f2dadc9b6358efd09ac5b8b28ff62e74c5f7da/kaggle_core.py",
      "quote": "def _run_kaggle(competition: str, env: dict | None = None, timeout: int = 90) -> list[dict]:\n    \"\"\"Pull the submission list for one competition. Returns [{ref, date, status, score, desc}].\"\"\"\n    cmd = [KAGGLE_BIN, \"competitions\", \"submissions\", \"-c\", competition]\n    r = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout, env=env)\n    rows = []\n    for line in (r.stdout or \"\").splitlines():\n        cols = [c.strip() for c in re.split(r\"  +\", line.strip()) if c.strip("
    },
    {
      "url": "https://raw.githubusercontent.com/WebTwizz/agent/e1979283d68e884a9117abd4fd5b30ae60e988c3/hermes/README.md",
      "quote": "- **Configuration only.** It holds `plugin.json` and `mcp.json` and no code of its own. The tools are served at runtime by WebTwizz's hosted MCP server at `https://app.webtwizz.com/mcp` and are not covered by the pinned commit.\n- **Network:** every tool call goes to `app.webtwizz.com` and acts on your WebTwizz account. Builds and edits use WebTwizz credits, the same as in the WebTwizz editor.\n- **Sign-in:** runs the pinned `mcp-remote@0.1.49` through `npx` (Node.js and npm required). O"
    },
    {
      "url": "https://raw.githubusercontent.com/NousResearch/hermes-agent/main/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"
    }
  ]
}