Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2323 commits
Select commit Hold shift + click to select a range
0cbc4ce
fix(streaming): gate the interrupt worker join on live Relay managed …
teknium1 Aug 15, 2026
4b0c103
fix(desktop-update): wait for rebuilt executable before relaunch
konsisumer Aug 15, 2026
fa72a1e
fix(kanban): re-create the schema when a cached DB path loses it (#83…
JoaoMarcos44 Aug 11, 2026
4aa9f73
fix(update): rebuild Desktop after release artifact loss
konsisumer Aug 15, 2026
b9e03b4
fix(desktop): give chat images native right-click and proper save fil…
teknium1 Aug 15, 2026
2a9f57c
fix(desktop): suppress skill suggestion pill when the session already…
teknium1 Aug 15, 2026
979a200
fix(update): preserve activated extras across runtime rebuilds
hxwvaa Jul 30, 2026
b67f202
fix(update): honor lazy install opt-out during restore
hxwvaa Aug 1, 2026
d1df111
fix(update): restore Hermes Tools dependencies
hxwvaa Aug 7, 2026
5599dc0
chore: map hbasheer@student.42abudhabi.ae -> hxwvaa for contributor a…
teknium1 Aug 15, 2026
3af56c2
fix(install.ps1): surface uv installer errors and add GitHub + existi…
teknium1 Aug 15, 2026
62014d8
fix(guard): steer live-checkout block message to disk-backed scratch …
teknium1 Aug 15, 2026
2bccd6a
fix(managed_uv): fall forward to next Python minor when current line …
RelaxJonh Aug 1, 2026
471c687
test(managed_uv): cover explicit-patch fallback on the next minor lin…
teknium1 Aug 15, 2026
cee2446
fix(cache): keep prompt_cache_key warm across compression session rot…
kshitijk4poor Aug 15, 2026
96cdf19
refactor(cache): fold self-review findings on the rotation-scope fix
kshitijk4poor Aug 15, 2026
e3fab04
refactor(cache): never-raising scope resolver shared by both call sites
kshitijk4poor Aug 15, 2026
b54b052
feat(desktop): multi-connection registry — named agent sources (schem…
teknium1 Aug 15, 2026
0904f50
fix(desktop): address connections-registry review findings
teknium1 Aug 15, 2026
0807673
fmt(js): `npm run fix` on merge (#86751)
hermes-seaeye[bot] Aug 15, 2026
30c469b
fix(gateway): spare pidfile-less Scheduled-Task gateways from the orp…
EvanProgramming Aug 15, 2026
5ef5227
fix(bedrock): let aux calls omit the Converse maxTokens cap
kshitijk4poor Aug 15, 2026
8b58f9f
test(bedrock): pin stream-path cap omission; document truthiness edge
kshitijk4poor Aug 15, 2026
ce996d4
feat(delegation): raise max_concurrent_children default 3 -> 10 (+mig…
teknium1 Aug 15, 2026
dcc2f3d
fix(vision): stop capping aux vision output with hardcoded max_tokens
adikpb Jul 31, 2026
ec470d9
test(vision): assert vision aux calls carry no max_tokens cap
adikpb Jul 31, 2026
688abc5
test(vision): assert no max_tokens cap in browser and video aux kwargs
adikpb Jul 31, 2026
d2672a3
feat(gateway): optional profile param on cron.manage RPC (#86796)
teknium1 Aug 15, 2026
fbaea9b
feat(sessions): generic 'hidden' session flag (sidebar-hide, still re…
teknium1 Aug 15, 2026
6479493
docs(desktop): document Settings → Connections (multi-connection regi…
teknium1 Aug 15, 2026
96d6db1
fix(artifacts): convert DB timestamps from seconds to ms for Date()
icemeng Jun 8, 2026
021950a
fix(desktop): stop artifact over-indexing
404Dealer Aug 8, 2026
bceac69
fix(desktop): artifacts page timestamps render 1970 and local images …
thatssoheil Aug 10, 2026
18bac64
chore: map contributor email for icemeng
teknium1 Aug 15, 2026
34e05c3
fix(desktop): render pet sprite at devicePixelRatio for sharp HiDPI o…
NorethSea Aug 15, 2026
fd08722
fix(desktop): smooth-scale pet sprite frames
fanfan343 Aug 11, 2026
d474ba5
test(desktop): cover bicubic smoothing in pet sprite
fanfan343 Aug 11, 2026
5eb1d2b
fix(desktop): restore pet.info backstop after live-sync regression
Adolanium Aug 8, 2026
28d2de1
fix(desktop): surface isolated tool failures in pet state
LBeghini Aug 8, 2026
9e88289
fix(petdex): quoted 'false' now disables display.pet.enabled everywhere
thatssoheil Aug 7, 2026
343068e
fix(petdex): cover the CLI pet pane and status-line signature too
thatssoheil Aug 7, 2026
ce02f0a
fix(pets): cover the pets CLI (doctor, has-active, /pet toggle) too
thatssoheil Aug 7, 2026
8052d5d
test(pets): lock the quoted-false behavior on the CLI surfaces
thatssoheil Aug 7, 2026
4f29374
fix(gateway): send-once spritesheet semantics for pet.info (#54730)
teknium1 Aug 15, 2026
1c23c2a
chore: map contributor email for attribution audit
teknium1 Aug 15, 2026
868c400
fix(tui): stop disabled pet cell polling
bananawalnut Jul 23, 2026
f0cfe5a
perf(dashboard): bound multi-profile sidebar polling
SiteupAgencia Aug 3, 2026
4466578
fix(kanban): detect WS client disconnect on idle board, prevent zombi…
tugrulguner Aug 3, 2026
6d0d748
chore: add contributor email mapping
tugrulguner Aug 3, 2026
5bceb3e
fix(dashboard): add idle back-off to PTY pump loop (#42627)
Christopher-Schulze Aug 8, 2026
bee0d45
perf(desktop): pause background UI work while unfocused
Aug 8, 2026
67a1c1e
fix(dashboard): use a fixed sidebar cache TTL (no HERMES_* env var fo…
teknium1 Aug 15, 2026
106207c
chore: map contributor emails for attribution audit
teknium1 Aug 15, 2026
f535a4f
test(desktop): pin document.hasFocus in background-sync backstop tests
teknium1 Aug 15, 2026
edd73da
test(kanban): regression for idle-board WS disconnect detection (#77833)
teknium1 Aug 15, 2026
aa8e92f
test: pin document.hasFocus in status timer test (useViewedInterval g…
teknium1 Aug 15, 2026
3d73821
fix(agent): stop thread output descriptor leaks
Reksely Aug 8, 2026
c99a45b
fix(browser): reap leaked agent-browser daemons whose owner is still …
Aug 9, 2026
7de5a65
fix(pets): delete row strips after extracting their frames
Adolanium Jun 25, 2026
b9672ea
fix(pets): remove the non-PNG base draft after hardening
Adolanium Jun 25, 2026
aba4934
fix(agent): omit unsupported metadata on Relay scope.pop
astraltrekkin Aug 5, 2026
94ce839
fix(sessions): release active-session leases against their acquisitio…
teknium1 Aug 15, 2026
2fecf39
chore: map contributor email for Hangzian
teknium1 Aug 15, 2026
0d07fe6
fix(projects): use _branch_lane_id for non-git folders to prevent dup…
Tranquil-Flow Jun 27, 2026
f7de2ca
fix(desktop): order project-tree lanes by recency in the overview, no…
briandevans Jul 13, 2026
0fd223d
fix(desktop): stop dual main lanes for non-git project workspaces
rsk-731 Jul 20, 2026
3defb25
fix(desktop): evict stale lane entry when overlay moves session to wo…
liuhao1024 Jun 30, 2026
d40dda7
fix(desktop): preserve lane session recency order
MustafaK99 Jul 12, 2026
db1d898
fix(desktop): no-op branch switch on non-repo project lanes
Inspired-by-Atmosphere Aug 10, 2026
e89532d
fix(desktop): order async session git metadata
embwl0x Aug 2, 2026
f378a8f
fix(projects): dedup project_create by primary_path (#75820)
teknium1 Aug 15, 2026
cab6eb7
test(projects): widen lane-id derivation regression coverage
teknium1 Aug 15, 2026
e0e4d3a
chore(contributors): map salvage-branch contributor emails
teknium1 Aug 15, 2026
d16326b
test: align lost-and-found schema pins with git_metadata_generation c…
teknium1 Aug 15, 2026
f080bc3
fix(tui): steady scrollbar after transcript shrink
LeonSGP43 May 14, 2026
6b39ae4
fix(desktop): let sidebar wheel scrolling chain past the virtualized …
teknium1 Aug 15, 2026
da68ecf
design(kanban): add side-by-side dialog prototype (4 variants)
DavidMetcalfe Jun 22, 2026
7448e7a
feat(plugins): expose Dialog/ConfirmDialog/Toast/useToast/useConfirmD…
DavidMetcalfe Jun 22, 2026
08f32a6
fix(kanban): replace native browser dialogs with in-app ConfirmDialog
DavidMetcalfe Jun 22, 2026
77f35ad
fix(tui): honor destructive slash confirmation config
YuYigeng Jul 26, 2026
7d34d7d
docs(tui): clarify destructive confirm controls
YuYigeng Jul 30, 2026
8e35ff0
fix(desktop): confirm before clearing the entire Enabled Toolsets lis…
PRATHAMESH75 Jul 28, 2026
e6708af
feat(desktop): confirm before deleting a session
RichardGuan1 Aug 6, 2026
4c24629
fix(console): skip the checkpoints prune confirmation the console alr…
briandevans Aug 8, 2026
1025cb0
fix(desktop): stop deleted sessions resurrecting through racing list …
teknium1 Aug 15, 2026
eaaecbc
chore: update contributor attribution map
teknium1 Aug 15, 2026
3c2daf5
i18n(web): add kanban bulk-confirm keys to all locales (English fallb…
teknium1 Aug 15, 2026
6fb6123
test: replace any-casts with typed globalThis narrowing in plugin SDK…
teknium1 Aug 15, 2026
20beee7
fix(desktop): prevent Enter from submitting during IME composition
satotakumi Jun 2, 2026
3d51c40
fix(desktop): prevent IME submit in inline edit composer
izumi0uu Jun 6, 2026
202e5b8
fix(desktop): block Enter keyCode 229 after IME compositionend
Jun 7, 2026
39e7607
fix(desktop): recover from a stale IME composition flag that wedged t…
AIalliAI Jun 11, 2026
9f2e6d0
fix(desktop): ignore IME composition keydowns in keybind combo resolu…
baslam Aug 13, 2026
5877884
fix(desktop): extend stale-flag self-heal and keyCode 229 guard to th…
teknium1 Aug 15, 2026
aa95939
test(desktop): cover IME composition guards in keybind combo resolution
teknium1 Aug 15, 2026
27a22b8
chore: map contributor emails for IME salvage
teknium1 Aug 15, 2026
15e7c56
style: eslint --fix on salvaged IME test (curly + padding rules)
teknium1 Aug 15, 2026
084fca9
fix(tui): clear input after Korean IME submit
sweetcornna Jun 3, 2026
834a9fc
fix(tui): preserve IME text before return submit
InphinitiZ Jun 5, 2026
5dec501
fix(tui): stop Vietnamese Telex IME from dropping characters
hanhvs Jun 30, 2026
e2f7850
fix(tui): tighten IME test per teknium1 review (#55415)
hanhvs Jul 15, 2026
2af4da4
fix(dashboard): prevent React from dropping first keystroke during IM…
liuhao1024 Jun 24, 2026
278c6eb
test(dashboard): reproduce dropped dead-key composition input
dplush Aug 1, 2026
6ece2da
fix(dashboard): forward committed dead-key input to PTY
dplush Aug 1, 2026
0924e33
fix(dashboard): defer IME fallback until xterm input settles
dplush Aug 1, 2026
c066b5a
test(dashboard): cover IME fallback lifecycle
dplush Aug 1, 2026
3d9fdb2
fix(dashboard): avoid duplicate IME fallback input
dplush Aug 1, 2026
874ae74
fix(dashboard): keep mouse input out of IME fallback
dplush Aug 1, 2026
a428531
fix(dashboard): preserve consecutive IME composition input
dplush Aug 1, 2026
434f1e9
fix(dashboard): retain composition after unrelated input
dplush Aug 1, 2026
0d40955
fix(dashboard): handle chunked IME composition input
dplush Aug 8, 2026
00516e6
test(dashboard): cover delayed IME fallback after unrelated input
dplush Aug 12, 2026
daa3f66
chore: map contributor emails for IME TUI salvage
teknium1 Aug 15, 2026
29ce482
style: eslint --fix import ordering in salvaged IME tests
teknium1 Aug 15, 2026
ee9ec61
perf(state): stop selecting full message content in session search
Adolanium Aug 2, 2026
6e1bdc0
perf(session-search): adapt discovery result hydration
blunkjamie-dev Aug 9, 2026
163d7af
fix(session-search): forward detail through agent paths
blunkjamie-dev Aug 9, 2026
888807d
docs(sessions): clarify actual-message retrieval
blunkjamie-dev Aug 9, 2026
4415f91
test(session-search): lock positional parameter prefix
blunkjamie-dev Aug 9, 2026
2162d58
perf(run-agent): reuse the Anthropic request-local client instead of …
JoaoMarcos44 Aug 2, 2026
7e439db
perf: parallelize provider model-list fetches in model picker
lepetitprince716-prog Aug 6, 2026
3806f8f
fix(session-search): forward detail through the public session_search…
teknium1 Aug 15, 2026
7f84de2
chore(contributors): map lepetitprince716@gmail.com -> lepetitprince7…
teknium1 Aug 15, 2026
b587681
fix: keep historical thinking collapsed in tui
LeonSGP43 Jun 8, 2026
2b0b4a2
feat(tui): auto-collapse reasoning blocks only when the reasoning pha…
JElfferich Aug 8, 2026
10bf145
feat(desktop): collapse thinking by default
isak-ialogics Jul 22, 2026
ac0d0f8
fix(desktop): flip zone collapse chevron to action direction
chillerno1 Jul 29, 2026
c6ec8a9
test(desktop): cover docked zone chevron direction
chillerno1 Jul 30, 2026
505f289
feat(web): add collapse toggle for the chat side panel
Eros-ITA Aug 10, 2026
a33ac1e
feat(desktop): add session list density modes
DavidMetcalfe Aug 15, 2026
8ea53d7
chore: map contributor emails for salvage attribution
teknium1 Aug 15, 2026
865e4e7
fix(desktop): default session list density to compact
teknium1 Aug 15, 2026
29c2813
style(desktop): prettier/eslint pass on salvaged files
teknium1 Aug 15, 2026
ddf6456
test: stub virtualizer.measure in virtual-session-list mock (density …
teknium1 Aug 15, 2026
6da30f7
fix(tui_gateway): fall back to session id when session_key is NULL in…
jdgg777 Aug 15, 2026
a654c52
chore: map contributor email (audit_pr_attribution)
teknium1 Aug 15, 2026
1ef7a0b
fix(desktop): recover empty model catalogs
mjolley9 Aug 12, 2026
20e5d78
fix(desktop): recover failed gateway catalogs
mjolley9 Aug 12, 2026
73e9b1a
docs(desktop): align getGateway docstring with $gateway atom subscrip…
mjolley9 Aug 15, 2026
101740e
chore: map contributor email (audit_pr_attribution)
teknium1 Aug 15, 2026
b066f2b
fix(history): isolate branch transcripts from parent updates
DannyFengTianYu Aug 2, 2026
07b9090
fix(desktop): preserve complete history when branching
DannyFengTianYu Aug 2, 2026
8a22220
chore: map contributor email (audit_pr_attribution)
teknium1 Aug 15, 2026
ee1731b
perf(cli): re-export decomposed command modules lazily, ~60ms off eve…
Adolanium Jul 29, 2026
473490a
perf(cli): stop per-keystroke config re-reads in slash completers
spfcraze Aug 3, 2026
4bd746c
perf(cli): memoise default-hermes-root resolution and global auth-sto…
spfcraze Aug 3, 2026
47400fe
test: make memo pins pre-fix-safe (raising=False resets)
spfcraze Aug 3, 2026
2a5093e
docs(auth): note get_default_hermes_root in the global-store memo doc…
spfcraze Aug 3, 2026
7b45d1d
perf(toolsets): memoise resolve_toolset keyed on registry generation
spfcraze Aug 3, 2026
e25cafc
perf(agent): cache per-turn display-flag config reads
spfcraze Aug 3, 2026
b9f7525
test(agent): pin measured-work regression for display-flag config cache
spfcraze Aug 3, 2026
2f54ad4
perf(cli): skip launcher-side plugin discovery for TUI handoff
jackoconner45 Aug 7, 2026
46fe44f
test(cli): stub portable-MCP lookup in completer read test; bound res…
teknium1 Aug 15, 2026
aa27edd
chore(contributors): map jackoconner55@icloud.com
teknium1 Aug 15, 2026
3c570c6
fix(desktop): preserve copy image for large remote media
locker95 Jul 16, 2026
0bc7070
fix(desktop): gate image copy on decoded contents
locker95 Jul 16, 2026
d5a8658
fix(desktop): save remote gateway files natively
PaulBlackSwan Jul 13, 2026
27b0039
fix(desktop): stream native gateway downloads + 404 data-url fallback
PaulBlackSwan Jul 16, 2026
03c85a1
test(desktop): port gateway-file-download tests to vitest electron pr…
teknium1 Aug 15, 2026
0930133
chore: map contributor email for PaulBlackSwan
teknium1 Aug 15, 2026
af585de
fmt(js): `npm run fix` on merge (#86801)
hermes-seaeye[bot] Aug 15, 2026
f2a30fa
test: derive lost-and-found synthetic width from the live schema
teknium1 Aug 15, 2026
006a4a8
fix(desktop): restore full-width chat composer column
infinitycrew39 Jul 22, 2026
2a82c6f
style(desktop): align empty-state width with full chat column
infinitycrew39 Jul 22, 2026
354abd7
fix(desktop): keep empty composer from collapsing
deniqlab Jul 20, 2026
49fbca1
fix(desktop): prevent accidental composer popout
lesterlxt Jul 24, 2026
652ae48
fix(desktop): let the edit composer scroll long prompts
mollusk Jul 12, 2026
47970a9
fix(desktop): clear edit-composer submitting latch after 200ms cooldown
xrwang8 Jul 24, 2026
2245302
fix(desktop): let composer status titles use row width
helix4u Jun 27, 2026
0d44771
fix(desktop): keep composer stable across compression
Johnny-xuan Jul 29, 2026
24fc613
fix(desktop): downscale large images in composer preview to prevent U…
DavidMetcalfe Aug 6, 2026
485e1e8
fix(desktop): keep full-res previewUrl separate from downscaled thumb…
DavidMetcalfe Aug 6, 2026
d345f08
fix(desktop): bound multi-image thumbnail raster cost
frizikk Aug 13, 2026
5e09b40
fix(desktop): serialize composer image previews
frizikk Aug 13, 2026
6dfe63e
fix(desktop): preserve image attachment occurrence ownership
frizikk Aug 13, 2026
7d5e975
fix(desktop): preserve image preview ownership across drafts
frizikk Aug 13, 2026
193c199
fix(desktop): make image attachment updates occurrence-safe
frizikk Aug 13, 2026
462e7d8
fix(desktop): preserve tile attachment ownership
frizikk Aug 13, 2026
e2a2fba
fix(desktop): preserve in-flight attachment replacements
frizikk Aug 13, 2026
d0642e6
fix(desktop): preserve legacy attachment replacements
frizikk Aug 13, 2026
89df391
fix(desktop): keybinds skip IME composition keys; pin draft survival …
teknium1 Aug 15, 2026
32efae9
chore: map contributor emails for salvaged commits
teknium1 Aug 15, 2026
1c9de87
fix: drop duplicate composingRef declaration from rebase weave
teknium1 Aug 15, 2026
13acf77
fix(desktop): remove session.new keybind hijacking typed N keys
baslam Aug 1, 2026
101dfd7
Add PageUp and PageDown keybind support
V0v1kkkAssistant Jun 25, 2026
245efda
fix(desktop): dispose the HUD snap shortcut on native window close
pierrenode Aug 10, 2026
a590321
fix(desktop): show platform commit shortcut
KeroZelvin Aug 1, 2026
f61fb52
fix(desktop): show platform layout modifier
KeroZelvin Aug 1, 2026
34f4845
fix(desktop): show platform Kanban modifier
KeroZelvin Aug 1, 2026
89f9375
feat(desktop): archive the current session via hotkey and ⌥+⇧-click
brian717 Aug 15, 2026
d4fa3f7
feat(desktop): add option to disable F12 DevTools shortcut
Jul 25, 2026
3b5d5e4
fix: address review feedback on Disable F12 DevTools PR
kas-cor Aug 8, 2026
dacb99d
fix(desktop): keep the deliberate mod+N chord for session.new
teknium1 Aug 15, 2026
a9361cf
fix(desktop): add zh locale strings for the Disable F12 toggle
teknium1 Aug 15, 2026
100098e
chore: map salvage contributor emails for attribution audit
teknium1 Aug 15, 2026
aaaea58
test+style: align session.new binding pin with #76185 and eslint --fix
teknium1 Aug 15, 2026
ca77157
fix: create message_metadata module and update chat_completion_helpers
tuck-coe Aug 10, 2026
d615587
fix: stamp user message timestamps in turn_context
tuck-coe Aug 10, 2026
261ed6e
fix: stamp timestamps in model_metadata, turn_finalizer
tuck-coe Aug 10, 2026
79a41c1
fix: convert remaining messages.append() calls to append_message()
tuck-coe Aug 10, 2026
03636ab
test: add message_metadata unit tests
tuck-coe Aug 10, 2026
7f7aefe
fix: restore complete message timestamp coverage
coe0718 Aug 12, 2026
1db9273
fix(gateway): timestamp launchd error log lines
doncazper Jul 5, 2026
6a375a2
fix(gateway): timestamp shared stderr output
doncazper Jul 15, 2026
a896322
feat(desktop): show detailed transcript timestamps
nicochase Aug 11, 2026
5f2a15a
fix(desktop): separate system timestamp text
nicochase Aug 11, 2026
c9d0cba
fix(desktop): show exact timestamps in tooltips (#70450)
Jul 24, 2026
1dbeb47
fix(desktop): timestamp every desktop.log / RECENT LOGS line
Enough1122 Aug 12, 2026
4a663dd
fix(desktop): sort imports to satisfy perfectionist lint (#84508)
Enough1122 Aug 12, 2026
77fcc2e
feat(display): honor display.timestamps across desktop transcript and…
teknium1 Aug 15, 2026
c21dc29
chore(contributors): map salvaged author emails
teknium1 Aug 15, 2026
2108d4b
fix(dashboard): paste on Ctrl+V and word-delete on Ctrl+Backspace/Delete
null-runner Jul 12, 2026
be25039
fix(tui): restore copy and cut shortcuts
null-runner Jul 14, 2026
4e6d863
fix(dashboard): gate shortcut sends on PTY state
null-runner Jul 16, 2026
24af668
fix(tui): word-delete forward and transactional cut
null-runner Jul 20, 2026
2ae7884
fix: make CLI multiline shortcuts work by default
John-Lussier Jul 9, 2026
b3447c2
test: align submit bindings with multiline default
John-Lussier Jul 10, 2026
fef9c53
fix(cli): convert Alt key shortcuts to sequence tuple for prompt_tool…
moisesvalero Jul 29, 2026
180bd4b
chore: map salvage contributor emails for attribution audit
teknium1 Aug 15, 2026
fbe4d73
test: type the WebSocket mock to satisfy docker-build tsc strictness
teknium1 Aug 15, 2026
77be513
fmt(js): `npm run fix` on merge (#86813)
hermes-seaeye[bot] Aug 15, 2026
a5b5043
fix(desktop): key the completed-unread dot on the focused session, no…
Jefftree Jul 29, 2026
d2c2b0b
fix(desktop): persist sidebar unread dots across app restarts
Zeus-Deus Jul 29, 2026
26b4315
fix(desktop): profile-scope persisted unread and stop cold-boot stora…
Zeus-Deus Jul 31, 2026
1abedda
fix(desktop): clear unread dot on tile open + add mark-as-read actions
gitong Aug 2, 2026
71e8c35
fix(desktop): clear unread for the whole conversation family, don't r…
Aug 10, 2026
c75d835
feat(desktop): mark a session as unread/read with a persisted watermark
Nicolas-Formenton Aug 12, 2026
5cf6122
chore: map contributor email
Nicolas-Formenton Aug 13, 2026
b44b99e
fix(desktop): integrate the unread read-state layers — focused-sessio…
teknium1 Aug 15, 2026
e1dd43b
chore: map contributor emails
teknium1 Aug 15, 2026
0ceb739
style: eslint --fix on salvaged unread-dot files
teknium1 Aug 15, 2026
7f92187
test: pass onToggleUnread in wheel-overscroll VirtualSessionList fixt…
teknium1 Aug 15, 2026
eb4f72f
test: satisfy new unread props at remaining sibling fixture (session-…
teknium1 Aug 15, 2026
f0c222c
fmt(js): `npm run fix` on merge (#86820)
hermes-seaeye[bot] Aug 15, 2026
77f1262
fix(codex): strip tool controls from summary calls
Julientalbot May 26, 2026
9a4383f
fix(telegram): publish sanitized runtime receipt
BenSheridanEdwards Jul 22, 2026
3f73ff5
fix(auth): enforce xAI external OAuth refresh ownership
BenSheridanEdwards Aug 3, 2026
d0823d8
fix(config): group OAuth ownership under security
BenSheridanEdwards Aug 3, 2026
4f63b91
fix(auth): reject unattended xAI device login
Aug 4, 2026
3b437c6
fix(cron): guard lifecycle state parse against ValueError
BenSheridanEdwards Aug 5, 2026
a06b0fd
test(auth): make external-owner persist test pass tty guard
BenSheridanEdwards Aug 6, 2026
456a7a5
feat(secrets): share Bitwarden disk cache across profiles with file l…
BenSheridanEdwards Aug 6, 2026
d5211b6
fix(auth): enforce Codex external OAuth refresh ownership
BenSheridanEdwards Aug 6, 2026
271be03
test: stop the suite running real git against its own checkout
BenSheridanEdwards Aug 7, 2026
3bcef2e
fix(gateway): /new stamps config primary and never fallbacks on EMFILE
BenSheridanEdwards Aug 14, 2026
8558b80
fix(ci): do not treat MagicMock or git init -b main as live writes
BenSheridanEdwards Aug 14, 2026
204a1be
fix(gateway): route webhook auto-TTS voice to deliver target (#6)
BenSheridanEdwards Aug 14, 2026
5373b40
test(codex): stop two migration tests spawning the real codex CLI (#5)
BenSheridanEdwards Aug 14, 2026
4c05489
merge fork/main (content already carried: 14 commits rebased onto ups…
BenSheridanEdwards Aug 15, 2026
b1d22be
test(runtime): repair fleet rebase CI guards
Aug 15, 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
  •  
  •  
  •  
18 changes: 18 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# CodeRabbit configuration.
#
# 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 —
# 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.
#
# The bot stays installed and summonable on demand: comment
# `@coderabbitai review` on any PR to request a one-off review, or
# `@coderabbitai ignore` to mute it on a PR it has already joined.
#
# To re-enable auto-review, flip `enabled: true` below (or delete this file —
# the app default is on).
reviews:
auto_review:
enabled: false
24 changes: 24 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,27 @@ web/package-lock.json linguist-generated=true
Dockerfile text eol=lf
*.dockerfile text eol=lf
docker/entrypoint.sh text eol=lf

# Enforce LF for all source/text files. Windows editors and tools default to
# CRLF; without normalization a Windows contributor's edit turns into a
# whole-file phantom diff (every line "changed" by its ending), breaks
# string-match patch tooling, and pollutes review. `text` normalizes to LF
# at check-in; `eol=lf` also checks out as LF so the working tree matches
# the index on every platform. PowerShell files are the deliberate
# exception (PS 5.1 tooling expects CRLF).
*.py text eol=lf
*.ts text eol=lf
*.tsx text eol=lf
*.js text eol=lf
*.mjs text eol=lf
*.cjs text eol=lf
*.jsx text eol=lf
*.json text eol=lf
*.yaml text eol=lf
*.yml text eol=lf
*.toml text eol=lf
*.md text eol=lf
*.css text eol=lf
*.html text eol=lf
*.svg text eol=lf
*.ps1 text eol=crlf
6 changes: 6 additions & 0 deletions .github/actions/detect-changes/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,15 @@ outputs:
deps:
description: Check pyproject.toml dependency upper bounds.
value: ${{ steps.classify.outputs.deps }}
uv_lock:
description: Run `uv lock --check` (pyproject.toml / uv.lock changes only).
value: ${{ steps.classify.outputs.uv_lock }}
npm_lock:
description: Post/update the semantic package-lock.json diff PR comment.
value: ${{ steps.classify.outputs.npm_lock }}
installer:
description: Run the PowerShell installer tests on a Windows runner.
value: ${{ steps.classify.outputs.installer }}
mcp_catalog:
description: Require MCP catalog security review label.
value: ${{ steps.classify.outputs.mcp_catalog }}
Expand Down
Binary file removed .github/pr-screenshots/39327/providers-collapsed.png
Binary file not shown.
Binary file removed .github/pr-screenshots/39327/providers-expanded.png
Binary file not shown.
Binary file removed .github/pr-screenshots/39327/tools-collapsed.png
Binary file not shown.
Binary file removed .github/pr-screenshots/39327/tools-expanded.png
Binary file not shown.
Binary file removed .github/pr-screenshots/45449/billing-confirm.png
Binary file not shown.
Binary file removed .github/pr-screenshots/45449/billing-overview.png
Binary file not shown.
Binary file not shown.
80 changes: 80 additions & 0 deletions .github/workflows/ci-review-comment.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
name: CI review comment

# Live-updating PR review comment.
#
# The poller runs for up to 40 minutes.
# This run lives in its own workflow.
# A run stays in progress until its last job ends, and GitHub refuses
# ``gh run rerun`` on a run that is in progress.
#
# ``workflow_run`` starts this when CI starts. It always reads the workflow
# and the scripts from the default branch, never from the PR head.
# It makes a write token safe here.
#
# The poller reads job results through the API. Thus it watches the CI run
# and the separate docker run, and it depends on neither.

on:
workflow_run:
workflows: [CI]
# ``in_progress``, not ``requested``: a first-time contributor's run
# sits in ``action_required`` until a maintainer approves it, and
# ``requested`` fires at creation — the poller would wait out its
# whole timeout on a run that never starts. ``in_progress`` fires
# when the run actually starts, and it also fires on re-runs, which
# ``requested`` does not.
types: [in_progress]

permissions:
contents: read
actions: read
pull-requests: write

# One poller per CI run. A new push starts a new CI run, and its poller
# cancels the poller of the run that GitHub superseded. The group keys
# on the head repository too: fork PRs often share a branch name
# (``main``, ``patch-1``), and two PRs must not cancel each other.
concurrency:
group: ci-review-comment-${{ github.event.workflow_run.head_repository.full_name }}-${{ github.event.workflow_run.head_branch }}
cancel-in-progress: true

jobs:
comment:
name: CI review comment (live)
# Fork PRs get no comment: the poller needs a write token, and the
# ``pull_requests`` payload is empty for a fork run.
if: >-
github.event.workflow_run.event == 'pull_request' &&
github.event.workflow_run.head_repository.full_name == github.repository
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- name: Checkout trusted default branch
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ github.event.repository.default_branch }}
persist-credentials: false

- name: Run live comment poller
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# The CI run to report on — not this run. The name must not be
# GITHUB_RUN_ID: the runner sets the GITHUB_* defaults itself and
# ignores an env: override, so that name silently resolves to THIS
# run. The poller then watches itself, which stays in_progress for
# as long as the poller runs, and it waits out its whole timeout.
CI_RUN_ID: ${{ github.event.workflow_run.id }}
# Sibling runs for the same commit that the comment also covers,
# one workflow name per line (a name can contain a comma).
# The poller resolves each name to its runs through the API.
WATCH_WORKFLOWS: |
Docker Build, Test, and Publish
PR_NUMBER: ${{ github.event.workflow_run.pull_requests[0].number }}
RUN_URL: ${{ github.event.workflow_run.html_url }}
# Commit info for the review comment header.
COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
COMMIT_MESSAGE: ${{ github.event.workflow_run.head_commit.message }}
run: |
python3 -u scripts/ci/live_comment.py \
--interval 15 \
--timeout 3000
134 changes: 37 additions & 97 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ permissions:
pull-requests: write # needed by lint (PR comment) + supply-chain review_status
actions: read # needed by osv-scanner (SARIF upload)
security-events: write # needed by osv-scanner (SARIF upload)
packages: write # needed by docker build

concurrency:
group: ci-${{ github.ref }}
Expand All @@ -47,7 +46,9 @@ jobs:
site: ${{ steps.classify.outputs.site }}
scan: ${{ steps.classify.outputs.scan }}
deps: ${{ steps.classify.outputs.deps }}
uv_lock: ${{ steps.classify.outputs.uv_lock }}
npm_lock: ${{ steps.classify.outputs.npm_lock }}
installer: ${{ steps.classify.outputs.installer }}
docker_meta: ${{ steps.classify.outputs.docker_meta }}
mcp_catalog: ${{ steps.classify.outputs.mcp_catalog }}
ci_review: ${{ steps.classify.outputs.ci_review }}
Expand All @@ -71,7 +72,17 @@ jobs:
if: needs.detect.outputs.python == 'true'
uses: ./.github/workflows/tests.yml
with:
slice_count: 8
slice_count: 12

# 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.
tests-os:
name: OS-specific tests
needs: detect
if: needs.detect.outputs.python == 'true'
uses: ./.github/workflows/tests-os.yml

lint:
name: Python lints
Expand All @@ -87,6 +98,13 @@ jobs:
if: needs.detect.outputs.frontend == 'true'
uses: ./.github/workflows/js-tests.yml

installer-tests:
name: Installer tests
needs: detect
# Windows-only, and only for PRs that touch install.ps1 or its tests.
if: needs.detect.outputs.installer == 'true'
uses: ./.github/workflows/installer-tests.yml

e2e-desktop:
name: Desktop E2E
needs: detect
Expand Down Expand Up @@ -126,6 +144,12 @@ jobs:
uv-lockfile:
name: Check uv.lock
needs: detect
# Gated: `uv lock --check` re-resolves the whole dependency graph against
# PyPI, so on every PR it spent a network round-trip — and, on a registry
# blip, a blocking red X — for diffs that cannot desync the lockfile
# (docs, frontend, prose). Only pyproject.toml / uv.lock can. A
# `.github/` change still forces it on via the classifier's fail-open.
if: needs.detect.outputs.uv_lock == 'true'
uses: ./.github/workflows/uv-lockfile-check.yml

infographic-check:
Expand All @@ -145,17 +169,6 @@ jobs:
if: needs.detect.outputs.docker_meta == 'true'
uses: ./.github/workflows/docker-lint.yml

docker:
name: Build&Test Docker image
needs: detect
# Trusted main pushes run docker.yml directly so its container-publish
# environment secrets never cross this reusable-workflow call. PR runs
# remain build/test-only and secret-free. Gated on python_prod (not
# python): the image copies installed code, never tests/ — tests-only
# PRs skip the build.
if: needs.detect.outputs.event_name == 'pull_request' && (needs.detect.outputs.python_prod == 'true' || needs.detect.outputs.frontend == 'true' || needs.detect.outputs.docker_meta == 'true')
uses: ./.github/workflows/docker.yml

supply-chain:
name: Supply-chain scan
needs: detect
Expand All @@ -181,83 +194,6 @@ jobs:
name: OSV scan
uses: ./.github/workflows/osv-scanner.yml

# ─────────────────────────────────────────────────────────────────────
# Live-updating PR review comment.
#
# A single ``comment-live`` job polls the GitHub Actions API every 15s
# for job statuses in this run, re-assembles the review comment from
# whatever results are available, and upserts it via the
# ``<!-- hermes-ci-review-bot -->`` marker.
#
# When the visible job set goes quiet, the poller waits 10 seconds and polls
# once more so downstream jobs created by an aggregate gate get included.
# ─────────────────────────────────────────────────────────────────────
comment-live:
name: CI review comment (live)
needs: [detect, review-labels, lockfile-diff, supply-chain, osv-scanner, uv-lockfile, history-check, contributor-check, e2e-desktop]
if: always() && github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork != true
runs-on: ubuntu-latest
timeout-minutes: 40
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ github.event.repository.default_branch }}
persist-credentials: false

- name: Run live comment poller
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_RUN_ID: ${{ github.run_id }}
PR_NUMBER: ${{ github.event.pull_request.number }}
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
# Commit info for the review comment header.
COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
COMMIT_MESSAGE: ${{ github.event.pull_request.head.commit.message }}
COMMIT_URL: ${{ github.server_url }}/${{ github.repository }}/pull/${{ github.event.pull_request.number }}/commits/${{ github.event.pull_request.head.sha }}
# Structured review statuses from workflow_call jobs.
# Each job outputs a JSON array of {source, results: [...]} objects
# that the assembler renders directly — no hardcoded job-name
# matching. We merge all available outputs into one array.
REVIEW_STATUSES: ${{ toJSON(needs.*.outputs.review_status) }}
run: |
set -uo pipefail

# REVIEW_STATUSES is a JSON array of strings (some may be empty
# when a job was skipped). Parse each string and merge into one
# flat array for the assembler.
python3 - <<'PYEOF'
import json, os, sys

raw = os.environ.get("REVIEW_STATUSES", "")
merged = []
if raw:
try:
arr = json.loads(raw)
except (json.JSONDecodeError, TypeError):
arr = []
for item in arr:
if not item:
continue
try:
statuses = json.loads(item)
except (json.JSONDecodeError, TypeError):
continue
if isinstance(statuses, list):
merged.extend(statuses)

# Write merged array to a temp file the poller reads.
with open("/tmp/review_statuses.json", "w") as f:
json.dump(merged, f)
print(f"Merged {len(merged)} review status entries")
PYEOF

python3 scripts/ci/live_comment.py \
--interval 15 \
--timeout 2100 \
--review-statuses-file /tmp/review_statuses.json

# ─────────────────────────────────────────────────────────────────────
# Gate: runs after everything. ``if: always()`` ensures it reports a
# status even when some deps were skipped. Only actual ``failure``
Expand All @@ -273,8 +209,10 @@ jobs:
needs:
- detect
- tests
- tests-os
- lint
- js-tests
- installer-tests
- e2e-desktop
- docs-site
- history-check
Expand All @@ -285,9 +223,10 @@ jobs:
- supply-chain
- review-labels
- osv-scanner
# comment-live is a polling job — it doesn't block the gate.
# we don't require docker to pass rn because it's so slow lol
# - docker
# The image build runs in its own workflow (docker.yml) and reports
# its own check. It was never required here, because it is too slow
# to block a merge. A separate run also stops it from holding this
# run open. That is what blocked ``gh run rerun``.
if: always()
runs-on: ubuntu-latest
timeout-minutes: 10
Expand Down Expand Up @@ -324,12 +263,13 @@ jobs:
# report with a gantt chart + per-step breakdown. The report is uploaded
# as an artifact and a markdown summary is written to $GITHUB_STEP_SUMMARY.
#
# The live comment poller can read the standalone review-status artifact
# after the HTML report is uploaded, so its link points straight at that report.
# The live comment poller dynamically fetches all review-status-* artifacts
# across the orchestrator and sub-workflow runs every cycle, so its link
# points straight at that report.
# ─────────────────────────────────────────────────────────────────────
ci-timings:
name: CI timing report
needs: [all-checks-pass, docker]
needs: [all-checks-pass]
if: always()
runs-on: ubuntu-latest
timeout-minutes: 10
Expand Down Expand Up @@ -384,7 +324,7 @@ jobs:
continue-on-error: true
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: ci-timings-review-status
name: review-status-ci-timings
path: review-status.json
retention-days: 14

Expand Down
15 changes: 15 additions & 0 deletions .github/workflows/contributor-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ jobs:
if [ -z "$NEW_EMAILS" ]; then
echo "No new commits to check."
echo "review_status=[]" >> "$GITHUB_OUTPUT"
echo "review_status=[]" > review-status.json
exit 0
fi

Expand Down Expand Up @@ -86,8 +87,22 @@ jobs:
--arg how_to_fix "$HOW_TO_FIX" \
'[{"source":"contributor attribution","results":[{"kind":"action_required","title":"Unmapped contributor email(s)","summary":"New contributor email(s) are not in AUTHOR_MAP.","detail":$detail,"how_to_fix":$how_to_fix}]}]')
echo "review_status=$REVIEW_STATUS" >> "$GITHUB_OUTPUT"
echo "review_status=$REVIEW_STATUS" > review-status.json

exit 1
else
echo "✅ All contributor emails are mapped."
echo "review_status=[]" >> "$GITHUB_OUTPUT"
echo "review_status=[]" > review-status.json
fi

- name: Upload review status artifact
if: always() && steps.check-emails.outcome != 'skipped'
continue-on-error: true
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: review-status-contributor-check
path: review-status.json
retention-days: 1
overwrite: true
if-no-files-found: ignore
Loading