Commit Graph

34808 Commits

Author SHA1 Message Date
Tony Simons
cd14f06dbf plugin catalog: add community plugin hermes-newswire
Breaking-news ticker for Hermes Desktop (RSS/Atom/JSON-Feed strip above
the statusbar; feed search + discovery; per-source favicons; grouping
modes; offline cache; in-app reading; zero API keys / model tokens).
Owner-submitted. Validated: 'hermes plugins validate' 10/10 checks;
102-test suite + ESM render smoke. Pinned 10ea9ba (repo published today —
2-week pin-maturity window flagged in the PR body for maintainer call).
2026-09-14 19:26:54 -07:00
teknium1
d16765a4b4 chore(contributors): map catalog submitter email(s) to GitHub login 2026-09-14 19:26:23 -07:00
poponline63
144942734e Add hermes-pets-all to the plugin catalog 2026-09-14 19:26:23 -07:00
Jeffrey Quesnelle
d08032655f Merge pull request #111423 from NousResearch/feat/local-engine-update-prompt
feat(local-models): prefer b10964 and add one-click engine updates
2026-09-14 22:25:46 -04:00
Vocllum
a982d2c882 feat(plugin-catalog): add hermes-auto-titler (community) 2026-09-14 19:13:48 -07:00
emozilla
c89b1d1318 test(desktop): complete SDK gateway routing mock 2026-09-14 22:12:53 -04:00
emozilla
de5a1da632 feat(desktop): add one-click local engine updates 2026-09-14 21:49:14 -04:00
emozilla
e9e363c856 feat(local-runtime): prefer llama.cpp b10964 2026-09-14 21:49:13 -04:00
teknium1
2179a279ae fix(desktop): dragging a link from a browser attaches an @url chip
Dropping a link out of a browser onto the Desktop composer toasted
"Drop files — Could not attach <title>.url" and attached nothing. A browser
link drag carries `text/uri-list` plus, on Windows, a virtual `<title>.url`
shortcut File (`.webloc` on macOS) that has no on-disk path. The drop
pipeline only understood Files and in-app paths: the path-less stub went to
the upload branch, `attachContextFilePath('')` returned false, and the user
had to copy/paste the URL instead.

`extractDroppedFiles` now reads `text/uri-list`, drops the path-less
shortcut stub when a link is present, and emits `{ url }` entries;
`droppedFileInlineRef` turns them into the same `@url:` chip the "+ → Add
URL" dialog and paste-linkify produce, so every drop surface (composer
form, text box, conversation area, edit composer) gets it for free.
`dragHasAttachments` accepts `text/uri-list` so the form-level enter/over
handlers claim the drag at all. A path-less *image* dragged off a web page
keeps its bytes and wins over the link to its own src.
2026-09-14 18:06:05 -07:00
teknium1
9326d9cdc4 fix(bot-mode): show the current thread and newest unresolved failure
Attribute drive-level errors to the thread being drained, not the send
that created the queue. Reinsert repeat member failures in recency order
so the collapsed activity row cannot show an older sibling failure.

Cover both invariants and the repeated-refusal sequence in native Desktop.
Thanks to @kvnloo for identifying both review findings.
2026-09-14 17:35:04 -07:00
teknium1
3040c87ac1 fix(bot-mode): do not retry failures from already queued sends
Keep failed-member exclusion across the room queue, rather than resetting
it per pending thread. A new user action after failure still permits a new
attempt. Share the drain activity epoch so a skipped queued thread cannot
hide the preceding member failure.

Proven red in real Electron: hold transport refusal, enqueue same-thread
and cross-thread sends, then release; old head submits three times, fixed
head once. Strengthen follow-up evidence with distinct provider replies,
exact public log order/count, and per-input inference counts.
2026-09-14 17:35:04 -07:00
teknium1
92a65be069 chore: keep Desktop version bump scoped to its package 2026-09-14 17:35:04 -07:00
teknium1
e80642df60 fix(bot-mode): keep group follow-ups ordered and late answers visible
Serialize room drives through their actual member completion, freeze input
watermarks by retained entry identity, and share the same completion path
with handoff continuations. Stop discards queued work without releasing an
active owner early; rename follows the existing room binding.

Observe stranded replies for the hard-cap duration plus grace after the
foreground wait, and retain unresolved failures in collapsed Activity.
Never automatically retry an ambiguous failed submit within the same drive.

