Skip to content

Rebuild Bot Mode on the app's design system - #96726

Merged
OutThisLife merged 33 commits into
mainfrom
bb/bot-mode-design-system
Aug 28, 2026
Merged

Rebuild Bot Mode on the app's design system#96726
OutThisLife merged 33 commits into
mainfrom
bb/bot-mode-design-system

Conversation

@OutThisLife

@OutThisLife OutThisLife commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

Summary

Bot Mode arrived as a 16,291-line plugin.js that reimplemented most of the desktop app instead of using it: its own scroll container, color palette, status dots, empty states, buttons, time formatting and cron surface, none of which could follow the theme. It also shipped a second "Bots" workspace tab that duplicated the sidebar, and a workspace-scoping filter that could take the main zone off screen entirely.

This rebuilds it on the primitives the app already ships, and widens the plugin SDK with the ones it was forced to reinvent so the next plugin doesn't have to.

  • Bot Mode is now 44 focused modules (plugin.tsx is imports and register()). A bot row renders the same SessionStatusDot, swatches and age labels as the session row beside it; the UI settles on "bot" as the noun, with model-facing prompt text still saying "agent".
  • It speaks every language the app does. The ~170 Bot-Mode-specific strings live in a plugin locale bundle registered through ctx.i18n, shipped in en / ja / zh / zh-hant using core's own nouns (ゲートウェイ / 网关 / 閘道, プロファイル / 配置文件 / 設定檔) so the rail doesn't read like a second translation of the app. Vocabulary core already ships in every locale — generic verbs, weekday names, Daily/Hourly — resolves against core rather than being duplicated into a second, worse translation. That includes the intro a new bot is born with, which used to greet every user in English and pull the bot's reply into English with it.
  • The SDK exports what was being hand-rolled — the Panel master-detail family, SessionStatusDot, ColorSwatches + PROFILE_SWATCHES, RowButton, DisclosureCaret, formatAgo, translateNow, and the unread store behind the dot — each with a docblock naming the hand-rolled shape it replaces.
  • The main zone can no longer vanish. Workspace mode goes back to being a signal consumers adapt to, never a decision about whether a pane renders, and a structural floor keeps the registered main pane's subtree alive whatever happens to its tabs. Bot chats are ordinary tabs in the main strip. The duplicate "Bots" workspace tab and its auto-open/close signal machine are gone (-1,623 lines).
  • Bot chats share core's unread store rather than keeping a parallel map that could disagree with the session dot. Hidden sessions have no listed row to read a profile from, so the writers take an explicit profile hint.
  • An empty bot chat is titled with the bot. It used to be blank space: core's intro splash belongs to a fresh draft and stands down for any session that exists. Rather than teach core about bots, the transcript gained a chat.empty contribution area (resolved like transcript.directives), and the splash's lettering became a Wordmark primitive both callers share — so the bot's face and name render in the same face as HERMES AGENT without forking it.
  • The composer adapts instead of forking. A bot chat has no repo, so the git branch/PR row stands down for it — the same composer, one condition, no second implementation.
  • A profile created without a clone gets a usable model block. Creating a bot from the desktop dialog built the profile tree but no config.yaml, so it resolved no provider and its first turn died with "No LLM provider configured" — every bot made that way was dead on arrival.

The row geometry has one owner now

chrome.tsx calls itself "shared, content-agnostic sidebar chrome" and warns that owning row height anywhere else makes rows float 1–2px off sessions — but its measurements were private consts, so anything wanting to line up copied the literals. The lead cell alone appeared verbatim in six files, four of them core's. That copy is the mechanical reason a bot row can drift from a session row however carefully it's styled.

The measurements moved to row-geometry.ts with the public names still re-exported from chrome.tsx, and the lead cell and ConnectionGlyph now reach the plugin through the SDK. Six copies became two owners — one for transcript lines, one for sidebar rows — and the plugin's GatewayKindGlyph, a fork of ConnectionGlyph down to the icon set, wraps the real one.

The harness is gone, not ported wholesale

The 84 .mjs files under tests/ read plugin.js as text and sliced it with vm/regex — the pattern AGENTS.md bans outright, and pointed at a file that no longer exists. They are replaced by real vitest renders against the real SDK, and check:test:plugins is deleted along with them. The contract tests AGENTS.md names by path are all present and green.

Three latent bugs surfaced during the split and are fixed with regression tests: groupChatSyncMemberKey keyed on a field descriptors never carry, so every member hashed to '' and the round engine saw one member where there were several; botMetaWriteAt grew an entry per write and never dropped one; aliasRouteIndex replaced the whole map on rebuild, so a slower rebuild finishing second clobbered a newer one. Two caches that grew for the window's life (decoded pet sprites over a 4,500-pet gallery, relay agent rows) are bounded by a shared LruCache, which also replaces the private one inside katex-memo.ts.

Review round

Five findings from review, each with the test that pins it:

  • The adopt-on-conflict open skipped its staleness probe. It runs a full extra round-trip past the point its two siblings are probed at — registry miss, mint, title conflict, re-consult — so it was the likeliest of them to land after the user clicked another bot, and the only one that navigated unguarded. Adopting the winner still settles identity; only the workspace steal is gated.
  • The bot-meta v1→v2 migration suite was dropped, not ported. migrateBotMeta and commitBotMetaV2 kept every branch — the topology gate, the marker that makes v2 authoritative, the rollback around a failed commit — while the only surviving coverage was the happy-path write ordering asserted incidentally by bot-delete. Nine cases restored, mutation-checked: deleting the marker rule fails three of them.
  • The composer's bot-chat flag subscribed to one store while reading three. isBotChatSession resolves a live id to the stored one it's filed under, so it reads $sessionTiles and $sessionStates as well as the scope set. It looked correct only because $sessionStates republishes per streaming token and overwrote the stale answer within a frame. useStoresSelector now sits beside useStoreSelector for the general case.
  • chat.empty mounted only the first contributor. Ownership is per session and resolves asynchronously, so first-wins let a plugin that declines a session permanently suppress the one that owns it — for whichever users' installed plugins registered in that order. Every contributor mounts and answers for itself; two claiming one session render both, a visible conflict instead of a silent drop.
  • A bot row click returns to the tabs that bot already has open instead of re-opening a Bot Chat the user closed (ported from main onto the split modules, with the explicit "Open Bot Chat" menu item that re-opens it on purpose).

The "one passive re-front attempt, never a remount strobe" invariant is structurally moot here: the strobe was a close+open of the Bots home tab, and this branch deletes the home — 11 references on main, zero here. The surviving pane sync is a guarded register/unregister, not a close+open cycle.

