Skip to content

Native Hermes Desktop HTTP bindings

AsyncHermesDesktop connects directly to hermes serve. It is separate from AsyncEdithHermes.remote, which connects to the EDITH control plane. The native Desktop application also uses HTTP routes outside the gateway RPC contract.

from edith_hermes import AsyncHermesDesktop

async with AsyncHermesDesktop.remote(
    base_url="http://127.0.0.1:9119",
    profile="family-edith",
    token=local_token,
) as desktop:
    operations = await desktop.capabilities()
    jobs = await desktop.cron.list()
    runs = await desktop.cron.runs(jobs[0]["id"])
    door = desktop.for_profile("door-edith")
    door_jobs = await door.cron.list()

Available typed groups are cron, files, git, skills and sessions. Cron includes atomic paused creation, edit, pause/resume/removal, trigger, execution history, delivery targets and blueprints. Mutation preflight rejects native cross-profile fallback; returned owner metadata is also checked. This preflight is not a server-side compare-and-swap transaction. Files expose native tree/text/data-URL operations. Git exposes review, mutation, branch and worktree operations. Skills expose installed inventory, content reading/writing, creation and enablement, plus Hub official catalog, sources, search, preview, safety scanning, install, uninstall and batch update bindings. Hub installer methods return a process receipt, not installation success. Check the native action result and saved inventory before confirming completion. SDK timeouts never replay the installer. Scan policy and user consent belong to the application's native flow; a scan result is not implicit consent to install. Sessions expose bounded, owner-checked message pages. This release does not claim complete coverage of every Desktop REST route or Electron host service.

AsyncHermesExtensions.prepare_blueprint(key, values) uses the explicit edith.desktop.v1.cron.prepare operation. It reuses Hermes's native blueprint validation and returns a profile-owned draft without creating or running a job. Discover that operation before offering an editable template; the native REST instantiate operation creates a job immediately and must not be used for preview.

Every request carries a concrete profile. all is deliberately unavailable in this bound client: aggregate different profiles explicitly and retain their ownership metadata. Native job IDs and session IDs are opaque; display names must not become routing keys. A borrowed HTTP client remains caller-owned.

Mutations are sent once, with redirects disabled by default. A timeout does not prove failure. Keep an application-owned operation receipt and reconcile saved state/history before issuing another mutation. cron.trigger can wait for the entire run; its timeout override does not weaken unrelated operations.

Use capabilities() to check the running deployment's OpenAPI route inventory. A documented binding does not mean an older or differently configured deployment provides it. Authentication failures, absent contracts and malformed discovery responses are errors, never an empty successful capability list.

These bindings were checked against native Hermes checkout 04dc7f846cfa921f77c95d42703afdbd9495ca72, particularly hermes_cli/web_routers/{cron,files,git,skills,sessions}.py and the Desktop API facades. Source provenance and native API ownership remain with Hermes.

EDITH's optional versioned extension client is separate from native REST/RPC. reset_reasoning(session_id) clears a session override using Hermes's profile reasoning resolver and native runtime persistence. It requires the advertised execution.reasoning_default operation, an idle initialized session and its owning profile. It does not change agent.reasoning_effort in profile config. skill_inventory() returns canonical file identities, revision tokens and optional legacy invocation aliases, including disabled skills. toggle_skill(id, revision=..., enabled=...) performs a per-skill compare-and-swap under Hermes's configuration lock. It never writes an inventory snapshot back into configuration. Discover skills.inventory and skills.toggle before using these product-owned methods. git_diff preserves patch line endings, git_apply checks and atomically applies selected review patches with fixed Git arguments, and cron_trigger / cron_operation wrap the native scheduler claim in a durable request receipt. They require matching operations in AsyncHermesExtensions.capabilities() on the running host. An app restart can recover a completed receipt without executing again. A native server crash during execution remains uncertain and blocks another dispatch; neither missing history nor a timeout establishes failure.