Adapted from the queue and boundary approach in #92041 by @enwaiax and
harvest-budget approach in #107193 by @Finn763; #106502 by @wadib identified
failed-submit watermark consumption. The implementation retains current
numeric watermark storage, room lifecycle bindings and serial round limits.

Related: #92003, #105247, #100026
2026-09-14 17:35:04 -07:00
Teknium
9975fd56be Merge pull request #111320 from NousResearch/docs/plugin-catalog-no-self-update
Plugin catalog: no self-updaters instead of a 2-week pin age, enforced in CI
2026-09-14 17:34:43 -07:00
teknium1
42602bd12a docs(computer-use): skill matches the driver's current vocabulary
The skill described a SOM overlay burned into the screenshot, a driver-side
`capture` tool, and manual symlinking of the cua-driver skill pack; users
who read the driver's own docs then called raw MCP tools (`capture`,
bare `element_index`) and hit "no reviewed risk classification" and
`snapshot_id_required`. State plainly that `computer_use(action=...)` is a
wrapper vocabulary the driver never sees, that `element=N` is translated to
the snapshot token, what a `stale` refusal means, how text-only models get
vision (auxiliary.vision routing / mode=ax), and the Windows WindowsApps
doctor failure. `cua-driver skills install` links into ~/.hermes/skills now.
2026-09-14 17:34:31 -07:00
teknium1
a4d474777f fix(computer-use): doctor diagnoses a denied cua-driver spawn instead of crashing
On Windows the Hermes venv interpreter cannot CreateProcess a binary under
C:\Program Files\WindowsApps (WinError 5) even though the shell resolves it,
so `hermes computer-use doctor` died with a raw PermissionError traceback
from _open_mcp. Catch the spawn OSError and print what failed, why the tool
may still work (PATH resolves another copy), and the fix (reinstall outside
WindowsApps or HERMES_CUA_DRIVER_CMD), exit 2.
2026-09-14 17:34:31 -07:00
teknium1
45da78d645 test(computer-use): element click carries the token from the live schema alone
Invariant through the real click() path on the modern tools/list shape
(no capabilities[] array, element_token only in inputSchema); red on main.
2026-09-14 17:34:31 -07:00
Jeff J Hunter
65625dfe87 fix(computer_use): attach element_token when the driver schema accepts it
cua-driver 0.21 refuses a bare element_index:

    click: bare element_index is not accepted; pass element_token,
    or snapshot_id together with element_index

_maybe_attach_element_token gated solely on the trycua/cua#1961 capability
vocabulary. 0.21 stopped publishing per-tool capability sets — every tool
reports an empty set — while still accepting element_token in its input
schema. The gate therefore fails closed on 0.21.x and we send the bare
index, so the driver rejects the call.

The effect is total: every element-targeted click is refused, leaving
agents with only blind pixel coordinates. Observed against cua-driver
0.21.0 on X11, where a capture returned 762 elements with 762 tokens
cached and every subsequent click still failed with snapshot_id_required.

Check the live input schema first — supports_input_property() already
exists for exactly this, and its docstring notes it "deliberately inspects
tools/list rather than ... requiring a capability token the driver never
shipped". The capability check is retained as a fallback so drivers that
did ship the vocabulary are unaffected.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 17:34:31 -07:00
Adolanium
9a6eb21a88 fix(catalog): pin hermes-tailscale without self-updater 2026-09-14 17:32:15 -07:00
Adolanium
3bec474211 feat(catalog): add hermes-tailscale community plugin 2026-09-14 17:32:15 -07:00
Adolanium
d4dbac6dc4 fix(catalog): pin hermes-ssh without self-updater 2026-09-14 17:31:46 -07:00
Adolanium
cb84ee770f feat(catalog): add hermes-ssh community plugin 2026-09-14 17:31:46 -07:00
teknium1
8f7853188f fix(cron): keep deferred delivery exceptions from aborting ticks
Catch unexpected delivery exceptions after claim, retain diagnostics and continue
sibling admissions without authorizing replay. Preserve indefinite retention.