Second review round

  • The kickoff was the first line of the forever-chat, in English (the remaining half of Bot Mode: canonical Bot Chat is born with a hardcoded English kickoff prompt attributed to the user #91827). It resolves through the bundle now. Attribution — it arrives on the user's side of the conversation — is the half that can't close here: prompt.submit is the user-turn API, so an unattributed birth needs the lazy or silent path Bot Mode: canonical Bot Chat is born with a hardcoded English kickoff prompt attributed to the user #91827 proposes, a gateway contract change rather than a rename. The intro itself is deliberate and contracted in AGENTS.md.
  • The residual owned strings are swept as a class, not as the cited lines. Every user-visible string the group room and the bot-scoped cron pane own is in the bundle. The frequency and weekday option lists stopped being module consts, which froze whichever locale happened to load first. What stays hardcoded is now stated in the bundle header with its reason: prompts addressed to a model (the room-picture prompt, the routine instruction), cron syntax and React keys, and 'You' — a marker that is persisted into the room log and compared as a sentinel, so localizing it needs the marker split from its rendering rather than a rename.
  • The round cap is ceded, not re-buried. GROUP_CHAT_MAX_ROUNDS and its four siblings already sit in one exported block at the values plugin.js shipped, so no rebase inherits a behavior change on top of a rewrite. Making them configurable is live contributor work — #92213 for per-room limits, #96842 for config plus a token budget — and both want that same seam, so the block says so where the constants are instead of this PR adding a config hook it has no consumer for.
  • The first-open git rail from the live smoke run is fixed. A bot created from the dialog opened its chat with the workspace fields omitted, because they were spread only when the caller passed a staleness probe — and the create path is the one caller without one. The composer reads that scope to stand its branch rail down, so a just-created bot showed the rail until the next click reopened the row scoped. The probe answers whether to navigate; what the session is never depended on it. Carried over from plugin.js, not introduced here. With the gate gone all four openers in that file are the same call, so they became one.

The #97008 session contracts (follow_profile_config, room_plumbing) were restored on the rebuilt modules in d22e8e402 with contract-shape tests.

Deliberate behavior changes, called out

Everything else is parity — the plugin registers the same five contribution areas, and a function-level diff against the deleted plugin.js accounts for all thirteen removals: eight are the Bots-home tab and the Active-Now strip removed on request, two folded into core's ConnectionGlyph, and three were provably dead (generatedSessionTitle had no callers, isGenericTitle only had it, groupChatSyncDeletedRevision survived only in a comment). Notification count is 44 before and after. These are the intentional differences:

  • "+" in the Bots workspace no longer refuses. It used to notify and do nothing whenever the sidebar's selection had no exact route — a group chat's blocked target, an orphaned roster row. Since the main strip carries plain session tabs alongside bot chats, a dead "+" there is worse than a fallthrough, so it aims at the selected bot's profile and falls through to an ordinary session otherwise. This is the "silent UX change" from review, now not silent.
  • The Bots home tab and the Active-Now strip are gone, on request — a second tab named Bots that previewed one session and opened another, and a status chip row that duplicated SessionStatusDot.
  • A bot row click opens in place rather than as a new tab, which is what stopped a click producing two chats.
  • The composer stands its branch rail down in a bot chat. Bots aren't working sessions and the git context was leaking into their replies.
  • An empty bot chat gets the bot's own intro through the new chat.empty area, instead of the app's generic one.
  • Three latent bugs are fixed rather than carried: groupChatSyncMemberKey keyed on a field descriptors never carry, so it was always ''; botMetaWriteAt grew forever; aliasRouteIndex's whole-map replace could clobber a concurrent rebuild.
  • The Routines pane starts collapsed, and the noun is "bot" throughout rather than alternating with "agent".

Pre-existing edge, noted not fixed

Bot chats open into the main pane, so the composer's model pill counts as touchesPrimary and selectModel scopes its write --globalmodel.default + model.provider on the active gateway profile. For a bot on the active connection that is the right profile: ensureBotAgent moves the gateway onto it first, so the pill writes the bot's own config.yaml, the same destination as Edit Profile's picker.

For a bot on another connection the routed path deliberately does not activate ("Desktop's active connection does not move"), so $activeGatewayProfile is still the local default while the remote bot's chat is on screen. If that holds at runtime, changing the model there rewrites the local profile's default instead of the bot's. This is code-reading, not a reproduction, and it predates this branch — recorded here so it isn't rediscovered as a regression.

Test plan

  • npx tsc --noEmit and npm run lint clean across apps/desktop, ui-tui, apps/shared, web
  • npx vitest run --project ui — 677 files, 6,681 tests green
  • Merged main; its Bots-home flash fix guards a surface this branch deletes, and its bot-row-click fix is ported onto the split modules
  • scripts/run_tests.sh tests/hermes_cli/test_profiles.py
  • Click a bot: one chat opens, the main zone stays put, the roster dot matches the session dot
  • Close a bot chat and delete its profile: the main zone still renders, the sidebar doesn't stretch
  • Scheduled jobs arrives as the right-edge rail tab; expanding it survives a reload
  • Open a bot chat with no history: face + name centered, correct after changing the avatar or renaming
  • Switch the app to 日本語 / 简体中文 / 繁體中文: the Bots rail, dialogs and group room follow

The middle four were driven live rather than by hand: a real Electron build against a real backend and real model turns on Linux (CDP), and the same matrix on a windows-latest runner (Playwright _electron), including no-clone bot creation. The one red there is #87761 — Windows refuses to remove a profile directory whose state.db the backend still holds open — which this branch neither causes nor touches.

@alt-glitch alt-glitch added type/refactor Code restructuring, no behavior change P3 Low — cosmetic, nice to have needs-decision Awaiting maintainer decision before any implementation comp/desktop Electron desktop app (apps/desktop/*) comp/cli CLI entry point, hermes_cli/, setup wizard area/profiles Multi-profile isolation, HERMES_HOME scoping area/config Config system, migrations, profiles sweeper:risk-session-state Sweeper risk: may lose/corrupt/mis-associate session or context state sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades labels Aug 27, 2026
@OutThisLife
OutThisLife marked this pull request as ready for review August 28, 2026 00:07
hermes-bots/plugin.js was 16,193 lines of hand-written JSX compiler output
— it imported { jsx, jsxs } from 'react/jsx-runtime' and called them
directly. Because the file was .js, eslint (scoped to plugins/**/*.{ts,tsx})
and tsc (allowJs: false) both skipped it entirely, so none of the design
system, import-fence, or type rules that govern the rest of the app ever
reached the largest UI surface we ship on by default.

Converting it back to JSX is an inverse-compile, not a rewrite, so it is
done by script rather than by hand:

- scripts/codemod/dejsx.mjs rewrites jsx()/jsxs() calls into JSX elements.
  735 conversions, none skipped. Comments between children become
  {/* … */} containers, since a bare // in children position is text.
- scripts/codemod/verify.mjs proves the result. It recompiles the .tsx
  through esbuild — an implementation independent of the codemod — and
  compares it to the original after normalizing away esbuild's own
  rewrites (quote style, void 0, numeric format, string/template folding,
  export hoisting) and alpha-renaming every binding per scope. Output:
  IDENTICAL across 333,711 normalized characters.

Two rewrite classes are semantics-preserving but not byte-identical, so
they are named and counted rather than hidden: 12 spread-children folds
(JSX has no spread-children syntax; children={[...xs]} can only be written
{xs}, which React flattens identically and which is the idiom the whole
ecosystem writes) and 1 redundant key prop (passed both in props and as
the third argument; React's jsx runtime never copies key into props).

No behavior change. 16,193 lines become 16,050 of real TSX.
Bot Mode arrived as a 16,933-line plugin.js that reimplemented most of the
app: its own scroll container, color palette, status dots, empty states,
buttons, time formatting and cron surface, none of which could follow the
theme. Split it into 41 focused modules and route every one of those through
the primitives core already ships, so a Bot row now renders the same
SessionStatusDot, swatches and age labels as the session row beside it.

User-facing strings move into a plugin locale bundle instead of sitting
inline, and the UI settles on "bot" as the noun (model-facing prompt text
still says "agent"). The codemod scaffolding that drove the jsx() -> TSX
conversion retires with the conversion.
Every primitive Bot Mode hand-rolled was one the app already had but never
exported: the Panel master-detail family, SessionStatusDot, ColorSwatches +
PROFILE_SWATCHES, RowButton, DisclosureCaret, formatAgo, translateNow, and
the unread store behind the dot. Export them, with docblocks that say which
hand-rolled shape each one replaces so the next plugin doesn't repeat it.

warmAgent/ensureAgent accept an undefined connectionId alongside null, since
a roster row's is optional and both mean "no explicit source".
Contributions could scope themselves to a workspace, and Bot Mode scoped
every sessions pane out of the center. Close the last bot chat and the main
zone had nothing left to render, so it collapsed and the sidebar stretched
across where the app used to be. Bot chats are ordinary tabs in the main
strip, beside session tabs, so the filter goes: workspace mode stays as a
SIGNAL consumers adapt to, never a decision about whether a pane renders.

A structural floor backs it up — a subtree hosting the registered main pane
never collapses, whatever happens to its tabs. The shared "+" now falls
through to an ordinary session when the selected owner has no route of its
own, instead of refusing with a toast.

Also lets a pane contribution declare defaultCollapsed, so Bot Mode's
scheduled-jobs pane arrives as the right-edge rail tab rather than an open
zone. It applies when the pane enters the tree, so a user's expand persists
and is never overruled on a later boot.
Bot Mode kept its own unread map, so a bot's dot and the session dot could
disagree about the same chat. Route it through core's store instead, keyed
by the canonical chat's stored id. A hidden session has no listed row to
read a profile from, so the writers take an explicit profile hint rather
than assuming the live gateway's — otherwise the marker persists into a
bucket that never held it.

The composer also hands a blank repoPath to the branch/worktree rail in a
bot chat. The row already hides itself without a repo and stops probing git
and GitHub with it, so one prop does what a second composer would have.
Creating a bot from the desktop dialog builds the profile tree but no
config.yaml, so the profile resolves no provider and its first turn dies
with "No LLM provider configured" — created, but unable to run. Every bot
made that way was dead on arrival.

Seed the active profile's model block at creation. It is a copy, not a
link: profiles stay independent islands and editing either afterwards never
touches the other. "Fresh" means fresh skills and SOUL, not unreachable.
Core has one empty state, the intro splash, and it belongs to a fresh
draft with no session selected. A session that exists but has nothing in
it yet falls outside that, and whoever opened it is the only one who
knows what should stand in the gap — core has no business learning a
bot's face and name.

Add `chat.empty` as a contribution area, resolved by the transcript the
same way `transcript.directives` resolves an inline widget. A
contribution mounts for every empty session and renders nothing for the
ones it does not own, so it can subscribe to its own stores and appear
once they load.

Pull the splash's lettering out of `intro.tsx` into a `Wordmark`
primitive so a second caller cannot fork it, and move the typeface,
weight and tracking into `.wordmark` beside the `.fit-text` rules they
travel with — as utilities they were one class-merge or one missed scan
away from silently rendering the wordmark in body text. `Wordmark` takes
its width, because fit-text sizes to fill and a short name set at the
splash's full width comes out enormous.
An untouched bot chat was blank: core's splash stands down for any
session that exists, and nothing took its place. Claim the new
`chat.empty` slot and title the chat with the bot's face above its name
in the splash's lettering, so an empty conversation still says whose it
is. Rendering "HERMES AGENT" there would have been the wrong identity
for the surface.

The transcript hands its slot the RUNTIME session id while a canonical
Bot Chat is keyed by its stored one — the two id spaces behind the
#93080 misroute — so identity resolves through the focus store the rest
of the plugin already trusts. Metadata is read with `botRosterMeta`
rather than by name: it is keyed by the route it came from, so a by-name
read misses the entry a bot's avatar and rename actually live under.

The name, not the stack, sits on the center line; the face hangs above
it by half its own block.
@OutThisLife
OutThisLife force-pushed the bb/bot-mode-design-system branch from 061d2e1 to e4bd1a0 Compare August 28, 2026 00:08
@github-actions

github-actions Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

૮ >ﻌ< ა ci review

ran on 21cc469 — Merge remote-tracking branch 'origin/main' into bb/bot-mode-

⚠️ Warnings

OSV vulnerability scan · View job

6 known vulnerabilities found in pinned dependencies.

How to fix:

Review the findings in the Security tab. Update the affected dependencies if a patched version is available.


debug info

CI timings

CI timings · View report · View job

Wall time 4m2s vs 4m14s (-4.7%). 8 job(s) slower, 5 faster,

  • OS-specific tests / Windows-only tests: -48.0s
  • Check contributors / check-attribution: +33.0s
  • JS & TS checks / JS & TS checks: -25.0s
  • Python tests / Run tests: +23.0s
  • OSV scan / Scan lockfiles / osv-scan: +9.0s

The old harness sliced source text out of plugin.js, re-evaluated the
fragments through vm.runInNewContext, and in a good number of files simply
regex-matched the source for a symbol name. Nothing it asserted survived the
split into modules, and its blind spot was load-bearing: the /new guard
regex-matched clean for as long as it shipped dead.

These are the same contracts driven against the real modules through the real
imports, colocated beside the code they cover. Files whose only content was a
source regex or a re-implementation of the function under test are dropped
rather than translated.
… does not exist

A bot's canonical chat is the relationship — /new inside one would fork it into
a scratch session, so the composer reroutes /new to /compact there. The guard
deciding "is this chat the canonical one" read host.activeSessionId, which is
not on the host: the real atoms are host.state.activeSessionId (runtime id) and
host.state.focusedStoredSessionId (stored id). The optional chain swallowed it,
the comparison ran against null every turn, and /new reset forever-chats for as
long as the guard shipped.

It reads the focused STORED id now, which is the id space canonical_session
reports in. The comparison itself moves into isCanonicalChatOnScreen so a test
can drive it — matching either the durable registry row or the
compression-lineage tip, since a compacted Bot Chat is on screen under its tip
id while the registry still names it by the root.
The plugin shipped as bundled JavaScript, so eslint never saw it. Now that it
is .tsx under src/, the whole ruleset applies: sorted JSX props, curly braces,
statement padding, unused imports.

Three of the ref writes the atom-mirror rule flagged are the cases its own
comment carves out — a scroll-position tracker fed by a DOM listener, a
previous-value tracker for the hidden -> visible edge (lagging a render IS its
contract), and a timer handle cleared on unmount. Those get the documented
disable. The fourth was a genuine mirror: McpSetupButton copied its profile
prop into a ref every render so two callers could read it. They read the prop
directly now, and the ref holds only the profile the component creates on
demand for the New Bot flow.

no-redeclare counts a TypeScript overload signature as a redeclaration of its
implementation, which is what botSelectionKey and botMetaKey tripped. Swapped
for the TS-aware version alongside the no-undef swap already there; hermes-ink,
whose vendored yoga bindings merge a const and a type under one name, extends
its existing carve-out to the new rule name.
@OutThisLife
OutThisLife requested a review from a team August 28, 2026 01:05
…one owner

Row geometry lived inside chrome.tsx as private consts, so anything that
wanted to line up with a session row copied the literals instead — the lead
cell alone appeared verbatim in six files. Its own comment warns that owning
height anywhere else makes rows float 1-2px off sessions, which is exactly
what a copy invites. Split the measurements into row-geometry.ts, keep the
public names re-exported from chrome.tsx, and put the lead cell and
ConnectionGlyph on the plugin SDK so a plugin composes the same box rather
than re-deriving it. ConnectionGlyph takes a className now so a caller can
tint it without forking the component.

LruCache is the same move for a different leak: katex-memo.ts had a private
one with a hardcoded ceiling, and the bot rail had two Maps that never
evicted. One shared class, exported, katex's twin deleted.
Six verbatim copies of the leading-glyph box down to two owners: transcript
lines get SCAFFOLD_GLYPH_CLASS from scaffold-row, sidebar rows get
SIDEBAR_ROW_LEAD. The bot rail's GatewayKindGlyph was a fork of core's
ConnectionGlyph down to the icon set, so it wraps the real one now and the
duplicate kind-to-icon tables are gone.
…s life

petFrameCache is keyed by spritesheet URL over a 4500-pet gallery and holds
decoded PNG data URLs, so scrolling pinned every pet you passed until the
window closed. Capped at 120 — five pages, so scrolling back stays instant
and a miss only re-pays the fetch and crop. relayAgentsCache already swept
stale ids, but the sweep sits behind an early return that a shrink to one
connection skips; capped at 32, safe because every live connection is
rewritten each cycle so eviction can only reach ids that stopped being
fetched.

relay.ts also carried eight loose module-level lets, the state outlier
across the plugin's modules. Nothing renders from them, so they stay module
scope — collapsed into one record rather than moved to a store.
Both roster filter menus, the avatar picker's tabs. Renamed group.newDesc to
group.manageDesc since it describes managing an existing group, not making
one.

The getPluginCtx()?.i18n.t() sites only guarded the context, not i18n on it
— a plugin context without the bundle threw mid-render and painted an empty
rail. Guarded both.
…ives

A raw checkbox in the routine editor where the SDK already exports one. The
same resizable-panel style block inline in three dialogs, now a
ResizableFrame beside the other dialog parts. Four inline styles that were
Tailwind spelled longhand — model-picker's was literally flex flex-col
gap-2. The twenty that remain are computed grid columns and avatar sizes,
which have to stay inline.
…tions

groupChatSyncMemberKey keyed on a field the descriptors never carry, so
every member hashed to the empty string and the round engine saw one member
where there were several; it keys on botRosterKey now, which is durable
across machines. botMetaWriteAt grew an entry per write and never dropped
one — it prunes past 60s, which is longer than the echo it exists to
suppress. aliasRouteIndex replaced the whole map on rebuild, so a slower
rebuild finishing second clobbered a newer one; a generation token means
only the newest result lands. Regression tests for each.

Dead since the split: EYE_X/EYE_Y, generatedSessionTitle, enabledMcp,
groupChatSyncDeletedRevision — each down to a declaration with no reader.
The bot source-status labels were half-localized, so they moved onto one
helper here rather than in the i18n pass. no-redeclare is disabled inline
over the two overload pairs it misreads, rather than in the shared config.
dokterdok added a commit to dokterdok/hermes-agent that referenced this pull request Aug 29, 2026
Port the source-qualified watermark contract from NousResearch#93006 onto the post-NousResearch#96726 Bot Mode modules.
dokterdok added a commit to dokterdok/hermes-agent that referenced this pull request Aug 29, 2026
Port the successful-open acknowledgement boundary from NousResearch#93006 onto the post-NousResearch#96726 Bot Mode modules.
dokterdok added a commit to dokterdok/hermes-agent that referenced this pull request Aug 29, 2026
Recreates the backend transport and lifecycle stack from 86c7258 through 7cf0b44 against post-NousResearch#96726 main. Includes v2 grants, queued offline dispatch, stop acknowledgement, recovery, and profile endpoint inheritance; excludes legacy Desktop code.
andredezzy pushed a commit to andredezzy/hermes-agent that referenced this pull request Aug 29, 2026
A Bot Mode room stops after 3 serial rounds and 10 member messages. That
suits a quick two-bot exchange and cuts short a workflow whose hops are
genuinely serial: a coordinator triaging to a domain expert, to a data
operator, and back needs more passes than three, so the room reports
'turn stopped at the round/message cap' with a bot still holding an
addressed handoff.

Read the ceilings from a group_chat block in config.yaml, falling back to
today's values when it is absent, so the person paying for the model calls
decides what a room may spend.

Config is advisory, never authoritative: each value is clamped to a hard
ceiling (20 rounds / 100 messages / 20 continuations), and anything below 1
or unparseable reads as unset rather than as zero. A typo can neither
silence a room nor uncap it.

The limits resolve once at plugin load and are snapshotted per drive rather
than read inside the round loop, which is hot; a gateway round-trip there
would be a stall the user feels. A config edit reaches a room on its next
send. Reading fails silently to the shipped defaults, because a room that
runs beats a room that refuses to start because config could not be read.

Ports the design from NousResearch#96842 (beplee), which was closed unmerged when
NousResearch#96726 deleted the plugin.js it patched, onto the new modules. Uses the
existing config.get 'full' key rather than adding a gateway method.
Per-room overrides (NousResearch#92213) can layer on the same seam.

Refs NousResearch#98004, NousResearch#96842, NousResearch#89545
gabrielcosi pushed a commit to gabrielcosi/home-ops that referenced this pull request Sep 1, 2026
…8.27 ➔ v2026.8.31) (#606)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/gabrielcosi/hermes-agent](https://github.com/NousResearch/hermes-agent) | patch | `v2026.8.27` → `v2026.8.31` |

---

### Release Notes

<details>
<summary>NousResearch/hermes-agent (ghcr.io/gabrielcosi/hermes-agent)</summary>

### [`v2026.8.31`](https://github.com/NousResearch/hermes-agent/releases/tag/v2026.8.31): Hermes Agent v0.21.0 (v2026.8.31)

[Compare Source](https://github.com/NousResearch/hermes-agent/compare/v2026.8.27...v2026.8.31)

##### Hermes Agent v0.21.0 (v2026.8.31)

**Release Date:** August 31, 2026
**Since v0.20.0:** \~5,800 commits · \~2,475 merged PRs · \~5,680 files changed · \~869,000 insertions · \~135,000 deletions · **\~2,100 issues closed** · 760+ contributors

> **The Pantheon Release.** v0.20.0 made Hermes the herald — he spoke, and he carried word to other agents. In v0.21.0 the gods assemble. Bot Mode ships built into the desktop app: a society of named agents with their own faces and group chats, where your bots talk to each other — and to you — like a team, not a toolbox. Around that spine: cron jobs gained memory and continuity so scheduled agents actually learn between runs, subagents can be steered live mid-flight, the MCP surface became a real command center, and the agent can now drive the desktop's own browser. This release rolls up everything from the v0.20.1–v0.20.6 infrastructure patch tags — those windows are fully documented here.

***

##### ✨ Highlights

- **Bot Mode — your agents become a society, built in** — Bot Mode is now a bundled, default-on part of the desktop app: every agent profile gets a name, a deterministic avatar face (with randomize/lock controls), and a place in a shared roster. Create Discord-style group chats where multiple bots and you talk in one room, @&#8203;-mention any bot from the composer, and give rooms names and pictures. Before, "multi-agent" meant plumbing; now it looks like a chat app full of coworkers. ([#&#8203;87886](https://github.com/NousResearch/hermes-agent/pull/87886), [#&#8203;88243](https://github.com/NousResearch/hermes-agent/pull/88243), [#&#8203;89386](https://github.com/NousResearch/hermes-agent/pull/89386), [#&#8203;96726](https://github.com/NousResearch/hermes-agent/pull/96726) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;dokterdok](https://github.com/dokterdok))

- **`hermes peer` — bot-to-bot DMs between your agents** — Any Hermes agent can now message any other by handle, across profiles and gateways, from the CLI or from inside a conversation. Ask your research bot to hand findings to your coding bot and get the reply back where you can read it. Replies land in each agent's canonical Bot Chat, so conversations between agents are durable and inspectable, not fire-and-forget. ([#&#8203;88725](https://github.com/NousResearch/hermes-agent/pull/88725), [#&#8203;88178](https://github.com/NousResearch/hermes-agent/pull/88178), [#&#8203;91487](https://github.com/NousResearch/hermes-agent/pull/91487) — [@&#8203;teknium1](https://github.com/teknium1))

- **Cron jobs that remember** — Scheduled jobs stopped being goldfish. Cron agents now load and update persistent memory like every other agent, `continuity=true` carries each run's output into the next (so a monitor can dedupe against what it already reported), every job gets a durable notepad scratchpad, monitor-mode jobs skip the LLM entirely when nothing changed, and cron output can land in a bot's canonical Bot Chat — where the bot actually responds. Your 9am briefing job now knows what it told you yesterday. ([#&#8203;91447](https://github.com/NousResearch/hermes-agent/pull/91447), [#&#8203;80774](https://github.com/NousResearch/hermes-agent/pull/80774), [#&#8203;81139](https://github.com/NousResearch/hermes-agent/pull/81139), [#&#8203;81138](https://github.com/NousResearch/hermes-agent/pull/81138), [#&#8203;91487](https://github.com/NousResearch/hermes-agent/pull/91487) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;smwbev](https://github.com/smwbev))

- **Steer your subagents while they run** — `delegate_task` gained live orchestration: list running children, steer one mid-flight with a course correction, or stop it early and keep the partial result. Add optional JSON-schema validation on child outputs, per-delegation cost surfaced in results, and raised defaults (250 iterations, 10 concurrent children) — delegation went from fire-and-pray to actually managed parallel work. ([#&#8203;85232](https://github.com/NousResearch/hermes-agent/pull/85232), [#&#8203;81144](https://github.com/NousResearch/hermes-agent/pull/81144), [#&#8203;81142](https://github.com/NousResearch/hermes-agent/pull/81142), [#&#8203;86506](https://github.com/NousResearch/hermes-agent/pull/86506), [#&#8203;86745](https://github.com/NousResearch/hermes-agent/pull/86745) — [@&#8203;teknium1](https://github.com/teknium1))

- **The MCP command center** — MCP servers and the catalog merged into one coherent desktop page with drag-in "paste anything" import, background health checks that nudge you to re-auth before a tool call fails, a fleet cost/usage overlay showing schema token estimates and 30-day usage per server, and `hermes://` deep links that install an MCP server with explicit confirmation. Managing twenty MCP servers used to be config-file archaeology; now it's a dashboard. ([#&#8203;87525](https://github.com/NousResearch/hermes-agent/pull/87525), [#&#8203;87572](https://github.com/NousResearch/hermes-agent/pull/87572), [#&#8203;87576](https://github.com/NousResearch/hermes-agent/pull/87576), [#&#8203;87579](https://github.com/NousResearch/hermes-agent/pull/87579), [#&#8203;87581](https://github.com/NousResearch/hermes-agent/pull/87581) — [@&#8203;teknium1](https://github.com/teknium1))

- **A CLI power wave** — Ctrl+P opens a fuzzy command palette, the `/model` picker filters as you type, `/status` shows reasoning mode, pending approvals, and context usage, and the status bar can display live cache-hit %, latency, and tokens/sec with per-field toggles. Plus: a global emergency stop, session pin/unpin, rotating task-oriented composer placeholders — and Ghostty-level **terminal pets**, because a companion should have a companion. ([#&#8203;90730](https://github.com/NousResearch/hermes-agent/pull/90730), [#&#8203;90717](https://github.com/NousResearch/hermes-agent/pull/90717), [#&#8203;90745](https://github.com/NousResearch/hermes-agent/pull/90745), [#&#8203;98250](https://github.com/NousResearch/hermes-agent/pull/98250), [#&#8203;98282](https://github.com/NousResearch/hermes-agent/pull/98282), [#&#8203;97666](https://github.com/NousResearch/hermes-agent/pull/97666) — [@&#8203;teknium1](https://github.com/teknium1), and salvaged community work)

- **The agent drives the desktop's browser** — The in-app browser stopped being a window the agent could only look at: Hermes now navigates, clicks, and reads it directly, and pages can be popped out to your system browser with full link context menus. Ask it to walk a docs site or debug a web app and watch it happen inside your own app. ([#&#8203;90197](https://github.com/NousResearch/hermes-agent/pull/90197), [#&#8203;89366](https://github.com/NousResearch/hermes-agent/pull/89366) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;ethernet8023](https://github.com/ethernet8023))

- **Six new providers and a model catalog wave** — Meta Model API (Muse Spark) arrives as a built-in provider, alongside CommandCode, Tencent TokenPlan, Nebius Token Factory, Ramp Router, and Actual Computer. The catalogs picked up GLM-5.3-Flash, qwen3.8-max/flash, Gemini 3.7 Flash, MiniMax M3 free, and Nemotron 3.5 Lightning — and `model_overrides` lets you patch any model's context window or pricing yourself without waiting on a release. ([#&#8203;88565](https://github.com/NousResearch/hermes-agent/pull/88565), [#&#8203;88308](https://github.com/NousResearch/hermes-agent/pull/88308), [#&#8203;97917](https://github.com/NousResearch/hermes-agent/pull/97917), [#&#8203;97916](https://github.com/NousResearch/hermes-agent/pull/97916), [#&#8203;97915](https://github.com/NousResearch/hermes-agent/pull/97915), [#&#8203;85560](https://github.com/NousResearch/hermes-agent/pull/85560) — [@&#8203;teknium1](https://github.com/teknium1) and community)

- **Security hardening across the board** — Protected agent-instruction files (AGENTS.md, skills, memory stores) now always require write approval so a prompt-injected agent can't quietly rewrite its own standing orders. A deep redaction sweep closed secret-leak gaps across terminal errors, `.env` file reads, checkpoints, and ACP logs; the approval system learned Windows destructive commands; and macOS permission grants finally survive updates via a stable TCC signing identity. ([#&#8203;81152](https://github.com/NousResearch/hermes-agent/pull/81152), [#&#8203;80965](https://github.com/NousResearch/hermes-agent/pull/80965), [#&#8203;84428](https://github.com/NousResearch/hermes-agent/pull/84428), [#&#8203;95091](https://github.com/NousResearch/hermes-agent/pull/95091) — [@&#8203;teknium1](https://github.com/teknium1) and community)

***

##### 🏗️ Core Agent & Architecture

##### Providers & Models

- **New providers:** Actual Computer inference ([#&#8203;79644](https://github.com/NousResearch/hermes-agent/pull/79644), salvage of [#&#8203;26491](https://github.com/NousResearch/hermes-agent/issues/26491)), CommandCode with GOAT/Pro/Max plans ([#&#8203;88308](https://github.com/NousResearch/hermes-agent/pull/88308), salvage of [#&#8203;32909](https://github.com/NousResearch/hermes-agent/issues/32909)), Meta Model API (Muse Spark) as a built-in provider plugin ([#&#8203;88565](https://github.com/NousResearch/hermes-agent/pull/88565)), Tencent TokenPlan ([#&#8203;97917](https://github.com/NousResearch/hermes-agent/pull/97917)), Nebius Token Factory ([#&#8203;97916](https://github.com/NousResearch/hermes-agent/pull/97916)), and Ramp Router ([#&#8203;97915](https://github.com/NousResearch/hermes-agent/pull/97915)).
- **Model catalog wave:** qwen3.8-max and qwen3.8-flash ([#&#8203;78024](https://github.com/NousResearch/hermes-agent/pull/78024), [#&#8203;96979](https://github.com/NousResearch/hermes-agent/pull/96979)), Gemini 3.7 Flash ([#&#8203;85526](https://github.com/NousResearch/hermes-agent/pull/85526)), GLM-5.3-Flash across OpenRouter/Nous/z.ai/OpenCode ([#&#8203;95621](https://github.com/NousResearch/hermes-agent/pull/95621), [#&#8203;96293](https://github.com/NousResearch/hermes-agent/pull/96293)), MiniMax M3 + Inkling free SKUs ([#&#8203;96264](https://github.com/NousResearch/hermes-agent/pull/96264)), Nemotron 3.5 Lightning ([#&#8203;84645](https://github.com/NousResearch/hermes-agent/pull/84645)), Meta Muse Spark 1.2 ([#&#8203;88600](https://github.com/NousResearch/hermes-agent/pull/88600)).
- **Per-model metadata overrides** via `model_overrides` config — patch context windows, pricing, or capabilities for any model without waiting on a release ([#&#8203;85560](https://github.com/NousResearch/hermes-agent/pull/85560)).
- **Data-training-tier warnings** — a unified selection-guard registry warns you across every picker surface when a model trains on your data ([#&#8203;85917](https://github.com/NousResearch/hermes-agent/pull/85917)).
- **Pip-installed model providers** discovered via entry points — third parties can ship providers as packages ([#&#8203;85504](https://github.com/NousResearch/hermes-agent/pull/85504), salvage [#&#8203;81419](https://github.com/NousResearch/hermes-agent/issues/81419)).
- **Prompt caching engaged for LiteLLM Claude** on the OpenAI wire ([#&#8203;87517](https://github.com/NousResearch/hermes-agent/pull/87517) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor)) and api.meta.ai routed through the Responses API for caching ([#&#8203;88601](https://github.com/NousResearch/hermes-agent/pull/88601)).
- **Codex GPT context defaults** back to the verified 272K, with explicit -900k picker variants for the large window ([#&#8203;92797](https://github.com/NousResearch/hermes-agent/pull/92797)).

##### Agent Loop & Reliability

- **Stalled-provider recovery** — a stalled stream no longer leaves Desktop silent or burns the retry budget ([#&#8203;87236](https://github.com/NousResearch/hermes-agent/pull/87236) — [@&#8203;fangliquanflq](https://github.com/fangliquanflq)).
- **MoA hardening cluster** — the Mixture-of-Agents facade now survives client rebuilds, stream retries, provider rotation, and fallback/restore without leaking prepared requests to native clients ([#&#8203;90212](https://github.com/NousResearch/hermes-agent/pull/90212) and siblings).
- **Structured-output resilience** — auxiliary calls translate `response_format` for Anthropic wires and retry when a provider rejects structured output ([#&#8203;89589](https://github.com/NousResearch/hermes-agent/pull/89589) — [@&#8203;ethernet8023](https://github.com/ethernet8023)).
- **Compression: lean tail mode** + a compaction recall eval harness to measure what compression actually preserves ([#&#8203;87326](https://github.com/NousResearch/hermes-agent/pull/87326)).
- **Oversized tool results spill to cache** instead of being truncated in sandbox-less sessions ([#&#8203;89028](https://github.com/NousResearch/hermes-agent/pull/89028)).
- **`clarify` asks multiple independent questions in one call** — one form instead of a chain of round-trips ([#&#8203;89467](https://github.com/NousResearch/hermes-agent/pull/89467) — [@&#8203;ethernet8023](https://github.com/ethernet8023)).
- **Verify subsystem** (port from superagent-ai/grok-cli): run-recipe detection + environment manifest so "it works" claims are backed by detected build/test commands ([#&#8203;80686](https://github.com/NousResearch/hermes-agent/pull/80686)).

##### Sessions & State

- **Resumed transcripts never re-append** — `_db_persisted` stamped at row load time ([#&#8203;92539](https://github.com/NousResearch/hermes-agent/pull/92539) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor)).
- **SessionDB context-manager protocol** for leak-free DB lifecycles ([#&#8203;88048](https://github.com/NousResearch/hermes-agent/pull/88048) — [@&#8203;jackulau](https://github.com/jackulau)).
- **Instant session naming** from the opening message, with sticky titles across resume ([#&#8203;81985](https://github.com/NousResearch/hermes-agent/pull/81985) — [@&#8203;OutThisLife](https://github.com/OutThisLife)).
- **Session pin/unpin from the CLI** — durable keep flags ([#&#8203;80761](https://github.com/NousResearch/hermes-agent/pull/80761)).

##### 📱 Messaging Platforms (Gateway)

- **Slack native live cards** — real streaming replies via chat.startStream plus opt-in plan/task cards for tool progress ([#&#8203;85476](https://github.com/NousResearch/hermes-agent/pull/85476)); outbound link-preview suppression across native and relay planes ([#&#8203;95142](https://github.com/NousResearch/hermes-agent/pull/95142) — [@&#8203;benbarclay](https://github.com/benbarclay)).
- **Telegram inline picker** — every command and skill searchable via [@&#8203;botname](https://github.com/botname), bypassing Telegram's command-menu cap ([#&#8203;98317](https://github.com/NousResearch/hermes-agent/pull/98317)).
- **Relay matured** — native static/dynamic plugin initialization ([#&#8203;77915](https://github.com/NousResearch/hermes-agent/pull/77915) — [@&#8203;bbednarski9](https://github.com/bbednarski9)), live-card ops with draft streaming + task cards ([#&#8203;85796](https://github.com/NousResearch/hermes-agent/pull/85796) — [@&#8203;victor-kyriazakos](https://github.com/victor-kyriazakos)), session-span segmentation ([#&#8203;85467](https://github.com/NousResearch/hermes-agent/pull/85467)), voice-note STT restored over the relay lane ([#&#8203;95274](https://github.com/NousResearch/hermes-agent/pull/95274) — [@&#8203;benbarclay](https://github.com/benbarclay)), transport dedupe/fail-fast fixes ([#&#8203;89584](https://github.com/NousResearch/hermes-agent/pull/89584)).
- **Gateway control socket** — fleet consumers query the gateway itself (identify/status), and updaters pause gateways gracefully instead of tree-killing them ([#&#8203;92447](https://github.com/NousResearch/hermes-agent/pull/92447), [#&#8203;95695](https://github.com/NousResearch/hermes-agent/pull/95695)).
- **Selective multiplex profile serving** ([#&#8203;83400](https://github.com/NousResearch/hermes-agent/pull/83400)), per-profile MCP lifecycle RPCs ([#&#8203;86473](https://github.com/NousResearch/hermes-agent/pull/86473)), roster previews showing the latest message ([#&#8203;85905](https://github.com/NousResearch/hermes-agent/pull/85905)), concise background-process notifications by default ([#&#8203;85877](https://github.com/NousResearch/hermes-agent/pull/85877)).
- **Turn-reaper stack dumps** — when the watchdog fires, wedged worker stacks are captured for diagnosis ([#&#8203;86248](https://github.com/NousResearch/hermes-agent/pull/86248)), with loop-watchdog tuning knobs wired end-to-end ([#&#8203;92317](https://github.com/NousResearch/hermes-agent/pull/92317)).
- **Split-delivery bug class closed** — swallowed finals and split deliveries fixed as a class ([#&#8203;79669](https://github.com/NousResearch/hermes-agent/pull/79669) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor), salvages [#&#8203;78558](https://github.com/NousResearch/hermes-agent/issues/78558)).

##### 🖥️ Desktop App

- **Bot Mode built in** — see Highlights. Full sub-catalog: attributed agent-to-agent message cards ([#&#8203;85855](https://github.com/NousResearch/hermes-agent/pull/85855)), sender-side delivery notices ([#&#8203;85888](https://github.com/NousResearch/hermes-agent/pull/85888)), paint-first hydration for instant wakes ([#&#8203;89510](https://github.com/NousResearch/hermes-agent/pull/89510)), editable group names and room pictures ([#&#8203;89371](https://github.com/NousResearch/hermes-agent/pull/89371)), Routines pane ([#&#8203;88731](https://github.com/NousResearch/hermes-agent/pull/88731)), rebuilt on the app design system ([#&#8203;96726](https://github.com/NousResearch/hermes-agent/pull/96726) — [@&#8203;OutThisLife](https://github.com/OutThisLife)).
- **In-app browser the agent can drive** — the agent uses the desktop's browser tab, not just looks at it ([#&#8203;90197](https://github.com/NousResearch/hermes-agent/pull/90197) — [@&#8203;OutThisLife](https://github.com/OutThisLife)), with external-open + link context menus ([#&#8203;89366](https://github.com/NousResearch/hermes-agent/pull/89366)).
- **Detached update hand-off on every OS** — quit → update → reopen with a single shim window; Windows desktop updates no longer park on "Updating Hermes" ([#&#8203;83634](https://github.com/NousResearch/hermes-agent/pull/83634), [#&#8203;90937](https://github.com/NousResearch/hermes-agent/pull/90937), [#&#8203;95897](https://github.com/NousResearch/hermes-agent/pull/95897)).
- **Quality-of-life wave** — HUD snaps to cursor on ⌘⇧G ([#&#8203;83130](https://github.com/NousResearch/hermes-agent/pull/83130)), paste into the composer without focusing it ([#&#8203;84955](https://github.com/NousResearch/hermes-agent/pull/84955)), per-turn duration badges ([#&#8203;87245](https://github.com/NousResearch/hermes-agent/pull/87245)), readable macOS window translucency ([#&#8203;88744](https://github.com/NousResearch/hermes-agent/pull/88744)), Linux launcher entry ([#&#8203;76456](https://github.com/NousResearch/hermes-agent/pull/76456)), Linux keychain auto-detection ([#&#8203;84903](https://github.com/NousResearch/hermes-agent/pull/84903)), cron + blueprint recipes in the sidebar ([#&#8203;85162](https://github.com/NousResearch/hermes-agent/pull/85162)).
- **Send Diagnostics** — error cards can upload a redacted debug bundle with a support handoff ([#&#8203;92020](https://github.com/NousResearch/hermes-agent/pull/92020)).
- **Seq-stamped event replay** — lossless desktop reconnect over WebSocket ([#&#8203;94219](https://github.com/NousResearch/hermes-agent/pull/94219) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor)).
- **God-file decomposition** — the desktop codebase refactored into atomic modules ([#&#8203;89611](https://github.com/NousResearch/hermes-agent/pull/89611) — [@&#8203;OutThisLife](https://github.com/OutThisLife)).

##### 🖥️ CLI & TUI

- See Highlights for the power wave (command palette, fuzzy /model, richer /status, live status-bar metrics, pets).
- **`hermes approval-check`** — dry-run approval verdicts for a command without running it ([#&#8203;81137](https://github.com/NousResearch/hermes-agent/pull/81137)).
- **Session titles in status bars** ([#&#8203;81947](https://github.com/NousResearch/hermes-agent/pull/81947)); subagent model exposed in the auxiliary-models picker ([#&#8203;80463](https://github.com/NousResearch/hermes-agent/pull/80463)).
- **Ctrl+C fixed** — stopped pushing the Kitty keyboard protocol that broke interrupts ([#&#8203;87074](https://github.com/NousResearch/hermes-agent/pull/87074)).

##### 🔧 Tool System & MCP

- **MCP command center** — see Highlights ([#&#8203;87525](https://github.com/NousResearch/hermes-agent/pull/87525) et al.).
- **Interrupted commands no longer poison cwd** — the terminal won't adopt a stale working directory after an interrupt ([#&#8203;85654](https://github.com/NousResearch/hermes-agent/pull/85654) — [@&#8203;ethernet8023](https://github.com/ethernet8023)).
- **Windows rename contention recovery** ([#&#8203;84852](https://github.com/NousResearch/hermes-agent/pull/84852) — [@&#8203;OutThisLife](https://github.com/OutThisLife)); colon-bearing session IDs no longer break sandbox mounts ([#&#8203;93488](https://github.com/NousResearch/hermes-agent/pull/93488), consolidated 6 PRs).
- **Vision output uncapped** — aux vision calls stop clamping max\_tokens ([#&#8203;75253](https://github.com/NousResearch/hermes-agent/pull/75253) — [@&#8203;adikpb](https://github.com/adikpb)).
- **Subagent work protected** — delegate no longer deletes a child's uncommitted work when git inspection fails ([#&#8203;88419](https://github.com/NousResearch/hermes-agent/pull/88419) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor)).

##### 🧩 Skills Ecosystem

- **Productivity skill wave** (salvaged from [@&#8203;community](https://github.com/community) proposals): document-to-action-items, meeting-action-items, email-inbox-triage, github-issue-to-pr, weekly-review-planning, competitor-news-monitor, product-price-monitor, social-media-content-calendar ([#&#8203;81185](https://github.com/NousResearch/hermes-agent/pull/81185), [#&#8203;81749](https://github.com/NousResearch/hermes-agent/pull/81749), [#&#8203;81672](https://github.com/NousResearch/hermes-agent/pull/81672), [#&#8203;81708](https://github.com/NousResearch/hermes-agent/pull/81708), [#&#8203;81936](https://github.com/NousResearch/hermes-agent/pull/81936), [#&#8203;81945](https://github.com/NousResearch/hermes-agent/pull/81945), [#&#8203;81906](https://github.com/NousResearch/hermes-agent/pull/81906), [#&#8203;81942](https://github.com/NousResearch/hermes-agent/pull/81942)).
- **HAR-derived API clients** — watch a website once, then call its hidden API directly with no browser ([#&#8203;70823](https://github.com/NousResearch/hermes-agent/pull/70823)).
- **publish-site** — versioned website publishing to GitHub/Cloudflare/Netlify Pages ([#&#8203;72189](https://github.com/NousResearch/hermes-agent/pull/72189)); **session-librarian** for prompt-driven session management ([#&#8203;84917](https://github.com/NousResearch/hermes-agent/pull/84917)); **blocked-page-recovery** fallback ladder ([#&#8203;84906](https://github.com/NousResearch/hermes-agent/pull/84906)); **merge-reconciler** for neutral multi-agent conflict resolution ([#&#8203;83063](https://github.com/NousResearch/hermes-agent/pull/83063)); Box productivity skill ([#&#8203;85767](https://github.com/NousResearch/hermes-agent/pull/85767)); ast-grep codemods ([#&#8203;80892](https://github.com/NousResearch/hermes-agent/pull/80892)); draw-your-font + simple-english optional skills ([#&#8203;80814](https://github.com/NousResearch/hermes-agent/pull/80814), [#&#8203;80811](https://github.com/NousResearch/hermes-agent/pull/80811)); plan-interrogation (evolved grill-me) ([#&#8203;97831](https://github.com/NousResearch/hermes-agent/pull/97831)).
- **Advisory SKILL.md linter on create** ([#&#8203;81896](https://github.com/NousResearch/hermes-agent/pull/81896)); skills-hub live-repo fallback for missing optional skills ([#&#8203;82780](https://github.com/NousResearch/hermes-agent/pull/82780)).

##### ⏰ Cron, Delegation & Multi-Agent

- **Cron memory + continuity** — see Highlights ([#&#8203;91447](https://github.com/NousResearch/hermes-agent/pull/91447), [#&#8203;80774](https://github.com/NousResearch/hermes-agent/pull/80774)).
- **Monitor-mode jobs** with hash-suppressed change detection ([#&#8203;81138](https://github.com/NousResearch/hermes-agent/pull/81138)); per-job durable notepads ([#&#8203;81139](https://github.com/NousResearch/hermes-agent/pull/81139)); pre-dispatch config validation ([#&#8203;81140](https://github.com/NousResearch/hermes-agent/pull/81140)); acked failure signatures stop re-pinging ([#&#8203;95017](https://github.com/NousResearch/hermes-agent/pull/95017)); per-job reasoning-effort pinning ([#&#8203;91244](https://github.com/NousResearch/hermes-agent/pull/91244)); "Trigger now" executes immediately and safely ([#&#8203;70638](https://github.com/NousResearch/hermes-agent/pull/70638) — [@&#8203;smwbev](https://github.com/smwbev)); model-drift impact surfaced in Desktop ([#&#8203;83266](https://github.com/NousResearch/hermes-agent/pull/83266) — [@&#8203;ctaylor86](https://github.com/ctaylor86)).
- **Live subagent orchestration** — see Highlights ([#&#8203;85232](https://github.com/NousResearch/hermes-agent/pull/85232)); structured-output schemas on delegate\_task ([#&#8203;81144](https://github.com/NousResearch/hermes-agent/pull/81144)); batch-quality validation before spawning ([#&#8203;81141](https://github.com/NousResearch/hermes-agent/pull/81141)); truncation markers on capped children ([#&#8203;86641](https://github.com/NousResearch/hermes-agent/pull/86641)).
- **Kanban hardening** — collision-hotspot flagging ([#&#8203;83428](https://github.com/NousResearch/hermes-agent/pull/83428)), split-brain decision-ownership contract ([#&#8203;83424](https://github.com/NousResearch/hermes-agent/pull/83424)), memory-aware dispatch guard ([#&#8203;88115](https://github.com/NousResearch/hermes-agent/pull/88115)), notify/wake delivery modes ([#&#8203;85487](https://github.com/NousResearch/hermes-agent/pull/85487)).

##### 📊 Observability

- **Model/provider usage reporting** and bounded tool-metrics aggregation land as an observability subsystem ([#&#8203;68881](https://github.com/NousResearch/hermes-agent/pull/68881), [#&#8203;68882](https://github.com/NousResearch/hermes-agent/pull/68882) — [@&#8203;afourniernv](https://github.com/afourniernv)), with lifecycle ops bounded so a wedged pipeline can never block the agent ([#&#8203;83514](https://github.com/NousResearch/hermes-agent/pull/83514) — [@&#8203;victor-kyriazakos](https://github.com/victor-kyriazakos)).

##### 🔒 Security & Reliability

- **Protected instruction files** — writes to AGENTS.md/skills/memory always require approval ([#&#8203;81152](https://github.com/NousResearch/hermes-agent/pull/81152)).
- **Redaction sweep** — emission gaps closed across env-name variants, control-splits, process(list), checkpoints ([#&#8203;80965](https://github.com/NousResearch/hermes-agent/pull/80965)); `.env` reads redacted via file-read detection ([#&#8203;80964](https://github.com/NousResearch/hermes-agent/pull/80964)); terminal exception results + ACP stderr ([#&#8203;81675](https://github.com/NousResearch/hermes-agent/pull/81675), [#&#8203;81686](https://github.com/NousResearch/hermes-agent/pull/81686)); SSH target logging ([#&#8203;88232](https://github.com/NousResearch/hermes-agent/pull/88232)).
- **Windows approval coverage** — destructive Windows commands and paths now trip the approval system ([#&#8203;84428](https://github.com/NousResearch/hermes-agent/pull/84428)).
- **Supply-chain response** — the Blender MCP catalog entry and skill were removed after an upstream compromise ([#&#8203;83404](https://github.com/NousResearch/hermes-agent/pull/83404)); plugin installs get Tier-1 security scanning ([#&#8203;80728](https://github.com/NousResearch/hermes-agent/pull/80728)).
- **macOS TCC identity** — permission grants survive every update via `hermes desktop --setup-tcc-identity` ([#&#8203;95091](https://github.com/NousResearch/hermes-agent/pull/95091)).
- **PKCE cookie fix** — SameSite=None over HTTPS with a matching clear path ([#&#8203;83536](https://github.com/NousResearch/hermes-agent/pull/83536) — [@&#8203;benbarclay](https://github.com/benbarclay)).

##### 🏗️ Infrastructure, CI & Packaging

- **Real-OS CI** — macOS and Windows CI lanes with tests gated by real host OS ([#&#8203;77992](https://github.com/NousResearch/hermes-agent/pull/77992) — [@&#8203;ethernet8023](https://github.com/ethernet8023)); work lanes on 32-core runners ([#&#8203;92009](https://github.com/NousResearch/hermes-agent/pull/92009)); review comments + image builds moved out of the hot CI path ([#&#8203;82668](https://github.com/NousResearch/hermes-agent/pull/82668)).
- **Bootstrap installer** no longer waits on pipe EOF ([#&#8203;90941](https://github.com/NousResearch/hermes-agent/pull/90941) — [@&#8203;OutThisLife](https://github.com/OutThisLife)).

##### 🐛 Notable Bug Fixes

- Desktop session races (Stop→edit/resend, submit ownership) fixed as a cluster ([#&#8203;86594](https://github.com/NousResearch/hermes-agent/pull/86594)); workspace-pane idle flicker ([#&#8203;97513](https://github.com/NousResearch/hermes-agent/pull/97513)); assistant-ui boundary recovery ([#&#8203;81232](https://github.com/NousResearch/hermes-agent/pull/81232)).
- Kanban schema re-creation when a cached DB path loses it ([#&#8203;83619](https://github.com/NousResearch/hermes-agent/pull/83619) — [@&#8203;JoaoMarcos44](https://github.com/JoaoMarcos44)).
- Cron jobs no longer inherit a kanban worker's dispatcher identity ([#&#8203;79657](https://github.com/NousResearch/hermes-agent/pull/79657) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor)); relay-fronted Slack cron delivery ([#&#8203;85340](https://github.com/NousResearch/hermes-agent/pull/85340) — [@&#8203;victor-kyriazakos](https://github.com/victor-kyriazakos)).
- Model-picker serves cached custom-provider catalogs on no-probe opens ([#&#8203;81973](https://github.com/NousResearch/hermes-agent/pull/81973) — [@&#8203;austinpickett](https://github.com/austinpickett)).
- Docker sandbox MEDIA attachments no longer silently drop ([#&#8203;94509](https://github.com/NousResearch/hermes-agent/pull/94509)); desktop binary attachments delivered into sandbox backends ([#&#8203;81717](https://github.com/NousResearch/hermes-agent/pull/81717)).
- Session-hygiene compaction cooldown escalates on repeat failures ([#&#8203;79741](https://github.com/NousResearch/hermes-agent/pull/79741) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor)).
- Provider-injected parameter 400s retried instead of aborting the turn ([#&#8203;91643](https://github.com/NousResearch/hermes-agent/pull/91643)).
- …and roughly two thousand more closed issues' worth — this window averaged \~85 merged PRs per day.

##### ↩️ Reverted in this window (not shipping)

- **Model Council mode (/council)** — landed then reverted; not in this release.
- **DCP context engine** — landed then reverted; not in this release.
- **WS-only gateway server ([#&#8203;94245](https://github.com/NousResearch/hermes-agent/issues/94245))** — merged then reverted ([#&#8203;96118](https://github.com/NousResearch/hermes-agent/issues/96118)); FastAPI remains on the desktop boot path. The seq-stamped event replay ([#&#8203;94219](https://github.com/NousResearch/hermes-agent/issues/94219)) DID ship.
- Electron rolled back to 40.10.2; TCC interpreter anchor removed (superseded by the signing-identity approach that shipped).

##### 👥 Contributors

##### Core Team (Nous Research)

- **[@&#8203;teknium1](https://github.com/teknium1)** — release direction, Bot Mode, MCP command center, cron memory, and \~1,340 merged PRs
- **[@&#8203;kshitijk4poor](https://github.com/kshitijk4poor)** (374 PRs) — gateway delivery classes, session persistence, event replay, MoA/caching fixes
- **[@&#8203;OutThisLife](https://github.com/OutThisLife)** (209 PRs) — desktop architecture, Bot Mode UI, in-app browser, update hand-off
- **[@&#8203;ethernet8023](https://github.com/ethernet8023)** (38 PRs) — OS-gated CI lanes, clarify multi-question, tool cwd safety, aux structured-output resilience
- **[@&#8203;benbarclay](https://github.com/benbarclay)** (17 PRs) — relay voice STT, Slack link previews, PKCE
- **[@&#8203;victor-kyriazakos](https://github.com/victor-kyriazakos)** (15 PRs) — relay live cards, observability bounding
- **[@&#8203;rob-maron](https://github.com/rob-maron)**, **[@&#8203;austinpickett](https://github.com/austinpickett)**, **[@&#8203;jquesnelle](https://github.com/jquesnelle)**, **[@&#8203;shannonsands](https://github.com/shannonsands)** — providers, dashboard, model catalogs, and more

##### Top Community Contributors (by merged PR count)

- **[@&#8203;helix4u](https://github.com/helix4u)** (31 PRs) — wake-word capture, session UX, fix wave across desktop and gateway
- **[@&#8203;fangliquanflq](https://github.com/fangliquanflq)** (17 PRs) — stalled-provider recovery and agent-loop resilience
- **[@&#8203;bbednarski9](https://github.com/bbednarski9)** — relay native plugin integration; **[@&#8203;HexLab98](https://github.com/HexLab98)**, **[@&#8203;xxxigm](https://github.com/xxxigm)**, **[@&#8203;afourniernv](https://github.com/afourniernv)** (observability), **[@&#8203;liuhao1024](https://github.com/liuhao1024)**, **[@&#8203;Christopher-Schulze](https://github.com/Christopher-Schulze)**, **[@&#8203;Adolanium](https://github.com/Adolanium)**, **[@&#8203;webtecnica](https://github.com/webtecnica)**, **[@&#8203;smwbev](https://github.com/smwbev)** (cron Trigger-now), **[@&#8203;ctaylor86](https://github.com/ctaylor86)** (cron drift in Desktop), **[@&#8203;JoaoMarcos44](https://github.com/JoaoMarcos44)** (kanban schema recovery), **[@&#8203;jackulau](https://github.com/jackulau)** (SessionDB context manager), **[@&#8203;adikpb](https://github.com/adikpb)** (vision output caps), **[@&#8203;dokterdok](https://github.com/dokterdok)** (Bot Mode unification), and many more.

##### All Contributors

Huge thanks to every one of the 760+ people who contributed code, co-authored fixes, or had their work salvaged into this release:

[@&#8203;03farren](https://github.com/03farren), [@&#8203;0xarkstar](https://github.com/0xarkstar), [@&#8203;0xGr1mm](https://github.com/0xGr1mm), [@&#8203;0xWhiteMage](https://github.com/0xWhiteMage), [@&#8203;100yenadmin](https://github.com/100yenadmin), [@&#8203;1052326311](https://github.com/1052326311), [@&#8203;29206394](https://github.com/29206394), [@&#8203;2ndNatureAI](https://github.com/2ndNatureAI), [@&#8203;3Nya3](https://github.com/3Nya3),
[@&#8203;3x3xX3N0N](https://github.com/3x3xX3N0N), [@&#8203;404Dealer](https://github.com/404Dealer), [@&#8203;4adwentures](https://github.com/4adwentures), [@&#8203;5Hyeons](https://github.com/5Hyeons), [@&#8203;686f6c61](https://github.com/686f6c61), [@&#8203;69k4xmdfm2-blip](https://github.com/69k4xmdfm2-blip), [@&#8203;6ylqq](https://github.com/6ylqq), [@&#8203;75day](https://github.com/75day), [@&#8203;a-espinoza](https://github.com/a-espinoza),
[@&#8203;A-Snegin](https://github.com/A-Snegin), [@&#8203;a-yeyang](https://github.com/a-yeyang), [@&#8203;a0000001](https://github.com/a0000001), [@&#8203;A2chitect](https://github.com/A2chitect), [@&#8203;abitme](https://github.com/abitme), [@&#8203;abundantbeing](https://github.com/abundantbeing), [@&#8203;acewong7](https://github.com/acewong7), [@&#8203;acgh213](https://github.com/acgh213), [@&#8203;adamcap926](https://github.com/adamcap926),
[@&#8203;addelh](https://github.com/addelh), [@&#8203;adikpb](https://github.com/adikpb), [@&#8203;Adolanium](https://github.com/Adolanium), [@&#8203;adurham](https://github.com/adurham), [@&#8203;adybag14-cyber](https://github.com/adybag14-cyber), [@&#8203;afourniernv](https://github.com/afourniernv), [@&#8203;ag9920](https://github.com/ag9920), [@&#8203;ahmadalzaro1](https://github.com/ahmadalzaro1), [@&#8203;Ahmett101](https://github.com/Ahmett101),
[@&#8203;ai-ag2026](https://github.com/ai-ag2026), [@&#8203;AIalliAI](https://github.com/AIalliAI), [@&#8203;aider4ryder](https://github.com/aider4ryder), [@&#8203;Ailirag](https://github.com/Ailirag), [@&#8203;Aintworth](https://github.com/Aintworth), [@&#8203;airo7](https://github.com/airo7), [@&#8203;AiwendilInTheWoods](https://github.com/AiwendilInTheWoods), [@&#8203;akivavh](https://github.com/akivavh), [@&#8203;AL-ZiLLA](https://github.com/AL-ZiLLA),
[@&#8203;Al3xand3r1987](https://github.com/Al3xand3r1987), [@&#8203;albertodepaola](https://github.com/albertodepaola), [@&#8203;aldoeliacim](https://github.com/aldoeliacim), [@&#8203;aleksclark](https://github.com/aleksclark), [@&#8203;AlexanderPrendota](https://github.com/AlexanderPrendota), [@&#8203;alexdev03](https://github.com/alexdev03), [@&#8203;AlexFucuson9](https://github.com/AlexFucuson9),
[@&#8203;AlexGabbia](https://github.com/AlexGabbia), [@&#8203;AlexMnrs](https://github.com/AlexMnrs), [@&#8203;algf](https://github.com/algf), [@&#8203;Allecpu](https://github.com/Allecpu), [@&#8203;allin2](https://github.com/allin2), [@&#8203;alt-glitch](https://github.com/alt-glitch), [@&#8203;amanning3390](https://github.com/amanning3390), [@&#8203;andrexibiza](https://github.com/andrexibiza), [@&#8203;andyst-dev](https://github.com/andyst-dev),
[@&#8203;angel12](https://github.com/angel12), [@&#8203;angeon922-collab](https://github.com/angeon922-collab), [@&#8203;Angriff36](https://github.com/Angriff36), [@&#8203;aniruddhaadak80](https://github.com/aniruddhaadak80), [@&#8203;annguyenNous](https://github.com/annguyenNous), [@&#8203;anuvratrastogi](https://github.com/anuvratrastogi), [@&#8203;Aoshi-Dev](https://github.com/Aoshi-Dev),
[@&#8203;appletechie](https://github.com/appletechie), [@&#8203;arccat-114](https://github.com/arccat-114), [@&#8203;arcimun](https://github.com/arcimun), [@&#8203;ArthurFranckPat](https://github.com/ArthurFranckPat), [@&#8203;aryaxo](https://github.com/aryaxo), [@&#8203;asdasdadhj](https://github.com/asdasdadhj), [@&#8203;ashah360](https://github.com/ashah360), [@&#8203;AshuJoshi](https://github.com/AshuJoshi), [@&#8203;asimons81](https://github.com/asimons81),
[@&#8203;assimovt](https://github.com/assimovt), [@&#8203;austinpickett](https://github.com/austinpickett), [@&#8203;AVW7](https://github.com/AVW7), [@&#8203;Axmr1](https://github.com/Axmr1), [@&#8203;aydnOktay](https://github.com/aydnOktay), [@&#8203;ayushnangia](https://github.com/ayushnangia), [@&#8203;baihemax](https://github.com/baihemax), [@&#8203;bananawalnut](https://github.com/bananawalnut), [@&#8203;Bartok9](https://github.com/Bartok9),
[@&#8203;bashrusakh](https://github.com/bashrusakh), [@&#8203;bbednarski9](https://github.com/bbednarski9), [@&#8203;BearHuddleston](https://github.com/BearHuddleston), [@&#8203;benbarclay](https://github.com/benbarclay), [@&#8203;benfrank241](https://github.com/benfrank241), [@&#8203;beplee](https://github.com/beplee), [@&#8203;bgrablin](https://github.com/bgrablin), [@&#8203;bka9](https://github.com/bka9), [@&#8203;BkashJEE](https://github.com/BkashJEE),
[@&#8203;BlackishGreen33](https://github.com/BlackishGreen33), [@&#8203;BlakeB254](https://github.com/BlakeB254), [@&#8203;blunkjamie-dev](https://github.com/blunkjamie-dev), [@&#8203;BobClawblaw](https://github.com/BobClawblaw), [@&#8203;bradmarshall987](https://github.com/bradmarshall987), [@&#8203;brian717](https://github.com/brian717), [@&#8203;briandevans](https://github.com/briandevans),
[@&#8203;BrianFranco](https://github.com/BrianFranco), [@&#8203;BrinShadewater](https://github.com/BrinShadewater), [@&#8203;brucexu-eth](https://github.com/brucexu-eth), [@&#8203;BrunoBza](https://github.com/BrunoBza), [@&#8203;buffpesos](https://github.com/buffpesos), [@&#8203;burak33bb](https://github.com/burak33bb), [@&#8203;C-EXCITE-STUDIO](https://github.com/C-EXCITE-STUDIO), [@&#8203;c-pompa](https://github.com/c-pompa),
[@&#8203;cadezhou](https://github.com/cadezhou), [@&#8203;calvinnwq](https://github.com/calvinnwq), [@&#8203;capt-marbles](https://github.com/capt-marbles), [@&#8203;carbongotfound](https://github.com/carbongotfound), [@&#8203;carlotestor](https://github.com/carlotestor), [@&#8203;Carry00](https://github.com/Carry00), [@&#8203;cation98](https://github.com/cation98), [@&#8203;ccowan93](https://github.com/ccowan93),
[@&#8203;cedricziel](https://github.com/cedricziel), [@&#8203;cervantesh](https://github.com/cervantesh), [@&#8203;cfdude](https://github.com/cfdude), [@&#8203;Chadmc9889](https://github.com/Chadmc9889), [@&#8203;CharZhou](https://github.com/CharZhou), [@&#8203;chelsealong](https://github.com/chelsealong), [@&#8203;chesterXalan](https://github.com/chesterXalan), [@&#8203;chillerno1](https://github.com/chillerno1),
[@&#8203;Christopher-Schulze](https://github.com/Christopher-Schulze), [@&#8203;chukirk-svg](https://github.com/chukirk-svg), [@&#8203;cicav](https://github.com/cicav), [@&#8203;citizendev9c](https://github.com/citizendev9c), [@&#8203;cj52973](https://github.com/cj52973), [@&#8203;clarkvines](https://github.com/clarkvines), [@&#8203;ClintonEmok](https://github.com/ClintonEmok), [@&#8203;clyu168](https://github.com/clyu168),
[@&#8203;cmoiccool](https://github.com/cmoiccool), [@&#8203;codexbt](https://github.com/codexbt), [@&#8203;coe0718](https://github.com/coe0718), [@&#8203;Cossackx](https://github.com/Cossackx), [@&#8203;coygeek](https://github.com/coygeek), [@&#8203;crazyhulk](https://github.com/crazyhulk), [@&#8203;CrazyWillBear](https://github.com/CrazyWillBear), [@&#8203;criptogus](https://github.com/criptogus), [@&#8203;cryptoyasenka](https://github.com/cryptoyasenka),
[@&#8203;ctaylor86](https://github.com/ctaylor86), [@&#8203;cvillarroel2](https://github.com/cvillarroel2), [@&#8203;cxxCoolStar](https://github.com/cxxCoolStar), [@&#8203;cycorld](https://github.com/cycorld), [@&#8203;dagbs](https://github.com/dagbs), [@&#8203;damadorPL](https://github.com/damadorPL), [@&#8203;DanBennettUK](https://github.com/DanBennettUK), [@&#8203;DanDo385](https://github.com/DanDo385),
[@&#8203;DannyFengTianYu](https://github.com/DannyFengTianYu), [@&#8203;Dannyzen](https://github.com/Dannyzen), [@&#8203;danspicytaco](https://github.com/danspicytaco), [@&#8203;dante32683](https://github.com/dante32683), [@&#8203;darko-mesaros](https://github.com/darko-mesaros), [@&#8203;daromaj](https://github.com/daromaj), [@&#8203;david-bartos-phrase](https://github.com/david-bartos-phrase),
[@&#8203;davidgut1982](https://github.com/davidgut1982), [@&#8203;DavidMetcalfe](https://github.com/DavidMetcalfe), [@&#8203;davidneyravyr](https://github.com/davidneyravyr), [@&#8203;daxro](https://github.com/daxro), [@&#8203;dcdexhome](https://github.com/dcdexhome), [@&#8203;deacon-botdoctor](https://github.com/deacon-botdoctor), [@&#8203;deadczarvc](https://github.com/deadczarvc), [@&#8203;deaneeth](https://github.com/deaneeth),
[@&#8203;DECRUX9812](https://github.com/DECRUX9812), [@&#8203;deepeet-git](https://github.com/deepeet-git), [@&#8203;deniqlab](https://github.com/deniqlab), [@&#8203;DeseretSaint](https://github.com/DeseretSaint), [@&#8203;dhanesh](https://github.com/dhanesh), [@&#8203;Dhruv7201](https://github.com/Dhruv7201), [@&#8203;dhruvkej9](https://github.com/dhruvkej9), [@&#8203;digitalbase](https://github.com/digitalbase),
[@&#8203;DmytroVolodymyrson](https://github.com/DmytroVolodymyrson), [@&#8203;dokterdok](https://github.com/dokterdok), [@&#8203;Dolverin](https://github.com/Dolverin), [@&#8203;dombejar](https://github.com/dombejar), [@&#8203;doncazper](https://github.com/doncazper), [@&#8203;dougatbuck](https://github.com/dougatbuck), [@&#8203;douxy1994](https://github.com/douxy1994), [@&#8203;dpersek](https://github.com/dpersek), [@&#8203;dplush](https://github.com/dplush),
[@&#8203;Drexuxux](https://github.com/Drexuxux), [@&#8203;drissman](https://github.com/drissman), [@&#8203;dromai](https://github.com/dromai), [@&#8203;dtownsel](https://github.com/dtownsel), [@&#8203;duclucky](https://github.com/duclucky), [@&#8203;Dudeman456](https://github.com/Dudeman456), [@&#8203;Dusk1e](https://github.com/Dusk1e), [@&#8203;dvbaecker](https://github.com/dvbaecker), [@&#8203;e-macgregor](https://github.com/e-macgregor),
[@&#8203;EAbaracus](https://github.com/EAbaracus), [@&#8203;eaglezzz0522-cloud](https://github.com/eaglezzz0522-cloud), [@&#8203;Eapwrk](https://github.com/Eapwrk), [@&#8203;easyvibecoding](https://github.com/easyvibecoding), [@&#8203;echoes666](https://github.com/echoes666), [@&#8203;egilewski](https://github.com/egilewski), [@&#8203;ehz0ah](https://github.com/ehz0ah), [@&#8203;ekinnee](https://github.com/ekinnee), [@&#8203;ekzhang](https://github.com/ekzhang),
[@&#8203;elbukott1](https://github.com/elbukott1), [@&#8203;elisam0](https://github.com/elisam0), [@&#8203;elphamale](https://github.com/elphamale), [@&#8203;ElSnacko](https://github.com/ElSnacko), [@&#8203;embwl0x](https://github.com/embwl0x), [@&#8203;emozilla](https://github.com/emozilla), [@&#8203;EMT5320](https://github.com/EMT5320), [@&#8203;EndeavorYen](https://github.com/EndeavorYen), [@&#8203;Enough1122](https://github.com/Enough1122),
[@&#8203;enwaiax](https://github.com/enwaiax), [@&#8203;epeterpanz](https://github.com/epeterpanz), [@&#8203;EpicIsTheOne](https://github.com/EpicIsTheOne), [@&#8203;eric-senyao](https://github.com/eric-senyao), [@&#8203;ernst-bablick](https://github.com/ernst-bablick), [@&#8203;Eros-ITA](https://github.com/Eros-ITA), [@&#8203;erosika](https://github.com/erosika), [@&#8203;ethernet8023](https://github.com/ethernet8023),
[@&#8203;etzelvon](https://github.com/etzelvon), [@&#8203;EvanProgramming](https://github.com/EvanProgramming), [@&#8203;EvenXieWF](https://github.com/EvenXieWF), [@&#8203;explainanalyze](https://github.com/explainanalyze), [@&#8203;f-trycua](https://github.com/f-trycua), [@&#8203;fanfan343](https://github.com/fanfan343), [@&#8203;fangliquanflq](https://github.com/fangliquanflq), [@&#8203;fattchris](https://github.com/fattchris),
[@&#8203;felix-windsor](https://github.com/felix-windsor), [@&#8203;Finn763](https://github.com/Finn763), [@&#8203;flaviovargasbrandao](https://github.com/flaviovargasbrandao), [@&#8203;Fly-onlyone](https://github.com/Fly-onlyone), [@&#8203;flyingdoubleG](https://github.com/flyingdoubleG), [@&#8203;forkercat](https://github.com/forkercat),
[@&#8203;francialisomlimoeiro](https://github.com/francialisomlimoeiro), [@&#8203;francip](https://github.com/francip), [@&#8203;frankmendes1979](https://github.com/frankmendes1979), [@&#8203;fred0m](https://github.com/fred0m), [@&#8203;frendo](https://github.com/frendo), [@&#8203;frizikk](https://github.com/frizikk), [@&#8203;frohsinnllc](https://github.com/frohsinnllc), [@&#8203;Frowtek](https://github.com/Frowtek),
[@&#8203;fukutake1207](https://github.com/fukutake1207), [@&#8203;fyzanshaik](https://github.com/fyzanshaik), [@&#8203;GarlicGo](https://github.com/GarlicGo), [@&#8203;Gateton](https://github.com/Gateton), [@&#8203;georgell-ceo](https://github.com/georgell-ceo), [@&#8203;gfriesen1](https://github.com/gfriesen1), [@&#8203;gigabyte22](https://github.com/gigabyte22), [@&#8203;gigashad](https://github.com/gigashad), [@&#8203;gijoby](https://github.com/gijoby),
[@&#8203;gitong](https://github.com/gitong), [@&#8203;gkd2323c](https://github.com/gkd2323c), [@&#8203;gnanirahulnutakki](https://github.com/gnanirahulnutakki), [@&#8203;GodsBoy](https://github.com/GodsBoy), [@&#8203;gokay-ai](https://github.com/gokay-ai), [@&#8203;goktugvatandas](https://github.com/goktugvatandas), [@&#8203;golldyck](https://github.com/golldyck), [@&#8203;goodchang77](https://github.com/goodchang77), [@&#8203;GottZ](https://github.com/GottZ),
[@&#8203;grahfmusic](https://github.com/grahfmusic), [@&#8203;gregorustar-maker](https://github.com/gregorustar-maker), [@&#8203;greyvito](https://github.com/greyvito), [@&#8203;gsy324](https://github.com/gsy324), [@&#8203;guanla-zz](https://github.com/guanla-zz), [@&#8203;guilhermeartileshubsai](https://github.com/guilhermeartileshubsai), [@&#8203;guilhermeraiuga](https://github.com/guilhermeraiuga),
[@&#8203;h-mascot](https://github.com/h-mascot), [@&#8203;h8hawk](https://github.com/h8hawk), [@&#8203;Haakam21](https://github.com/Haakam21), [@&#8203;Haik-G](https://github.com/Haik-G), [@&#8203;halaprix](https://github.com/halaprix), [@&#8203;Halldrix](https://github.com/Halldrix), [@&#8203;handnewb](https://github.com/handnewb), [@&#8203;Hangzian](https://github.com/Hangzian), [@&#8203;hanhvs](https://github.com/hanhvs), [@&#8203;hansai-art](https://github.com/hansai-art),
[@&#8203;HAOWANG116](https://github.com/HAOWANG116), [@&#8203;HarishDarko](https://github.com/HarishDarko), [@&#8203;hbentel](https://github.com/hbentel), [@&#8203;helix4u](https://github.com/helix4u), [@&#8203;HenryGHJ](https://github.com/HenryGHJ), [@&#8203;hermias1](https://github.com/hermias1), [@&#8203;HexLab98](https://github.com/HexLab98), [@&#8203;hillimited](https://github.com/hillimited), [@&#8203;Hjharris1](https://github.com/Hjharris1),
[@&#8203;hkfiberlaser-svg](https://github.com/hkfiberlaser-svg), [@&#8203;honor2030](https://github.com/honor2030), [@&#8203;howdeploy](https://github.com/howdeploy), [@&#8203;hsearcy](https://github.com/hsearcy), [@&#8203;huklaa](https://github.com/huklaa), [@&#8203;hustwkr](https://github.com/hustwkr), [@&#8203;hutao562](https://github.com/hutao562), [@&#8203;hxwvaa](https://github.com/hxwvaa), [@&#8203;IAvecilla](https://github.com/IAvecilla),
[@&#8203;icemeng](https://github.com/icemeng), [@&#8203;infinitycrew39](https://github.com/infinitycrew39), [@&#8203;infocentr](https://github.com/infocentr), [@&#8203;InphinitiZ](https://github.com/InphinitiZ), [@&#8203;insane66613](https://github.com/insane66613), [@&#8203;Inspired-by-Atmosphere](https://github.com/Inspired-by-Atmosphere), [@&#8203;intelac](https://github.com/intelac),
[@&#8203;intellectronica](https://github.com/intellectronica), [@&#8203;isak-ialogics](https://github.com/isak-ialogics), [@&#8203;ishanparihar](https://github.com/ishanparihar), [@&#8203;isheng-eqi](https://github.com/isheng-eqi), [@&#8203;Ishman82](https://github.com/Ishman82), [@&#8203;iskysun96](https://github.com/iskysun96), [@&#8203;iso2kx](https://github.com/iso2kx), [@&#8203;itsflownium](https://github.com/itsflownium),
[@&#8203;izumi0uu](https://github.com/izumi0uu), [@&#8203;Jaaneek](https://github.com/Jaaneek), [@&#8203;Jackal991](https://github.com/Jackal991), [@&#8203;jackijianxa](https://github.com/jackijianxa), [@&#8203;jackoconner45](https://github.com/jackoconner45), [@&#8203;jackulau](https://github.com/jackulau), [@&#8203;jaimedhenriques](https://github.com/jaimedhenriques), [@&#8203;james47kjv](https://github.com/james47kjv),
[@&#8203;jbagdonas](https://github.com/jbagdonas), [@&#8203;jcjc81](https://github.com/jcjc81), [@&#8203;jdgg777](https://github.com/jdgg777), [@&#8203;jeeves-assistant](https://github.com/jeeves-assistant), [@&#8203;jeff-mettel](https://github.com/jeff-mettel), [@&#8203;Jefftree](https://github.com/Jefftree), [@&#8203;JElfferich](https://github.com/JElfferich), [@&#8203;jeremyrandria-debug](https://github.com/jeremyrandria-debug),
[@&#8203;JinUltimate1995](https://github.com/JinUltimate1995), [@&#8203;jirathip-k](https://github.com/jirathip-k), [@&#8203;jmmaloney4](https://github.com/jmmaloney4), [@&#8203;JoaoMarcos44](https://github.com/JoaoMarcos44), [@&#8203;joe-rodgers](https://github.com/joe-rodgers), [@&#8203;joe050860](https://github.com/joe050860), [@&#8203;John-Lussier](https://github.com/John-Lussier),
[@&#8203;Johnny-xuan](https://github.com/Johnny-xuan), [@&#8203;johnrazmus](https://github.com/johnrazmus), [@&#8203;johnsonAyo](https://github.com/johnsonAyo), [@&#8203;jonpol01](https://github.com/jonpol01), [@&#8203;JonthanaHanh](https://github.com/JonthanaHanh), [@&#8203;JoshPaulie](https://github.com/JoshPaulie), [@&#8203;Jreevo](https://github.com/Jreevo), [@&#8203;jtstothard](https://github.com/jtstothard),
[@&#8203;Julientalbot](https://github.com/Julientalbot), [@&#8203;justcarlosm](https://github.com/justcarlosm), [@&#8203;justinbowes](https://github.com/justinbowes), [@&#8203;justinjohnson25600](https://github.com/justinjohnson25600), [@&#8203;jwtor7](https://github.com/jwtor7), [@&#8203;k0rnacki](https://github.com/k0rnacki), [@&#8203;kadiratesdev](https://github.com/kadiratesdev),
[@&#8203;Kailigithub](https://github.com/Kailigithub), [@&#8203;kaishi00](https://github.com/kaishi00), [@&#8203;KarateWilly](https://github.com/KarateWilly), [@&#8203;kas-cor](https://github.com/kas-cor), [@&#8203;katie-lpd](https://github.com/katie-lpd), [@&#8203;Kavyrocom](https://github.com/Kavyrocom), [@&#8203;KBANTH](https://github.com/KBANTH), [@&#8203;kchernev](https://github.com/kchernev), [@&#8203;KeaneYan](https://github.com/KeaneYan),
[@&#8203;kernel-t1](https://github.com/kernel-t1), [@&#8203;KeroZelvin](https://github.com/KeroZelvin), [@&#8203;kerpopule](https://github.com/kerpopule), [@&#8203;KHALIDagara](https://github.com/KHALIDagara), [@&#8203;KhanCold](https://github.com/KhanCold), [@&#8203;khanhngoo](https://github.com/khanhngoo), [@&#8203;KIAgent01](https://github.com/KIAgent01), [@&#8203;kim-miram](https://github.com/kim-miram), [@&#8203;kimyxx](https://github.com/kimyxx),
[@&#8203;Kinkoolino-Hermes](https://github.com/Kinkoolino-Hermes), [@&#8203;kinsolee](https://github.com/kinsolee), [@&#8203;kitsonk](https://github.com/kitsonk), [@&#8203;klaus765](https://github.com/klaus765), [@&#8203;koltyj](https://github.com/koltyj), [@&#8203;konsisumer](https://github.com/konsisumer), [@&#8203;kronexoi](https://github.com/kronexoi), [@&#8203;krunkosaurus](https://github.com/krunkosaurus),
[@&#8203;kshitijk4poor](https://github.com/kshitijk4poor), [@&#8203;kudapara](https://github.com/kudapara), [@&#8203;kvnloo](https://github.com/kvnloo), [@&#8203;kweiner](https://github.com/kweiner), [@&#8203;kyssta-exe](https://github.com/kyssta-exe), [@&#8203;Kyzcreig](https://github.com/Kyzcreig), [@&#8203;laithrw](https://github.com/laithrw), [@&#8203;lakshyaag-tavily](https://github.com/lakshyaag-tavily), [@&#8203;landaun](https://github.com/landaun),
[@&#8203;laulopezreal](https://github.com/laulopezreal), [@&#8203;laviesony](https://github.com/laviesony), [@&#8203;lazy-idler](https://github.com/lazy-idler), [@&#8203;LBeghini](https://github.com/LBeghini), [@&#8203;leeclouddragon](https://github.com/leeclouddragon), [@&#8203;Leegenux](https://github.com/Leegenux), [@&#8203;LemonSchneid](https://github.com/LemonSchneid), [@&#8203;LeonardoLGDS](https://github.com/LeonardoLGDS),
[@&#8203;leonphull](https://github.com/leonphull), [@&#8203;LeonSGP43](https://github.com/LeonSGP43), [@&#8203;lepetitprince716-prog](https://github.com/lepetitprince716-prog), [@&#8203;Lesnak1](https://github.com/Lesnak1), [@&#8203;lesterlxt](https://github.com/lesterlxt), [@&#8203;lesyuk](https://github.com/lesyuk), [@&#8203;lEWFkRAD](https://github.com/lEWFkRAD), [@&#8203;lextiz](https://github.com/lextiz), [@&#8203;lgy1027](https://github.com/lgy1027),
[@&#8203;Lidang-Jiang](https://github.com/Lidang-Jiang), [@&#8203;lilShawtty-byte](https://github.com/lilShawtty-byte), [@&#8203;lin-hongkuan](https://github.com/lin-hongkuan), [@&#8203;liuhao1024](https://github.com/liuhao1024), [@&#8203;liusencomic-cyber](https://github.com/liusencomic-cyber), [@&#8203;lkz-de](https://github.com/lkz-de), [@&#8203;loafoe](https://github.com/loafoe), [@&#8203;locker95](https://github.com/locker95),
[@&#8203;LordMelkor](https://github.com/LordMelkor), [@&#8203;lorzl](https://github.com/lorzl), [@&#8203;lost9999](https://github.com/lost9999), [@&#8203;loulanyue](https://github.com/loulanyue), [@&#8203;LovePlayCode](https://github.com/LovePlayCode), [@&#8203;luckygreen](https://github.com/luckygreen), [@&#8203;lukeroberts](https://github.com/lukeroberts), [@&#8203;luoxiao6645](https://github.com/luoxiao6645), [@&#8203;luxles](https://github.com/luxles),
[@&#8203;m1k3s0](https://github.com/m1k3s0), [@&#8203;Mabolla](https://github.com/Mabolla), [@&#8203;MagMueller](https://github.com/MagMueller), [@&#8203;magnus919](https://github.com/magnus919), [@&#8203;magnuslundstedt](https://github.com/magnuslundstedt), [@&#8203;MaheshBhushan](https://github.com/MaheshBhushan), [@&#8203;MarcoFernstaedt](https://github.com/MarcoFernstaedt), [@&#8203;mariobgsp](https://github.com/mariobgsp),
[@&#8203;marketing2981](https://github.com/marketing2981), [@&#8203;markmcd](https://github.com/markmcd), [@&#8203;markmnl](https://github.com/markmnl), [@&#8203;MarkVLK](https://github.com/MarkVLK), [@&#8203;marzukia](https://github.com/marzukia), [@&#8203;Mat-London](https://github.com/Mat-London), [@&#8203;matsvarn](https://github.com/matsvarn), [@&#8203;mattprusak](https://github.com/mattprusak), [@&#8203;MaximCrabbe](https://github.com/MaximCrabbe),
[@&#8203;maxmilian](https://github.com/maxmilian), [@&#8203;mehmetkr-31](https://github.com/mehmetkr-31), [@&#8203;Mengchee118](https://github.com/Mengchee118), [@&#8203;menhguin](https://github.com/menhguin), [@&#8203;metamindedu](https://github.com/metamindedu), [@&#8203;michaelHMK](https://github.com/michaelHMK), [@&#8203;michaelsam94](https://github.com/michaelsam94), [@&#8203;milnerrad](https://github.com/milnerrad),
[@&#8203;MindDragonLabs](https://github.com/MindDragonLabs), [@&#8203;misterdas](https://github.com/misterdas), [@&#8203;mjolley9](https://github.com/mjolley9), [@&#8203;mmcallister8](https://github.com/mmcallister8), [@&#8203;mmcclean-aws](https://github.com/mmcclean-aws), [@&#8203;mmchuangyt-ai](https://github.com/mmchuangyt-ai), [@&#8203;moisesvalero](https://github.com/moisesvalero), [@&#8203;mollusk](https://github.com/mollusk),
[@&#8203;monerostar](https://github.com/monerostar), [@&#8203;Morad37](https://github.com/Morad37), [@&#8203;mrkillbob](https://github.com/mrkillbob), [@&#8203;mrmixx-max](https://github.com/mrmixx-max), [@&#8203;mrsucesso](https://github.com/mrsucesso), [@&#8203;MrTheSoulz](https://github.com/MrTheSoulz), [@&#8203;MustafaK99](https://github.com/MustafaK99), [@&#8203;myk0la-b](https://github.com/myk0la-b), [@&#8203;mzkarami](https://github.com/mzkarami),
[@&#8203;n-leezy](https://github.com/n-leezy), [@&#8203;n1majne3](https://github.com/n1majne3), [@&#8203;NaMinhyeok](https://github.com/NaMinhyeok), [@&#8203;nanami7777777](https://github.com/nanami7777777), [@&#8203;nankingjing](https://github.com/nankingjing), [@&#8203;natebransc](https://github.com/natebransc), [@&#8203;nateEc](https://github.com/nateEc), [@&#8203;Navlem](https://github.com/Navlem), [@&#8203;nbxuhk](https://github.com/nbxuhk),
[@&#8203;nductien](https://github.com/nductien), [@&#8203;Ne0teric](https://github.com/Ne0teric), [@&#8203;NealZhouPanda](https://github.com/NealZhouPanda), [@&#8203;necoweb3](https://github.com/necoweb3), [@&#8203;negroni334](https://github.com/negroni334), [@&#8203;nftpoetrist](https://github.com/nftpoetrist), [@&#8203;nicochase](https://github.com/nicochase), [@&#8203;Nicolas-Formenton](https://github.com/Nicolas-Formenton),
[@&#8203;nicolasdmolina](https://github.com/nicolasdmolina), [@&#8203;nikitaBarkov](https://github.com/nikitaBarkov), [@&#8203;NikolaRHristov](https://github.com/NikolaRHristov), [@&#8203;noahingh](https://github.com/noahingh), [@&#8203;nolanchic](https://github.com/nolanchic), [@&#8203;NorethSea](https://github.com/NorethSea), [@&#8203;notkisk](https://github.com/notkisk), [@&#8203;notwitcheer](https://github.com/notwitcheer),
[@&#8203;NousResearch](https://github.com/NousResearch), [@&#8203;null-runner](https://github.com/null-runner), [@&#8203;ojassharma7](https://github.com/ojassharma7), [@&#8203;oliver-mee](https://github.com/oliver-mee), [@&#8203;olympusbuildz](https://github.com/olympusbuildz), [@&#8203;OmarB97](https://github.com/OmarB97), [@&#8203;ooiuuii](https://github.com/ooiuuii), [@&#8203;openclaww-xz](https://github.com/openclaww-xz),
[@&#8203;opti-josh-holt](https://github.com/opti-josh-holt), [@&#8203;osgeek90](https://github.com/osgeek90), [@&#8203;ousiaresearch](https://github.com/ousiaresearch), [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;Owen-narcissus](https://github.com/Owen-narcissus), [@&#8203;paoloantinori](https://github.com/paoloantinori), [@&#8203;Parker-Fawcett](https://github.com/Parker-Fawcett),
[@&#8203;pasevin](https://github.com/pasevin), [@&#8203;pasmud](https://github.com/pasmud), [@&#8203;PaulBlackSwan](https://github.com/PaulBlackSwan), [@&#8203;paultaki](https://github.com/paultaki), [@&#8203;peetteerr](https://github.com/peetteerr), [@&#8203;pefontana](https://github.com/pefontana), [@&#8203;Per0-1](https://github.com/Per0-1), [@&#8203;pierrenode](https://github.com/pierrenode), [@&#8203;PINKIIILQWQ](https://github.com/PINKIIILQWQ),
[@&#8203;pittosporum-seu](https://github.com/pittosporum-seu), [@&#8203;pju-hoge](https://github.com/pju-hoge), [@&#8203;plcunha](https://github.com/plcunha), [@&#8203;Pluviobyte](https://github.com/Pluviobyte), [@&#8203;pmos69](https://github.com/pmos69), [@&#8203;pnascimento9596](https://github.com/pnascimento9596), [@&#8203;poisdahl](https://github.com/poisdahl), [@&#8203;potatosalad](https://github.com/potatosalad),
[@&#8203;prashantjain25](https://github.com/prashantjain25), [@&#8203;PRATHAMESH75](https://github.com/PRATHAMESH75), [@&#8203;professorpalmer](https://github.com/professorpalmer), [@&#8203;projetsjsl](https://github.com/projetsjsl), [@&#8203;protas-box](https://github.com/protas-box), [@&#8203;qazasdsdqaza](https://github.com/qazasdsdqaza), [@&#8203;QDung210](https://github.com/QDung210),
[@&#8203;qixuancao](https://github.com/qixuancao), [@&#8203;QuarkAssistant](https://github.com/QuarkAssistant), [@&#8203;quocanh261997](https://github.com/quocanh261997), [@&#8203;ragingbulld](https://github.com/ragingbulld), [@&#8203;rainbowgore](https://github.com/rainbowgore), [@&#8203;rapsealk](https://github.com/rapsealk), [@&#8203;Raven26-VooDoo](https://github.com/Raven26-VooDoo),
[@&#8203;RaviTharuma](https://github.com/RaviTharuma), [@&#8203;RayCharlizard](https://github.com/RayCharlizard), [@&#8203;razultull](https://github.com/razultull), [@&#8203;re-ITRT](https://github.com/re-ITRT), [@&#8203;Reksely](https://github.com/Reksely), [@&#8203;RelaxJonh](https://github.com/RelaxJonh), [@&#8203;repfigit](https://github.com/repfigit), [@&#8203;RGerrish](https://github.com/RGerrish), [@&#8203;RibatTRW](https://github.com/RibatTRW),
[@&#8203;RichardGuan1](https://github.com/RichardGuan1), [@&#8203;RichardHojunJang](https://github.com/RichardHojunJang), [@&#8203;richardhowes](https://github.com/richardhowes), [@&#8203;RickyYii](https://github.com/RickyYii), [@&#8203;rikkarth](https://github.com/rikkarth), [@&#8203;rille111](https://github.com/rille111), [@&#8203;Ringo6107](https://github.com/Ringo6107), [@&#8203;rjhilgefort](https://github.com/rjhilgefort),
[@&#8203;rjvandeve](https://github.com/rjvandeve), [@&#8203;rkfshakti](https://github.com/rkfshakti), [@&#8203;rlaope](https://github.com/rlaope), [@&#8203;Rmohid](https://github.com/Rmohid), [@&#8203;rob-maron](https://github.com/rob-maron), [@&#8203;rodrigogs](https://github.com/rodrigogs), [@&#8203;royalaid](https://github.com/royalaid), [@&#8203;royzhrxy-glitch](https://github.com/royzhrxy-glitch), [@&#8203;rroverin](https://github.com/rroverin),
[@&#8203;rshi0212](https://github.com/rshi0212), [@&#8203;rsk-731](https://github.com/rsk-731), [@&#8203;rtcopenclawgh](https://github.com/rtcopenclawgh), [@&#8203;ruangraung](https://github.com/ruangraung), [@&#8203;rudrakshchahal](https://github.com/rudrakshchahal), [@&#8203;ruochu88s](https://github.com/ruochu88s), [@&#8203;rweddle](https://github.com/rweddle), [@&#8203;ryankhart](https://github.com/ryankhart), [@&#8203;S-Claw](https://github.com/S-Claw),
[@&#8203;Sahil-SS9](https://github.com/Sahil-SS9), [@&#8203;salch-cred](https://github.com/salch-cred), [@&#8203;sam7894604](https://github.com/sam7894604), [@&#8203;samclams](https://github.com/samclams), [@&#8203;saralilyb](https://github.com/saralilyb), [@&#8203;sashmatash](https://github.com/sashmatash), [@&#8203;sasquatch9818](https://github.com/sasquatch9818), [@&#8203;satotakumi](https://github.com/satotakumi),
[@&#8203;ScaleLeanChris](https://github.com/ScaleLeanChris), [@&#8203;SeashoreShi](https://github.com/SeashoreShi), [@&#8203;serefyarar](https://github.com…
dokterdok added a commit to dokterdok/hermes-agent that referenced this pull request Sep 1, 2026
Recreates the backend-only portions of NousResearch#94697 commits 8cb3e09d and 35b5d161 against post-NousResearch#96726 main. Explicit interrupt, Stop, session close, and backend shutdown remain authoritative.
dokterdok added a commit to dokterdok/hermes-agent that referenced this pull request Sep 1, 2026
Recreates the backend-only portions of NousResearch#94697 commits 8cb3e09d and 35b5d161 against post-NousResearch#96726 main. Explicit interrupt, Stop, session close, and backend shutdown remain authoritative.
dokterdok added a commit to dokterdok/hermes-agent that referenced this pull request Sep 3, 2026
Port the source-qualified watermark contract from NousResearch#93006 onto the post-NousResearch#96726 Bot Mode modules.

(cherry picked from commit 1751a32)
dokterdok added a commit to dokterdok/hermes-agent that referenced this pull request Sep 3, 2026
Port the successful-open acknowledgement boundary from NousResearch#93006 onto the post-NousResearch#96726 Bot Mode modules.

(cherry picked from commit 21e7e68)
melon-xf added a commit to melon-xf/hermes-agent that referenced this pull request Sep 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/config Config system, migrations, profiles area/i18n Localization, locales, translations area/profiles Multi-profile isolation, HERMES_HOME scoping comp/cli CLI entry point, hermes_cli/, setup wizard comp/desktop Electron desktop app (apps/desktop/*) needs-decision Awaiting maintainer decision before any implementation P3 Low — cosmetic, nice to have sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades sweeper:risk-session-state Sweeper risk: may lose/corrupt/mis-associate session or context state type/refactor Code restructuring, no behavior change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants