{
  "sources": [
    {
      "url": "https://raw.githubusercontent.com/breadcrumbs-agency/hermes-breadcrumb-plugin/b8975645e5174edbcc00d5dc86a78e536bce938b/README.md",
      "quote": "- **A memory provider.** Recall before each turn, inside a steady-state budget: it holds context overflows at 2%\n  to 5% of turns. The tools `crumb` and `crumb_find`. A receipt for each read. Tool calls and their results\n  become linked `step` and `tool` crumbs.\n- **A context engine** (ACE): `hermes config set context.engine breadcrumbs`.\n- **`/island`**: one codebase for each profile, so that two codebases do not dilute one memory. It is a slash\n  command and three hooks."
    },
    {
      "url": "https://raw.githubusercontent.com/breadcrumbs-agency/hermes-breadcrumb-plugin/b8975645e5174edbcc00d5dc86a78e536bce938b/breadcrumbs/hermes.py",
      "quote": "        except (ValueError, TypeError) as e:\n            return json.dumps({\"error\": str(e)})\n\n    def find(self, query, k=8, exclude_session=None, items=None, room=None):\n        return self._find(query, k, exclude_session, items, room)[0]\n\n    def _find(self, query, k=8, exclude_session=None, items=None, room=None):\n        \"\"\"(text, want): want is the bytes of the text before a cut."
    },
    {
      "url": "https://raw.githubusercontent.com/stupidburgers/pinpoint/06b911e1c66908ebf340c6cb981028bc45b89c73/README.md",
      "quote": "- Ids are stable hashes of the element's role and position in the page, not of the thing the fix changes. **Fixed** = a later audit no longer reports the finding, that rule ran without error, truncation or limits under the same audit options, and an element with the same signature is still on the page exactly once. Pinpoint does *not* re-measure that element, so fixed is not proof that it now passes. **Gone** = the element's signature is missing from a complete element invent"
    },
    {
      "url": "https://raw.githubusercontent.com/stupidburgers/pinpoint/06b911e1c66908ebf340c6cb981028bc45b89c73/_tools.py",
      "quote": "CODES = {\"desktop_unavailable\", \"no_preview\", \"consent_denied\", \"timeout\", \"page_mismatch\",\n         \"page_unreachable\", \"engine_error\", \"bad_args\"}\nCODE_MAP = {\"navigated\": \"page_unreachable\", \"origin_blocked\": \"page_unreachable\"}\nHINT = _core.HINT\nRESULT_LIMIT = 12000\n\nAUDIT_SCHEMA = {\n    \"name\": \"pinpoint_audit\",\n    \"description\": (\n        \"Measure the live page in Hermes Desktop's Browser pane. Runs deterministic in-page checks \""
    },
    {
      "url": "https://raw.githubusercontent.com/karmsheel/google-home/b9a23c4f7ac3ea884ebeeb0cc0184f9960911c6f/README.md",
      "quote": "  chip, palette commands and a settings page, with the push-to-talk microphone.\n\n## What is actually possible\n\nRead [`docs/REVERSE_ENGINEERING.md`](docs/REVERSE_ENGINEERING.md) for the protocol\nwork. The short version:\n\n| Direction | How | Status |\n|---|---|---|\n| **Speaker out** (it talks) | Cast v2 → Default Media Receiver → HTTP MP3 | Works |"
    },
    {
      "url": "https://raw.githubusercontent.com/karmsheel/google-home/b9a23c4f7ac3ea884ebeeb0cc0184f9960911c6f/googlehome/tools.py",
      "quote": "        return {\"ok\": False, \"via\": \"direct\", \"error\": \"no Cast device discovered\",\n                \"configured_device\": settings.device}\n    try:\n        probed = castdevice.probe(host, int(resolved.get(\"port\") or 8009), timeout=4.0)\n    except castdevice.CastError as exc:\n        return {\"ok\": False, \"via\": \"direct\", \"error\": str(exc), \"device\": resolved}\n    return {\"ok\": True, \"via\": \"direct\", \"profile\": settings.profile or \"(unbound)\","
    },
    {
      "url": "https://raw.githubusercontent.com/Dgardenhire/hermes-imprint/a8ce37bc2f62e0c1d287a36b836a227eef243747/README.md",
      "quote": "  shows that a number appears in your sources. It cannot tell you whether the source is right. It checks numbers and\n  quotes, not claims or framing: a deck headlined \"adds a site\" passed 19 of 19 when the sources said \"proposes\", so\n  read the headlines yourself.\n- **Brands.** A brand is a saved set of colors with roles (checked for contrast), fonts, a logo, voice rules, a page"
    },
    {
      "url": "https://raw.githubusercontent.com/Dgardenhire/hermes-imprint/a8ce37bc2f62e0c1d287a36b836a227eef243747/runtime.py",
      "quote": "class ModelError(RuntimeError):\n    \"\"\"A failure the page shows as is. ``code`` lets the page pick the right next step.\"\"\"\n\n    def __init__(self, message: str, code: str = \"model\"):\n        super().__init__(message)\n        self.code = code\n\n\nNO_MODEL = \"Imprint couldn't reach your Hermes model. Check Settings, then press Retry.\"\nBUSY = \"Your model is busy right now. Wait a minute, then press Retry.\""
    },
    {
      "url": "https://raw.githubusercontent.com/Dgardenhire/hermes-imprint/a8ce37bc2f62e0c1d287a36b836a227eef243747/dashboard/plugin_api.py",
      "quote": "async def post_ask(body: dict):\n    try:\n        b = _body(body)\n        q = str(b.get(\"question\") or \"\").strip()\n        if not q:\n            raise ValueError(\"Type a question first.\")\n        if len(q) > 2000:\n            raise ValueError(\"That question is too long. Keep it under 2,000 characters.\")\n        source_ids = _ids(b.get(\"source_ids\"), \"s\")\n        if not source_ids:\n            raise ValueError(\"Choose at least one source first.\")"
    },
    {
      "url": "https://raw.githubusercontent.com/robbyczgw-cla/hermes-ui-cards/c40df4d41cd5439cf4902995fd4a9e5505483f25/README.md",
      "quote": "- **A card is not an approval bypass.** A Yes on a card is your message to the model. Hermes' own\n  approval settings still apply to whatever it then runs (with the default *Smart* approval mode, Hermes\n  may approve routine commands itself, so the card is often the only question you see).\n- **Work in progress is kept.** Checklist ticks, form input and drafts survive reopening the chat."
    },
    {
      "url": "https://raw.githubusercontent.com/robbyczgw-cla/hermes-ui-cards/c40df4d41cd5439cf4902995fd4a9e5505483f25/hui_cards/tool.py",
      "quote": "        if card is None:\n            card = read_card_file(card_id)\n        if card is not None and not isinstance(card.get(\"type\"), str):\n            card = None\n        if card is None and outcome.get(\"type\"):\n            reply = {**reply, \"type\": outcome[\"type\"]}\n        return answer_context(reply, card, history, user_message,\n                              duplicate=outcome[\"record\"] if status == \"duplicate\" else None)\n    return FOREIGN_NOTE.format(card_id=card_id)\n\n"
    },
    {
      "url": "https://raw.githubusercontent.com/robbyczgw-cla/hermes-ui-cards/c40df4d41cd5439cf4902995fd4a9e5505483f25/tests/test_parity.py",
      "quote": "def test_validator_parity(path, js_results):\n    raw = json.loads(path.read_text(encoding=\"utf-8\"))\n    original = copy.deepcopy(raw)\n    card, errors, warnings = validate_card(raw)\n    expected = {\"card\": card, \"errors\": errors, \"warnings\": warnings}\n    assert raw == original, \"Python validator mutated its input\"\n    assert ordered_json(js_results[str(path)]) == ordered_json(expected)\n    if path.parent.name == \"valid\":\n        assert not errors"
    },
    {
      "url": "https://raw.githubusercontent.com/samirsawarkar/lumina/aaced5beb7bdb93cf7267060bb81fb49d4762c67/README.md",
      "quote": "- **What your chosen AI model sees:** When Hermes searches your library, it receives the photo metadata needed to answer your request — dates, place names, recognized people names, scene labels, and short snippets of detected text (up to 80 characters). When you ask a question about a photo (\"when does my passport expire?\"), the full text of that photo (at most 5 photos) is sent so the model can answer. For the privacy check-up, the model receives counts, kinds, a fixed docum"
    },
    {
      "url": "https://raw.githubusercontent.com/samirsawarkar/lumina/aaced5beb7bdb93cf7267060bb81fb49d4762c67/plugin.yaml",
      "quote": "platforms: [macos]\nrequires_hermes: \">=0.23\"\nprovides_tools:\n  - lumina_search\n  - lumina_create_album\n  - lumina_library_info\n  - lumina_on_this_day\n  - lumina_export\n  - lumina_read_text\n  - lumina_expiry\n  - lumina_make_memory\n  - lumina_redact\n  - lumina_privacy_check\nprovides_hooks:\n  - pre_tool_call\n  - post_tool_call\n  - transform_llm_output\n  - pre_llm_call\npython_dependencies:\n  - \"osxphotos>=0.70,<1\"\n  - \"photoscript>=0.4,<1\"\n  - \"Pillow>=10,<14\""
    },
    {
      "url": "https://raw.githubusercontent.com/samirsawarkar/lumina/aaced5beb7bdb93cf7267060bb81fb49d4762c67/leakguard.py",
      "quote": "    \"\"\"Document name if the image looks like an ID document, else None. Fails open.\"\"\"\n    try:\n        st = p.stat()\n        key = (str(p), st.st_mtime_ns, st.st_size)\n        if key not in _CACHE:\n            if _safe_copy(p):\n                r = None\n            else:\n                texts = [l.text for l in redact.ocr_boxes(p)]\n                k = privacy.kind_of(texts)  # precise: passwords (wifi signs), receipts, serial numbers are not blocked"
    },
    {
      "url": "https://raw.githubusercontent.com/samirsawarkar/lumina/aaced5beb7bdb93cf7267060bb81fb49d4762c67/__init__.py",
      "quote": "        return None if (args or {}).get(\"allow_original\") is True else _id_guard(list(dict.fromkeys(u)))\n    if tool_name == \"lumina_redact\":\n        a = args or {}\n        u, f = a.get(\"uuid\"), a.get(\"path\")\n        one = (isinstance(u, str) and photos.UUID_RE.fullmatch(u) is not None and f is None) or (u is None and isinstance(f, str) and redact.image_file(f) is not None)\n        if not one or (a.get(\"preset\") or \"hotel\") not in redact.PRESETS:"
    },
    {
      "url": "https://gist.githubusercontent.com/gtmcknight/594c47336546c8763e641b46cf9af4ec/raw/field.json",
      "quote": "af2023a1d7798207e4334dff\",\"subdir\":\"\"},{\"pr\":153020,\"name\":\"breadcrumbs\",\"repo\":\"https://github.com/breadcrumbs-agency/hermes-breadcrumb-plugin\",\"sha\":\"b8975645e5174edbcc00d5dc86a78e536bce938b\",\"subdir\":\"\"},{\"pr\":153023,\"name\":\"parallax\",\"repo\":\"https://github.com/kruschdev/Hermes-Parallax\",\"sha\":\"4fff9b4873ed1be606fbf7dabe375efb53408df6\",\"subdir\":\"\"},{\"pr\":153024,\"name\":\"home-3d-workshop\",\"repo\":\"https://github.com/Wijt/hermes-home-3d-workshop\",\"sha\":\"8068c2533ac03e9067448bf"
    },
    {
      "url": "https://gist.githubusercontent.com/gtmcknight/594c47336546c8763e641b46cf9af4ec/raw/RUN.md",
      "quote": "# Run a plugin inside real Hermes\n\nFor seats in rounds 3 and 4. Everything lives under `test/scratch/`. Nothing here needs a model, a key or an account: the model is Nous's own scripted test stand-in, `tests/fakes/fake_llm_provider.py` in the Hermes source, which answers with the tool calls you plan and records everything Hermes sends.\n\n## 1. Hermes, once\n\n    git clone --depth 1 https://github.com/NousResearch/hermes-agent test/scratch/hermes"
    },
    {
      "url": "https://raw.githubusercontent.com/NousResearch/hermes-agent/fdde27e7dae174cb4ba842589e92508852b7dd9f/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"
    }
  ]
}
