Repository navigation
Releases: TheSmokeDev/hermes-talk
Release list
v0.21.1
Desktop Talk connects on a stock Hermes host, and when a request fails the panel
says why.
Fixed
- Desktop Talk no longer fails every Connect with "Talk is temporarily
unavailable" on a Hermes host without task context support, which is every
released core today. It binds the conversation only when/statusreports
taskContinuity.supported, and otherwise connects the way the dashboard's
legacy Talk does. The composer popover also stays open when the host moves
focus back to the composer as the pointer crosses the chat; outside click and
Escape still close it. Thanks to @HearthCore for the diagnosis and the fix.
(#169, #170) - GPT-Live on Desktop still binds its own task when none is preselected, such
as an empty conversation on the Talk-enabled build or a catalog that has not
loaded yet. #170 inverted that start check onmain, and no release carried
it. On a host without task context the panel now refuses GPT-Live before
connecting and names the missing host support, instead of asking for a task
it cannot offer. (#174)
Changed
- A refused Desktop plugin request shows its status and error code in the
panel (Error code: 503 context_unavailable) and logs the route and code to
the devtools console. Plugin requests travel over IPC, so the Network tab
never shows them. The refusal's free text still stays out of both. On a host
without task context, the recipient picker says recipients need that support
instead of failing a refresh.docs/DESKTOP.mddescribes such hosts, and
says what SSH and URL connections need: an SSH connection reaches the remote
backend over its loopback, so Talk installed and enabled there admits it
withoutTALK_DASHBOARD_TOKEN. (#174)
v0.21.0
Talk works on a stock Hermes Desktop, and the refusal text stops asking for an
update that does not exist.
Added
- The Desktop composer Talk button now runs on a stock Hermes Desktop build.
Talk reads the focused conversation from the host state, confirms its stored
identity with a read-only title request, and attaches through the composer
popover. Connect once the conversation has one message, because Desktop saves a
conversation on its first message. Requests on this lane follow whichever
profile Desktop has active, and Talk refuses a request rather than address
another gateway once that profile moves. There is no microphone lease to share
with Desktop dictation, andTALK_DASHBOARD_TOKENis unsupported here; the
panel names both when they matter. The Talk-enabled build is unchanged and
keeps the floating window, the lease, pinned requests and empty conversations.
(#168)
Changed
- A host that reports only part of the Talk contract now says that, instead of
asking for an update that no release carries. The composer popover names the
Talk-enabled Hermes Desktop build as what the floating window needs, and
docs/DESKTOP.mddescribes the two lanes side by side. (#168)
Full changelog: https://github.com/TheSmokeDev/hermes-talk/blob/main/CHANGELOG.md
Hermes Talk 0.20.2
0.20.x is the floating panel release. You can talk and type in the same conversation, address the exact Codex or Claude thread you mean, steer or cancel a running job and answer its approvals from a task card, and get spoken updates that never claim more than the transport can prove.
0.20.2 finishes the window. After you connect, the floating window shrinks to the round Talk button and expands again on hover; both are toggles under Advanced. Around the control the window is transparent and click-through, so it sits over your work instead of covering it, and you can click and drag the button to move it. A reconnect never closes a panel you pinned. hermes talk check now passes on the ChatGPT-subscription GPT-Live lane, and doctor names the live model there (#161).
For context: 0.20.0 added the panel itself, one authenticated route for typed operations, live replay, typed attach and read-only recipient history. 0.20.1 added attachments on a worker start.
The Desktop floating window needs a host side that lives in my Hermes fork and is not upstream yet.
Install:
hermes plugins install TheSmokeDev/hermes-talk --enable
pip install "hermes-talk[audio]" # mic + speaker support; skip if dashboard-onlyUpgrading: hermes plugins update hermes-talk, then restart the gateway.
Every version with its receipts: CHANGELOG.md
Signed-off-by: SmokeDev degensmoke@gmail.com
Hermes Talk 0.20.1: attachments on a worker start
Hermes Talk 0.20.1 adds attachments to a worker start.
- Upload adapter.
POST /attachments/uploadis authenticated and bound to the connection, generation and input. It refuses unless the host advertisesfeatures.input_attachments(read live), enforces the host's published limits, forwards through the existing task gateway, and returns only an opaque{attachment_id, filename, content_type, bytes, sha256}. A retry replays the receipt. - Descriptor.
textInput.attachmentson/statusis sourced from the same live host capability, so the panel only offers file Send where it will work. - Admission.
/text/inputtakes{attachment_id, sha256}references onstart_workeronly, verified again at the single dispatch chokepoint against the same owner, connection, generation and input. The other operations refuse with a fixed code, matching the host's unsupported-delivery flags. Attachment sends run on the Hermes child worker. - Panel. A Send with files uploads first, then sends with the references frozen into the captured send. An upload failure keeps the draft and sends nothing.
- Fixed. A browser-flow route test raced the delivery emit on slow Windows runners; it now awaits it.
Requires a host that publishes features.input_attachments (the Hermes fork's attachment ingress). On a host without it, attachments stay local and Send with files is disabled with a visible reason, as before.
Signed-off-by: SmokeDev degensmoke@gmail.com
Hermes Talk 0.20.0: the floating panel release
Hermes Talk 0.20.0 is the floating panel release: talk and type in one conversation, pick the exact Codex or Claude thread you are addressing, steer or cancel a running job and answer its approvals from a card, and get honest spoken updates that never claim more than the transport can prove.
- Floating Talk panel in the dashboard tab and the Desktop Talk view. The runtime survives collapsing the controls and browsing other tasks. Recipient picker with exact identities, typed input with draft retention, task cards with approvals. Send with files is disabled with a visible reason until the host attachment route exists.
- Explicit operations through one authenticated route: message to the pinned task or to the selected recipient, start a Talk-owned worker, steer, cancel, approval. Every call is bound to the connection and generation, the recipient is the store's current selection, and a repeated input returns its stored receipt rather than dispatching twice. Reply states are the honest ones; nothing retries an uncertain dispatch.
- Live replay re-announces a finished result into the exact bound Live session, with the dispatch fence persisted before the send.
- Typed attach and read-only recipient history: microphone-off use that mints no voice credentials; catalog, history, status and select over the host bridge. A history read never confers send.
- Result presentation keeps six facts separate across terminal, Discord and browser: result ready, context submitted, playback started, playback finished, interrupted, unknown.
/replay EVENT_IDon native terminal and Discord. - Desktop plug-and-play: open a conversation, Talk, Connect.
- Outbox in WAL mode so a busy writer cannot starve reads into "storage broken".
- Windows CI is stable: scaled waits, per-test timeouts, and the wall-clock deadline tests skipped on Windows CI only while still running on Linux and locally.
Subscription stays the default. OpenAI Realtime and GPT-Live ride the Codex login, Grok rides X Premium or SuperGrok, Gemini Live takes an API key. No new dependency.
Signed-off-by: SmokeDev degensmoke@gmail.com
Hermes Talk 0.19.2: GPT-Live subscription auth on a stock Hermes login
Hermes Talk 0.19.2 fixes GPT-Live subscription auth on a stock Hermes install.
In 0.19.1 the Codex lane borrows Hermes' own login first (#146), but that path handed back no account id, so validate_live_auth refused it and subscription mode failed unless you had also run codex login. Reported in #149.
- The account id is read from the borrowed token's
https://api.openai.com/auth→chatgpt_account_idclaim, the same claim Hermes uses for its ownChatGPT-Account-Idheader.expires_atnow reports the token'sexp. - The Codex CLI store path reads the same claim when
auth.jsoncarries noaccount_id. - Fail-closed behavior is unchanged: a token that names no account still cannot open subscription mode, and nothing falls through to API billing.
- Four new tests drive the real Hermes borrow path through a stand-in
hermes_cli.auth_codex; three of them fail on 0.19.1. dashboard/manifest.jsonis bumped in step with the other two version files.
No new surface, no new dependency, no change to the API-key lanes or to Grok and Gemini.
Signed-off-by: SmokeDev degensmoke@gmail.com
Hermes Talk 0.19.1: read-only Codex subscription lane
Hermes Talk 0.19.1 makes the Codex subscription lane read-only. It never refreshes or rewrites ~/.codex/auth.json again.
- The Codex lane now borrows Hermes' own Codex login first, through
hermes_cli.auth_codex.resolve_codex_runtime_credentials. Hermes owns that token store and refreshes it under its lock, so there is one owner of the credential instead of two. - If Hermes has no Codex login, Talk reads
~/.codex/auth.jsonread-only. An expired CLI token surfaces aTalkAuthErrorpointing atcodex loginorhermes auth login openai-codexinstead of a silent refresh. - Removed
_post_token_form,_write_auth_jsonand_refresh_codex_credential, plus thehttpxandtempfileimports they needed. 70 insertions, 205 deletions. - Tests rewritten to the new contract: the store is byte-identical after an expired token, and a Hermes login wins over the CLI file.
Written by @teknium1 in #146 to clear the one catalog-admission blocker on NousResearch/hermes-agent#108798. Merged as-is at 03b5cd9; all 11 checks green on that head.
No new surface, no new dependency, no behavior change for the API-key lanes or for Grok and Gemini.
Signed-off-by: SmokeDev degensmoke@gmail.com
Hermes Talk 0.19.0
Hermes Talk 0.19.0 keeps GPT-Live responsive while Hermes works and separates existing application conversations from new Codex workers.
- Subscription remains the default. API billing is explicit, with separate model and voice settings and no automatic paid fallback.
- List and select an existing Codex Desktop or Claude Code task, then send to that exact recipient. Delivery receipts distinguish queued, posted, accepted, completed, failed and unknown.
- Start a Codex worker separately; keep talking, check its results and steer the original job through the shared coordinator.
- Transcript capture, status and controls continue while delegation is deciding. Exact event identities, whitespace, late words and pending native capture survive reconciliation.
- Completion updates no longer wait for unrelated transcript persistence. Requested screen inspection returns a fresh capture receipt.
- Discord continues to check the operator and every human listener before control and private output.
Existing-task delivery requires a host with the authenticated recipient bridge in TheSmokeDev/hermes-agent#11. Worker features require the compatible host task-worker APIs. Availability is reported per execution host and application. Claude Code applies its own incoming-message approval policy; permission-bypass sessions may require approval in the existing task before posting is confirmed.
Setup: GPT-Live guide.
Existing tasks: recipient routing guide.
Native Hermes subscription support is separately submitted in NousResearch/hermes-agent#108940. That upstream PR is open for maintainer review.
Signed-off-by: SmokeDev degensmoke@gmail.com
Hermes Talk 0.18.0: GPT-Live and Codex workers
GPT-Live voice with Hermes task continuity and Codex background workers on dashboard, terminal and Discord.
- Subscription authentication is the default. API billing is separately selected with
TALK_LIVE_AUTH=api; subscription failure never switches to a paid API key. - Browser WebRTC, native subscription WebRTC and native API WebSockets share one Live delegation adapter.
- Keep talking while work runs, switch tasks and return, steer the original job, handle current approvals, cancel and inspect complete results.
- Reconnect and audience checks preserve task ownership. Duplicate delegation events cannot launch duplicate jobs.
- Codex workers use the installed native Codex CLI 0.154.0 executable and the configured workspace/model/approval policy.
Task workers require a compatible Hermes host containing the task-worker APIs, including the merged host change in TheSmokeDev/hermes-agent#9. A Talk plugin update alone does not add these APIs to another host build.
Install the source plugin through Hermes and install [audio,live] dependencies in the host Python environment for native audio. Configuration and operating steps: GPT-Live guide and Codex workers.
Validation: all 11 PR checks passed, including Python 3.11-3.13 on Linux and Windows, plugin scanning, dependency review and CodeQL. Final local suite: 2,266 passed, 48 skipped, 5 expected failures. Wheel and source package contain all 65 declared modules. Real connection-only checks passed for both voice billing options.
SmokeDev
v0.17.3 — stop() can no longer strand a dashboard session
One fix, for the dashboard tab. Ending a session could strand it: if any
teardown step threw, the rest of stop() was skipped, the UI reset to
idle, and the server kept listening, so the next session started with the
previous one still live. Every teardown step now owns its own failure and a
repeated stop() is a no-op. Found and fixed by
@JakeStevenson while building a mobile
surface on the dashboard transport, the second outside fix to a live lane.
Fixed
- The dashboard transport's
stop()is now idempotent and every teardown
step is guarded, so a throw in one can never skip the rest. Previously a
throw inabortCascade()(or any other step) left the channel and peer
open — the server kept listening even though the UI reset to idle, and a
secondstop()could throw again. Each step now nulls its reference and
swallows its own failure, so teardown always completes and a repeated
call is a no-op. Regression test drives the real bundle throughnode
with a throwingabortCascade()and asserts every wire is closed. (#130)