Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2359 commits
Select commit Hold shift + click to select a range
57ab272
chore(plugin-catalog): bump switchbot-control to bb68cb4
TakeshiTGAL Oct 7, 2026
fe8081c
chore(catalog): review disclosure for switchbot-control
teknium1 Oct 7, 2026
6f48dbc
fix(update): a stash with no Python is never rejected by the import p…
teknium1 Oct 5, 2026
a3ed4a1
fix(update): skip the restore import check only for non-runtime files
teknium1 Oct 7, 2026
74943bb
docs: stop presenting Desktop Light as a shipped download
teknium1 Oct 7, 2026
e720847
plugin-catalog: add Agent Hold Em
tony-simons-aiowa Oct 6, 2026
2d1d134
chore(catalog): review disclosure for agent-hold-em
teknium1 Oct 7, 2026
bce40f3
feat(plugin-catalog): add hermes-field-notes — pitfalls and local cor…
itpartypattaya Oct 6, 2026
8d1b4f1
plugin-catalog: hermes-field-notes 1.2.0 (patch recipes)
itpartypattaya Oct 6, 2026
234567a
plugin-catalog: hermes-field-notes 1.2.1 (review fixes)
itpartypattaya Oct 6, 2026
d8fc7cc
plugin-catalog: hermes-field-notes — README author section
itpartypattaya Oct 6, 2026
e6757f2
chore(catalog): review disclosure for hermes-field-notes
teknium1 Oct 7, 2026
f821e1e
chore: map alrcatraz for salvage of #132751
kshitijk4poor Oct 5, 2026
b6912e1
fix(agent): let an explicit tool_reason label a soft interrupt
alrcatraz Oct 4, 2026
1e26d03
fix(agent): attribute the terminal batch-timeout abort to the guard
alrcatraz Oct 4, 2026
3336c96
fix(agent): render skipped-call notices from the recorded reason
alrcatraz Oct 4, 2026
6bbdc8a
fix(agent): hide the synthetic interrupt close from the transcript
alrcatraz Oct 4, 2026
cf9b558
test(agent): cover soft-interrupt attribution and skipped-call wording
alrcatraz Oct 4, 2026
e8a478d
fix(agent): render concurrent skip notices from the recorded reason
alrcatraz Oct 5, 2026
15015d7
fix(agent): hide only the placeholder close, keep caller banners visible
alrcatraz Oct 5, 2026
703200b
fix(agent): stop the interrupt placeholder echoing back as a reply
alrcatraz Oct 5, 2026
a8236e4
test(agent): cover replay-echo retirement, and pin behaviour not wording
alrcatraz Oct 5, 2026
c77fc2c
fix(agent): drop the diagnostic message from the batch-guard interrupt
kshitijk4poor Oct 5, 2026
c9bd9bb
test(agent): align skip-notice fixtures with the recorded-reason wording
kshitijk4poor Oct 5, 2026
cd5b83a
fix(agent): retire replay-echo ghosts without mutating the transcript
kshitijk4poor Oct 5, 2026
5d8523e
test(agent): trim the soft-interrupt salvage tests to two invariants
kshitijk4poor Oct 5, 2026
17da1d7
fix(agent): render skip wording verbatim instead of brace-escaping it
kshitijk4poor Oct 5, 2026
7112b1a
fix(agent): attribute Ctrl-C tool cancellation to a user interrupt
kshitijk4poor Oct 5, 2026
7f0af2e
fix(agent): neutralise legacy interrupt placeholders instead of dropp…
kshitijk4poor Oct 5, 2026
c8634c7
refactor(agent): tidy the interrupt-placeholder fold-ups
kshitijk4poor Oct 5, 2026
c2583b5
test(agent): follow the renamed interrupt placeholder in the send-tim…
kshitijk4poor Oct 5, 2026
75ef078
test(agent): drive the real batch-timeout guard in the soft tool_reas…
kshitijk4poor Oct 5, 2026
764938e
fix(agent): publish the Ctrl-C reason before the sequential cancel hook
kshitijk4poor Oct 5, 2026
1475b45
test(agent): pin the visible-banner branch of close_interrupted_tool_…
kshitijk4poor Oct 5, 2026
06205f7
refactor(agent): match the replay-echo test docstring to the neutrali…
kshitijk4poor Oct 5, 2026
2bbb37b
refactor(agent): move interrupt placeholders into agent_runtime_helpe…
kshitijk4poor Oct 5, 2026
1585587
fix(agent): only relabel a prepared-batch abort as a batch timeout on…
kshitijk4poor Oct 7, 2026
4136797
refactor(agent): correct the stale placeholder-consistency comment
kshitijk4poor Oct 7, 2026
8914357
fix(agent): stop terminal batch preparation from overwriting a user stop
kshitijk4poor Oct 7, 2026
ef1a0b5
test(agent): pin system attribution in sequential skip notices
kshitijk4poor Oct 7, 2026
8db8f87
test(agent): pin system attribution in unfinished concurrent slot res…
kshitijk4poor Oct 7, 2026
745c741
test(agent): pin the Ctrl-C attribution on the concurrent tool path
kshitijk4poor Oct 7, 2026
7c493cd
refactor(agent): derive user-stop skip wording from USER_INTERRUPT_RE…
kshitijk4poor Oct 7, 2026
714fc80
refactor(agent): share the hidden interrupt placeholder row
kshitijk4poor Oct 7, 2026
184a83d
refactor(agent): import the interrupt placeholder at module level
kshitijk4poor Oct 7, 2026
299a132
docs(agent): say skipped-result content uses str.replace for {name}
kshitijk4poor Oct 7, 2026
c46eee0
test(agent): move the brace-rendering check after the attribution sce…
kshitijk4poor Oct 7, 2026
70dcdd6
refactor(agent): hoist the hidden placeholder row import and say why …
kshitijk4poor Oct 7, 2026
54a079f
fix(cron): fire an outage-skipped one-shot whose fire claim never landed
kshitijk4poor Oct 7, 2026
70be36a
fix(cron): report an unwritable tick lock in cron status and doctor
kshitijk4poor Oct 7, 2026
0a8aee5
fix(gateway): send cron store notices for a symlinked cron/ directory
kshitijk4poor Oct 7, 2026
808dba9
fix(cron): keep the outage marker when a skipped one-shot's dispatch …
kshitijk4poor Oct 7, 2026
844e514
fix(cron): drop a departed profile's store state by its resolved stor…
kshitijk4poor Oct 7, 2026
2a66c7f
test(cron): pin that the tick-lock probe names the lock file
kshitijk4poor Oct 7, 2026
204f0b2
test(cron): derive the run-claim expiry step from the TTL helper
kshitijk4poor Oct 7, 2026
af40505
fix(cron): keep store state another still-ticked profile shares throu…
kshitijk4poor Oct 7, 2026
e9a1933
refactor(cron): name forget_stores for what it takes; fix the clear_r…
kshitijk4poor Oct 7, 2026
d02f211
test(cron): pass encoding= to every text read/write in the store-outa…
kshitijk4poor Oct 7, 2026
d56a48d
feat(telemetry): updates that stop before applying say why
teknium1 Oct 7, 2026
f05d298
fixup: keep main.py and update_failure_class under their health caps
teknium1 Oct 7, 2026
b5a8fba
test(telemetry): pre-apply exit classes, parked parity, receipt-less …
teknium1 Oct 7, 2026
b49e2ff
fix(telemetry): review findings on pre-apply stop reasons
teknium1 Oct 7, 2026
476e0f1
fix(telemetry): pre-receipt exits keep their initiator; index.lock pe…
teknium1 Oct 7, 2026
b8f007c
docs(telemetry): how update dashboards count a partial run
teknium1 Oct 7, 2026
062dffa
test(desktop-update): a hand-off log read racing Add-Content retries,…
teknium1 Oct 7, 2026
69d126b
test(e2e/desktop): give the build-fail updater its manual-outcome gra…
teknium1 Oct 7, 2026
ed2dd0b
fix(cron): live-owner stale-claim reclaim measures silence, not run l…
teknium1 Oct 6, 2026
4d8024d
fix(tools): normalize foreground terminal heartbeat
KoNit-K Sep 22, 2026
cb6ffe6
fix(terminal): foreground heartbeat is dropped, not refused; notify i…
teknium1 Oct 6, 2026
4051201
fix(desktop): setup cards stop redrawing in a loop
alt-glitch Oct 7, 2026
3531ae5
fix(onboarding): the first-task handoff follows a renamed owner profile
alt-glitch Oct 7, 2026
16f1675
fix(free-tier): a short free-tier 429 no longer blocks for a whole qu…
alt-glitch Oct 7, 2026
9a39f9e
fix(desktop): a sign-in offer from the previous backend never opens
alt-glitch Oct 7, 2026
f383e66
fix(auth): persist profile single-use OAuth credentials when root sto…
0xalydev Sep 5, 2026
c5087ba
fix(auth): persist first profile OAuth row with empty root
lfaus Sep 3, 2026
dc824c5
fix(auth): save a profile's first single-use login, and never print A…
jonpol01 Sep 28, 2026
04b515c
fix(auth): the forked-grant heal keeps a profile's own Anthropic login
unsupportedpastels Oct 7, 2026
bf23bcc
fix(auth): a profile's auth add never copies root's login into the pr…
unsupportedpastels Oct 7, 2026
2c8df45
Merge remote-tracking branch 'origin/main' into sid/onboarding
alt-glitch Oct 7, 2026
e76fb95
fix(telemetry): update stage rows count the stage a failed run died in
teknium1 Oct 7, 2026
4645720
test: detached-writer custody tests read a pid from a beat that can n…
teknium1 Oct 7, 2026
84692b7
fix(tests): runner applies passthrough --ignore-glob; windows marker …
teknium1 Oct 7, 2026
44c1ad7
fix(desktop): show a queued cron run row immediately after trigger
austinpickett Oct 6, 2026
f7b6b4e
refactor(desktop-i18n): move billingBlock copy into en_billing sibling
austinpickett Oct 6, 2026
25dfcbf
chore(desktop): refresh locales/_keys.desktop.json for cron.queuedRun
austinpickett Oct 6, 2026
9c6ff60
fix(update): sweep stale git locks at the start of the run, not only …
kokhlo Oct 3, 2026
a81d340
fix(update): a killed git's index.lock no longer blocks the next update
teknium1 Oct 7, 2026
b773ba0
fix(update): on Windows a killed git's index.lock waits only for gits…
teknium1 Oct 7, 2026
f5f912e
fix(update): only a killed update's index.lock is reclaimed at once
teknium1 Oct 7, 2026
aa45073
fix(update): the start-of-update index.lock reclaim never takes a liv…
teknium1 Oct 7, 2026
3f7a349
fix(update): on macOS only a git working in this checkout keeps a dea…
teknium1 Oct 7, 2026
d3245fa
fix(update): the macOS lock scan finds ps when the launcher's PATH ha…
teknium1 Oct 7, 2026
3569fba
fix(update): review the macOS lock scan's lsof/ps lookups; keep it st…
teknium1 Oct 7, 2026
e4a4f1b
fix(desktop): a setup card's typed-pick callback keeps a stable identity
alt-glitch Oct 7, 2026
effe2ff
test(ci): the CI replay names a silent step's exit code
teknium1 Oct 7, 2026
1ab7983
test(ci): the CI replay does not run Git Bash under x64 emulation on …
teknium1 Oct 7, 2026
392d017
fix(free-tier): a setup chat turn does not start the sign-in offer clock
alt-glitch Oct 7, 2026
db02737
Merge remote-tracking branch 'origin/main' into sid/onboarding
alt-glitch Oct 7, 2026
c4ba8b1
i18n(desktop): translate cron.queuedRun in every overlay
alt-glitch Oct 7, 2026
cdda67f
Fix reasoning markup rendering in dashboard
giggling-ginger Jul 7, 2026
85d7a89
fix(web): scope structured reasoning UI to assistant messages
giggling-ginger Jul 16, 2026
d199cc2
test(web): behaviour coverage for structured reasoning transcript ren…
austinpickett Oct 6, 2026
ef0c635
refactor(web): move session source config to SessionsPage_sources sib…
austinpickett Oct 6, 2026
1fac4e4
fix(desktop): hide unknown cloud agent status
tank321 Jul 29, 2026
489c1ac
test(desktop): cover empty cloud agent status
tank321 Jul 30, 2026
ef4b046
fix(pm): reclaim dependency state of deleted checkouts (pm gc + start…
teknium1 Oct 6, 2026
3ca97d5
fix(pm): orphan reclaim runs on every prune pass and keeps checkouts …
teknium1 Oct 7, 2026
121eb0c
fix(pm): an interrupted orphan reclaim leaves a dir the next pass sti…
teknium1 Oct 7, 2026
0e21933
fix(kanban): only sweep a parent workspace once the parent itself is …
liuhao1024 Oct 5, 2026
7dab93b
fix(mcp): reject fabricated DCR for providers without RFC 7591 regist…
Aug 7, 2026
01d4050
Report bounded npm probe and terminal GUI installer failures
mrkillbobbot Oct 7, 2026
2943ee6
fix(ts): npm run fix
ethernet8023 Oct 7, 2026
58ba6a7
fix(free-tier): HERMES_PREVIEW_FULL_CONNECTORS=1 turns the preview co…
alt-glitch Oct 7, 2026
071842a
fix(desktop): explain missing remote profiles
dskwe Oct 1, 2026
6fa88c1
fix(desktop): lint missing-profile error and move its tests to a sibl…
OutThisLife Oct 7, 2026
dd7ee86
fix(models): TokenHub's saved endpoint is not a relay, so /model keep…
kshitijk4poor Oct 7, 2026
3902bbc
test: move the profile-hook keyword compat test into its own module
kshitijk4poor Oct 7, 2026
ad12263
refactor(models): name the two canonical-endpoint sources; comment sa…
kshitijk4poor Oct 7, 2026
433cc1c
fix(tui): drop the unused route lookup in _fallback_session_info
kshitijk4poor Oct 7, 2026
7abd2e5
refactor(plugins): one per-home enable lock, not two
kshitijk4poor Oct 7, 2026
9d33231
refactor(setup): setup_choose reads the facts module directly; drop t…
kshitijk4poor Oct 7, 2026
708d45f
perf(state): pre-filter the per-turn tool-retry scan with LIKE
kshitijk4poor Oct 7, 2026
f2cd946
fix(onboarding): /initiate-setup names the user's profile on every su…
kshitijk4poor Oct 7, 2026
b6a7e59
fix(free-tier): the 402 sign-in refusal applies on the welcome host only
kshitijk4poor Oct 7, 2026
d8dc967
fix(desktop): give fresh group threads room context
plarche-ux Sep 23, 2026
db48af2
fix(desktop): splice fresh-thread room context verbatim
OutThisLife Oct 7, 2026
75dfe26
fix(desktop): default UI Scale to 100% and keep chat text at 110%
unsupportedpastels Oct 7, 2026
a63ffb3
test(desktop): name the default-zoom test for what it asserts
unsupportedpastels Oct 7, 2026
dd6ab89
fix(pricing): price Bedrock Claude Opus 5 and 5.5 from the snapshot
OutThisLife Oct 7, 2026
3126389
fix(auth): discover external CLIs in user-local bin
KoNit-K Oct 3, 2026
cea7404
chore(tests): drop the stale _external_process_spec bare_which allowl…
OutThisLife Oct 6, 2026
6db8548
fix(auth): keep relative external CLI command paths resolving from th…
OutThisLife Oct 7, 2026
1527923
test(auth): drive copilot-acp runtime resolution through a real PATH …
OutThisLife Oct 7, 2026
e894a7f
refactor(auth): move external-process CLI lookup into auth_external_p…
OutThisLife Oct 7, 2026
865ba90
fix(auth): return the user-local external CLI as one native path on W…
OutThisLife Oct 7, 2026
e9a981b
fix(state): catch the corruption-class DatabaseError inside rebuild_f…
liuhao1024 Oct 5, 2026
a0b14df
fix(state): catch corruption-class DatabaseError in optimize_fts() too
kshitijk4poor Oct 6, 2026
609181f
test(state): plain close() in the FTS corruption fixture teardown
kshitijk4poor Oct 6, 2026
86e4a57
test(state): drop the toothless in_transaction assert
kshitijk4poor Oct 6, 2026
583e995
refactor(state): one WHY line on the rebuild_fts corruption arm
kshitijk4poor Oct 6, 2026
8e0c55d
test(state): assert the exact surviving-index count
kshitijk4poor Oct 6, 2026
995da31
fix(state): only a malformed-image error gets the FTS offline-repair …
kshitijk4poor Oct 6, 2026
3248506
fix(state): name the user-facing repair commands in the FTS corruptio…
kshitijk4poor Oct 6, 2026
daa9593
test(state): drop the unpinned rollback claim from the corruption-cla…
kshitijk4poor Oct 6, 2026
3b2a6b6
fix(desktop): make auto-project Hide from sidebar reversible via an U…
PRATHAMESH75 Jul 28, 2026
d7cf4d8
chore(desktop): regenerate locales/_keys.desktop.json for undo-hide keys
OutThisLife Oct 6, 2026
734c35b
fix(desktop): translate the undo-hide toast strings (de/es/fr/ru) for…
austinpickett Oct 6, 2026
ec60e9a
test(desktop): store-level dismiss/restore round-trip for auto projects
austinpickett Oct 6, 2026
bf8cf34
refactor(desktop): move sidebar projects copy into per-locale sibling…
austinpickett Oct 6, 2026
354724f
style(desktop): sort the projects-sibling imports per perfectionist
austinpickett Oct 6, 2026
3adc457
Merge remote-tracking branch 'origin/main' into sid/onboarding
austinpickett Oct 7, 2026
3090ef7
fmt(js): `npm run fix` on merge (#134737)
hermes-seaeye[bot] Oct 7, 2026
04dc7f8
chore(plugin-catalog): pin claude-subscription-directsdk to 4bc79c7 (…
unsupportedpastels Oct 7, 2026
39a01d0
fix(model-picker): keep custom provider rows and the current model ho…
austinpickett Oct 6, 2026
7b9ce36
fix(desktop): widen the inline image preview envelope so stacked imag…
austinpickett Oct 6, 2026
dbbc8d7
test(desktop): pin the preview height clamp's viewport growth and cei…
austinpickett Oct 7, 2026
649d6c0
test(desktop): fold the MEDIA pdf card case into the existing media s…
austinpickett Oct 7, 2026
3cabfad
feat(models): add anthropic/claude-haiku-5.5 to OpenRouter and Nous P…
unsupportedpastels Oct 7, 2026
0f56e56
fix(dashboard): repair loopback auth identity frontend integration (#…
Tranquil-Flow Aug 5, 2026
9d7a4ab
fix(dashboard): hide AuthWidget on 401 via ApiError status
austinpickett Oct 6, 2026
af9c713
fix(web): bound the dashboard build's CPU and heap (#63338)
austinpickett Oct 6, 2026
cc11102
docs(web): note the dashboard build's resource caps (#63338)
austinpickett Oct 6, 2026
9890036
fix(browser): pin local Chromium headless on Windows
austinpickett Oct 6, 2026
6869d00
fix(desktop): the link-title window cannot become visible
austinpickett Oct 6, 2026
6dc79b2
fix(gateway): stop _ensure_windows_gateway_venv_imports leaking PYTHO…
liuhao1024 Jul 3, 2026
0b70608
test(gateway): venv import setup must not leak PYTHONPATH into global…
austinpickett Oct 6, 2026
63e5656
fix(kanban): board identity requires board.json; archive leaves a tom…
austinpickett Oct 6, 2026
cae57ad
fix(kanban): connect()/init_db() refuse to recreate dead boards
austinpickett Oct 6, 2026
1a85226
fix(kanban): dashboard rejects stale archived/deleted board slugs
austinpickett Oct 6, 2026
9aaf2fd
refactor(kanban): split board metadata/lifecycle into kanban_db_board…
austinpickett Oct 6, 2026
bae3a01
fix(agent): do not interrupt a turn when lease refresh hits a SQLite …
686f6c61 Sep 28, 2026
23cd990
fix(agent): stop a locked lease refresh once its lifetime runs out
686f6c61 Sep 29, 2026
b8788c3
fix(agent): bound lease lock tolerance by the row's committed expiry
teknium1 Oct 7, 2026
c538ec5
test(agent): release the lease-test lock on a refusal signal, not a t…
teknium1 Oct 7, 2026
134e08c
fix(ci): route web_build_limits.py to the update e2e lanes
teknium1 Oct 7, 2026
cc75e8f
chore(plugin-catalog): bump hermes-monitoring-dashboard to e4825262
teknium1 Oct 7, 2026
19cb1cb
fix: disclose enabled plugins' registered skills in the system prompt…
teknium1 Oct 7, 2026
3b288d8
chore(plugin-catalog): bump hermes-monitoring-dashboard to 96d6881d
teknium1 Oct 7, 2026
889eddc
fix(gateway): /yolo survives a gateway restart
teknium1 Oct 7, 2026
bc2e4d3
Merge pull request #134209 from NousResearch/sid/onboarding
ethernet8023 Oct 7, 2026
6662326
fix: hot-mount plugin API routes installed after server start
teknium1 Oct 7, 2026
8620eff
fix(dashboard): hot-mount plugin APIs without redirect, ahead of the …
teknium1 Oct 7, 2026
e675225
fmt(js): `npm run fix` on merge (#134819)
hermes-seaeye[bot] Oct 7, 2026
41ab94b
revert: plugins uninstall/update work again while the gateway runs (r…
teknium1 Oct 7, 2026
61b7f95
fix(plugins): uninstall on Windows succeeds while the gateway has the…
teknium1 Oct 8, 2026
f3ef9db
fix(desktop): a voice turn's reasoning-off no longer leaks into new c…
teknium1 Oct 7, 2026
8a33891
revert: dashboard-auth token exchange breaks on gzip IdP responses (p…
teknium1 Oct 8, 2026
96c2d9f
fix(cli): ignore lifetime session tokens in the switch guard
686f6c61 Sep 28, 2026
20cb63d
fix(tui_gateway): ask the large-context confirm when a model is picke…
jonh-dev Sep 25, 2026
7b41e8f
test(tui_gateway): pin the large-context boundary and the no-agent pick
jonh-dev Sep 25, 2026
b1f53dd
fix(tui_gateway): a model switch dropped at turn start warns instead …
OutThisLife Oct 8, 2026
6c62eeb
chore(contributors): map jonh-dev's commit email
OutThisLife Oct 8, 2026
436a6e1
fix(desktop): the scrolled-up composer comes back on hover or focus a…
OutThisLife Oct 8, 2026
08165d5
feat(desktop): the dimmed composer comes back after 5s without scrolling
OutThisLife Oct 8, 2026
65c6fb5
fix(release): continue the version line after the legacy v0.21.5 release
teknium1 Oct 8, 2026
807fa8a
fix(tui-gateway): persist session /yolo toggles to the session row
rlaope Sep 29, 2026
adc7381
fix(tui-gateway): restore YOLO on resume
aslater3 Oct 4, 2026
50f8e4d
fix(tui-gateway): /yolo restore keys on the stored session; pre-first…
teknium1 Oct 8, 2026
3a43872
docs(security): /yolo survives a TUI/Desktop resume too
teknium1 Oct 8, 2026
44395b7
refactor(tui-gateway): restore session /yolo once in session.resume, …
teknium1 Oct 8, 2026
cfb9ae4
Merge pull request #134905 from NousResearch/fix/release-seed-0215
ethernet8023 Oct 8, 2026
23aa9cf
fix(release): read attempt claims from the remote, not local tags
ethernet8023 Oct 8, 2026
cc1679d
feat(release): add a changelog subcommand and point oversized drafts …
ethernet8023 Oct 8, 2026
495447c
fix(release): abandon clears every outstanding attempt of the version
ethernet8023 Oct 8, 2026
bdb8f92
fix(desktop): log why the MSIX relaunch waiter failed to start
ethernet8023 Oct 8, 2026
2966cb6
Merge pull request #134911 from NousResearch/fix/relaunch-waiter-diag…
ethernet8023 Oct 8, 2026
ddde331
fix(desktop): make the relaunch waiter's script log per-attempt, UTF-…
ethernet8023 Oct 8, 2026
05d5d7e
fix(desktop): tag every line of a multi-line waiter script error
ethernet8023 Oct 8, 2026
17737af
Merge pull request #134884 from NousResearch/fix/release-abandon-all-…
ethernet8023 Oct 8, 2026
9927e3c
fix(tui_gateway): a bare mid-turn model pick gets its confirm before …
teknium1 Oct 8, 2026
457a1e1
Merge pull request #134916 from NousResearch/fix/relaunch-waiter-log-…
ethernet8023 Oct 8, 2026
08dfac4
fix(release): build the default flake package for the Nix identity check
ethernet8023 Oct 8, 2026
5631d66
ci(release): also build the desktop package from the stamped source
ethernet8023 Oct 8, 2026
8cb42b9
Update .github/workflows/nix.yml
ethernet8023 Oct 8, 2026
c68f806
test(install-e2e): the windows source update check reads staged main,…
ethernet8023 Oct 8, 2026
d6284c6
fix(termux): upgrade libc++ in the wheelhouse builder so cmake starts
ethernet8023 Oct 8, 2026
ac70f81
fix(release): the stable MSIX smoke accepts the release-time package …
teknium1 Oct 8, 2026
a28a5d0
fix(update): a whole-second marker creation time in our own second is…
ethernet8023 Oct 8, 2026
b1a39a1
refactor(approval): one session /yolo contract for CLI, TUI/Desktop a…
teknium1 Oct 8, 2026
167e9fd
fix(desktop): never idle-reap a local profile backend (#134942)
teknium1 Oct 8, 2026
dde8800
docs(plugins): list the built-in author tools at the top of the plugi…
notwitcheer Oct 7, 2026
0240fa4
fix(release): read the Hermes version line in the Nix check and accep…
teknium1 Oct 8, 2026
3ed17ec
Merge upstream 0240fa4a while preserving fork contracts
mrkillbobbot Oct 8, 2026
df2d9e7
Fix ordinary sync integration contracts and hosted validation fixtures
mrkillbobbot Oct 8, 2026
e63e368
Keep OAuth traceback logging and review custom reasoning wire defaults
mrkillbobbot Oct 8, 2026
a9dc1cc
Preserve auxiliary OAuth logger seam and qualify remaining health fix
mrkillbobbot Oct 8, 2026
0e1131d
Remove temporary ordinary sync qualification workflow
mrkillbobbot Oct 8, 2026
3680490
Pin release-N1 cron swap bookkeeping observation contracts
mrkillbobbot Oct 8, 2026
86f9113
Recognize job-scoped N1 cron swap bookkeeping failures
mrkillbobbot Oct 8, 2026
341c13e
Remove temporary cron observation qualification workflow
mrkillbobbot Oct 8, 2026
0d748a1
Merge branch 'main' into codex/sync-upstream-main-20261007
mrkillbob Oct 8, 2026
535a21e
Merge fork/main into upstream sync branch
mrkillbobbot Oct 8, 2026
3fb71ed
fix(website): resync lockfile with package.json overrides
mrkillbobbot Oct 8, 2026
103dd0c
fix(security): scope skill env passthrough per conversation; add fork…
mrkillbobbot Oct 8, 2026
5188bd4
fix: stream-limit media proxy; match only generated transcription seg…
mrkillbobbot Oct 8, 2026
f01e5bf
fix: resolve STT hook model before upload limit; clean up transcribe-…
mrkillbobbot Oct 8, 2026
deefe2c
ci(docs): allow-list the unfixable braces advisory in the website aud…
mrkillbobbot Oct 8, 2026
c2825f7
fix(stt): keep xAI backlog on early end-of-audio; blob fallback on di…
mrkillbobbot Oct 9, 2026
c59f52f
fix: key pooled usage cache by route host; windows-safe audit gate su…
mrkillbobbot Oct 9, 2026
b6741e9
fix(ci): pass explicit encoding in npm audit gate (windows footgun ch…
mrkillbobbot Oct 9, 2026
134c047
fix(desktop): withhold plugin settings gear for non-active connection…
mrkillbobbot Oct 9, 2026
e13300f
fix(web): recognize CommonMark fences in reasoning markup parser
mrkillbobbot Oct 9, 2026
91d25ca
fix: type fence regex results (web tsc -b); structured reasoning.effo…
mrkillbobbot Oct 9, 2026
3afa787
test: give the staged-main probe test a realistic timeout
mrkillbobbot Oct 9, 2026
9fecdb0
test: wait for transcribe-stream cleanup instead of racing the server…
mrkillbobbot Oct 9, 2026
ec00402
Merge branch 'main' into codex/sync-upstream-main-20261007
mrkillbob Oct 9, 2026
6120907
Merge fork/main into upstream sync branch
mrkillbobbot Oct 9, 2026
b23bbde
test: make transcribe-stream cleanup test deterministic
mrkillbobbot Oct 9, 2026
1867d96
test: move Desktop STT catalog contract into the Vitest lane
mrkillbobbot Oct 9, 2026
0f2e4cd
fix(stt): convert segmenter failures into a transcription error envelope
mrkillbobbot Oct 9, 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 .coderabbit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#
# Auto-review is DISABLED repo-wide: the app was enabled at the org level on
# 2026-08-14 and immediately began reviewing every opened PR. This repo's
# merge gate is CI ("All required checks pass") plus maintainer review —
# merge gate is CI ("All required checks pass (v2)") plus maintainer review —
# CodeRabbit reviews carry no merge weight (protect-main ruleset requires
# 0 approving reviews), so auto-firing on the full PR firehose adds comment
# noise without gating value.
Expand Down
3 changes: 3 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
# same review for the same reason.
/.github/ @NousResearch/hermes-agent-core
/scripts/ci/ @NousResearch/hermes-agent-core
# The code-health gate decides whether a PR passes; weakening it is a CI change.
/scripts/check @NousResearch/hermes-agent-core
/scripts/code_health/ @NousResearch/hermes-agent-core

# eslint configs can define custom ``fix`` functions that run arbitrary code.
eslint.config.* @NousResearch/hermes-agent-core
Expand Down
1 change: 1 addition & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ Fixes #
- [ ] I searched for [existing PRs](https://github.com/NousResearch/hermes-agent/pulls) to make sure this isn't a duplicate
- [ ] My PR contains **only** changes related to this fix/feature (no unrelated commits)
- [ ] I've run `pytest tests/ -q` and all tests pass
- [ ] `python scripts/check` passes (the blocking lint and code-health checks CI runs)
- [ ] I've added tests for my changes (required for bug fixes, strongly encouraged for features)
- [ ] I've tested on my platform: <!-- e.g. Ubuntu 24.04, macOS 15.2, Windows 11 -->

Expand Down
47 changes: 36 additions & 11 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ on:
required: false
type: boolean
default: false
strict_acceptance:
description: "Acceptance runs only: known_failure owners whose gaps FAIL this run instead of xfailing ('upd-txn', a comma list, or '1' for every gap). Sets HERMES_E2E_STRICT_ACCEPTANCE for the E2E suites (tests/e2e/core/_pending_fixes.py)."
required: false
type: string
default: ''
workflow_call:
inputs:
release:
Expand Down Expand Up @@ -162,7 +167,9 @@ jobs:
tests:
name: Python tests
needs: detect
if: needs.detect.outputs.python == 'true'
# Its E2E jobs are lanes of their own: a lane the classifier sets must reach
# its job whatever `python` says (tests/ci/test_update_ci_routing.py).
if: needs.detect.outputs.python == 'true' || needs.detect.outputs.e2e == 'true' || needs.detect.outputs.e2e_upgrade == 'true'
uses: ./.github/workflows/tests.yml
with:
# NousResearch runs the full unit suite on one 32-core runner. Forks
Expand All @@ -173,17 +180,19 @@ jobs:
e2e_mode: full
e2e: ${{ github.repository != 'NousResearch/hermes-agent' || needs.detect.outputs.e2e == 'true' }}
e2e_upgrade: ${{ github.repository != 'NousResearch/hermes-agent' || needs.detect.outputs.e2e_upgrade == 'true' }}
strict_acceptance: ${{ inputs.strict_acceptance || '' }}

# macOS + Windows lanes. The main `tests` lane above is Linux-only, and
# the OS-marked tests it collects are skipped there by design (see the
# `_OS_MARKS` comment in tests/conftest.py) — this is where they run.
# Same `python` lane gate: if no Python changed, neither runs.
# Only this fork's non-release Windows-native results are advisory.
# Shared tests/runners and the upstream/release matrix stay unchanged.
# Gated on `python` and on each lane it consumes: desktop_updater is set by
# TypeScript-only changes too (the Electron marker / result readers), and with
# `python` alone those never reached the Windows hand-off tests below.
# This fork's Windows-native advisory callers retain visible results.
tests-os:
name: OS-specific tests
needs: detect
if: needs.detect.outputs.python == 'true'
if: needs.detect.outputs.python == 'true' || needs.detect.outputs.desktop_updater == 'true' || needs.detect.outputs.e2e == 'true' || needs.detect.outputs.e2e_upgrade == 'true'
uses: ./.github/workflows/tests-os.yml
with:
platform_scope: ${{ needs.detect.outputs.os_tests_scope }}
Expand All @@ -193,25 +202,29 @@ jobs:
desktop_updater: ${{ needs.detect.outputs.desktop_updater == 'true' }}
e2e: ${{ github.repository != 'NousResearch/hermes-agent' || needs.detect.outputs.e2e == 'true' }}
e2e_upgrade: ${{ github.repository != 'NousResearch/hermes-agent' || needs.detect.outputs.e2e_upgrade == 'true' }}
strict_acceptance: ${{ inputs.strict_acceptance || '' }}

tests-windows-advisory:
name: Windows-only tests (advisory)
needs: detect
if: needs.detect.outputs.python == 'true' && needs.detect.outputs.advisory_windows == 'true'
if: (needs.detect.outputs.python == 'true' || needs.detect.outputs.desktop_updater == 'true' || needs.detect.outputs.e2e == 'true' || needs.detect.outputs.e2e_upgrade == 'true') && needs.detect.outputs.advisory_windows == 'true'
uses: ./.github/workflows/tests-os.yml
with:
platform_scope: windows
desktop_updater: ${{ needs.detect.outputs.desktop_updater == 'true' }}
e2e: ${{ github.repository != 'NousResearch/hermes-agent' || needs.detect.outputs.e2e == 'true' }}
e2e_upgrade: ${{ github.repository != 'NousResearch/hermes-agent' || needs.detect.outputs.e2e_upgrade == 'true' }}
strict_acceptance: ${{ inputs.strict_acceptance || '' }}

lint:
name: Python lints
needs: detect
if: needs.detect.outputs.python == 'true'
# frontend too: the code-health ratchet in lint.yml also covers TypeScript.
if: needs.detect.outputs.python == 'true' || needs.detect.outputs.frontend == 'true'
uses: ./.github/workflows/lint.yml
with:
event_name: ${{ needs.detect.outputs.event_name }}
python: ${{ needs.detect.outputs.python == 'true' }}

js-tests:
name: JS & TS checks
Expand Down Expand Up @@ -278,8 +291,11 @@ jobs:
needs: detect
# apps/desktop/e2e/update: a real install.sh install + packaged Desktop,
# first run, "Update now" hand-off/relaunch, concurrent-update refusal.
# Advisory until it has proven stable on CI: its shards run with continue-on-error, so a
# red shard shows on the PR but does not fail all-checks-pass.
# Required when it runs: a PR that touches the Desktop update path (the
# classifier's e2e_desktop_update lane) cannot merge on a red shard. Like
# the Linux e2e-upgrade shards and the Windows install + update journey
# (tests / tests-os, gated on e2e_upgrade), it is skipped — and the skip
# counts as success — when the PR does not touch that path.
if: ${{ needs.detect.outputs.python_prod == 'true' || needs.detect.outputs.frontend == 'true' || needs.detect.outputs.e2e_desktop_update == 'true' }}
uses: ./.github/workflows/e2e-desktop-update.yml

Expand Down Expand Up @@ -396,7 +412,8 @@ jobs:
# Gate: runs after everything. ``if: always()`` ensures it reports a
# status even when some deps were skipped.
#
# Non-release (PR/push): failure fails, skipped counts as success.
# Non-release (PR/push): failure fails. Update/E2E consumers selected
# by detect.outputs must succeed; only unselected consumers may skip.
# Release (inputs.release): strict — every required job must be
# `success`. A skipped required lane fails the gate; only the PR-only
# jobs (history-check, lockfile-diff, supply-chain, review-labels) and
Expand All @@ -407,11 +424,19 @@ jobs:
# named Windows-native advisory callers keep their real results visible
# without joining these required dependencies. Shared checks stay required.
#
# The check name carries a version. The ruleset requires a check NAME, and a
# green check run recorded on a PR head stays valid forever, so a PR whose
# last CI predates a new required job still merges on that old green (32
# PRs merged without the code-health ratchet that way). When the required
# set gains a job every open PR must pass, bump the version here and in the
# protect-main ruleset in the same rollout: older greens then no longer
# count, and each PR needs one fresh CI run before it can merge.
#
# Outputs ``needs-json`` — a compact ``{job_name: result}`` dict — so
# the live comment poller can list failed jobs in the PR comment.
# ─────────────────────────────────────────────────────────────────────
all-checks-pass:
name: All required checks pass
name: ${{ github.repository == 'NousResearch/hermes-agent' && 'All required checks pass (v2)' || 'All required checks pass' }}
needs:
- detect
- tests
Expand Down
9 changes: 9 additions & 0 deletions .github/workflows/docs-site-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ jobs:
command: npm ci
working-directory: website

- name: Check Docusaurus Tinypool compatibility
run: node scripts/check-tinypool-compat.mjs
working-directory: website

- name: Install ascii-guard
uses: ./.github/actions/retry
with:
Expand Down Expand Up @@ -59,3 +63,8 @@ jobs:
# Same pattern Docusaurus uses internally (build:fast --locale en).
run: npm run build:fast
working-directory: website

- name: Audit website dependencies
# Fails on any high/critical advisory except the allow-listed ones (braces has no
# patched release); see scripts/ci/npm_audit_gate.py.
run: python3 scripts/ci/npm_audit_gate.py website
4 changes: 2 additions & 2 deletions .github/workflows/e2e-desktop-update.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ jobs:
name: Desktop install/update E2E (Linux, ${{ matrix.cell }})
runs-on: ${{ github.repository == 'NousResearch/hermes-agent' && 'ubuntu-latest-32-core' || 'ubuntu-latest' }}
timeout-minutes: 30
# Advisory until stable on CI (see ci.yaml): a red shard does not fail the caller.
continue-on-error: true
# Required whenever the e2e_desktop_update lane fires (see ci.yaml): it was
# advisory until it proved stable, and every main push shard since has passed.
strategy:
fail-fast: false
# One install per shard (every spec restores it; paths are baked in, so
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/install-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -130,11 +130,12 @@ on:
- 'setup-hermes.*'
- 'hermes_bootstrap.py'
- 'pm/**'
- '!pm/**/*.md'
- 'hermes_cli/update*'
- 'hermes_cli/*update*'
- 'hermes_cli/pm*'
- 'hermes_cli/*install*'
- 'hermes_cli/_early_recovery.py'
- 'hermes_cli/_early_recovery*.py'
- 'hermes_cli/_launchers.py'
- 'hermes_cli/managed_uv.py'
- 'hermes_cli/venv_sync.py'
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/js-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ jobs:
uses: ./.github/actions/setup-pm
with:
toolchain: node
- name: Check bounded npm configuration resolution
run: node --test scripts/build/node-options.test.mjs
- name: Install locked native test tooling without lifecycle scripts
if: matrix.runner != 'windows-2025'
run: npm ci --workspace apps/desktop --workspace tests-js --include-workspace-root --include=dev --ignore-scripts --no-audit --no-fund
Expand Down
53 changes: 47 additions & 6 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
name: Lint (ruff + ty)

# Two things here:
# Three things here:
# 1. Advisory diff — ruff + ty diagnostics as a diff vs the target branch.
# Writes a Markdown summary to the run page. Exit zero always.
# 2. Blocking ``ruff check .`` — enforces the explicit rules in
# ``[tool.ruff.lint.select]`` (currently PLW1514). Failure blocks merge.
# Separate job so the advisory diff still runs even when enforcement
# fails.
# 3. Blocking code-health ratchet (``scripts/code_health``) for Python and TypeScript.
# ``python scripts/check`` runs every blocking check here locally with the same pinned tools.
#
# The fork's CI-sensitive review remains in review-labels.yml; CODEOWNERS
# additionally routes these files where a code-owner ruleset is configured.
Expand All @@ -18,6 +20,10 @@ on:
description: The event name from the calling orchestrator (pull_request or push).
type: string
required: true
python:
description: Python changed. A frontend-only PR runs just the code-health ratchet (TS).
type: boolean
default: true

permissions:
contents: read
Expand All @@ -29,7 +35,7 @@ concurrency:
jobs:
lint-diff:
name: ruff + ty diff
if: inputs.event_name == 'pull_request'
if: inputs.event_name == 'pull_request' && inputs.python
runs-on: ubuntu-latest
# Checkout alone has been observed taking >10 min on this fork right after
# a large upstream-sync merge (materializing/transferring the huge
Expand All @@ -53,7 +59,7 @@ jobs:
- name: Install ruff + ty
uses: ./.github/actions/retry
with:
command: python -m scripts.ci.python_packages ruff==0.15.10 ty==0.0.82
command: python -m scripts.ci.python_packages "$(python -m scripts.code_health --print-pins)" ty==0.0.82

- name: Determine base ref
id: base
Expand Down Expand Up @@ -138,6 +144,7 @@ jobs:
# ``lint-diff`` job above runs independently so reviewers still get
# the diff comment even when enforcement fails.
name: ruff enforcement (blocking)
if: inputs.python
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
Expand All @@ -152,20 +159,49 @@ jobs:
- name: Install ruff
uses: ./.github/actions/retry
with:
command: python -m scripts.ci.python_packages ruff==0.15.10
command: python -m scripts.ci.python_packages "$(python -m scripts.code_health --print-pins)"

- name: ruff check .
# No --exit-zero, no || true. Exit code propagates to the job,
# which propagates to the required-check gate.
run: |
ruff check .
code-health:
# Per-unit ratchet: every function and file keeps its own cap (its value on main when it is
# already over target, else the target) and pattern rules compare fingerprints, so a PR
# cannot trade one violation for another. The merge commit is compared with its first
# parent (current main), so an improvement that lands on main is locked in at once.
name: code health ratchet (blocking)
if: inputs.event_name == 'pull_request'
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout code
uses: actions/checkout@f548e57e544e1ff5a4c46bf1e1b8685f8e4a348a # v7.0.1
with:
fetch-depth: 2 # the merge commit and its first parent (the base branch tip)

- uses: ./.github/actions/setup-pm
with:
cache-python: true
prune-python-cache: true

- name: Install pinned ruff
uses: ./.github/actions/retry
with:
command: python -m scripts.ci.python_packages "$(python -m scripts.code_health --print-pins)"

- name: Ratchet the PR against the base branch tip
run: python scripts/check --only health --base HEAD^1

windows-footguns:
# Static guardrails on Windows-unsafe Python primitives — os.kill(pid, 0),
# os.killpg, os.setsid, signal.SIGKILL without getattr fallback,
# shebang scripts via subprocess, bare open() without encoding=, etc.
# See scripts/check-windows-footguns.py for the full rule list.
name: Windows footguns (blocking)
if: inputs.python
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
Expand Down Expand Up @@ -198,14 +234,19 @@ jobs:

# The OS lanes import only files carrying the matching marker, so a test that fakes
# macOS (is_macos -> True, sys.platform -> "darwin") without `platforms("macos")` is green on
# Linux over a faked branch and never runs on macOS (#111866, AGENTS.md § Don't fake the host OS).
# Linux over a faked branch and never runs on macOS (#111866, tests/AGENTS.md § Don't fake the host OS).
- name: Forbid unmarked macOS fakes in tests
run: python scripts/ci/check_os_marker_fakes.py

# Every AGENTS.md from the git root down to the working directory loads as one
# project-context block (30,720 chars on a 128k window); chains are capped at 30k.
- name: Keep every AGENTS.md under its truncation cap
run: python scripts/ci/check_agents_md_size.py

# Advisory: profile-scope hazard shapes on the lines this PR adds (child env from os.environ,
# raw os.getenv of a platform credential, HOME-only RPC binding, bare-PID liveness). One
# process serves many profiles; every pattern leaked the launch profile at least once. Printed
# into the log for the reviewer; never fails the job (root AGENTS.md § Code Shape Rules).
# into the log for the reviewer; never fails the job (root AGENTS.md § Rules that apply everywhere).
- name: Profile-scope patterns on added lines (advisory)
if: github.event_name == 'pull_request'
continue-on-error: true
Expand Down
7 changes: 5 additions & 2 deletions .github/workflows/nix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -160,13 +160,16 @@ jobs:
env:
RELEASE_VERSION: ${{ inputs.version }}
run: |
package="$(nix build "path:$RUNNER_TEMP/release-source#hermes-agent" --no-link --print-out-paths)"
source="path:$RUNNER_TEMP/release-source"
package="$(nix build "$source#default" --no-link --print-out-paths)"
actual="$("$package/bin/hermes" --version)"
ACTUAL_VERSION="$actual" python3 - <<'PY'
import os
expected = os.environ["RELEASE_VERSION"]
actual = os.environ["ACTUAL_VERSION"].split()[-1].removeprefix("v")
# Line one is "Hermes Agent v<version> (...)"; later lines (Python, OpenAI SDK) carry other versions.
first = os.environ["ACTUAL_VERSION"].splitlines()[0].split()
actual = first[2].removeprefix("v") if first[:2] == ["Hermes", "Agent"] and len(first) > 2 else ""
if actual != expected:
raise SystemExit(f"Nix package version mismatch: expected {expected}, got {actual}")
PY
9 changes: 6 additions & 3 deletions .github/workflows/plugin-catalog-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,12 @@ jobs:
steps:
- uses: actions/checkout@f548e57e544e1ff5a4c46bf1e1b8685f8e4a348a # v7.0.1
with:
# The pull_request checkout is GitHub's merge commit; depth 2 brings its
# first parent (the base tip), which is all the diff below needs.
fetch-depth: 2
# Full commit graph + tags, blobs on demand: the diff below needs the
# merge commit's first parent, and Hermes resolves its own version
# from the release tags merged into HEAD. A shallow checkout reports
# "unknown", which plugins checking the host version reject (omh).
fetch-depth: 0
filter: blob:none
# `hermes plugins validate` below runs pinned-repo code; keep the
# job's token out of .git/config where that code could read it.
persist-credentials: false
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/pm-bundle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ on:
pull_request:
paths:
- 'pm/**'
- '!pm/**/*.md'
- 'scripts/bundles/**'
- 'scripts/ci/desktop_build_cache.py'
- '.github/actions/desktop-build-cache/**'
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/termux-verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ on:
paths:
- 'scripts/termux/**'
- 'pm/**'
- '!pm/**/*.md'
- 'tests/scripts/test_termux*'
- '.github/workflows/termux-verify.yml'
pull_request:
paths:
- 'scripts/termux/**'
- 'pm/**'
- '!pm/**/*.md'
- 'tests/scripts/test_termux*'
- '.github/workflows/termux-verify.yml'
workflow_dispatch:
Expand Down
Loading
Loading