Commit Graph

50816 Commits

Author SHA1 Message Date
Teknium
cbe5e53e28 feat(release): promote Docker stable/latest from a published receipt tag
The ordered publication pass moves nousresearch/hermes-agent:stable/latest
only after it reads the R2 stable channel head. When that read fails
(v0.21.6: "Channel repository authority mismatch"), the release publishes
and the aliases never move.

`python -m scripts.releases.docker promote --version X.Y.Z` reads the
published vX.Y.Z receipt tag and runs the existing promote_stable with the
digest it binds (slim checked against the receipt, desktop from its own
attempt tag). docker-promote-stable.yml dispatches it with the Docker Hub
credentials only CI holds.
2026-10-08 05:06:16 -07:00
teknium1
99a45ecc17 chore: map contributor email for babyblueviper1 2026-10-08 04:14:43 -07:00
teknium1
9c1fa8e552 chore(catalog): review disclosure for invinoveritas-receipts 2026-10-08 04:14:43 -07:00
Federico Blanco Sánchez-Llanos
83040ef022 plugin-catalog: add invinoveritas-receipts 2026-10-08 04:14:43 -07:00
teknium1
8f463316fd feat(plugins): one name resolver for every verb; one switch turns a unified package on
- hermes_cli: _find_plugin_entry is the single resolver (key / manifest name / unique leaf /
  catalog name via the installer-owned record). enable/disable/show/capabilities/update/remove,
  the dashboard and plugins.manage settings all go through it, so the catalog name you
  installed with keeps working (17 catalog entries install under another manifest name).
  _catalog_install_on_disk reuses the same catalog lookup.
- Desktop hub: join agent rows to desktop halves by package folder (what Electron stamps),
  not manifest name, so a self-cloned package is one row instead of two.
- Desktop: turning a unified package on (install dialog 'Enable after install' or the Agent
  switch) also turns its opt-in desktop half on, unless the user switched it off. Off stays
  per half. Capability consent is untouched.
- docs: plugin-catalog page.
2026-10-08 04:12:02 -07:00
teknium1
1748b89455 style(tui): keep session.close on one line (methods_session.py is at its line cap) 2026-10-08 04:11:24 -07:00
teknium1
919b8bfc10 fix(tui): session.close always returns a messages list and keeps its tui_close reason
The close result carried messages=None when a test stubbed the finalize boundary
(SessionCloseResult wants a list), dropped end_reason="tui_close" from the
teardown call, and two existing exact-result assertions predate the new field.
2026-10-08 04:11:24 -07:00
teknium1
dacb06ea93 feat(plugins): show on_session_finalize return messages to the user
A plugin's on_session_finalize hook can now return a str or {"message": str}
and Hermes shows it at the session boundary without starting a turn or
rewriting the model reply:

- CLI /new: printed before the new session; CLI quit: printed above the
  exit summary; one-shot -q/-z: printed to stderr (stdout stays the answer)
- TUI: session.close returns the messages; /new shows them as system lines
- Gateway /new and shutdown: sent to the owning chat via the adapter, while
  adapters are still connected

on_session_end stays observer-only: it fires after every turn, not at a
session boundary. Gateway finalize dispatch moves to
gateway/run_shutdown_session_end.py.
2026-10-08 04:11:24 -07:00
Anton Vykhovanets
3470e3ee2f fix(plugin-catalog): stack — re-pin to 3b33466, add homepage link + banner 2026-10-08 04:11:10 -07:00
ajspig
6e97b016f6 plugin-catalog: expand honcho description from the README
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 04:10:29 -07:00
ajspig
e8ab51ff8e plugin-catalog: lead honcho description with the README tagline
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 04:10:29 -07:00
teknium1
581e71adf7 chore(catalog): review disclosure for profile-models 2026-10-08 04:09:58 -07:00
Allen Robin Hubert
54ec66237d catalog: add profile-models 2026-10-08 04:09:58 -07:00
teknium1
c9aee22b90 chore(catalog): review disclosure for openrouter-spend 2026-10-08 04:09:25 -07:00
Allen Robin Hubert
914adfb84e catalog: add openrouter-spend 2026-10-08 04:09:25 -07:00
teknium1
cc1500a071 fix(desktop): a linked plugin checkout drives its desktop half; doctor flags a stale copy
The Desktop loads a unified package's desktop half from the copy in
desktop-plugins/<name>/, not from the package. Editing the source shipped
nothing and nothing said so:

- a package symlinked into plugins/ (the in-place dev layout the Python
  loader already follows) was never copied at all — Dirent.isDirectory()
  is false for a symlink;
- an installed package edited in place stayed stale until Rescan/restart.

