Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
399 commits
Select commit Hold shift + click to select a range
f69e3aa
fix(auxiliary): refresh auto-routed provider credentials on 401
fanyangCS Jul 6, 2026
d42e9b1
fix(auxiliary): recover from stale fallback-candidate credentials ins…
teknium1 Jul 6, 2026
8f80a98
chore: add fanyangCS to AUTHOR_MAP
teknium1 Jul 6, 2026
91bcfff
Revert "docs(skills): tighten dynamic-workflow per donovan-yohan review"
teknium1 Jul 7, 2026
05cbddc
Revert "feat(skills): add dynamic-workflow orchestration skill"
teknium1 Jul 7, 2026
1c702aa
fix(agent): run Z.AI overload adaptive backoff on the overloaded path
xxxigm Jul 6, 2026
ba03c5a
test(retry): cover Z.AI overload retry ceiling reachability
xxxigm Jul 6, 2026
45f5a6e
refactor(retry): single-source Z.AI overload short-attempts + drop ch…
kshitijk4poor Jul 7, 2026
b2213ba
fix: fetch Codex quota from credential pool
spiky02plateau May 26, 2026
c59b300
test: lock Codex usage percent polarity
spiky02plateau May 26, 2026
130e233
fix(usage): scope Codex usage pool fallback to AuthError, keep single…
kshitijk4poor Jul 7, 2026
ef599aa
chore: map spiky02plateau in AUTHOR_MAP for #32824 salvage
kshitijk4poor Jul 7, 2026
586aae4
Merge pull request #60034 from kshitijk4poor/salvage/59523-zai-overlo…
kshitijk4poor Jul 7, 2026
536ffed
feat(docker): re-seed a terminally-dead Nous bootstrap session on boo…
benbarclay Jul 7, 2026
444dc0d
feat(auth): log forensic detail at Nous quarantine so terminal auth d…
benbarclay Jul 7, 2026
1822562
test: drop worktree-path sanity guard that fails in CI
benbarclay Jul 7, 2026
5eac665
feat(status): expose nous_session_valid on /api/status for hosted-age…
benbarclay Jul 7, 2026
2726c21
feat(display): show file_path in skill_view tool progress lines (#60079)
teknium1 Jul 7, 2026
d297568
fix(gateway): detect config token credential collisions (#59321)
teknium1 Jul 7, 2026
f1fde49
fix(gateway): avoid cross-profile session recovery (#59325)
teknium1 Jul 7, 2026
088b989
fix(gateway): scope reset banners' session info to the serving profil…
teknium1 Jul 7, 2026
249c69b
fix(gateway): per-profile pairing whitelist isolation in multiplex mo…
teknium1 Jul 7, 2026
76979a0
fix(auth): per-profile Anthropic OAuth file + complete port-binding p…
teknium1 Jul 7, 2026
4b9d9b2
fix(dashboard): use loopback host for in-container WebSocket client (…
benbarclay Jul 7, 2026
043e71f
fix(gateway): use process-level HERMES_HOME for identity files (#5699…
teknium1 Jul 7, 2026
ae878e1
fix(state): set active=1 explicitly in message INSERTs (#51646)
HexLab98 Jul 6, 2026
7445df1
test(state): cover explicit active=1 on message INSERT (#51646)
HexLab98 Jul 6, 2026
b75783e
fix(state): heal NULL active rows on every startup, not just pre-v12 DBs
kshitijk4poor Jul 7, 2026
11516f3
perf: partial index so the startup NULL-active repair skips the table…
kshitijk4poor Jul 7, 2026
33a5295
fix(gateway): strip stale dangerous-confirmation text in user message…
knoal Jul 6, 2026
e7a6d67
fix: redact expired confirmations in place to preserve role alternation
kshitijk4poor Jul 7, 2026
6d3d9d0
fix: drop timestamp in handle_max_iterations' hand-built api_messages
kshitijk4poor Jul 7, 2026
07d9341
fix: default memory null target to memory store (#46356)
teknium1 Jul 7, 2026
6297206
fix(cron): normalize absolute skill paths before skill_view (#59824)
HexLab98 Jul 6, 2026
e7082ea
test(cron): cover absolute skill path normalization (#59824)
HexLab98 Jul 6, 2026
713e50e
fix: normalize against tools.skills_tool.SKILLS_DIR, the root skill_v…
kshitijk4poor Jul 7, 2026
2c5762f
chore: debug log for untrusted absolute skill paths; drop misleading …
kshitijk4poor Jul 7, 2026
3c8130a
fix: re-apply confirmation expiry on the cached-agent live-history path
kshitijk4poor Jul 7, 2026
8a7d079
fix: merge split gateway pairing stores
williamumu May 23, 2026
179ca25
chore: add williamumu to AUTHOR_MAP for PR #31041 salvage
teknium1 Jul 5, 2026
2e30a5e
fix: prevent /stop signal loss and empty provider credential corruption
isheng-eqi Jul 7, 2026
c2c7360
test: set pool.provider= on mocks to avoid MagicMock truthy guard tri…
isheng-eqi Jul 7, 2026
144457d
fix(interrupt): extend post-worker /stop guard to Bedrock streaming path
kshitijk4poor Jul 7, 2026
fc02b1c
refactor(cli): simplify safe-mode startup wiring
teknium1 Jun 13, 2026
299d5c6
fix(cli): safe mode also skips shell-hook registration
teknium1 Jul 7, 2026
c0adfd4
feat(desktop): render Mermaid code blocks in markdown file preview
teknium1 Jul 6, 2026
7ff86f4
refactor(desktop): route preview-pane mermaid fences through shared e…
teknium1 Jul 7, 2026
a796e0b
fix: cool down transient Telegram typing failures (#46355)
teknium1 Jul 7, 2026
8fc1cb7
fix: repair URL authority whitespace before web fetches (#46363)
teknium1 Jul 7, 2026
d1c8c03
feat(agent): add Codex-native compaction paths
hmirin Jun 27, 2026
87b65e2
refactor(compression): scope Codex-native compaction to the app-serve…
teknium1 Jul 7, 2026
b8ce583
fix(discord): bound REST response reads
ooiuuii Jun 29, 2026
87be36c
fix(discord): bound component labels by UTF-16 units
ooiuuii Jun 29, 2026
e0bca1c
fix(discord): bound standalone response reads
ooiuuii Jun 29, 2026
f341cad
refactor(discord): detect streaming bodies structurally, not by mock-…
teknium1 Jul 7, 2026
7647eff
Merge pull request #60117 from kshitijk4poor/fix/59607-cached-agent-e…
kshitijk4poor Jul 7, 2026
ce038a0
fix(schema): preserve multi-type arrays as anyOf instead of dropping …
teknium1 Jun 19, 2026
4aaaa20
fix(telegram): add timeout to start_polling() in network error handler
liuhao1024 Jul 6, 2026
aaeba21
fix(telegram): bound start_polling() at bootstrap and conflict-retry …
kshitijk4poor Jul 7, 2026
2718179
fix(docs): discord permissions (add Create Public Threads, remove Use…
Jun 6, 2026
b2c6668
chore: add flo1t to AUTHOR_MAP
teknium1 Jul 7, 2026
569b78c
fix(setup): bootstrap pip with ensurepip when not available in venv b…
ygd58 Mar 25, 2026
ba865e4
refactor(setup): route dependency installs through the canonical uv→p…
teknium1 Jul 7, 2026
9420f1a
test(google_meet): assert ladder-based dependency install instead of …
teknium1 Jul 7, 2026
b899ffd
test(e2e): stub reset-notice session info to deflake test_new_resets_…
teknium1 Jul 7, 2026
9c272a3
feat(gateway): default session auto-reset to off (mode: none) (#60194)
teknium1 Jul 7, 2026
0d9ed92
Add semantic titles for Discord auto-threads
rungmc357 Jul 2, 2026
1deeaf7
fix(discord): truncate thread titles by UTF-16 units + AUTHOR_MAP
teknium1 Jul 7, 2026
4916897
feat: add uninstall dry-run mode
teknium1 Jun 15, 2026
f8723c4
fix(skills): resolve skills dir from active profile
jplew Jul 1, 2026
4a99571
fix(tui): pass profile_home to slash_worker subprocess for profile-lo…
iamlukethedev Jun 7, 2026
c6a3d41
fix(skills): widen call-time skills-dir resolution to skill_manager_tool
teknium1 Jul 7, 2026
4f6313e
test(tui): accept profile_home kwarg in _FakeWorker doubles
teknium1 Jul 7, 2026
a1e6ea7
fix(tools): keep shell snapshots owner-only
egilewski Jul 1, 2026
685f527
chore: add andrewhomeyer to AUTHOR_MAP (co-author on snapshot perms s…
teknium1 Jul 7, 2026
afb5808
feat(discord): make interactive view timeout configurable (#60230)
teknium1 Jul 7, 2026
cc0aa18
feat(kanban): add grab-to-pan board scrolling
vampyren Jul 7, 2026
3c63ed3
chore: add vampyren to AUTHOR_MAP (PR #59830 salvage)
teknium1 Jul 7, 2026
2acbdd1
fix(discord): include approval command in message content
jakepresent Jun 25, 2026
009b42d
fix(discord): mirror all interactive prompt payloads into message con…
teknium1 Jul 7, 2026
2bc6e1a
fix(installer): put node.exe on PATH for Windows npm lifecycle scripts
HexLab98 Jul 7, 2026
8ff162f
test(installer): guard Ensure-NodeExeOnPath wiring in install.ps1
HexLab98 Jul 7, 2026
d33becd
fix(gateway): demote PRIORITY-path interrupt to queue during compress…
pierrenode Jul 7, 2026
1c473bc
Merge pull request #60291 from HexLab98/fix/windows-installer-node-pa…
OutThisLife Jul 7, 2026
4ca6186
docs: sharpen bypass comment per review
kshitijk4poor Jul 7, 2026
2e42bb2
Merge pull request #60448 from kshitijk4poor/chore/59607-comment-prec…
kshitijk4poor Jul 7, 2026
91885a3
feat(sessions): export sessions to markdown
web3blind Jul 6, 2026
f3c27e3
refactor(sessions): fold Markdown/QMD export into 'sessions export --…
teknium1 Jul 7, 2026
51dd569
docs(i18n): add zh-Hans docs for Markdown/QMD session export
teknium1 Jul 7, 2026
acfefa4
feat(sessions): full prune-filter set + --redact on sessions export
teknium1 Jul 7, 2026
b9d9b8a
fix(discord): handle expired slash defer interactions
Alix-007 May 28, 2026
4c3a388
fix(discord): widen expired-defer handling to /thread slash command
teknium1 Jul 7, 2026
8ce3c2f
feat(desktop): add UI scale setting to appearance settings
Adolanium Jul 7, 2026
ee66ff2
chore(desktop): drop PR screenshot assets from tree
teknium1 Jul 7, 2026
985e19c
fix(agent): add cross-turn stream-stale circuit breaker (#58962)
necoweb3 Jul 7, 2026
2985d16
fix: reset stream-stale breaker on model switch and fallback activation
kshitijk4poor Jul 7, 2026
437052f
docs: document HERMES_STREAM_STALE_GIVEUP alongside sibling stream knobs
kshitijk4poor Jul 7, 2026
d43863f
fix: widen stale circuit breaker to non-streaming path + all provider…
kshitijk4poor Jul 7, 2026
fa65137
fix(bedrock): route non-Claude auxiliary models through Converse API
xxxigm Jul 7, 2026
e9da629
test(bedrock): cover auxiliary Converse routing for non-Claude models
xxxigm Jul 7, 2026
b2d6a51
fix: normalize string stop + surface dropped stream/tool_choice in Co…
kshitijk4poor Jul 7, 2026
2a14205
feat(mem0): self-hosted dashboard backend + recall tuning (salvage #5…
kartik-mem0 Jul 2, 2026
53edf6f
fix(mem0): make prompt label + platform setup honor host routing prec…
kshitijk4poor Jul 2, 2026
9a32272
fix(mem0): prune dead get_all, wire rerank config default, warn on ME…
kshitijk4poor Jul 7, 2026
b598f8e
feat: add prompt-only session export
catbearlove1-lang Jul 3, 2026
a80e5e7
feat(cli): add standalone HTML session export with sidebar navigation
simplast May 22, 2026
49dd0b1
feat(cli): include system prompts in HTML export
simplast May 23, 2026
a730156
feat(cli): redesign system prompt display as dedicated header section
simplast May 23, 2026
271130a
feat(cli): expand system prompt by default in HTML export
simplast May 23, 2026
4bd6fce
fix(cli): fix layout width bug and ensure system prompt header is used
simplast May 23, 2026
ab07e06
style(export): restore width: 0 for multi-session flex layout
simplast May 23, 2026
b172e03
feat(cli): filter internal session_meta messages from HTML export
simplast May 23, 2026
f76899f
feat(sessions): wire html + prompt-only formats into 'sessions export'
teknium1 Jul 7, 2026
e0176cb
feat(discord): optionally mention approval owners on exec prompts
alex107ivanov Jul 7, 2026
94b4ac1
chore: add alex107ivanov to AUTHOR_MAP
teknium1 Jul 7, 2026
b1500af
fix: restore cli-config.yaml.example from main (stale-branch version …
teknium1 Jul 7, 2026
b428920
fix(web-server): close OAuth token TOCTOU by writing 0o600 atomically
Que0x Jul 4, 2026
5e51b12
feat(mem0): add self-hosted mode to the setup wizard
teknium1 Jul 7, 2026
0e04d14
feat(sessions): trace export + HF upload via 'sessions export --forma…
teknium1 Jul 7, 2026
37a4cf9
fix: limit desktop model pickers to explicit providers
rarf Jul 2, 2026
a0b14a3
chore: map Ronald contributor email
rarf Jul 2, 2026
f304f41
fix: harden explicit-provider gate for stale env-seeded pool entries …
teknium1 Jul 7, 2026
36308f0
feat(plugins): pass approve rule keys to approval gate
doncazper Jul 5, 2026
117f49b
fix(approval): wire gateway notify round-trip into the plugin escalat…
teknium1 Jul 7, 2026
d5a5ea8
chore: add doncazper to AUTHOR_MAP
teknium1 Jul 7, 2026
0ecfbc9
feat(pty): RingBuffer for keep-alive output capture
TinkerOfThings Jun 21, 2026
e5ac169
feat(pty): PtySession drain/attach/detach with EOF close 4410
TinkerOfThings Jun 21, 2026
41166bb
feat(pty): PtySessionRegistry with reap + capacity
TinkerOfThings Jun 21, 2026
e10e4bc
feat(chat): reattach /api/pty sessions via ?attach= token
TinkerOfThings Jun 21, 2026
c3d2be0
feat(pty): periodic reaper wired into dashboard lifespan
TinkerOfThings Jun 21, 2026
79f4f78
feat(chat): persist attach token, reconnect on transient close
TinkerOfThings Jun 21, 2026
086596c
fix(mcp): reap orphaned subprocesses before spawning new ones on retry
liuhao1024 Jul 2, 2026
f99e9f0
fix(mcp): reap stdio orphans before reconnect
tianma-if Jul 4, 2026
743c116
fix(mcp): unify reconnect orphan reaping + move off the event loop
teknium1 Jul 7, 2026
1f6836c
fix(mcp): bound stdio initialize handshake to stop subprocess/FD leak
rainbowgore Jul 6, 2026
4638f3b
fix(mcp): widen #59349 handshake bound to HTTP transports + cancel ab…
teknium1 Jul 7, 2026
5089c84
fix(mcp): reap orphaned stdio MCP children on ungraceful parent death
Jul 7, 2026
86c5feb
fix(mcp): watchdog wrap after OSV preflight + forward SIGTERM to chil…
teknium1 Jul 7, 2026
6c731fe
Recycle idle MCP stdio servers
harjothkhara Jun 8, 2026
ea0b42c
Handle minimal MCP server fakes
harjothkhara Jun 8, 2026
bae3954
chore(release): map rainbowgore + thestudionorth in AUTHOR_MAP for MC…
teknium1 Jul 7, 2026
a620383
docs(mcp): document idle_timeout_seconds / max_lifetime_seconds recyc…
teknium1 Jul 7, 2026
2d4fd1d
test(mcp): unblock recycle-reconnect test from the parked self-probe …
teknium1 Jul 7, 2026
838d504
fix(mcp): guard POSIX-only kill primitives in stdio watchdog for the …
teknium1 Jul 7, 2026
b062083
feat(dashboard): report profile + gateway topology in /api/status (#6…
teknium1 Jul 7, 2026
8a726e9
fix(tools): enable platform-native toolsets when their composite is e…
Tranquil-Flow Jul 1, 2026
551f001
docs(sessions): unify export docs under one overview section (#60554)
teknium1 Jul 7, 2026
c3808cf
fix(discord): honor pairing grants for message auth
BROCCOLO1D Jul 3, 2026
3e7ade4
fix(discord): explain fail-closed allowlist default
yungchentang Jul 7, 2026
db9e3e4
docs(discord): troubleshoot silent fail-closed denials
teknium1 Jul 7, 2026
6ca3d70
fix(gateway): only session-discover channel targets for connected pla…
teknium1 Jul 8, 2026
0263f1d
Fix delegation config precedence
shannonsands Jul 7, 2026
bf76391
Use read-only config loader and honor HERMES_IGNORE_USER_CONFIG in de…
shannonsands Jul 7, 2026
5633fa1
fix(dashboard): advertise truecolor to the embedded chat TUI (#60576)
teknium1 Jul 8, 2026
8d66e78
feat(dashboard): expose profile names + gateway_mode on gated /api/st…
benbarclay Jul 8, 2026
4e4a69c
feat(relay): carry routed profile from the connector wire source (#60…
benbarclay Jul 8, 2026
4b184cb
Add dashboard memory provider switching
shannonsands Jul 3, 2026
d9a4b5a
fix: validate memory provider names before filesystem lookup and setu…
teknium1 Jul 8, 2026
75de005
feat(gateway): GATEWAY_MULTIPLEX_PROFILES env override for multiplex …
benbarclay Jul 8, 2026
543f069
Fix dashboard chat model profile scoping
shannonsands Jun 22, 2026
6015ee5
fix: pass profile-scoped SessionDB to _session_latest_descendant in d…
teknium1 Jul 7, 2026
4f620a0
Add WhatsApp dashboard pairing flow
shannonsands Jul 2, 2026
f9eca7e
chore: release v0.18.1 (2026.7.7) (#60595)
teknium1 Jul 8, 2026
c30c975
fix(whatsapp): unpin Baileys from git commit, use published 7.0.0-rc1…
teknium1 Jul 8, 2026
9de9c25
chore: release v0.18.2 (2026.7.7.2) (#60651)
teknium1 Jul 8, 2026
4d7f8ad
feat(install): warn pip/Homebrew installs are unsupported (CLI, TUI, …
ethernet8023 Jul 8, 2026
2e1982f
Fail closed on invalid JSON/YAML/TOML writes instead of writing then …
neoguyverx Jul 7, 2026
6695640
fix(tools): make the YAML write gate syntax-only so multi-doc/tagged …
teknium1 Jul 8, 2026
a208b7e
chore: add AUTHOR_MAP entry for neoguyverx (PR #60526 salvage)
teknium1 Jul 8, 2026
862aee4
fix(gateway): drain in-flight cron jobs before shutdown tool kill
HexLab98 Jul 8, 2026
e6077af
test(gateway): cover cron drain during gateway shutdown (#60432)
HexLab98 Jul 8, 2026
24e9ed7
fix(gateway,cron): make shutdown drain visible to in-flight cron work
JoaoMarcos44 Jul 8, 2026
8a573bb
fix(cron): stop interrupted jobs from delivering their pre-kill output
JoaoMarcos44 Jul 8, 2026
ecc6725
fix(gateway,cron): reconcile #60612 + #60631 onto one drain surface
teknium1 Jul 8, 2026
f5ef7ee
fix(tui): prevent ws_orphan_reap from ending gateway-originated sessions
AIalliAI Jul 8, 2026
4878803
fix(tui): derive gateway-owned sources from the Platform enum, not a …
teknium1 Jul 8, 2026
f64e4f4
feat(gateway): generic OIDC client-credentials relay provisioning (NA…
benbarclay Jul 8, 2026
832c5f9
Fix slow Z.AI startup by caching auto-detected endpoint to disk
veradim Jun 7, 2026
c75e1d1
chore: add veradim to AUTHOR_MAP for PR #41201 salvage
kshitijk4poor Jul 8, 2026
6eeed3f
fix: don't flip active_provider when caching Z.AI probe result
kshitijk4poor Jul 8, 2026
1192f29
fix: Z.AI endpoint persist failure must not break URL resolution
kshitijk4poor Jul 8, 2026
7ecc822
fix(cron): stop the ticker from stalling forever on a wedged jobs loc…
teknium1 Jul 8, 2026
98804db
fix(tui_gateway): back off notification poller when session is busy
SiteupAgencia Jul 3, 2026
5413c42
chore: add SiteupAgencia to AUTHOR_MAP for #57435 salvage
teknium1 Jul 8, 2026
465cbe8
test(tools): add unit tests for skill_gist
waroffchange Jul 8, 2026
ac6dd59
fix(agent): tag desktop chat sessions as desktop
fyzanshaik Jul 4, 2026
aab351b
fix(delegation): route async results to origin session
dschnurbusch Jul 6, 2026
4b27be1
fix(delegation): fail-closed orphan handling + session-scoped delegat…
teknium1 Jul 8, 2026
b64b802
feat(models): swap curated Tencent Hy3 Preview for GA tencent/hy3, dr…
teknium1 Jul 8, 2026
ee0b54e
docs(i18n): align translated CONTRIBUTING files with pyproject Python…
waroffchange Jul 8, 2026
5057f03
docs(i18n): align translated CONTRIBUTING files with pyproject Python…
waroffchange Jul 8, 2026
f75f3cd
fix(delegation): route async delegate_task results back to originatin…
asimons81 Jul 5, 2026
6537239
fix(delegation): positive-proof ownership for the post-turn drain
teknium1 Jul 8, 2026
c0fbee9
fix(desktop): register /compress command in TUI gateway dispatch so D…
kyssta-exe Jul 8, 2026
7e3986a
fix(tui): route /compress and /compact past the slash worker to comma…
teknium1 Jul 8, 2026
e10c8eb
fix(whatsapp): use windows_detach_popen_kwargs to prevent console win…
kyssta-exe Jul 8, 2026
efb226b
fix(cli): preserve chat -q answer by gating exit-summary screen clear…
Tranquil-Flow Jun 26, 2026
58e1647
test(cli): update FakeCLI._print_exit_summary for new clear_screen kwarg
teknium1 Jul 8, 2026
63c4100
perf(yuanbao): bounded-concurrency inbound media resolve
Jun 16, 2026
b848fcb
feat(Yuanbao) optimizes media resource processing speed: parallel dow…
Jul 8, 2026
d39c624
fix(delegate): pin async completion to spawning parent session (#57498)
nankingjing Jul 3, 2026
75efd73
fix(gateway): never resurrect ended sessions for delegation completio…
teknium1 Jul 8, 2026
0cf2e39
feat(gateway): add webhook payload filters
uwuira Jul 3, 2026
ae5e390
fix(gateway): run webhook route scripts off the event loop + AUTHOR_M…
teknium1 Jul 8, 2026
8e73481
fix(desktop): continue the selected stored session instead of minting…
teknium1 Jul 8, 2026
76381e2
fix(compression): stop compaction thrash — 75% trigger floor under 51…
teknium1 Jul 8, 2026
aabfedc
docs(webhook): complete filters + route-scripts coverage across doc s…
teknium1 Jul 8, 2026
62ada51
feat(xai): add grok-4.5 (GA) to model catalog, context lengths, and r…
teknium1 Jul 8, 2026
d6a275b
fix(gateway): compact hygiene transcripts in place
nullptr0807 Jul 8, 2026
4d611ba
chore: AUTHOR_MAP entry for nullptr0807 (PR #60956 salvage)
teknium1 Jul 8, 2026
9a4341a
fix(dashboard): keep status responsive when session db locks
tianma-if Jul 4, 2026
346e567
🐛 fix(dashboard): offload cron profile scans
BlackishGreen33 Jun 13, 2026
49fa04a
🐛 fix(dashboard): use managed cron threadpool
BlackishGreen33 Jun 13, 2026
7d0ddbb
fix(dashboard): cache gateway PID status probes
0disoft Jun 27, 2026
492be28
fix(web): bound dashboard action log tails
ooiuuii Jul 4, 2026
d7e4d94
perf(dashboard): recursive-CTE descendant lookup in _session_latest_d…
sebastianlutycz Jul 8, 2026
24d5bda
fix(dashboard): run GET /api/sessions session-DB read off the event loop
0-CYBERDYNE-SYSTEMS-0 Jul 8, 2026
206c042
chore: AUTHOR_MAP entries for salvaged contributors (#53511/#53966/#3…
kshitijk4poor Jul 8, 2026
1e2ad17
fix: descendant CTE must dedup (UNION) to survive parent-chain cycles
kshitijk4poor Jul 8, 2026
664878b
fix: guard /api/status active count against missing state.db
kshitijk4poor Jul 8, 2026
c95cf31
test: patch the cached PID probe name in profile-unification status t…
kshitijk4poor Jul 8, 2026
0d5549a
fix(api): add pagination to GET /api/sessions/{id}/messages
mahdiwafy Jul 7, 2026
4df16c4
Refresh on upstream/main: resolve conflicts (no behavior change)
Jul 5, 2026
22eb1af
perf(state): add compact_rows to skip system_prompt blob in session l…
CodeForgeNet Jun 16, 2026
4f220fc
fix: follow-up for salvaged #60347/#43653/#47437
kshitijk4poor Jul 8, 2026
7570bb4
fix: offset-without-limit was silently ignored in get_messages
kshitijk4poor Jul 8, 2026
7a25017
test: accept compact_rows kwarg in tui_gateway session fakes
kshitijk4poor Jul 8, 2026
31e39de
test: expect compact_rows in the read-only status-count fake
kshitijk4poor Jul 8, 2026
0569a63
fix(agent): guard response.text access in _summarize_api_error agains…
gauravsaxena1997 Jul 8, 2026
1792a3a
chore: add gauravsaxena1997 to AUTHOR_MAP (PR #59868 salvage)
kshitijk4poor Jul 8, 2026
74e28f7
style(tests): merge import blocks in test_summarize_api_error
kshitijk4poor Jul 8, 2026
be1346c
fix(gateway): reload fallback_providers on live agent create/reuse
HexLab98 Jul 8, 2026
e721ad8
test(gateway): cover fallback_providers reload for live sessions
HexLab98 Jul 8, 2026
0a01b20
fix(gateway): harden fallback-chain refresh from review findings
kshitijk4poor Jul 8, 2026
e21ba91
perf(skills): speed up snapshot prompt builds
dexhunter Jul 7, 2026
449706c
chore: add dexhunter to AUTHOR_MAP (PR #60339 salvage)
kshitijk4poor Jul 8, 2026
2a29331
fix: run CLI new-session memory flush off-thread
Tosko4 Jul 5, 2026
d8bc4f2
fix: serialize /new end→switch boundary on the memory manager worker
kshitijk4poor Jul 8, 2026
e0ed5dc
refactor: address Phase-2 review findings on /new boundary handoff
kshitijk4poor Jul 8, 2026
6d65210
feat(desktop): group tool calls across text-less assistant messages
OutThisLife Jul 8, 2026
fac8551
Merge pull request #61147 from NousResearch/bb/desktop-tool-window-merge
OutThisLife Jul 8, 2026
39d0945
feat(desktop): ts-ify everything
ethernet8023 Jun 29, 2026
7a65530
fix(js): set @types/node to node 22, what's required in "engines"
ethernet8023 Jul 3, 2026
56a8e81
cleanup(desktop): `npm run fix` for fmtting
ethernet8023 Jul 8, 2026
513dba4
chore(models): drop x-ai/grok-4.3 from OpenRouter/Nous curated lists …
teknium1 Jul 9, 2026
bf913ab
fix(desktop): stop using tsx to boot Electron main in dev
OutThisLife Jul 9, 2026
88a58ff
Merge pull request #61277 from NousResearch/bb/fix-desktop-tsx-electr…
OutThisLife Jul 9, 2026
2806321
hermes_cli: register groq as a recognized provider
bbasketballer75 Jul 9, 2026
68e08f5
WIP: local Windows fixes, Cloudflare Tunnel host allowlist, safe_subp…
bbasketballer75 Jul 9, 2026
c273240
hermes_cli: add nssm_truth helper for service-state-vs-reality checks
Jul 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .envrc
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
watch_file pyproject.toml uv.lock
watch_file pyproject.toml uv.lock hermes
watch_file package-lock.json package.json web/package.json ui-tui/package.json website/package.json apps/shared/package.json apps/desktop/package.json ui-tui/packages/hermes-ink/package.json
watch_file flake.nix flake.lock nix/devShell.nix nix/tui.nix nix/package.nix nix/python.nix nix/hermes-agent.nix nix/desktop.nix

Expand Down
11 changes: 9 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -221,10 +221,17 @@ jobs:

- name: Save baseline cache (main only)
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
run: cp ci-timings.json ci-timings-baseline.json
run: |
# Degraded runs (API rate-limited) produce no ci-timings.json —
# skip rather than fail, and never cache an empty baseline.
if [ -f ci-timings.json ]; then
cp ci-timings.json ci-timings-baseline.json
else
echo "No timings JSON this run — skipping baseline update"
fi

- name: Upload baseline to cache (main only)
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
if: github.event_name == 'push' && github.ref == 'refs/heads/main' && hashFiles('ci-timings-baseline.json') != ''
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: ci-timings-baseline.json
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ __pycache__/
.venv
.vscode/
.env
.op.env
.env.local
.env.development.local
.env.test.local
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,7 @@ The dashboard embeds the real `hermes --tui` — **not** a rewrite. See `hermes

### Electron Desktop Chat App (`apps/desktop/`)

A **separate** chat surface from both the classic CLI and the dashboard's embedded TUI. It is an Electron + React + nanostore renderer (`@assistant-ui/react`) that talks to a `tui_gateway` backend over JSON-RPC (`requestGateway(method, params)`). The WebSocket/JSON-RPC transport lives in the framework-agnostic `apps/shared` package (`@hermes/shared` — `JsonRpcGatewayClient` + WS URL helpers), which the web dashboard (`web/`) also consumes; **desktop has no build/runtime dependency on the dashboard frontend** — it spawns a headless `hermes serve` backend server (the same gateway `dashboard` serves, minus the browser UI). `dashboard` and `serve` share `cmd_dashboard`/`start_server` but are independent surfaces — neither launches the other. The one exception is a backward-compat *fallback*: `serve` is newer, so the desktop spawn (`electron/backend-command.cjs` + `backendSupportsServe()` in `main.cjs`) detects whether the resolved runtime registers `serve` and, only when it does not (an older managed install / PATH `hermes` the app hasn't updated yet), rewrites the argv to the legacy `dashboard --no-open`. Without that, a new app against an un-upgraded runtime would crash on an unknown subcommand and brick every mid-upgrade user. It does NOT embed `hermes --tui` — it has its own composer, transcript, and slash-command pipeline. Route desktop bugs to the `hermes-desktop-app-work` skill, not `hermes-dashboard-work`.
A **separate** chat surface from both the classic CLI and the dashboard's embedded TUI. It is an Electron + React + nanostore renderer (`@assistant-ui/react`) that talks to a `tui_gateway` backend over JSON-RPC (`requestGateway(method, params)`). The WebSocket/JSON-RPC transport lives in the framework-agnostic `apps/shared` package (`@hermes/shared` — `JsonRpcGatewayClient` + WS URL helpers), which the web dashboard (`web/`) also consumes; **desktop has no build/runtime dependency on the dashboard frontend** — it spawns a headless `hermes serve` backend server (the same gateway `dashboard` serves, minus the browser UI entirely: `serve` sets `headless_backend=True`, so `cmd_dashboard` skips `_build_web_ui` AND exports `HERMES_SERVE_HEADLESS=1` so `mount_spa()` disables the SPA even if a stray `web_dist/` exists — only the JSON-RPC/WS/API surface is reachable). `dashboard` and `serve` share `cmd_dashboard`/`start_server` but are independent surfaces — neither launches the other. The one exception is a backward-compat *fallback*: `serve` is newer, so the desktop spawn (`electron/backend-command.cjs` + `backendSupportsServe()` in `main.cjs`) detects whether the resolved runtime registers `serve` and, only when it does not (an older managed install / PATH `hermes` the app hasn't updated yet), rewrites the argv to the legacy `dashboard --no-open`. Without that, a new app against an un-upgraded runtime would crash on an unknown subcommand and brick every mid-upgrade user. It does NOT embed `hermes --tui` — it has its own composer, transcript, and slash-command pipeline. Route desktop bugs to the `hermes-desktop-app-work` skill, not `hermes-dashboard-work`.

**Slash commands in the desktop app are curated client-side, then dispatched to the backend.** The pipeline:

Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.es.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ Esto no es una barra de calidad — es una decisión de acoplamiento y mantenimi
| Requisito | Notas |
|-----------|-------|
| **Git** | Con la extensión `git-lfs` instalada |
| **Python 3.11+** | uv lo instalará si falta |
| **Python 3.11–3.13** | uv lo instalará si falta |
| **uv** | Gestor de paquetes Python rápido ([instalar](https://docs.astral.sh/uv/)) |
| **Node.js 20+** | Opcional — necesario para herramientas de navegador y puente WhatsApp (coincide con los engines de `package.json` raíz) |

Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ A well-built third-party-product plugin can clear automated review and still be
| Requirement | Notes |
|-------------|-------|
| **Git** | With the `git-lfs` extension installed |
| **Python 3.11+** | uv will install it if missing |
| **Python 3.11–3.13** | uv will install it if missing |
| **uv** | Fast Python package manager ([install](https://docs.astral.sh/uv/)) |
| **Node.js 20+** | Optional — needed for browser tools and WhatsApp bridge (matches root `package.json` engines) |

Expand Down
4 changes: 2 additions & 2 deletions acp_registry/agent.json
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
{
"id": "hermes-agent",
"name": "Hermes Agent",
"version": "0.18.0",
"version": "0.18.2",
"description": "Self-improving open-source AI agent by Nous Research with ACP editor integration, persistent memory, skills, and rich tool support.",
"repository": "https://github.com/NousResearch/hermes-agent",
"website": "https://hermes-agent.nousresearch.com/docs/user-guide/features/acp",
"authors": ["Nous Research"],
"license": "MIT",
"distribution": {
"uvx": {
"package": "hermes-agent[acp]==0.18.0",
"package": "hermes-agent[acp]==0.18.2",
"args": ["hermes-acp"]
}
}
Expand Down
76 changes: 67 additions & 9 deletions agent/account_usage.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import httpx

from agent.anthropic_adapter import _is_oauth_token, resolve_anthropic_token
from hermes_cli.auth import _read_codex_tokens, resolve_codex_runtime_credentials
from hermes_cli.auth import AuthError, _read_codex_tokens, resolve_codex_runtime_credentials
from hermes_cli.runtime_provider import resolve_runtime_provider

if TYPE_CHECKING:
Expand Down Expand Up @@ -436,20 +436,78 @@ def _resolve_codex_usage_url(base_url: str) -> str:
return normalized + "/api/codex/usage"


def _fetch_codex_account_usage() -> Optional[AccountUsageSnapshot]:
creds = resolve_codex_runtime_credentials(refresh_if_expiring=True)
token_data = _read_codex_tokens()
tokens = token_data.get("tokens") or {}
account_id = str(tokens.get("account_id", "") or "").strip() or None
def _resolve_codex_usage_credentials(
base_url: Optional[str],
api_key: Optional[str],
) -> tuple[str, str, Optional[str]]:
"""Resolve Codex quota credentials from the native runtime path.

Prefer explicit live-agent credentials, then the legacy singleton OAuth
state, then the credential pool. Hermes's native OAuth setup now stores
device-code logins in the pool, so quota diagnostics must not depend only
on the older singleton store.
"""
explicit_key = str(api_key or "").strip()
if explicit_key:
return explicit_key, str(base_url or "").strip(), None

# Tier 2: the native runtime resolver. It ALREADY falls back to the
# credential pool when the singleton is empty (see
# ``resolve_codex_runtime_credentials`` — issue #32992), so in a pool-only
# setup this returns a usable ``source="credential_pool"`` token.
#
# Only ``AuthError`` ("no creds" / rate-limited) is caught so tier 3 can
# run: a broad ``except Exception`` would (a) mask a transient refresh /
# network failure and silently hand back a DIFFERENT pool account's usage,
# and (b) hide genuine programming errors. A refresh/network error must
# propagate — the outer ``fetch_account_usage`` guard fails open (shows
# nothing this turn) rather than reporting the wrong account.
#
# The ``account_id`` (for the ``ChatGPT-Account-Id`` header) is read
# best-effort: a partial/missing singleton token store must not sink an
# otherwise-usable resolver credential and force a header-less pool fallback.
try:
creds = resolve_codex_runtime_credentials(refresh_if_expiring=True)
account_id: Optional[str] = None
try:
token_data = _read_codex_tokens()
tokens = token_data.get("tokens") or {}
account_id = str(tokens.get("account_id", "") or "").strip() or None
except AuthError:
# Pool-only creds carry no singleton account_id; header is optional.
logger.debug("codex ▸ /usage account_id read failed (best-effort)", exc_info=True)
return creds["api_key"], str(creds.get("base_url", "") or "").strip(), account_id
except AuthError:
logger.debug("codex ▸ /usage runtime resolver returned no creds; trying pool", exc_info=True)

# Tier 3: direct pool select. Reached only when the resolver itself raises
# AuthError (e.g. singleton missing AND its own pool read found nothing at
# resolve time, but a pool entry is usable now). Pool credentials have no
# account_id concept, so the ChatGPT-Account-Id header is intentionally
# omitted here.
from agent.credential_pool import load_pool

pool = load_pool("openai-codex")
entry = pool.select()
if entry is None:
raise RuntimeError("No available openai-codex credential in credential pool")
return entry.runtime_api_key, str(entry.runtime_base_url or base_url or "").strip(), None


def _fetch_codex_account_usage(
base_url: Optional[str] = None,
api_key: Optional[str] = None,
) -> Optional[AccountUsageSnapshot]:
token, resolved_base_url, account_id = _resolve_codex_usage_credentials(base_url, api_key)
headers = {
"Authorization": f"Bearer {creds['api_key']}",
"Authorization": f"Bearer {token}",
"Accept": "application/json",
"User-Agent": "codex-cli",
}
if account_id:
headers["ChatGPT-Account-Id"] = account_id
with httpx.Client(timeout=15.0) as client:
response = client.get(_resolve_codex_usage_url(creds.get("base_url", "")), headers=headers)
response = client.get(_resolve_codex_usage_url(resolved_base_url), headers=headers)
response.raise_for_status()
payload = response.json() or {}
rate_limit = payload.get("rate_limit") or {}
Expand Down Expand Up @@ -628,7 +686,7 @@ def fetch_account_usage(
return None
try:
if normalized == "openai-codex":
return _fetch_codex_account_usage()
return _fetch_codex_account_usage(base_url=base_url, api_key=api_key)
if normalized == "anthropic":
return _fetch_anthropic_account_usage()
if normalized == "openrouter":
Expand Down
Loading