Reproduced PermissionError at target traversal after discovery. Native Electron
controlled-fault A/B confirms the healthy sibling settles and renders once.
2026-09-14 17:29:32 -07:00
teknium1
002ee41cfc fix(cron): keep unowned Bot Chat delivery on its resolved home
Extend deferred dispatch's destination pin to ordinary CLI fallback, so
custom-root and active-profile changes cannot redirect a checked target.
Refuse a missing destination before launch and name the target on failure.
Replace the old env-clearing expectation with two behavioral invariants
and retain the native Electron custom-root reproduction.

Adapted from the root-boundary fix and diagnosis in #104066.
Related #104055, #104066.

Co-authored-by: fangliquanflq <fangliquan@qq.com>
2026-09-14 17:29:32 -07:00
teknium1
3b0fe0cc2b fix(cron): keep deferred Bot Chat delivery bound to admission
Carry the original destination home and delivery ID into deferred drain and
its child, rather than re-resolving a mutable profile/root. Missing destinations
fail closed; supported-owner handoffs remain transferred, not ambiguous failures.
Capture the producer root before the background thread starts, and retain/log
malformed JSON without stopping healthy admissions or the whole cron tick.

Two invariants reproduced failures on the published head. Real Electron root
change and malformed-record cases are red before and green after; nested DM
control remains passing. No automatic retry of claimed or uncertain turns.
2026-09-14 17:29:32 -07:00
teknium1
6af84ead60 test(cron): retain native Bot Chat delivery reproduction 2026-09-14 17:29:32 -07:00
teknium1
5d8390d1a4 fix(cron): retain Bot Chat output while a CLI owner is open
Keep never-started output behind unsupported owners and drain in admission
order after release. Persist claims before execution and never replay uncertain
started turns. Existing supported-owner receipts keep their authority.

Credits 686f6c61's residual queue proposal in #100319. This is a scoped
implementation, not general retry of failed CLI subprocesses.

Native Electron before/after: CLI-owned target previously returned
SESSION_NOT_OWNED and remained empty after release/tick; now its queued
output and reply appear once in the target Bot Chat. Nested quiet CLI
message_agent delivery to a named Desktop owner also passes on base.
2026-09-14 17:29:32 -07:00
Adolanium
e7bd70d92a feat(catalog): add shodan community plugin 2026-09-14 17:29:03 -07:00
Adolanium
b5b8df57b7 fix(catalog): pin hermes-terminal without self-updater 2026-09-14 17:28:30 -07:00
Adolanium
0491ae8101 feat(catalog): add hermes-terminal community plugin 2026-09-14 17:28:30 -07:00
Adolanium
4b8e183912 feat(catalog): add hermes-rss community plugin 2026-09-14 17:27:59 -07:00
Adolanium
010ebe4736 fix(catalog): pin read-only Resetwatch package without updater 2026-09-14 17:27:30 -07:00
Adolanium
55fe7f6340 catalog: pin Resetwatch DeepSeek weekday pricing fix 2026-09-14 17:27:30 -07:00
Adolanium
2c70c41adc feat(catalog): add hermes-resetwatch community plugin 2026-09-14 17:27:30 -07:00
Adolanium
23effb598d feat(catalog): add hermes-office community plugin 2026-09-14 17:27:01 -07:00
Adolanium
69e857425c fix(catalog): pin hermes-nous-prices without self-updater 2026-09-14 17:26:31 -07:00
Adolanium
b92dfc2d95 catalog: pin Nous pricing Gateway companion release 2026-09-14 17:26:31 -07:00
Adolanium
eab8871978 feat(catalog): add hermes-nous-prices community plugin 2026-09-14 17:26:31 -07:00
Adolanium
5acad84150 fix(catalog): pin hermes-ledgerline without self-updater 2026-09-14 17:26:02 -07:00
Adolanium
681d6c63fb feat(catalog): add hermes-ledgerline community plugin 2026-09-14 17:26:02 -07:00
teknium1
48763a4d01 docs(plugin-catalog): replace the 2-week pin-maturity rule with a no-self-updater rule, enforced in CI
Teknium's ruling: catalog plugins do not need the 2-week maturity window,
but they may not ship an in-app updater that downloads and replaces their
own files, because that makes the reviewed SHA pin decorative. Rule 3 in
the README and item 5 on the docs page now say so, and plugin-catalog-ci
fails an entry whose catalog build both fetches from GitHub releases/raw
and writes or renames plugin files (either half alone is allowed).
2026-09-14 17:17:19 -07:00
teknium1
b8bf484351 test(bot-mode): keep the reproducible mock patch whitespace-clean 2026-09-14 17:04:56 -07:00
teknium1
de5ff9ba85 test(bot-mode): prove native profile fallback and nested delivery ownership
Retain executable Electron evidence for the named-unowned and live-owner
paths; stale PATH fails on base and passes with the contributor fix.
Clarify that --in selects cwd rather than the profile database.
2026-09-14 17:04:56 -07:00
liuhao1024
37243bd668 fix(tools): resolve hermes CLI beside the interpreter in bot_mode_dm deliveries
Bot-to-bot message_agent delivery builds both transport argvs (local
teammate chat and peer dm) with a bare "hermes" as argv[0]. Since #96631
the delivery runner spawns under terminal_tool's isolated host-local
environment, which does not inherit the gateway's PATH — so on
docker/service installs (venv at /opt/hermes/.venv) every delivery exits
with FileNotFoundError: 'hermes'.