Electron now follows symlinked package dirs, marks their copy linked, and
re-syncs it on any byte difference. The renderer watches a linked copy's
source plugin.js and, on save, runs the reconcile and hot-reloads. Catalog
and git installs keep the mtime rule. `hermes plugins doctor` warns when
the copy differs from the source and says how to refresh it.
2026-10-08 04:07:30 -07:00
Shaurya Jain
6cb6aad026 chore(plugin-catalog): bump linkup to v1.0.1 (d83d116) 2026-10-08 04:07:26 -07:00
teknium1
8822c002b6 chore: map contributor email for labyrinth-analytics 2026-10-08 04:06:55 -07:00
labyrinth-analytics
69684d8ff0 catalog: bump LoreConvo to 0.10.16 2026-10-08 04:06:55 -07:00
teknium1
cd5b486231 chore: map contributor email for Agantila 2026-10-08 04:06:07 -07:00
teknium1
e935eaea48 chore(catalog): review disclosure for next-steps 2026-10-08 04:06:07 -07:00
colabonate
0c30804f74 plugin-catalog: add next-steps — session-prediction for Hermes Desktop 2026-10-08 04:06:07 -07:00
zakiyys
e86b289636 feat(plugin-catalog): add nowstamp 2026-10-08 04:03:54 -07:00
TakeshiTGAL
9d50bd96f2 fix(plugin-catalog): update klipper-print-watch to 20aa6f0 2026-10-08 04:03:25 -07:00
Ace Data Cloud Dev
faf206bcc9 docs(plugin-catalog): update Ace Data Cloud installation guide 2026-10-08 04:02:47 -07:00
teknium1
a7d5e8d1dd chore(catalog): review disclosure for vornik-companion 2026-10-08 04:02:17 -07:00
Vadim Grinco
5ff01ace5b chore(plugin-catalog): bump vornik-companion to 0.11.3
Pin EaseIT-cz/vornik at cf817ad47d22 (CE release 2026.10.5), plugin 0.11.3.
Since 0.4.0 the plugin adds: forgetting reaches Vornik (/vornik-memory,
/vornik-forget), the Vornik approval transport (Hermes's own approval
prompts answered on the user's paired phone via the local vornikctl, opt-in
with hermes vornik approvals on), and fixes to both. The Disclosure line
covers the new behaviour.
2026-10-08 04:02:17 -07:00
teknium1
ce4149d953 chore(catalog): review disclosure for hermes-honcho-plugin 2026-10-08 04:01:44 -07:00
outpoints
d42d2c9fc6 fix(plugin-catalog): update hermes-honcho-plugin to 4fb2a17
New catalog banner and gallery. Plugin code and version 0.4.0 are unchanged.
2026-10-08 04:01:44 -07:00
outpoints
b889438d53 feat(plugin-catalog): add hermes-honcho-plugin plugin 2026-10-08 04:01:44 -07:00
teknium1
37823c458d chore: map contributor email for Zechereh 2026-10-08 04:01:01 -07:00
teknium1
0618e22f96 chore(catalog): review disclosure for tinyfish 2026-10-08 04:01:01 -07:00
Zachary Lyon
d590687d7f feat(plugin-catalog): add tinyfish plugin
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 04:01:01 -07:00
teknium1
a6c3802fe6 chore(catalog): review disclosure for hermes-pickup 2026-10-08 04:00:16 -07:00
Matt Urenovich
b4140e35ee feat(plugin-catalog): add hermes-pickup plugin 2026-10-08 04:00:16 -07:00
xraysight
6c80c32734 chore(catalog): update hermes-memory-ui to v0.6.4 2026-10-08 03:58:20 -07:00
Maxim Spivakovsky
48935b85ba catalog: update Kinprove genealogy research recipes to 1.2.0 2026-10-08 03:57:50 -07:00
olric3015
3f97b91aae feat(plugin-catalog): add the approval-ledger catalog card 2026-10-08 03:57:05 -07:00
olric3015
1fa1c46796 feat(plugin-catalog): add approval-ledger 2026-10-08 03:57:05 -07:00
teknium1
2d91335c59 chore: map contributor email for Efistoffeles 2026-10-08 03:56:03 -07:00
teknium1
eae45403c6 chore(catalog): review disclosure for letsfg 2026-10-08 03:56:03 -07:00
Efistoffeles
cbcdb50140 chore(plugin-catalog): update letsfg to 1.1.0
Re-pins LetsFG to 437b91d. The bundled skill and README named three
tools the hosted server has since renamed, and described a booking
approval flow the server no longer has. The banner is the new LetsFG
logo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 03:56:03 -07:00
aean0x
2e8e2188b8 catalog(git-hook): re-pin to aean0x/hermes-git-hook#4 (v0.5.1)
0.4.3 (66a6efcc) -> 0.5.1 (a7303c89, main). The adopted range is
66a6efc..a7303c8:

  #8  f936bfe  _busy() no longer reads a bare .git/REBASE_HEAD as a rebase in
               progress. On git 2.55 a finished `rebase --continue` leaves that
               file behind on a clean tree and `rebase --abort`/`--quit` will
               not remove it, so the worktree stayed busy for good and the hook
               skipped its whole fetch/commit path for it.
  #2  280c57c  A direct push the remote refuses on policy grounds (branch
               protection, a PR-required ruleset, GH013/GH006) no longer
               strands a commit: the hook drops only its own unpushed commit,
               leaves the edit staged and dirty, stops committing on that
               branch and reports it once, instead of re-pushing and re-logging
               the same remote error every pass.
  #4  a7303c8  A dead cwd fails open instead of refusing the tool call.

