Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2398 commits
Select commit Hold shift + click to select a range
fe2ae40
fix(agent): demote oversized tool results in protected compression tail
giggling-ginger Jul 10, 2026
d12ea20
test(agent): cover protected-tail last resort
giggling-ginger Jul 11, 2026
18d83b4
test(agent): pin the #61932 all-oversized-tail dead-end shape as comp…
teknium1 Jul 23, 2026
d2bb6cc
fix(compression): merge todo snapshot into trailing user msg to avoid…
yingliang-zhang Jun 30, 2026
33fd705
fix(compression): preserve multimodal todo tails
yingliang-zhang Jul 15, 2026
06a2d77
fix(compression): gate todo-snapshot merge on real-user tails, refres…
teknium1 Jul 23, 2026
2ca38e5
test(compression): pin scaffolding-tail standalone append + stale-sna…
teknium1 Jul 23, 2026
4035d70
fix(context-engine): honor quiet compaction status
stephenschoettler May 30, 2026
28dced2
test: isolate quiet compaction status assertions
stephenschoettler Jun 8, 2026
d81a3db
fix(context-engine): adapt quiet compaction status to turn-context re…
stephenschoettler Jun 20, 2026
49a8c61
fix(context-engine): route pre-API and idle compaction status through…
teknium1 Jul 23, 2026
ca9c30c
fix(gateway): bound hygiene compression failures
kshitijk4poor Jun 27, 2026
2e9765b
fix(gateway): route hygiene-timeout warning via profile-aware adapter…
teknium1 Jul 23, 2026
acbc3ab
fix(cli): widen startup worktree pruning to all .worktrees/ trees and…
teknium1 Jul 23, 2026
de602b7
fix(update): self-heal venv after failed lazy backend refresh
HexLab98 Jul 4, 2026
a9a8ba2
test(update): cover lazy refresh venv repair after failed installs
HexLab98 Jul 4, 2026
8aa2a8b
fix(update): import-based recovery under Windows hermes.exe self-lock
HexLab98 Jul 23, 2026
40fd2b8
fix(update): split core vs lazy markers; probes cannot false-clear
HexLab98 Jul 23, 2026
509960e
fix(update): stdlib-only early recovery before hermes_cli.main imports
teknium1 Jul 23, 2026
795bf4a
fix(credential-pool): attribute failures to the key that failed, not …
Jul 5, 2026
a9613d2
fix(credential-pool): refresh the failing entry, not current(), on au…
Jul 20, 2026
129b9f9
test: make interrupt-pool double's entries callable
teknium1 Jul 23, 2026
1c58fe4
chore(contributors): add email mapping for schattenan
teknium1 Jul 23, 2026
714d7cc
fix(windows): hide console flashes in GUI-reachable exec paths and pr…
basilalshukaili Jul 2, 2026
a553bc7
test(windows): regression coverage for the six #56747 hide-flag sites
teknium1 Jul 23, 2026
47bbc12
fix(kanban): isolate delegated children from parent task
ddifa86 Jul 16, 2026
a7dcf97
fix(kanban): harden delegated-child mutation boundary
ddifa86 Jul 22, 2026
b327eaa
chore: map trkim@vms-solutions.com to ddifa86
teknium1 Jul 23, 2026
792ede0
test: pin repo root on PYTHONPATH for subprocess-boundary kanban isol…
teknium1 Jul 23, 2026
cdfe562
fix(auxiliary): unwrap explicit provider:moa to its aggregator, not t…
srojk34 Jul 2, 2026
2755bf5
fix(auxiliary): route all MoA aux resolution through one shared aggre…
teknium1 Jul 23, 2026
683059f
fix(api_server): fail closed when API_SERVER_KEY strength can't be ve…
Drexuxux Jul 22, 2026
e321b83
feat(skills): add tldraw-offline agent scripting skill
teknium1 Jul 18, 2026
849c177
fix(skills/tldraw-offline): correct the computer-use delivery note
teknium1 Jul 18, 2026
ec5835a
fix(compression): persist anti-thrash state across process restarts (…
teknium1 Jul 23, 2026
08298da
fix(computer-use): handle Linux cua window metadata
dnth Jul 23, 2026
b86367e
fix: signal lock-hold to callers when compression skips
0xLeathery Jul 3, 2026
65145d9
fix(cli): show lock-hold reason when /compress no-ops
0xLeathery Jul 3, 2026
eed6bb1
fix(gateway): show lock-hold reason when /compress no-ops
0xLeathery Jul 3, 2026
07cb4a6
fix(tui): show lock-hold reason when /compress no-ops
0xLeathery Jul 3, 2026
e8000b4
fix: prevent stale lock-skip signal leaking between compress_context …
0xLeathery Jul 3, 2026
eb7be2e
fix(compress): classify unconfirmed lock-acquire failures and cover a…
teknium1 Jul 23, 2026
4cb85fb
fix(compress): type-pin the lock-skip signal check at every consumer
teknium1 Jul 23, 2026
02f1dd0
fix(moa): route Copilot slots by target model
nullptr0807 Jul 7, 2026
51083d2
fix(moa): route every Copilot credential path by target
nullptr0807 Jul 16, 2026
6bd02ae
feat(image_routing): accept vision alias for custom provider models
happy5318 Jul 13, 2026
dc3e4e8
fix(kanban): keep delegated results in worker turn
MustafaK99 Jul 12, 2026
4c88e21
chore: map rmk799@outlook.com to MustafaK99
teknium1 Jul 23, 2026
6833eab
fix(kanban): isolate worker-created child workspaces
Jul 19, 2026
b9b5481
fix(kanban): preserve cross-profile project child routing
Jul 19, 2026
781968b
chore: map team@williepeacock.com to peacockesq
teknium1 Jul 23, 2026
b0a8889
Surface warning when context exceeds compression threshold but compre…
Jul 11, 2026
5c8d098
Address sweeper review: safe should_compress_info + cover all guards
Jul 11, 2026
1d1b670
fix(compression): reset blocked-overflow dedup on every compression p…
teknium1 Jul 23, 2026
d5c03fb
fix(compression): guard overflow-warn dedup reset against minimal tes…
teknium1 Jul 23, 2026
01b0451
fix(compression): compose the blocked-warning probe with engine prefl…
teknium1 Jul 23, 2026
0e15805
fix(credential-pool): exhaust all entries sharing a failed API key on…
Jul 21, 2026
1f07fae
perf(credential-pool): persist same-key sibling exhaustion once
teknium1 Jul 23, 2026
76d4b65
chore(contributors): add email mapping for airclear
teknium1 Jul 23, 2026
fdd3943
fix(update): survive undeletable untracked files during autostash (#7…
teknium1 Jul 23, 2026
3d67f00
fix(credential-pool): stop lost-update cooldown erasure and wrong-key…
drleadflow Jul 16, 2026
547bf1e
test: isolate unmatched-hint regression from live ~/.claude credentials
teknium1 Jul 23, 2026
c2c2449
chore(contributors): add email mapping for drleadflow
teknium1 Jul 23, 2026
65d42e3
fix(kanban): stop decompose siblings sharing one worktree checkout
ahmadashfq Jul 10, 2026
5b794c9
fix(credential_pool): acquire the pool lock in has_available/peek/cur…
solyanviktor-star Jul 11, 2026
769381f
fix(credential_pool): complete the locking boundary across the public…
solyanviktor-star Jul 12, 2026
d9165d7
fix: resolve current entry unlocked in try_refresh_matching no-hint b…
teknium1 Jul 23, 2026
0dbf639
fix(windows): hidden-console daemons — extend the parent-console fix …
teknium1 Jul 23, 2026
2962ba2
fix(auxiliary): treat explicit model:auto sentinel, not just cfg_model
srojk34 Jul 1, 2026
1d603fe
fix(moa): pass custom extra_body to slots
Jul 7, 2026
4ab3bf6
test(moa): cover the one-shot /moa aggregator path for slot extra_body
teknium1 Jul 23, 2026
78312c1
fix(moa): preserve custom provider context metadata
wjq990112 Jul 19, 2026
c7fd3eb
fix(gateway): honor explicit api_server enabled:false under env key
davidgut1982 Jun 23, 2026
3638136
fix(auth): count MoA preset slots as explicit provider configuration
baenregod Jul 23, 2026
ada06ee
test(gateway): loosen hygiene-timeout wall-clock bound to flake polic…
teknium1 Jul 23, 2026
4f71095
docs(slack): document bot message handling
haran2001 Jul 10, 2026
2b226be
docs(messaging): document the '!' prefix for Slack thread commands
navahc09 Jun 13, 2026
6d4f7f4
docs(slack): gap pass — mention-gating decision table, allow_bots dee…
teknium1 Jul 23, 2026
6b1b2e6
chore: map shubhambc09@gmail.com -> navahc09
teknium1 Jul 23, 2026
74db4bf
fix(gateway): bridge top-level port/host into extra for webhook and a…
Jul 2, 2026
24d7333
test(gateway): cover msgraph_webhook port/host/secret bridging + cont…
teknium1 Jul 23, 2026
96f21e8
fix(gateway): make Slack platform note capability-aware when slack to…
ygd58 Jul 21, 2026
e027f43
fix(gateway): key Slack capability gate into the prompt pin; defer po…
teknium1 Jul 23, 2026
4253460
fix(slack): throttle channel directory warnings
LeonSGP43 May 2, 2026
0eb5cb5
fix(slack): surface bot-event arrival and allow_bots interop diagnost…
haran2001 May 22, 2026
c1529e5
fix(gateway): quiet Slack missing_scope channel directory fallback
nanckh Jun 3, 2026
93102e9
fix(slack): add catch-all event handler to prevent Slack auto-disabli…
shivasymbl Jun 4, 2026
ece3dd1
fix(slack): avoid logging block text previews
ooiuuii Jul 4, 2026
390ddfd
fix(slack): quiet Slack display defaults — no heartbeat/busy-ack brea…
peterw Jul 23, 2026
565ea19
test(slack): pin catch-all event matcher registration and non-shadowing
ygd58 Jul 23, 2026
44f6f84
test(slack): behavioral log-noise/privacy suite + keep clarify choice…
teknium1 Jul 23, 2026
bc56002
chore(contributors): add email mappings for slack C13 log-noise salvage
teknium1 Jul 23, 2026
3ec5a06
test(slack): mark block-privacy fixture message as human-authored (cl…
teknium1 Jul 23, 2026
26a2fda
fix(slack): surface thread images/files as markers in fetched thread …
yemi-lagosinternationalmarket Jul 23, 2026
2d7353c
feat(slack): deliver thread-root images on the first mention turn
teknium1 Jul 23, 2026
c132783
test(slack): regression coverage for thread image/file context visibi…
teknium1 Jul 23, 2026
93a47dd
chore: map yemi@lagosinternationalmarket.com -> yemi-lagosinternation…
teknium1 Jul 23, 2026
f716b87
fix(slack): edit status bubbles in place instead of posting new ones
trac3r00 Jul 21, 2026
fa8a3e3
fix(slack): preserve progress edits on network failures
2001Y Jul 13, 2026
62747aa
fix(slack): delete stale progress messages
Trantor-develops Jul 2, 2026
e40a38a
fix(slack): avoid assistant status on synthetic top-level threads
dorukardahan Jul 23, 2026
d35b003
fix(gateway): respect reply_in_thread=false for Slack progress messages
patp May 2, 2026
5c89cc4
fix(slack): clear assistant status on every send() exit path
teknium1 Jul 23, 2026
21ac2b5
chore: map contributor emails for Slack C6 progress-cards salvage
teknium1 Jul 23, 2026
ca988df
test(slack): importorskip real slack_sdk/slack_bolt in transient-edit…
teknium1 Jul 23, 2026
42626da
fix(security): pin DNS resolutions for SSRF-safe fetches
egilewski Jul 3, 2026
0cd4afe
fix(security): guard remaining preflighted HTTP fetches
egilewski Jul 15, 2026
2e08b77
fix(security): validate inbound Slack file URLs against SSRF
zapabob Jun 11, 2026
1d7db1b
fix(slack): neutralize prompt injection in thread-context backfill
Frowtek Jul 18, 2026
fccc222
fix(slack): warn when slack_tokens.json is group/world-readable
AlexFucuson9 Jul 7, 2026
8e4b5d8
harden(slack): CDN-allowlist inbound file URLs, DNS-pin token downloa…
teknium1 Jul 23, 2026
12096b1
docs: add SQLite FD leak infographic and report updates for #69678
JoaoMarcos44 Jul 23, 2026
4dccfcd
feat(bedrock): add Converse API prompt caching (cachePoint)
JoaoMarcos44 Jul 23, 2026
beffbab
docs(bedrock): add cachePoint architecture infographic
JoaoMarcos44 Jul 23, 2026
a4bc1ca
fix(timeline): persist typed display events (#69771)
ethernet8023 Jul 23, 2026
6bb0eac
fix(gateway): don't re-deliver consumed background completions as raw…
teknium1 Jul 23, 2026
8d1b137
test(gateway): pin automatic /goal continuation drain — no user nudge…
teknium1 Jul 23, 2026
61ea271
feat(slack): elapsed typing heartbeat — 'still working… (2m03s)' on l…
MrAbsaroka Jul 23, 2026
9179940
fix(gateway): hint Slack/Discord channels at the prior auto-reset ses…
metamon-p Jul 23, 2026
9ddcb58
chore(contributors): add email mapping for metamon-p (PR #36220 salvage)
teknium1 Jul 23, 2026
9c9b057
fix(slack): forward reaction_added events to the message pipeline
bpross Jul 23, 2026
558dab0
feat(slack): opt-in reaction triggers, removed events, hooks, channel…
teknium1 Jul 23, 2026
1f25791
chore(release): map C17 reaction-cluster contributor emails
teknium1 Jul 23, 2026
50a6dc7
fix(gateway): duck-type set_reaction_handler on adapter wiring sites
teknium1 Jul 23, 2026
8e6d1a9
fix(slack): stop double-decoding HTML entities when escaping message …
briandevans Jul 15, 2026
b810711
fix(gateway): strip language tag from Slack fenced code blocks
z23 Jul 15, 2026
cc64f02
fix(slack): add bold-text zero-width-space guard for trailing non-wor…
Jul 23, 2026
132e000
fix(slack): avoid duplicating rich-text link messages
mzkarami Jul 17, 2026
5e44413
fix: escape triple-backtick in reasoning before wrapping in outer cod…
Skywind5487 Jun 18, 2026
9ed5aef
test: code fence tracking coverage for all send/split paths
Skywind5487 Jun 18, 2026
3e2fe3f
fix: close orphaned code fences on all send paths
Skywind5487 Jun 18, 2026
b932997
fix: also close orphaned single-backtick inline-code spans
Skywind5487 Jun 27, 2026
b86ca7c
fix(gateway): keep overflow stream chunks editable
Jun 14, 2026
72f714c
fix(gateway): preserve adapter overflow splitting in streams
2001Y Jul 23, 2026
a773879
feat(slack): wrap and align GFM tables for proper mrkdwn rendering
kylezh Jul 23, 2026
c934c53
feat(slack): opt-in Block Kit markdown block rendering for standard m…
shivasymbl Jul 23, 2026
eaa35ae
fix(gateway): balance code fences on every remaining chunk-split path
teknium1 Jul 23, 2026
80dcff8
chore: map C11 salvage contributor emails + fixture kwarg fix
teknium1 Jul 23, 2026
1f45504
chore(contributors): map 2001Y machine-local email
teknium1 Jul 23, 2026
9e4b898
fix(gateway): require usable API_SERVER_KEY to enroll the api_server …
nawfalaf Jul 23, 2026
089f09f
fix(api_server): mark rejected API_SERVER_KEY as non-retryable fatal …
cifangyiquan Jul 23, 2026
53e6435
fix(gateway): parse gateway.api_server YAML config section (#66630)
Jul 18, 2026
6ced760
test(gateway): cover gateway.api_server YAML discovery + extra bridge…
teknium1 Jul 23, 2026
32f7c5a
fix(gateway): distinguish gateway auth 401 from provider API key errors
annguyenNous Jun 5, 2026
25b3cd2
fix(desktop): i18n the gateway auth error summary + clean regex char …
teknium1 Jul 23, 2026
08abc5e
fix(prompt): forbid MEDIA: tags in the api_server platform hint
Jul 21, 2026
cd6fb2b
fix(prompt): scope api_server MEDIA: hint to actual interception beha…
teknium1 Jul 23, 2026
185b08a
chore: add contributor mapping for elphamale
teknium1 Jul 23, 2026
246eace
fix(gateway): deliver kanban/delegate wake-ups to api_server sessions
ianks Jul 15, 2026
2cc0ff4
fix(kanban): advance notify cursor only after a successful wake self-…
teknium1 Jul 23, 2026
0796a98
fix(api_server): bind chat_id (raw session id) on /v1/runs
teknium1 Jul 23, 2026
f50c3d9
fix(delegation): persist origin_session_id in durable dispatch records
teknium1 Jul 23, 2026
a60b00e
fix(slack): isolate workspace-local routing
jordanhubbard Jul 15, 2026
ed67f9a
test(slack): adapt main's marker-mechanism tests to workspace-scoped …
teknium1 Jul 23, 2026
06be0e6
fix(gateway): namespace Slack sessions by workspace
trac3r00 Jul 21, 2026
c1c991a
fix(gateway): unify legacy-Slack-key recovery on the claim-once path
teknium1 Jul 23, 2026
ca8aee8
fix(slack): route file downloads to the owning workspace via URL-embe…
benjamin2026-dot Jul 23, 2026
9439f11
test(slack): pin download-token workspace routing (#59742)
teknium1 Jul 23, 2026
5ee1c42
chore: map contributor emails for C9 salvage (jordanhubbard, trac3r00…
teknium1 Jul 23, 2026
543941f
fix(slack): tolerate bare adapter instances in _remember_channel_team…
teknium1 Jul 23, 2026
f8f5ce7
fix(slack): honor ignored channels before gateway dispatch
byshubham Jun 24, 2026
ee62aab
fix(slack): honor disable_dms setting
vexclawx31 Jun 26, 2026
241bc11
fix(platforms): clear home channel when setup prompt left blank
DavidMetcalfe Jul 23, 2026
c5b62fd
fix(gateway): guard chained .get() against None intermediate values
annguyenNous May 29, 2026
2946805
feat(slack): set HermesAgent User-Agent on slack-bolt client
mwbrooks Jun 10, 2026
805c22c
fix(streaming): add Slack streaming=false default to match Discord
AhmetArif0 Jun 2, 2026
0a5d8a1
feat(slack): support long app descriptions in the manifest generator
2001Y Jul 23, 2026
da131ae
feat(slack): bridge slack.ignored_channels through the YAML→env confi…
teknium1 Jul 23, 2026
8685fea
fix(slack): resolve channel IDs to human-readable names
dirtyren Apr 30, 2026
d9fe008
fix(slack): prefer live send adapter and try multi-workspace tokens i…
replygirl Jul 23, 2026
6651376
chore: map contributor emails for mwbrooks and replygirl
teknium1 Jul 23, 2026
c4f5a45
fix(gateway): tolerate bare GatewayRunner instances in the ignored-ch…
teknium1 Jul 23, 2026
75afaf4
test(gateway): use valid API server key in env override test (#70274)
ethernet8023 Jul 23, 2026
53bdcac
fix(desktop): stop assistant reply rendering twice after a tool-call …
SHL0MS Jul 23, 2026
053f162
fmt(js): `npm run fix` on merge (#70291)
hermes-seaeye[bot] Jul 23, 2026
4c9628e
fix(anthropic): coerce empty/whitespace-only text blocks on the reque…
PRATHAMESH75 Jul 23, 2026
5be99b6
ci(js-tests): split check into parallel matrix shards per workspace (…
ethernet8023 Jul 23, 2026
cc1725c
fix(moa): stop reference_max_tokens from also capping the aggregator
srojk34 Jul 3, 2026
32a4faa
fix(auxiliary): honor max_tokens for MoA reference/aggregator tasks
Janig88 Jul 4, 2026
3616ce0
fix: use auxiliary_max_tokens_param for Copilot GPT-5 compat
Janig88 Jul 4, 2026
289fad1
fix(auxiliary): thread task=task through _build_call_kwargs in fallba…
Janig88 Jul 7, 2026
3dce1b9
fix(auxiliary): scope max_tokens to moa_reference only (not aggregator)
Janig88 Jul 15, 2026
4ee74fa
fix: forward max_tokens to gemini-native so MoA reference cap applies
awain7 Jul 4, 2026
ead9d7b
test: cover gemini-native max_tokens forwarding in _build_call_kwargs
awain7 Jul 16, 2026
bc7212c
feat(moa): per-reference-model max_tokens override
rain-sk Jul 7, 2026
69339aa
fix(compaction): skip compression when it can't reduce tokens
golldyck Jul 1, 2026
8cd49c4
fix(compression): reclaim locks from dead processes
the3asic Jul 16, 2026
6ab8428
fix(compression): keep PID probing POSIX-only
the3asic Jul 16, 2026
fdefb2d
fix(compression): prefer psutil.pid_exists for lease liveness probe; …
teknium1 Jul 23, 2026
056a40a
fix(agent): defer turns during compression lock contention instead of…
helix4u Jul 23, 2026
eebc228
fix(gateway): retry-next-message semantics for compression_deferred +…
teknium1 Jul 23, 2026
34678d2
fix(compression): skip empty post-handoff summary windows
Jul 6, 2026
6a8d318
chore: map kinsonnee@gmail.com -> WOLIKIMCHENG for #59526 salvage
teknium1 Jul 23, 2026
17a81ac
fix(context_compression): roll back interrupted preflight state pollu…
izumi0uu Jun 29, 2026
66fdcfa
fix: harden salvaged preflight display rollback for test-double density
teknium1 Jul 23, 2026
cb481e2
feat(compression): proactive tool-result pruning for large-window models
Kolektori Jul 11, 2026
fa48004
feat(compression): prompt-cache reclaim gate + hardened wiring for pr…
teknium1 Jul 23, 2026
80ece38
fix: bound compression summary input
May 18, 2026
b7a05b6
fix: re-anchor summary-input bound to current main + bound iterative …
teknium1 Jul 23, 2026
8d72845
fix(cli): resolve moa:<preset> model in non-interactive mode
0xDevNinja Jul 20, 2026
d661886
test(cli): assert HermesCLI.__init__ wires moa:<preset> to the moa pr…
0xDevNinja Jul 20, 2026
c1f5f0f
fix(doctor): recognise 'moa' as a valid internal provider
liuhao1024 Jul 5, 2026
3638abf
fix(moa): parse JSON string reference_models in _normalize_preset
wen0531 Jul 6, 2026
85b2d52
test(moa): regression tests for JSON-string reference_models parsing …
teknium1 Jul 23, 2026
d4c6ae7
fix(moa): preserve save_traces/trace_dir on GUI config save
liuhao1024 Jul 5, 2026
a7d78ad
fix: filter invalid MoA slot providers
Jul 12, 2026
3ea35d6
fix(vertex,moa): register vertex in PROVIDER_REGISTRY and HERMES_OVER…
srojk34 Jul 1, 2026
df051c1
fix(vertex): surface vertex in the /model picker — credential gate + …
teknium1 Jul 23, 2026
9b868f6
chore: contributor email mappings for wen0531 and iniak
teknium1 Jul 23, 2026
5faef80
fix: ghost skill P0/P1 mitigation - [SKILL_PRUNED] marker + safety rule
dolphin-creator Jun 7, 2026
6816f2f
fix(P1+P2): marker names skill_view(name='X') + DEDUP rule for repeat…
dolphin-creator Jul 23, 2026
44c67fc
fix(compression): ghost-skill defense — canonical marker constant, pr…
teknium1 Jul 23, 2026
28f73d3
test(compression): ghost-skill defense suite — marker round-trip, pro…
teknium1 Jul 23, 2026
6936510
fix(compression): mark raw skill_view bodies summarized away, not onl…
teknium1 Jul 23, 2026
a9c8682
feat(compress): preserve recent N user messages during context compre…
Jul 13, 2026
d43cc2c
fix(compress): gate N-user tail guarantee to actionable turns, behavi…
teknium1 Jul 23, 2026
d0d116b
fix: getattr-guard min_tail_user_messages for __new__ test doubles
teknium1 Jul 23, 2026
f65d105
fix(agent): preserve Gemini thought_signature in MoA aggregator mode
AlexFucuson9 Jul 17, 2026
8d11983
fix(gemini): emit thoughtSignature sentinel for cross-provider tool_c…
Apr 25, 2026
8d14e19
fix(agent): close MoA stream on interrupt
deaneeth Jul 2, 2026
5501187
fix(moa): restore virtual runtime after fallback
ildunari Jun 27, 2026
0749cac
fix(moa): share facade factory so restore/recover keep reference rela…
teknium1 Jul 23, 2026
4c66307
fix(moa): pass Copilot initiator header to advisors
dyreckt Jul 7, 2026
16950a4
fix(moa): normalize Copilot aliases + carry x-initiator through retry…
teknium1 Jul 23, 2026
74a56b7
test(moa): regression for aggregator-model thought_signature resoluti…
teknium1 Jul 23, 2026
850f576
feat(moa): add every_n fanout cadence with cached-guidance reuse
teknium1 Jul 23, 2026
f7b90e6
feat(moa): add privacy redaction filter with display/full modes
teknium1 Jul 23, 2026
30bb555
fix(gateway): retry detached restart watcher without breakaway
VerbalChainsaw Jul 14, 2026
d6ffe3d
fix(windows): hide console flashes from LSP server spawn and installe…
hellofrommorgan Jul 23, 2026
4276fe8
test(windows): pin hide-flags contract for LSP client spawn and npm/g…
teknium1 Jul 23, 2026
6b278ee
fix(desktop): respect HERMES_GIT_BASH_PATH in findGitBash()
Jul 14, 2026
ebf5426
chore: map contributor email for seamusmore (PR #64339 salvage)
teknium1 Jul 23, 2026
6c2c866
fix(desktop): join Windows bash candidates with path.win32 in find-gi…
teknium1 Jul 23, 2026
fbf04ae
style(desktop): apply eslint/prettier conventions to find-git-bash mo…
teknium1 Jul 23, 2026
43be8d1
fix(desktop): accumulate MoA reference reasoning blocks instead of re…
Jul 15, 2026
07a732c
fix(tui): keep MoA reference blocks visible when the thinking section…
Jul 15, 2026
d7fbd13
fix(tui): fix mount-collapse and live-progress gating for MoA referen…
Jul 16, 2026
6cbb8cc
fix(desktop): add MoA preset enabled toggle
teknium1 Jul 23, 2026
89e6f4c
feat(agent): add MOA progress indicator (#59546)
SquabbyZ Jul 6, 2026
ad6a2ae
feat(tui,desktop): surface MoA fan-out progress from moa.progress/moa…
teknium1 Jul 23, 2026
ca294d3
feat(moa): add reference model toggles
oppenheimor Jul 6, 2026
280c4dc
test(moa): round-trip regression for per-slot reasoning_effort + enabled
teknium1 Jul 23, 2026
513d302
test(web_server): update MoA slot-shape assertions for per-advisor en…
teknium1 Jul 23, 2026
385a065
test(moa): tolerate enabled flag in slot-shape assertions after cross…
teknium1 Jul 24, 2026
5c5960d
fix(windows): suppress console window flashes in env probes, lazy ins…
m4r13y Jul 19, 2026
0b17d4d
fix(windows): re-fit env_probe console suppression to the temp-file _…
teknium1 Jul 23, 2026
4fe11d1
Bridge protected patch tree to Nous upstream baseline 8fc278207b0f5b2…
vectorcmd Jul 24, 2026
a41bb85
Merge remote-tracking branch 'upstream/main' into ace/patches-nightly
vectorcmd Jul 24, 2026
fde81f6
chore: record Nous upstream baseline 0b17d4d71e1a
vectorcmd Jul 24, 2026
c577975
fix(desktop): restore intro import ordering
vectorcmd Jul 24, 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 .ace/upstream-main.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
8fc278207b0f5b25e567966f9615e1b1737f62af
0b17d4d71e1ad94aa8d3d9ae3172e031ab42860a
40 changes: 29 additions & 11 deletions .github/workflows/js-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 20
outputs:
packages: ${{ steps.set-matrix.outputs.packages }}
checks: ${{ steps.set-matrix.outputs.checks }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
Expand All @@ -22,21 +22,40 @@ jobs:
command: npm ci --ignore-scripts
- id: set-matrix
run: |
PACKAGES=$(npm query .workspace | jq -c '[.[].location]')
if [ "$PACKAGES" = "[]" ] || [ -z "$PACKAGES" ]; then
echo "::error::Workspace discovery produced an empty package list — refusing to emit a zero-length matrix (would skip all JS/TS checks silently)."
exit 1
fi
echo "packages=$PACKAGES" >> "$GITHUB_OUTPUT"
node -e '
const { execSync } = require("child_process");
const pkgs = JSON.parse(execSync("npm query .workspace", { encoding: "utf-8" }));
if (pkgs.length === 0) {
console.error("::error::Workspace discovery produced an empty package list — refusing to emit a zero-length matrix (would skip all JS/TS checks silently).");
process.exit(1);
}
const checks = [];
for (const pkg of pkgs) {
const scripts = pkg.scripts || {};
const subs = Object.keys(scripts).filter(s => /^check:.+$/.test(s));
if (subs.length > 0) {
for (const script of subs) {
checks.push({ package: pkg.location, script });
}
} else if (scripts.check) {
checks.push({ package: pkg.location, script: "check" });
}
}
if (checks.length === 0) {
console.error("::error::No check scripts found in any workspace package.");
process.exit(1);
}
process.stdout.write("checks=" + JSON.stringify(checks) + "\n");
' >> "$GITHUB_OUTPUT"

check:
name: Typecheck & Test
name: ${{ matrix.package }} / ${{ matrix.script }}
needs: workspaces
runs-on: ubuntu-latest
timeout-minutes: 20
strategy:
matrix:
package: ${{ fromJson(needs.workspaces.outputs.packages) }}
include: ${{ fromJson(needs.workspaces.outputs.checks) }}
fail-fast: false # report all failures, not just the first one
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
Expand All @@ -47,5 +66,4 @@ jobs:
- uses: ./.github/actions/retry
with:
command: npm ci
- run: npm run --prefix ${{ matrix.package }} check
- run: npm run --prefix ${{ matrix.package }} fix
- run: npm run --prefix ${{ matrix.package }} ${{ matrix.script }}
4 changes: 2 additions & 2 deletions acp_adapter/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -1936,8 +1936,8 @@ def _cmd_tools(self, args: str, state: SessionState) -> str:
return "No tools available."
lines = [f"Available tools ({len(tools)}):"]
for t in tools:
name = t.get("function", {}).get("name", "?")
desc = t.get("function", {}).get("description", "")
name = (t.get("function") or {}).get("name", "?")
desc = (t.get("function") or {}).get("description", "")
# Truncate long descriptions
if len(desc) > 80:
desc = desc[:77] + "..."
Expand Down
118 changes: 78 additions & 40 deletions agent/agent_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,7 @@ def init_agent(
checkpoint_max_total_size_mb: int = 500,
checkpoint_max_file_size_mb: int = 10,
pass_session_id: bool = False,
requested_provider: str = None,
):
"""
Initialize the AI Agent.
Expand All @@ -488,6 +489,7 @@ def init_agent(
base_url (str): Base URL for the model API (optional)
api_key (str): API key for authentication (optional, uses env var if not provided)
provider (str): Provider identifier (optional; used for telemetry/routing hints)
requested_provider (str): Original provider identity before runtime canonicalization
api_mode (str): API mode override: "chat_completions" or "codex_responses"
model (str): Model name to use (default: "anthropic/claude-opus-4.6")
max_iterations (int): Maximum number of tool calling iterations (default: 90)
Expand Down Expand Up @@ -568,6 +570,11 @@ def init_agent(
agent.base_url = base_url or ""
provider_name = provider.strip().lower() if isinstance(provider, str) and provider.strip() else None
agent.provider = provider_name or ""
agent.requested_provider = (
requested_provider.strip().lower()
if isinstance(requested_provider, str) and requested_provider.strip()
else agent.provider
)
agent._credential_pool = credential_pool
agent.acp_command = acp_command or command
agent.acp_args = list(acp_args or args or [])
Expand Down Expand Up @@ -1018,49 +1025,20 @@ def init_agent(
elif isinstance(effective_key, str) and len(effective_key) > 12:
print(f"🔑 Using token: {effective_key[:8]}...{effective_key[-4:]}")
elif agent.provider == "moa":
from agent.moa_loop import MoAClient
from agent.moa_loop import build_moa_facade
agent.api_mode = "chat_completions"

# Route reference-model outputs to the agent's tool_progress_callback so
# build_moa_facade wires the reference relay that routes
# reference-model outputs to the agent's tool_progress_callback so
# every surface that already consumes it (CLI spinner/scrollback, TUI,
# desktop, gateway) can show each reference's answer as a labelled block
# before the aggregator acts. The facade emits "moa.reference" and
# "moa.aggregating" events; we forward them through the same callback
# the tool lifecycle uses. Best-effort and cache-safe — these are
# display-only events, they never touch the message history.
def _moa_reference_relay(event: str, **kwargs: Any) -> None:
cb = getattr(agent, "tool_progress_callback", None)
if cb is None:
return
try:
if event == "moa.reference":
label = str(kwargs.get("label") or "")
text = str(kwargs.get("text") or "")
idx = kwargs.get("index")
count = kwargs.get("count")
cb(
"moa.reference",
label,
text,
None,
moa_index=idx,
moa_count=count,
)
elif event == "moa.aggregating":
cb(
"moa.aggregating",
str(kwargs.get("aggregator") or ""),
None,
None,
moa_ref_count=kwargs.get("ref_count"),
)
except Exception:
pass

agent.client = MoAClient(
agent.model or "default",
reference_callback=_moa_reference_relay,
)
# desktop, gateway) can show each reference's answer as a labelled
# block before the aggregator acts. The facade emits "moa.reference",
# "moa.progress", "moa.phase", and "moa.aggregating" events, forwarded
# through the same callback the tool lifecycle uses. Best-effort and
# cache-safe — display-only events, they never touch the message
# history. The factory is shared with the fallback-restore/recovery
# paths so a restored facade keeps emitting these events (#53802).
agent.client = build_moa_facade(agent, agent.model)
agent._client_kwargs = {}
agent.api_key = api_key or "moa-virtual-provider"
agent.base_url = "moa://local"
Expand Down Expand Up @@ -1803,6 +1781,28 @@ def _moa_reference_relay(event: str, **kwargs: Any) -> None:
compression_enabled = str(_compression_cfg.get("enabled", True)).lower() in {"true", "1", "yes"}
compression_target_ratio = float(_compression_cfg.get("target_ratio", 0.20))
compression_protect_last = int(_compression_cfg.get("protect_last_n", 20))
# Minimum REAL (actionable) user messages guaranteed to survive in the
# uncompressed tail (compression.min_tail_user_messages). Default 1
# preserves current behavior exactly — the existing single-user tail
# anchor. Values > 1 extend the guarantee to the last N actionable
# user turns. Booleans rejected (bool subclasses int), non-int-like
# values fall back to 1, floor at 1.
_raw_min_tail_users = _compression_cfg.get("min_tail_user_messages", 1)
if isinstance(_raw_min_tail_users, bool):
compression_min_tail_users = 1
elif isinstance(_raw_min_tail_users, int):
compression_min_tail_users = _raw_min_tail_users
elif isinstance(_raw_min_tail_users, float):
compression_min_tail_users = (
int(_raw_min_tail_users) if _raw_min_tail_users.is_integer() else 1
)
else:
try:
compression_min_tail_users = int(str(_raw_min_tail_users).strip())
except (TypeError, ValueError):
compression_min_tail_users = 1
if compression_min_tail_users < 1:
compression_min_tail_users = 1
# Cap on compression retry rounds before a turn gives up with "max
# compression attempts reached" (compression.max_attempts). Hardcoding 3
# strands sessions that legitimately need more rounds — e.g. a restart
Expand Down Expand Up @@ -1831,6 +1831,39 @@ def _moa_reference_relay(event: str, **kwargs: Any) -> None:
if compression_max_attempts < 1:
compression_max_attempts = 3
compression_max_attempts = min(compression_max_attempts, 10)

def _parse_prune_int(raw, default):
# Same parser semantics as compression.max_attempts above: reject
# booleans (bool subclasses int — YAML `true` would coerce to 1),
# reject fractional floats rather than truncating them, accept
# integral floats and numeric strings, fall back to the default on
# anything else.
if isinstance(raw, bool):
return default
if isinstance(raw, int):
return raw
if isinstance(raw, float):
return int(raw) if raw.is_integer() else default
try:
return int(str(raw).strip())
except (TypeError, ValueError):
return default

# Opt-in proactive tool-result prune trigger (0 = disabled — the
# default, so an unset key is behavior-neutral). Negative values are
# treated as disabled rather than erroring.
compression_proactive_prune_tokens = max(
0, _parse_prune_int(_compression_cfg.get("proactive_prune_tokens", 0), 0)
)
compression_proactive_prune_min_chars = _parse_prune_int(
_compression_cfg.get("proactive_prune_min_result_chars", 8000), 8000
)
compression_proactive_prune_min_reclaim = max(
0,
_parse_prune_int(
_compression_cfg.get("proactive_prune_min_reclaim_tokens", 4096), 4096
),
)
# protect_first_n is the number of non-system messages to protect at
# the head, in addition to the system prompt (which is always
# implicitly protected by the compressor). Floor at 0 — a value of
Expand Down Expand Up @@ -2305,6 +2338,10 @@ def _moa_reference_relay(event: str, **kwargs: Any) -> None:
max_tokens=agent.max_tokens,
model_thresholds=compression_model_thresholds,
threshold_tokens_cap=compression_threshold_tokens,
proactive_prune_tokens=compression_proactive_prune_tokens,
proactive_prune_min_result_chars=compression_proactive_prune_min_chars,
proactive_prune_min_reclaim_tokens=compression_proactive_prune_min_reclaim,
min_tail_user_messages=compression_min_tail_users,
)
_bind_session_state = getattr(agent.context_compressor, "bind_session_state", None)
if callable(_bind_session_state):
Expand Down Expand Up @@ -2569,6 +2606,7 @@ def _moa_reference_relay(event: str, **kwargs: Any) -> None:
agent._primary_runtime = {
"model": agent.model,
"provider": agent.provider,
"requested_provider": agent.requested_provider,
"base_url": agent.base_url,
"api_mode": agent.api_mode,
"api_key": getattr(agent, "api_key", ""),
Expand Down
Loading
Loading