Resolve the CLI with bot_relay._hermes_cli() (#93590) — the venv sibling
of this interpreter, then shutil.which, then the bare name — at both
argv construction sites. The turn-lock matcher in _delivery_lock()
already matches argv[0] by basename, so absolute paths lock exactly as
before.

Fixes #100662
2026-09-14 17:04:56 -07:00
teknium1
1f1f02e354 fix(desktop): preserve qualified bot identity in primary handoffs
Keep the salvaged botHandle normalization, but remove the unconditional
hermes alias on remote default profiles: the parser's last-wins map
otherwise retargets a local @hermes handoff by roster order.

Consolidate regression coverage into two invariants for persisted primary
handles, both handoff directions and three-source qualified identity.
Capture real Electron screenshots, durable logs and source receipts;
exercise the reverse live handoff too. Document the repair and bump the
bundled Desktop patch version.
2026-09-14 17:04:27 -07:00
teknium1
52972d15f3 test(desktop): live e2e for a teammate's @hermes handoff driving the primary bot
Real-Electron Playwright spec for #100406: a two-member room (primary
profile + code-farmer). The user addresses only @code-farmer; its
scripted reply @mentions hermes; the assertion is a `default`-authored
"B" entry in the persisted room log. On origin/main the room settles
after Code Farmer's line and the spec fails at that assertion; with the
mention-alias fix it passes.

The mock inference server gains a per-speaker script for group rooms:
`E2E_SAY(<handle>)[<line>]` tokens in the user's send answer the member
whose turn prompt opens with `You are @<handle>`; unscripted members
reply "(pass)". `{at}` stands for `@` so the script itself never
mentions anyone and round one only drives the member the user tagged.
2026-09-14 17:04:27 -07:00
Cursor Agent
d92ce52e71 fix(desktop): keep @hermes callable when the primary handle is default
Group mention parse used member.handle before botHandle, so a persisted
or union-stamped handle of "default" never mapped to the user-facing
@hermes alias. Bot-to-bot handoff toward the primary profile then
settled with no continuation, while the reverse direction still worked.

Co-authored-by: Noa <rainbowgore@users.noreply.github.com>
2026-09-14 17:04:27 -07:00
teknium1
1a990f3062 fix(skills): keep scanning link-shaped arguments inside fenced code blocks
Masking every balanced [x](dest) in a .md file also blanked
`cp [k](../../../.ssh/id_rsa) /tmp` inside a ```sh fence, which main scored
caution and the branch let through as safe. A link inside a code fence is a
command argument, not a hyperlink: toggle masking off between fence markers.
2026-09-14 16:28:49 -07:00
KoNit-K
5f6e3a6fe3 test(skills): trim link-traversal coverage to two invariants
Split the salvaged regression into the two facts the fix must hold:
a 3-level doc link no longer produces a traversal finding or blocks a
community install, and traversal outside a link destination (a shell
script, or prose on the same line as a link) still fires. The shell
script case is taken from #110978 by @KoNit-K; the same-line case is
what distinguishes masking link destinations from gating by extension.
2026-09-14 16:28:49 -07:00
Puvaan Raaj
b259f2401d fix(skills): ignore traversal in markdown links
(cherry picked from commit 92b48941b707df4fd3c13029b157a3f28188b4c4)
2026-09-14 16:28:49 -07:00