Commit Graph

32924 Commits

Author SHA1 Message Date
Teknium
78afbc3c37 fix(desktop): load property card guidance only on demand 2026-09-08 13:39:01 -07:00
Adolanium
ab6f4c5408 fix(desktop): show the focused bot's working think pose
Port Adolanium's focused-turn pose from Hermes-Bot-Mode#101 and
hermes-agent#88134 to the current typed Bot Mode implementation.
Match the busy signal's connection-qualified focused owner rather than
the gateway socket, retain worker activity, and ease transitions in
elapsed time on the existing shared face clock.

Includes owner-isolation and animated-pose invariants, both proven red
on origin/main, and native Electron before/after verification against
a real temporary Hermes backend with held loopback inference.

Co-authored-by: Teknium <127238744+teknium1@users.noreply.github.com>
2026-09-08 13:38:53 -07:00
Teknium
aa83c6d614 fix: hide inactive grouping options from delegation schema 2026-09-08 13:38:18 -07:00
Teknium
9d66e76c5d feat(desktop): let users order Group Chat rooms
Add Move up/down controls for actual rooms without changing bot or folder
ordering. Preserve default pin/activity ordering until an explicit move,
retain hidden room slots, and persist Desktop-local order through room
updates, mirror merges, and hydration. No membership or routing writes.

Adapted narrowly from the group ordering idea in archived
NousResearch/Hermes-Bot-Mode#105 by @onuraycicek; rename already exists.

Co-authored-by: Onur Aycicek <onur.m.aycicek@gmail.com>
2026-09-08 13:37:19 -07:00
Teknium
19cd839d54 fix(compression): keep lean tails lean after auxiliary feasibility
Lowering the session trigger must not replace the window-relative lean
selection budget with threshold times target_ratio. Invalidate the lean
cache through the existing property while preserving explicit legacy and
external-engine fallback behavior.

Narrow adaptation of the aux-sync diagnosis and invariants in #93576,
without adding a required recalibration method to context engines.
Related: #95681, #93576

Co-authored-by: Turgut Kural <58116817+TurgutKural@users.noreply.github.com>
2026-09-08 13:37:01 -07:00
Teknium
9d661c2c92 fix(prompt): keep memory guidance within available tools 2026-09-08 13:36:05 -07:00
Teknium
acbe72ed1f fix: keep Bot Mode pet selection rings inside the gallery 2026-09-08 13:35:51 -07:00
brooklyn!
3c0a84f94b chore: map MacBook-Air contributor email
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 15:35:19 -05:00
brooklyn!
be4bd24a50 fix(desktop): take Import session off the sidebar nav
The importer stays in the command palette. The labeled nav row was
clutter next to New session / Capabilities / Messaging.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 15:35:19 -05:00
brooklyn!
960dee7fe5 fix(desktop): Hide tabs works on the sessions sidebar
hideOnly chrome pinned the Sessions/Bots strip on at any tab count, so
never was a silent no-op. The panes stay; ⌘⌥T brings the strip back.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-08 15:35:19 -05:00
Teknium
9b0d75ce44 fix: gateway ordering test runs without root access 2026-09-08 13:25:54 -07:00
Teknium
b2aa855b62 fix(cli): open subagent monitor with the TUI Ctrl+T shortcut 2026-09-08 10:37:36 -07:00
Teknium
abd83ab560 fix(skills): make RSS and Reddit reading optional 2026-09-08 10:07:51 -07:00
kshitijk4poor
6f11a3296e refactor(gateway): wait on the target user's bus socket, not the generic control-socket predicate
_user_systemd_socket_ready() accepts systemd/private alone, which is enough for
systemctl --user but not for the systemd-run --user that restart-safe workers
need; systemd_user_bus_env() requires the bus socket. Replace the uid threading
through five helpers with one _wait_for_target_user_bus(uid) that polls
/run/user/<uid>/bus, and move the post-enable wait + restart hint out of
_ensure_linger_enabled into _ensure_system_service_linger so the activity probe
runs only when linger was actually just enabled. Kanban applies the bus env
unconditionally like the cron sibling. Refs #104893.
2026-09-08 22:35:39 +05:30
kshitijk4poor
4c4845f0af fix(gateway): order the system unit after the target user's manager
run_gateway() adopts the user bus once at boot; the generated system unit had
no ordering against user@<uid>.service, so after a reboot the two race and
the adoption can miss until the next gateway restart. Emit After=/Wants=
user@<uid>.service for the unit's User= (uid now returned by
_system_service_identity, which already resolved the account). Existing
system units are flagged outdated once and refreshed on the next
install/restart. Refs #104893.
2026-09-08 22:35:39 +05:30
ckomma
be9c2bd19c fix(cron): derive the user bus env per probe and scoped spawn
A system-level gateway unit has no ordering against user@<uid>.service and
linger may be enabled after boot, so the bus can appear after the one-shot
adoption in run_gateway() ran. Derive XDG_RUNTIME_DIR/DBUS_SESSION_BUS_ADDRESS
fresh for the availability probe and every scoped spawn (cron worker, Kanban
worker, PTY/pipe terminal spawns, scope cleanup) so the 60s failure TTL can
actually recover. Refs #104893.
2026-09-08 22:35:39 +05:30
joaomarcos
748e68432b fix(gateway): provision linger for system-service users
A system unit's `User=` has no login session on a headless host, so
user@<uid>.service never starts and `systemd-run --user --scope` — every
restart-safe cron/Kanban worker — has no bus to reach. `hermes gateway
install --system` runs as root and already knows the target user, so enable
linger for that user on fresh install, on an already-current unit, and on
repair.

