{
  "sources": [
    {
      "url": "https://raw.githubusercontent.com/aydnOktay/hermes-done-bell-/3fa519a291d91b0e6c44bd42762190363ce80c39/README.md",
      "quote": "Copy 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.js\" -Force\n```\n\nRestart Hermes. Status bar chip: `busy` while working, `done` when idle.\n\n1. Send a chat, switch to another window"
    },
    {
      "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"
    },
    {
      "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 it)."
    },
    {
      "url": "https://raw.githubusercontent.com/getaskclaw/hermes-wake/1e6ba97109b06592e0652b7d6df905969100031f/README.md",
      "quote": "- In one rare case a wake can fire twice. That needs a process to die after\n  `kanban complete` succeeds but before it records the result, and then a 5-minute\n  lease expires.\n\n## Settings (`plugins.entries.hermes-wake.settings`)\n\n| key | default | meaning |\n|---|---|---|\n| `board` | `hermes-wake` | kanban board for parked cards |\n| `hermes_bin` | `\"\"` | hermes executable; default `hermes` on PATH |\n| `terminal_hint` | `true` | add the hint after detached terminal commands |"
    },
    {
      "url": "https://raw.githubusercontent.com/getaskclaw/hermes-wake/1e6ba97109b06592e0652b7d6df905969100031f/core.py",
      "quote": "def tick(store: Store, kanban: KanbanCLI, runner=subprocess.run, now=None, log=None) -> list:\n    \"\"\"One pass. Returns the watch ids completed in this pass. Safe to run in many processes.\"\"\"\n    done = []\n    for w in store.active(now):\n        seen = w.get(\"path_seen\")\n        outcome = check(w, runner, now)\n        if w.get(\"path_seen\") != seen:\n            store.set_extra(w[\"id\"], {\"path_seen\": w.get(\"path_seen\")})\n        if outcome is None:\n            continue"
    },
    {
      "url": "https://gitlab.com/Zaygalx1/warden/-/raw/2a10176a20bbc1645a6f25b47a572416d744d636/README.md",
      "quote": "- sec_contain plans only, deliberately: it builds graded plans with\n  approval classes, TTL and rollback steps, and refuses mode=apply\n  outright, because no actuator is implemented and the owner has\n  held live containment back until investigation results are\n  trusted. sec_investigate is implemented: deterministic, every\n  claim cites stored evidence, unresolvable claims are dropped and\n  counted. Nothing in Warden can change a firewall or an identity"
    },
    {
      "url": "https://gitlab.com/Zaygalx1/warden/-/raw/2a10176a20bbc1645a6f25b47a572416d744d636/src/hermes_warden/plugin.py",
      "quote": "def _on_pre_tool_call(tool_name=\"\", args=None, **_):\n    \"\"\"Human gate on execution: every sec_assess mode=apply call is\n    escalated to Hermes's approval prompt before it runs.\n\n    This is defence in depth, NOT the primary boundary. Hermes runs\n    approvals per its own configuration: under yolo mode or\n    approvals.mode=off the gate does not fire, and under\n    approvals.cron_mode=approve it is auto-approved. The real"
    },
    {
      "url": "https://raw.githubusercontent.com/chadius-maximus/call-your-shot/ad40dce864790e472e258228bc31a9ba0d34f4b3/README.md",
      "quote": "## Limits\n\n- The plugin asks the agent to call its shot through a system prompt section. A model can ignore\n  that; the scoreboard shows how many multi-step turns ran with no shot.\n- One shot per turn. Work that spans several turns is scored per turn.\n- Time is wall-clock time for the turn, so it includes time spent waiting for your approval.\n- Tool calls made by delegated subagents run in their own sessions and are not added to the\n  parent's count."
    },
    {
      "url": "https://raw.githubusercontent.com/chadius-maximus/call-your-shot/ad40dce864790e472e258228bc31a9ba0d34f4b3/__init__.py",
      "quote": "def _on_post_tool_call(tool_name: str = \"\", session_id: str = \"\", turn_id: str = \"\", **kwargs) -> None:\n    \"\"\"Count every tool call of the turn except the shot itself and tool-loading plumbing.\"\"\"\n    try:\n        if tool_name == TOOL_NAME or tool_name in META_TOOLS:\n            return\n        with _turns_lock:\n            turn = _turn_for(str(session_id or \"\"), str(turn_id or \"\"))\n            turn.calls += 1"
    },
    {
      "url": "https://raw.githubusercontent.com/francoleff/google-workspace-hermes/ae9a3e7847d7f0c02c4fccf2e6c04ed453f2e089/README.md",
      "quote": "> RSVP has **not** been run against Google (no invitation to answer), and the sidebar actions have **not** been run inside the running Hermes Desktop app. Run the [live check](#live-check-what-to-run-with-your-own-account) before relying on it.\n\n## What you can do\n\n| Area | In the sidebar page | Hermes tools |\n|---|---|---|"
    },
    {
      "url": "https://raw.githubusercontent.com/francoleff/google-workspace-hermes/ae9a3e7847d7f0c02c4fccf2e6c04ed453f2e089/hermes_google_workspace/hooks.py",
      "quote": "def pre_tool_call(tool_name: str = \"\", args: dict | None = None, **kwargs):\n    \"\"\"Escalate this plugin's writes to Hermes's approval gate.\"\"\"\n    if not tool_name or not tool_name.startswith(\"google_\"):\n        return None\n\n    arguments = args if isinstance(args, dict) else {}\n\n    if tool_name in _ALWAYS_APPROVE:\n        action = _ALWAYS_APPROVE[tool_name]\n    elif tool_name == \"google_gmail_modify\":"
    },
    {
      "url": "https://raw.githubusercontent.com/axAilotl/hermes-audio-api/079c6c21e73257c34247e8314c0f0aa4270d1f5f/README.md",
      "quote": "## Hermes internals used\n\nHermes has no public \"transcribe with the configured provider\" or \"speak with\nthe configured provider\" call, so the plugin uses the same entry points the CLI\nand gateway use: `tools.transcription_tools.transcribe_audio`,\n`tools.tts_tool.text_to_speech_tool` and `is_whisper_hallucination`. They are\nimported in one module, `hermes_audio_api/_core.py`, and `hermes plugins\nvalidate` reports them as private imports. A Hermes release that moves them"
    },
    {
      "url": "https://raw.githubusercontent.com/axAilotl/hermes-audio-api/079c6c21e73257c34247e8314c0f0aa4270d1f5f/hermes_audio_api/server.py",
      "quote": "def _check_auth(request: web.Request) -> web.Response | None:\n    expected = request.app[API_KEY_KEY]\n    header = request.headers.get(\"Authorization\", \"\")\n    scheme, _, token = header.partition(\" \")\n    # Compare bytes: compare_digest raises on non-ASCII str, which would turn a bad key into a 500.\n    supplied = token.strip().encode(\"utf-8\", \"surrogateescape\")\n    if scheme.lower() == \"bearer\" and supplied and hmac.compare_digest(supplied, expected.encode()):"
    },
    {
      "url": "https://raw.githubusercontent.com/numengames/numinia-hermes-plugin/a957189ca899a6468dced8c1dd9ad7626b1a8ae5/README.md",
      "quote": "## What you get\n\n| Function (setting) | Default | The world sees | The world may ask |\n|---|---|---|---|\n| `salud` (`publish_health`) | **on** | Hermes is up (bridge state) | nothing |\n| `cron` (`publish_cron`) | off | one object per scheduled job (name, schedule, state) | pause / resume a job, **only after you approve it in Hermes** |\n| `sesiones` (`publish_sessions`) | off | one place per session (hashed id, platform, model) | nothing |"
    },
    {
      "url": "https://raw.githubusercontent.com/numengames/numinia-hermes-plugin/a957189ca899a6468dced8c1dd9ad7626b1a8ae5/hermes_3d_lib/actions.py",
      "quote": "class ActionQueue:\n    \"\"\"Pending world requests waiting for a human approval inside Hermes.\"\"\"\n\n    def __init__(\n        self, *, enabled: Callable[[], bool], known_job: Callable[[str], bool], read_only: Callable[[], bool] = lambda: False\n    ) -> None:\n        self._read_only = read_only\n        self._enabled = enabled\n        self._known_job = known_job\n        self._items: dict[str, Pending] = {}"
    },
    {
      "url": "https://raw.githubusercontent.com/clawsyndicate/printwatch/b5aec0301dfca8536e325da8f495339a003ecd07/__init__.py",
      "quote": "def _secret(name: str) -> str:\n    \"\"\"Scoped credential read. Inside Hermes: agent.secret_scope.get_secret only \u2014\n    catalog policy forbids plugins reading os.environ for credentials. Standalone\n    dev runs (no agent object) fall back to the plain environment.\"\"\"\n    if _agent is not None:\n        scope = getattr(_agent, \"secret_scope\", None)\n        if scope is not None:\n            try:\n                v = scope.get_secret(name)\n            except Exception:"
    },
    {
      "url": "https://raw.githubusercontent.com/nebout2011-debug/selaeron-paperclip-plugin/e1fd695eb65dd3bed1797af07c4c85d103cf9e32/hermes_integration/hermes_paperclip_plugin.py",
      "quote": "def _dedup_key(run_id: str, issue: str, summary: str) -> str:\n    return hashlib.sha256(f\"{run_id}\\x00{issue}\\x00{summary}\".encode(\"utf-8\")).hexdigest()\n\n\n_SEEN: set = set()\n_SEEN_LOCK = threading.Lock()\n\n\ndef _is_duplicate(key: str) -> bool:\n    with _SEEN_LOCK:\n        if key in _SEEN:\n            return True\n        _SEEN.add(key)\n        return False\n\n\ndef _release_duplicate(key: str) -> None:\n    with _SEEN_LOCK:\n        _SEEN.discard(key)\n\n"
    },
    {
      "url": "https://raw.githubusercontent.com/robbiemu/hermes-agent/6b573f8f2f31ac0f5254c99b6f64d97e674ff569/plugins/apple-keychain/README.md",
      "quote": "## Access and compatibility\n"
    },
    {
      "url": "https://raw.githubusercontent.com/robbiemu/hermes-agent/6b573f8f2f31ac0f5254c99b6f64d97e674ff569/plugins/apple-keychain/__init__.py",
      "quote": "    def fetch(self, cfg: dict, home_path: Path) -> FetchResult:\n        result = FetchResult()\n        if os_family() != \"darwin\":\n            return result.fail(\"Apple Keychain secret source only works on macOS.\", ErrorKind.NOT_CONFIGURED)\n        if not isinstance(cfg, dict):\n            return result.fail(\"secrets.apple_keychain must be a mapping.\", ErrorKind.NOT_CONFIGURED)\n        items, warnings = normalize_items(cfg)\n        result.warnings.extend(warnings)"
    },
    {
      "url": "https://raw.githubusercontent.com/robbiemu/hermes-agent/6b573f8f2f31ac0f5254c99b6f64d97e674ff569/hermes_cli/plugins.py",
      "quote": "class PluginContext(PluginCapabilityCtxMixin):\n    \"\"\"Facade given to plugins so they can register tools and hooks.\"\"\"\n\n    def __init__(self, manifest: PluginManifest, manager: PluginManager):\n        self.manifest = manifest\n        self._manager = manager\n        self._llm: Any = None  # lazy; tests preseed it (see ``llm``)\n        # Set when this context's load overran ``plugins.load_timeout_seconds``: the abandoned worker may"
    }
  ]
}