capabilities: unchanged -- the same four hooks (pre_tool_call,
post_tool_call, post_llm_call, on_session_end), no tools, no middleware, no
env vars.

description: adds the refusal clause to the existing disclosure -- a branch
whose direct push the remote refuses on policy grounds is never committed to
again, and the edit stays staged and dirty.
2026-10-08 03:55:27 -07:00
teknium1
87d5ff4576 chore(catalog): review disclosure for hermes-stt-enhance 2026-10-08 03:54:54 -07:00
Hermes Agent
14fa4c3fba plugins: pin hermes-stt-enhance to 0.5.1
Re-pins to 7be60e3, which stops calling the retired managed_uv shim and
reads security.allow_lazy_installs through hermes_cli.config, failing
closed when it is unset, false, malformed or unreadable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 03:54:54 -07:00
Hermes Agent
5005716ff4 plugins: add hermes-stt-enhance voice provider
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 03:54:54 -07:00
Teknium
e6848c2c9a test(approvals): pin unattended_mode: approve on webhook runs too
Addresses review: a change that always denied webhook runs would have passed.
The webhook/msgraph_webhook case now runs under both deny and approve; all four
parametrizations are red on main.
2026-10-08 03:50:22 -07:00
Teknium
e760a20d89 test(approvals): fold the unattended-presence cases into two invariants; document the api_server bridge exception
Replaces the six TestUnattendedPlatformExecAskLeak cases in test_approval.py (past its
size cap) with two invariants in a sibling file, both red on main:
- webhook / msgraph_webhook deny from approvals.unattended_mode even with the
  TurnRunner-registered notifier, and never reach the human gate;
- api_server denies without a notifier and keeps the ask path once a client bridge
  (/v1/runs, streaming chat) registers one.

security.md: unattended_mode now names the api_server exception.

Root cause first identified in #100554 (@fangliquanflq); webhook leg from #134821.
2026-10-08 03:50:22 -07:00
liuhao1024
71ff5238ec fix(approvals): treat webhook platforms as notifier-blind in _presence
The TurnRunner lane registers a gateway notify callback for every inbound
turn with no platform branch (run_turn_runner._run_conversation_with_approval),
so on webhook/msgraph_webhook the 'no notifier' discriminator can never fire:
is_ask stays True, the adapter renders no send_exec_approval surface, the
inbound lane is POST -> 202 with no reader, and the turn blocks in
_await_gateway_decision for the full approval timeout before failing closed
— the residual stall of #100532 that the notifier derivation missed.

A registered notifier only means 'someone can answer' on api_server, whose
turn paths choose whether to register one. Add _NOTIFIER_BLIND_APPROVAL_PLATFORMS
({webhook, msgraph_webhook}) and drop is_ask there regardless of registration;
api_server keeps the notifier test. New tests drive the gate with a registered
notifier on both platforms (the suite previously had no
HERMES_SESSION_PLATFORM=webhook case at all).
2026-10-08 03:50:22 -07:00
liuhao1024
8918717b1a fix(approvals): resolve an unattended turn from unattended_mode when no notifier is registered
start_gateway() sets HERMES_EXEC_ASK=1 process-wide, so an api_server/webhook
turn inside a gateway still reads as 'ask' in _presence() even though
_is_gateway_approval_context() already excluded the platform. The unattended
branch then never runs: a smart ESCALATE (or any manual-mode dangerous
command) falls through to the interactive transport, and on a session with no
gateway notify callback — non-streaming /v1/chat/completions, webhook,
msgraph_webhook — the card parks as pending_approval that no client can ever
answer, while approvals.unattended_mode is never consulted (#100532).

Drop is_ask for unattended-platform sessions without a registered notify
callback, so the unattended branch resolves instantly from
approvals.unattended_mode before the guardian call runs. /v1/runs and
streaming chat completions register their callback and keep the ask path.
2026-10-08 03:50:22 -07:00