- `get_systemd_linger_status()` / `_ensure_linger_enabled()` take the target
  username; root is included (restart-safe workers cross `systemd-run --user`
  regardless of who the gateway runs as).
- After `loginctl enable-linger` succeeds, wait for the TARGET uid's control
  socket (`_wait_for_user_dbus_socket(uid=...)`) — logind starts the user
  manager asynchronously and `--start-now` boots the gateway immediately; the
  caller's own env (root's) says nothing about it and is never adopted.
- Messages and the manual-remediation hint are scope-aware (`sudo systemctl
  restart`, not `systemctl --user`); when the repaired service is already
  active, say that a restart is required — `systemctl start` on an active
  unit is a no-op and the running gateway keeps its bus-less environment.

Refs #104893.
2026-09-08 22:35:39 +05:30
kshitijk4poor
59d1336473 chore: map ckomma contributor email 2026-09-08 22:35:39 +05:30
ethernet
c8aa5608c2 Merge pull request #101420 from ethernet8023/ethie/desktop-update-tests
test(install): cross-OS install/update E2E matrix (windows, macos, linux)
2026-09-08 10:30:44 -04:00
Teknium
a25967b434 test: keep Desktop pane-focus setup outside cold imports 2026-09-08 07:29:26 -07:00
kshitijk4poor
63ec22e797 fix: correct two stale comments/docs strings left out of the docs batch
The docs batch (#105782-#105787, tracking #105788) fixed the website docs but
flagged two in-code strays it could not touch:

- hermes_cli/tips.py:121 still said delegate_task "spawns up to 3 concurrent
  sub-agents"; the default has been 10 since the v33 config migration
  (config_defaults.py:1256, config_migrations.py:613).
- hermes_cli/config_defaults.py:1778 said "remote backends run per-call",
  contradicted by tools/code_kernel_remote.py (session kernels on remote
  backends, failing open to per-call only when the backend cannot spawn one)
  since #96991.

Comment-only changes: tips.py list entry updated, config_defaults.py comment
rewritten to match the actual kernel lifecycle. No behaviour change.

Validated: test_tips.py 6 passed; ruff, check-windows-footguns, and
check_compat_pointers all clean. Refs #105788 (crumb noted in the issue body).
2026-09-08 19:52:26 +05:30
hermes-seaeye[bot]
b3399c1396 fmt(js): npm run fix on merge (#105823)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-08 14:05:24 +00:00
hermes-seaeye[bot]
9a3f1dceba fmt(js): npm run fix on merge (#105818)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-08 13:59:05 +00:00
Teknium
a529ecfeb5 feat(desktop): nest profile sessions under gateway sections 2026-09-08 06:53:22 -07:00
Teknium
f6449ec37c docs: explain gateway session groups and saved Cloud switching 2026-09-08 06:53:22 -07:00
Teknium
6909604f97 fix(desktop): reuse saved Cloud gateways from Settings
Separate saved Cloud instances from the live window source, use the existing
registry activation path instead of repeating sign-in/apply, and persist the
chosen instance name while retaining registry identity and custom labels.

Naming metadata adapted from IAvecilla's contribution in PR #103224.

Co-authored-by: IAvecilla <ignacio.avecilla@lambdaclass.com>
2026-09-08 06:53:22 -07:00
Teknium
77a5457343 feat: organize desktop sessions by gateway and profile 2026-09-08 06:53:22 -07:00
witcheer
fb3446a281 docs: eight small accuracy fixes from open type/docs issues
Each fix verified against main @ ee84ccd on 2026-09-08.

- windows-native: the troubleshooting entry told users to set HERMES_GATEWAY_FORCE_STARTUP (no code reads it), query a task named HermesGateway (hermes_cli/gateway_windows.py names it Hermes_Gateway), and described the Startup-folder fallback as a cmd.exe shortcut (it writes a .vbs run via wscript.exe). Closes #88077.
- faq: 'hermes config set HERMES_MODEL ...' does not change the default model; 'model.default' does. Closes #65855.
- messaging/index, slash-commands, irc: gateway settings are read from ~/.hermes/config.yaml (gateway/config.py), not gateway-config.yaml. Closes #65857, closes #78276.
- telegram: reaction lifecycle is 👀 then 👍/👎 (plugins/platforms/telegram/adapter.py on_processing_complete), docs said ✅/❌. Closes #78698.
- plugins: bundled memory providers win on a name collision (plugins/memory/__init__.py docstring: bundled, user, project, entry point, first seen wins); the page said user plugins override. Model providers keep the documented last-writer-wins. Closes #100281.
- architecture, index: terminal backend count is seven (tools/terminal_tool.py: local, docker, singularity, modal, daytona, vercel_sandbox, ssh); two surfaces said six. Closes #78252.
- quickstart: the Portal quick path was called 'free'; the login is free, the inference is billed to the subscription. Wording now matches integrations/nous-portal. Closes #78254.
2026-09-08 19:00:02 +05:30
witcheer
f77dbc2440 docs(bot-mode): state that same-gateway Group Chats keep running after Desktop closes
Since v2026.8.31 (#99007 gateway-owned room authority, #99047 replica takeover, #99099 gateway-side turn driver) a room whose members all live on one gateway continues without any Desktop attached. The Bot Mode page carries the cross-machine and replication beats but never states this durability, so readers still assume the Desktop drives the room. Adds one bullet under Groups and group chats; groups.capabilities.driver flag per tui_gateway/methods_groups.py.
2026-09-08 18:59:38 +05:30
witcheer
7ae4acf369 docs(mcp): surface device-code login in the remote/headless hosts section
hermes mcp login --flow device (RFC 8628, #104891, v2026.9.7) is documented on reference/mcp-config-reference but the user-guide MCP page, where people land when the loopback callback cannot reach their browser, still lists only Desktop relay, paste-back, SSH forward and proxied redirect_uri. Adds one bullet with a link to the reference section.
2026-09-08 18:59:08 +05:30
witcheer
0268b70646 docs(code-execution): document the session kernel, reset, and stdout spillover
The code-execution page describes project vs strict mode, the minimal environment and the RPC channel, but never mentions that execute_code calls share a persistent per-session kernel (tools/code_kernel.py), that a timeout kills the kernel, that reset=true exists, or that stdout beyond 50 KB is spilled to cache/exec with the path returned (tools/code_execution_tool.py). Defaults from hermes_cli/config_defaults.py (kernel_idle_timeout 1800, max_session_kernels 4). Remote-backend kernel and fail-open per-call fallback from tools/code_kernel_remote.py.
2026-09-08 18:58:49 +05:30
witcheer
08ffadc930 docs(sessions): fix tip box that still says auto-prune ships disabled
The Automatic Cleanup section on the same page states that sessions.auto_prune is on by default (since #54189, default flipped to True in hermes_cli/config_defaults.py), while the tip box under the prune commands still said "auto-prune ships disabled. Enable it if...". A reader gets two answers from one page. Rewrites the tip to the shipped default and shows how to turn it off.
2026-09-08 18:58:21 +05:30
witcheer
bc1d1a2879 docs(delegation): update shipped defaults (250 iterations, 10 concurrent children) and document output_schema
The delegation page and the delegation-patterns guide still stated the pre-v2026.8.31 defaults (50 iterations, 3 concurrent subagents). Shipped values: DEFAULT_MAX_ITERATIONS = 250 (tools/delegate_tool.py) and max_concurrent_children: 10 (hermes_cli/config_defaults.py). The per-task output_schema contract (one bounded correction retry, schema_valid / schema_errors on the result) was not documented anywhere on the page. The Max Iterations section also showed max_iterations as a per-call argument; delegate_task ignores caller-supplied values and reads delegation.max_iterations from config.
2026-09-08 18:58:00 +05:30
unsupportedpastels
8aa219ef60 fix(desktop): expose plugin installation from settings 2026-09-08 05:23:59 -07:00
Teknium
13fb5e1ece test(browser): migrate pinned-profile fixtures to real SQLite 2026-09-08 05:10:57 -07:00
Teknium
58d6d5223a fix(browser): bound auth backups without replacing live SQLite files
Preserve Ben Barclay's diagnosis and replace the staging-file approach with
SQLite-coordinated writes and a five-second backup callback deadline. A
main-file replacement can replay an abandoned destination WAL; immutable
source reads can miss committed source WAL. Neither raw copy nor replacement
is safe when the destination is locked.

Refuse unavailable auth databases without raw-copy fallback, retaining the
existing close-browser-and-retry flow. Keep two invariant tests for lock
refusal/recovery and source-versus-destination WAL contents. Convert existing
text masquerading as database fixtures into real SQLite fixtures.

Related: #105754
Related: #96659
2026-09-08 05:10:57 -07:00
Ben Barclay
b4d7cf735d fix(browser): real-profile auth mirror hangs forever on a locked destination
A `browser_exec` call could park a thread in `sqlite3_sleep` permanently
while mirroring Chrome's auth DBs, holding the agent's turn open. The turn
never reaches its `finally`, so no `session.info running=false` settle is
emitted and the Desktop composer latches busy — every later message queues
and never sends. Captured live: one thread stuck 24+ minutes across two
dumps, turn accepted at 15:03 with no `tui turn finished` 46 minutes later.

Root cause is the DESTINATION, not the source. `Connection.backup()` retries
a busy destination internally and ignores the connection's busy timeout, so
`sqlite3.connect(dst, timeout=5)` cannot bound it. A destination left locked
by an earlier hung mirror therefore blocks the next mirror forever — and
because the tool-level 420s timeout abandons the thread without interrupting
a C-level lock wait, the lock is never released and every subsequent launch
re-hangs the same way. Self-perpetuating.

Two changes:

- Back up into a fresh `<dst>.new` and `os.replace()` it into place. No other
  process can hold a file we just created, so there is nothing to contend on,
  and the swap stays atomic. Measured against a live Chrome with a
  deliberately locked destination: 0.0006s vs an indefinite hang.
- Drop the `mode=ro` (no `immutable=1`) source fallback. 8e746668ba added
  `immutable=1` to fix exactly this hang but left `mode=ro` as a fallback,
  keeping the unbounded path one exception away; sqlite's busy timeout does
  not cover lock negotiation, so nothing bounds it. `immutable=1` is also the
  semantically correct mode — a committed snapshot of a file another process
  owns. The bounded plain-copy fallback is unchanged.

Tests: three regressions, all mutation-checked (fail on base, pass here).
The locked-destination test runs the copy on a worker with a join deadline so
the unfixed behaviour fails fast instead of hanging the suite. 199 passing
across the browser real-profile and CLI suites.
2026-09-08 05:10:57 -07:00
Teknium
ee84ccd8bd test: align gateway review acknowledgement with shared formatter 2026-09-08 04:38:47 -07:00
Teknium
9e048186a9 fix: make review workers recognizable in live subagent viewers 2026-09-08 04:38:47 -07:00
hermes-seaeye[bot]
d4d4ecfae0 fmt(js): npm run fix on merge (#105739)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-08 10:47:44 +00:00
Teknium
3863d13440 docs: describe one-line docks and consistent transcript controls 2026-09-08 03:42:08 -07:00
Teknium
0a3b7fdce2 fix: preserve Ink composer cursor across agent monitors 2026-09-08 03:42:08 -07:00
Teknium
f7fe32bfde feat: add compact Ink agent dock and Enter live tail 2026-09-08 03:42:08 -07:00
Teknium
34e539ebeb feat: collapse Classic CLI subagent dock with F7 2026-09-08 03:42:08 -07:00
Teknium
f3ccab1f60 test: define passive one-line subagent dock contract 2026-09-08 03:42:08 -07:00
Teknium
3dcf0deb29 test(desktop): adapt status-card regression to current router 2026-09-08 03:39:32 -07:00
Lester Liang
dec10c9177 fix(desktop): keep task status card opaque on scroll 2026-09-08 03:39:32 -07:00
hermes-seaeye[bot]
04b88a4c0a fmt(js): npm run fix on merge (#105732)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-08 10:17:46 +00:00
hermes-seaeye[bot]
7ee52894a7 fmt(js): npm run fix on merge (#105729)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-09-08 10:11:57 +00:00
Teknium
fb5715c19f fix: preserve subagent controls across attached session peers 2026-09-08 03:06:30 -07:00