Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1332 commits
Select commit Hold shift + click to select a range
0f1c970
fix(api-server): harden jobs API β€” input limits, field whitelist, sta…
teknium1 Mar 22, 2026
89befca
fix(cron): support Telegram topic delivery via platform:chat_id:threa…
teknium1 Mar 22, 2026
c0c13e4
fix(api-server): harden jobs API β€” input limits, field whitelist, sta…
teknium1 Mar 22, 2026
56b0104
fix: respect DashScope v1 runtime mode for alibaba (#2459)
teknium1 Mar 22, 2026
ffa8b56
fix(discord): properly route slash event handling in threads
teknium1 Mar 22, 2026
0e64a48
Merge pull request #2460 from NousResearch/hermes/hermes-5d6932ba
teknium1 Mar 22, 2026
f842305
docs(skill): add split, merge, search examples to ocr-and-documents s…
teknium1 Mar 22, 2026
027fc1a
fix: replace production print() calls with logger in rl_training_tool…
teknium1 Mar 22, 2026
f69c47d
fix: /stop command crash + UnboundLocalError in streaming media delivery
teknium1 Mar 22, 2026
0962cbb
fix: /stop command crash + UnboundLocalError in streaming media deliv…
teknium1 Mar 22, 2026
0698ddb
fix(compression): remove hardcoded gemini-3-flash-preview as default …
Mar 22, 2026
a53db44
fix(compression): remove hardcoded gemini-3-flash-preview as default …
teknium1 Mar 22, 2026
e804891
fix: improve error message when PortAudio system library is missing
Mar 22, 2026
e6a708a
fix(io): catch ValueError in _SafeWriter for closed file handles (#2428)
Mar 22, 2026
f3301a3
fix(email): guard against IndexError when IMAP search returns empty list
Mar 21, 2026
2de42ba
fix(state): add missing thread lock to session_count() and message_co…
Mar 21, 2026
5407d12
fix(agent): strip trailing empty assistant messages before API calls …
ygd58 Mar 20, 2026
edda0e3
fix: batch of 5 small contributor fixes (#2466)
teknium1 Mar 22, 2026
2603026
docs: Gemini OAuth provider implementation plan (#2467)
teknium1 Mar 22, 2026
ab3cbfc
feat(discord): persistent typing indicator for DMs
teknium1 Mar 22, 2026
b7091f9
feat(cli): MCP server management CLI + OAuth 2.1 PKCE auth
teknium1 Mar 22, 2026
3037450
Merge pull request #2468 from NousResearch/hermes/hermes-5d6932ba
teknium1 Mar 22, 2026
34be3f8
revert: remove trailing empty assistant message stripping
teknium1 Mar 22, 2026
fd32e3d
revert: remove trailing empty assistant message stripping (#2471)
teknium1 Mar 22, 2026
8d528e0
fix(api_server): persist ResponseStore to SQLite across restarts (#2472)
teknium1 Mar 22, 2026
ff071fc
fix(gateway): process /queue'd messages after agent completion (#2469)
teknium1 Mar 22, 2026
c275aa4
Merge pull request #2465 from NousResearch/hermes/hermes-31d7db3b
teknium1 Mar 22, 2026
f9c2ad4
fix: defer streaming iteration linebreak to prevent blank line stacking
MacroAnarchy Mar 22, 2026
44b572a
fix: defer streaming iteration linebreak to prevent blank line stacki…
teknium1 Mar 22, 2026
0510ee0
chore: add minimax-m2.7 to model catalogs (#2474)
teknium1 Mar 22, 2026
ebd0291
docs(honcho): add self-hosted / Docker configuration section
teknium1 Mar 22, 2026
a227617
Merge pull request #2475 from NousResearch/hermes/hermes-31d7db3b
teknium1 Mar 22, 2026
6435d69
fix: make vision_analyze timeout configurable via config.yaml (#2480)
teknium1 Mar 22, 2026
9c32fed
feat(cli): Claude Code-style @ context completions
teknium1 Mar 22, 2026
be3eb62
fix(tests): resolve all consistently failing tests
teknium1 Mar 22, 2026
24cf2a7
Merge pull request #2488 from NousResearch/hermes/hermes-31d7db3b
teknium1 Mar 22, 2026
09fd007
Merge pull request #2482 from NousResearch/hermes/hermes-5d6932ba
teknium1 Mar 22, 2026
afe2f0a
feat(discord): add document caching and text-file injection (#2503)
teknium1 Mar 22, 2026
72a6d7d
fix(model_metadata): skip endpoint probe for known providers (Copilot…
teknium1 Mar 22, 2026
bfe4baa
chore: remove unused imports, dead code, and stale comments
teknium1 Mar 22, 2026
2bd8e5c
fix(telegram): auto-reconnect polling after network interruption
teknium1 Mar 22, 2026
8587cdd
chore: remove unused imports, dead code, and stale comments (#2509)
teknium1 Mar 22, 2026
55a27a3
Merge pull request #2517 from NousResearch/hermes/hermes-31d7db3b
teknium1 Mar 22, 2026
5e5ad63
fix(matrix): duplicate messages, image caching for vision support (#2…
teknium1 Mar 22, 2026
cd2280d
feat(gateway): notify users when session auto-resets (#2519)
teknium1 Mar 22, 2026
fa6f069
fix(file_tools): strip ANSI escape codes from write_file and patch co…
teknium1 Mar 22, 2026
e93b539
feat(session_search): add recent sessions mode when query is omitted
teknium1 Mar 22, 2026
ed805f5
fix(mcp-oauth): port mismatch, path traversal, and shared handler sta…
teknium1 Mar 22, 2026
b2b4a9e
fix(gateway): hygiene compression ignores config context_length and 1…
teknium1 Mar 22, 2026
b799bca
refactor(gateway): remove broken 1.4x hygiene multiplier entirely
teknium1 Mar 22, 2026
1f21ef7
fix(cli): prevent 'Press ENTER to continue...' on exit
teknium1 Mar 22, 2026
2b3c1d8
Merge pull request #2555 from NousResearch/hermes/hermes-fdcb4c4a
teknium1 Mar 22, 2026
942f6ea
fix(run_agent): ensure proper cleanup of OpenAI client in background …
teknium1 Mar 22, 2026
1b5fb36
fix(cli): allow custom/local endpoints without API key
teknium1 Mar 22, 2026
5ddb6a1
Merge pull request #2556 from NousResearch/hermes/hermes-fdcb4c4a
teknium1 Mar 22, 2026
3b509da
feat: auto-reconnect failed gateway platforms with exponential backof…
teknium1 Mar 23, 2026
b072737
fix: expand tilde (~) in vision_analyze local file paths (#2585)
teknium1 Mar 23, 2026
f60ebc7
fix: move activated skills line below welcome text
teknium1 Mar 23, 2026
ca2958f
fix: normalize repeat<=0 to None to prevent cron jobs deleting after …
Mibayy Mar 23, 2026
2d8fad8
fix(context): restrict @ references to safe workspace paths (#2601)
Gutslabs Mar 23, 2026
93dc5de
fix: prevent agents from starting gateway outside systemd management …
teknium1 Mar 23, 2026
d35df0d
fix(discord): ignore system messages in on_message handler (#2618)
teknium1 Mar 23, 2026
7da0822
fix(approval): honor bare YAML approvals.mode: off (#2620)
teknium1 Mar 23, 2026
9d61483
fix: media delivery fails for file paths containing spaces (#2621)
teknium1 Mar 23, 2026
868b3c0
fix: platform default toolsets silently override tool deselection in …
teknium1 Mar 23, 2026
6302e56
fix(gateway): add all missing platform allowlist env vars to startup …
teknium1 Mar 23, 2026
934fbe3
fix: strip ANSI at the source β€” clean terminal output before it reach…
teknium1 Mar 23, 2026
0791efe
fix(security): add SSRF protection to vision_tools and web_tools (har…
teknium1 Mar 23, 2026
ad5f973
fix(vision): make SSRF redirect guard async for httpx.AsyncClient
teknium1 Mar 23, 2026
f9c2565
fix(config): log warning instead of silently swallowing config.yaml e…
teknium1 Mar 23, 2026
73a88a0
fix(security): prevent shell injection in _expand_path via ~user path…
teknium1 Mar 23, 2026
4ff73fb
feat(config): support ${ENV_VAR} substitution in config.yaml (#2684)
teknium1 Mar 23, 2026
48b5bc6
fix(gateway): prevent stale memory overwrites by flush agent (#2670)
teknium1 Mar 23, 2026
8416bc2
chore: release v0.4.0 (v2026.3.23)
teknium1 Mar 24, 2026
6e97a3b
docs: revise v0.4.0 changelog β€” fix feature attribution, reorder sect…
teknium1 Mar 24, 2026
1345e93
fix: add macOS Homebrew paths to browser and terminal PATH resolution
teknium1 Mar 24, 2026
87e2626
feat(cli, agent): add tool generation callback for streaming updates
teknium1 Mar 24, 2026
4313b8a
fix(cli): ensure single closure of streaming boxes during tool genera…
teknium1 Mar 24, 2026
2f1c4fb
fix(auth): preserve 'custom' provider instead of silently remapping t…
teknium1 Mar 24, 2026
b641ee8
feat(model): /model command overhaul β€” Phases 2, 3, 5
teknium1 Mar 24, 2026
18cbd18
fix: remove litellm/typer/platformdirs from hermes-agent deps (supply…
teknium1 Mar 24, 2026
ce39f9c
fix(gateway): detect virtualenv path instead of hardcoding venv/ (#2797)
teknium1 Mar 24, 2026
2e52427
refactor(model): extract shared switch_model() from CLI and gateway h…
teknium1 Mar 24, 2026
a312ee7
fix(agent): ensure first delta is fired during reasoning updates
teknium1 Mar 24, 2026
773d3bb
docs: update all docs for /model command overhaul and custom provider…
teknium1 Mar 24, 2026
98b5570
fix: make browser command timeout configurable via config.yaml (#2801)
teknium1 Mar 24, 2026
2233f76
fix(tools): handle 402 insufficient credits error in vision tool (#2802)
teknium1 Mar 24, 2026
02b38b9
refactor: remove mini-swe-agent dependency β€” inline Docker/Modal back…
teknium1 Mar 24, 2026
ee3f3e7
docs: fix stale and incorrect documentation across 18 files
teknium1 Mar 24, 2026
677b11d
fix: reject relative cwd paths for container terminal backends
teknium1 Mar 24, 2026
e2c81c6
docs: add missing skills, CLI commands, and messaging env vars
teknium1 Mar 24, 2026
ad1bf16
chore: remove all remaining mini-swe-agent references
teknium1 Mar 24, 2026
745859b
feat: env var passthrough for skills and user config (#2807)
teknium1 Mar 24, 2026
c9b7605
chore: pin all dependency version ranges (supply chain hardening) (#2…
teknium1 Mar 24, 2026
177e432
refactor: update mini_swe_runner to use Hermes built-in backends
teknium1 Mar 24, 2026
624e4a8
chore: regenerate uv.lock with hashes, use lockfile in setup (#2812)
teknium1 Mar 24, 2026
ac5b8a4
ci: add supply chain audit workflow for PR scanning (#2816)
teknium1 Mar 24, 2026
ebcb81b
docs: document 9 previously undocumented features
teknium1 Mar 24, 2026
9718334
docs: fix api-server response storage β€” SQLite, not in-memory (#2819)
teknium1 Mar 24, 2026
0b993c1
docs: quote pip install extras to fix zsh glob errors (#2815)
teknium1 Mar 24, 2026
4819155
fix: update context pressure warnings and token estimates after compa…
teknium1 Mar 24, 2026
618f15d
fix: reorder setup wizard providers β€” OpenRouter first
teknium1 Mar 24, 2026
6893444
chore: gitignore orphaned mini-swe-agent directory
teknium1 Mar 24, 2026
8ee4f32
fix(gateway): use TERMINAL_CWD for context file discovery, not proces…
teknium1 Mar 25, 2026
7efaa59
Merge pull request #2891 from NousResearch/hermes/hermes-gateway-context
teknium1 Mar 25, 2026
9231a33
fix(compression): replace dead summary_target_tokens with ratio-based…
teknium1 Mar 25, 2026
27c023e
feat(config): expose compression target_ratio, protect_last_n, and th…
teknium1 Mar 25, 2026
1e9ff53
docs: clarify two-mode behavior in session_search schema description
teknium1 Mar 25, 2026
b36fe92
feat(session_search): add recent sessions mode when query is omitted …
teknium1 Mar 25, 2026
ef47531
docs: unify hooks documentation β€” add plugin hooks to hooks page, add…
teknium1 Mar 25, 2026
7ca22ea
fix(compression): restore sane defaults and cap summary at 12K tokens
teknium1 Mar 25, 2026
9b32f84
fix: browser_vision ignores auxiliary.vision.timeout config (#2901)
teknium1 Mar 25, 2026
1b24a22
fix(skills): agent-created skills were incorrectly treated as untrust…
teknium1 Mar 25, 2026
80cc27e
feat(api-server): Idempotency-Key support, body size limit, OpenAI er…
teknium1 Mar 25, 2026
ab4ba81
feat(migration): comprehensive OpenClaw migration v2 β€” 17 new modules…
teknium1 Mar 25, 2026
e5691ee
feat(gateway): configurable Telegram reply threading mode (#2907)
teknium1 Mar 25, 2026
fd292e6
fix: skip KawaiiSpinner when TUI handles tool progress (#2973)
teknium1 Mar 25, 2026
c6f4515
fix(whatsapp): download documents, audio, and video media from messag…
teknium1 Mar 25, 2026
5dbe2d9
fix: skills-sh install fails for deeply nested repo structures (#2980)
teknium1 Mar 25, 2026
42fec19
feat: persist reasoning across gateway session turns (schema v6) (#2974)
teknium1 Mar 25, 2026
b2a6b01
fix(api_server): streaming breaks when agent makes tool calls (#2985)
teknium1 Mar 25, 2026
20cc173
perf(prompt_builder): avoid redundant file re-read for skill conditio…
teknium1 Mar 25, 2026
114e636
fix(display): suppress KawaiiSpinner animation under patch_stdout (#2…
teknium1 Mar 25, 2026
fba73a6
fix(skills): use Git Trees API to prevent silent subdirectory loss du…
teknium1 Mar 25, 2026
f665351
fix(shell): exponential backoff for persistent shell polling (#2996)
teknium1 Mar 25, 2026
52c5e49
fix(session): surface silent SessionDB failures that cause session da…
teknium1 Mar 25, 2026
61949f0
Fix (#2997)
teknium1 Mar 25, 2026
650b400
fix(cron): mark session as ended after job completes (#2998)
teknium1 Mar 25, 2026
65dace1
fix(discord): stop phantom typing indicator after agent turn complete…
teknium1 Mar 25, 2026
68ab37e
fix(delegate): give subagents independent iteration budgets (#3004)
teknium1 Mar 25, 2026
099dfca
fix: GLM reasoning-only and max-length handling (#3010)
teknium1 Mar 25, 2026
8f6ef04
fix(cli): buffer reasoning preview chunks and fix duplicate display (…
teknium1 Mar 25, 2026
b646190
feat: nix flake β€” uv2nix build, NixOS module, persistent container mo…
alt-glitch Mar 25, 2026
0dcd6ab
fix: status bar shows 26K instead of 260K for token counts with trail…
teknium1 Mar 25, 2026
94e3d9a
fix(agent): restore safe non-streaming fallback after stream failures…
teknium1 Mar 25, 2026
e4033b2
fix(cli): catch KeyboardInterrupt during flush_memories on exit (#3025)
teknium1 Mar 25, 2026
861624d
fix(cli): refresh TUI before background task output to prevent status…
teknium1 Mar 25, 2026
8bb1d15
chore: remove ~100 unused imports across 55 files (#3016)
teknium1 Mar 25, 2026
14cf2d8
fix(display): guard isatty() against closed streams via _is_tty prope…
teknium1 Mar 25, 2026
73e66eb
fix(gateway): thread-safe SessionStore β€” protect _entries with thread…
teknium1 Mar 25, 2026
ab548a9
fix(security): add SSRF protection to browser_navigate (#3058)
teknium1 Mar 25, 2026
f83c27e
feat(skills): add Docker management skill to optional-skills (#3060)
teknium1 Mar 25, 2026
7126524
remove config drift check for nix (#3061)
alt-glitch Mar 25, 2026
e0cfc08
fix(gateway/slack): send progress messages to correct thread (#3063)
teknium1 Mar 25, 2026
77bcaba
refactor: consolidate get_hermes_home() and parse_reasoning_effort() …
teknium1 Mar 25, 2026
841401f
feat(cli): preserve user input on multiline paste (#3065)
teknium1 Mar 25, 2026
d218cf9
fix(skills): handle null metadata in skill frontmatter
teknium1 Mar 25, 2026
f7f30aa
fix(streaming): detect and kill stale SSE connections
teknium1 Mar 25, 2026
37cabc4
test(skills): add regression tests for null metadata frontmatter
teknium1 Mar 25, 2026
9d1e130
fix(cli): prevent TypeError on startup when base_url is None (#3068)
teknium1 Mar 25, 2026
9792bde
fix(agent): count compression restarts toward retry limit (#3070)
teknium1 Mar 25, 2026
bd6b138
fix: clean up HTML error messages in CLI display (#3069)
teknium1 Mar 25, 2026
3bc953a
fix(security): bump dependencies to fix CVEs + regenerate uv.lock (#3…
teknium1 Mar 25, 2026
0cfc1f8
fix: add MCP tool name collision protection (#3077)
teknium1 Mar 25, 2026
9783c9d
refactor: remove /model slash command from CLI and gateway (#3080)
teknium1 Mar 26, 2026
0d7f739
fix(setup): use explicit key mapping for returning-user menu dispatch…
teknium1 Mar 26, 2026
281100e
fix(agent): prevent AsyncOpenAI/httpx cross-loop deadlock in gateway …
ctlst Mar 26, 2026
41081d7
fix(cli): prevent update crash in non-TTY environments (#3094)
teknium1 Mar 26, 2026
45f57c2
feat(models): add glm-5-turbo to zai provider model list (#3095)
teknium1 Mar 26, 2026
712cebc
fix(logging): show HTTP status code and 400 body in API error output …
teknium1 Mar 26, 2026
432ba3b
fix: use sys.executable for pip in update commands to fix PEP 668 (#3…
teknium1 Mar 26, 2026
bd43a43
fix(cli): handle EOFError in sessions delete/prune confirmation promp…
teknium1 Mar 26, 2026
b374f52
fix(session): clear compressor summary and turn counter on /clear and…
teknium1 Mar 26, 2026
4b45f65
fix: update api_key in _try_activate_fallback for subagent auth (#3103)
teknium1 Mar 26, 2026
910ec7e
chore: remove unused Hermes-native PKCE OAuth flow (#3107)
teknium1 Mar 26, 2026
7258311
fix: stop recursive AGENTS.md walk, load top-level only (#3110)
teknium1 Mar 26, 2026
5b29ff5
fix(logging): extract useful info from HTML error pages, dump debug o…
teknium1 Mar 26, 2026
f46542b
fix(cli): read root-level provider and base_url from config.yaml into…
teknium1 Mar 26, 2026
59575d6
fix(gateway): recover from hung agents β€” /stop force-unlocks session …
teknium1 Mar 26, 2026
156b503
fix(reasoning): skip duplicate callback for <think>-extracted reasoni…
teknium1 Mar 26, 2026
08d3be0
fix: graceful return on max retries instead of crashing thread
teknium1 Mar 26, 2026
cbf195e
chore: fix 154 f-strings, simplify getattr/URL patterns, remove dead …
teknium1 Mar 26, 2026
c07c17f
feat(agent): surface all retry/fallback/compression lifecycle events …
teknium1 Mar 26, 2026
c511e08
fix(agent): always prefer streaming for API calls to prevent hung sub…
teknium1 Mar 26, 2026
0426bb7
fix: reset default SOUL.md to baseline identity text (#3159)
teknium1 Mar 26, 2026
26bfdc2
feat: add godmode jailbreaking skill + docs (#3157)
teknium1 Mar 26, 2026
4a56e2c
fix(display): show tool progress for substantive tools, not just "pre…
teknium1 Mar 26, 2026
9989e57
fix: add request timeouts to send_message_tool HTTP calls (#3162)
memosr Mar 26, 2026
43af094
fix(agent): include tool tokens in preflight estimate, guard context …
teknium1 Mar 26, 2026
36af1f3
feat(telegram): Private Chat Topics with functional skill binding (#2…
teknium1 Mar 26, 2026
c6fe75e
fix(gateway): fingerprint full auth token in agent cache signature (#…
teknium1 Mar 26, 2026
2c719f0
fix(auth): migrate OAuth token refresh to platform.claude.com with fa…
teknium1 Mar 26, 2026
62f8aa9
fix: MCP toolset resolution for runtime and config (#3252)
teknium1 Mar 26, 2026
b7b3294
fix(skills): preserve trust for skills-sh identifiers + reduce resolu…
teknium1 Mar 26, 2026
3a7907b
fix(security): prevent zip-slip path traversal in self-update (#3250)
teknium1 Mar 26, 2026
b81d49d
fix(state): SQLite concurrency hardening + session transcript integri…
teknium1 Mar 26, 2026
a8e02c7
fix: align Nous Portal model slugs with OpenRouter naming (#3253)
teknium1 Mar 26, 2026
76ed15d
fix(security): normalize input before dangerous command detection (#3…
teknium1 Mar 26, 2026
e9e7fb0
fix(gateway): track background task references in GatewayRunner (#3254)
teknium1 Mar 26, 2026
41ee207
fix: catch KeyboardInterrupt in exit cleanup handlers (#3257)
teknium1 Mar 26, 2026
db241ae
feat(sessions): add --source flag for third-party session isolation (…
teknium1 Mar 26, 2026
3a86328
fix(gateway): add request timeouts to HA, Email, Mattermost, SMS adap…
teknium1 Mar 26, 2026
243ee67
fix: store asyncio task references to prevent GC mid-execution (#3267)
teknium1 Mar 26, 2026
72250b5
feat: config-gated /verbose command for messaging gateway (#3262)
teknium1 Mar 26, 2026
e5d1444
fix(security): restrict subagent toolsets to parent's enabled set (#3…
teknium1 Mar 26, 2026
6610c37
fix(telegram): self-reschedule reconnect when start_polling fails (#3…
teknium1 Mar 26, 2026
148f466
fix(matrix): add backoff for SyncError in sync loop (#3280)
teknium1 Mar 26, 2026
bdccdd6
fix: OpenClaw migration overwrites defaults and setup wizard skips im…
teknium1 Mar 26, 2026
716e616
fix(tui): status bar duplicates and degrades during long sessions (#3…
teknium1 Mar 27, 2026
bde45f5
fix(gateway): retry transient send failures and notify user on exhaus…
teknium1 Mar 27, 2026
08fa326
feat(gateway): deliver background review notifications to user chat (…
teknium1 Mar 27, 2026
0375b2a
fix(gateway): silence background agent terminal output (#3297)
teknium1 Mar 27, 2026
2d232c9
feat(cli): configurable busy input mode + fix /queue always working (…
teknium1 Mar 27, 2026
3c57eaf
fix: YAML boolean handling for tool_progress config (#3300)
teknium1 Mar 27, 2026
18d28c6
fix: add explicit hermes-api-server toolset for API server platform (…
teknium1 Mar 27, 2026
60fdb58
fix(agent): update context compressor limits after fallback activatio…
teknium1 Mar 27, 2026
f008ee1
fix(session): preserve reasoning fields in rewrite_transcript (#3311)
teknium1 Mar 27, 2026
ad764d3
fix(auxiliary): catch ImportError from build_anthropic_client in visi…
teknium1 Mar 27, 2026
005786c
fix(gateway): include per-platform ALLOW_ALL and SIGNAL_GROUP in star…
teknium1 Mar 27, 2026
1519c4d
fix(session): add /resume CLI handler, session log truncation guard, …
teknium1 Mar 27, 2026
a8df7f9
fix: gateway token double-counting with cached agents (#3306)
teknium1 Mar 27, 2026
867eefd
fix(signal): track SSE keepalive comments as connection activity (#3316)
teknium1 Mar 27, 2026
22cfad1
fix: gateway token double-counting β€” use absolute set instead of incr…
teknium1 Mar 27, 2026
0339662
fix(ci): pin acp <0.9 and update retry-exhaust test (#3320)
teknium1 Mar 27, 2026
3f95e74
fix: validate empty user messages to prevent Anthropic API 400 errors…
teknium1 Mar 27, 2026
58ca875
feat(gateway): surface session config on /new, /reset, and auto-reset…
teknium1 Mar 27, 2026
a2847ea
fix(gateway): add media download retry to Mattermost, Slack, and base…
teknium1 Mar 27, 2026
b8b1f24
fix: handle addition-only hunks in V4A patch parser (#3325)
teknium1 Mar 27, 2026
be416cd
fix: guard config.get() against YAML null values to prevent Attribute…
teknium1 Mar 27, 2026
75fcbc4
feat(telegram): auto-discover fallback IPs via DoH when api.telegram.…
teknium1 Mar 27, 2026
915df02
fix(streaming): stale stream detector race causing spurious RemotePro…
teknium1 Mar 27, 2026
b7bcae4
fix: SQLite WAL write-lock contention causing 15-20s TUI freeze (#3385)
teknium1 Mar 27, 2026
41d9d08
fix(telegram): fall back to no thread_id on 'Message thread not found…
teknium1 Mar 27, 2026
5a1e2a3
perf(ttft): salvage easy-win startup optimizations from #3346 (#3395)
teknium1 Mar 27, 2026
eb2127c
fix(cron): prevent recurring job re-fire on gateway crash/restart loo…
teknium1 Mar 27, 2026
e0dbbdb
fix: eliminate 'Event loop is closed' / 'Press ENTER to continue' dur…
teknium1 Mar 27, 2026
8ecd7ae
fix: prevent reasoning box from rendering 3x during tool-calling loop…
teknium1 Mar 27, 2026
cc45140
feat(nix): add suffix PATHs during nix build for more agent-friendlin…
alt-glitch Mar 27, 2026
5127567
perf(ttft): cache skills prompt with shared skill_utils module (salva…
teknium1 Mar 27, 2026
f57ebf5
fix(api-server): cancel orphaned agent + true interrupt on SSE discon…
teknium1 Mar 27, 2026
fd8c465
feat: add Hugging Face as a first-class inference provider (#3419)
teknium1 Mar 27, 2026
fb46a90
fix: increase API timeout default from 900s to 1800s for slow-thinkin…
teknium1 Mar 27, 2026
6f11ff5
fix(anthropic): use model-native output limits instead of hardcoded 1…
teknium1 Mar 27, 2026
e4e04c2
fix: make tirith block verdicts approvable instead of hard-blocking (…
teknium1 Mar 27, 2026
ab09f6b
feat: curate HF model picker with OpenRouter analogues (#3440)
teknium1 Mar 27, 2026
6586927
fix: guard aux LLM calls against None content + reasoning fallback + …
teknium1 Mar 27, 2026
8fdfc4b
fix(agent): detect thinking-budget exhaustion on truncation, skip use…
teknium1 Mar 27, 2026
b6b87de
fix: discover plugins before reading plugin toolsets in tools_config …
teknium1 Mar 27, 2026
83043e9
fix: add timeout to subprocess calls in context_references (#3469)
teknium1 Mar 28, 2026
388fa52
fix(matrix): add missing matrix entry in PLATFORMS dict (#3473)
teknium1 Mar 28, 2026
03f24c1
fix: session_search fallback preview on summarization failure (salvag…
teknium1 Mar 28, 2026
15cfd20
fix: cap context pressure percentage at 100% in display (#3480)
teknium1 Mar 28, 2026
09796b1
fix: alibaba provider default endpoint and model list (#3484)
teknium1 Mar 28, 2026
290c71a
fix(gateway): scope progress thread fallback to Slack only (salvage #…
teknium1 Mar 28, 2026
6ed9740
fix: prevent unbounded growth of _seen_uids in EmailAdapter (#3490)
teknium1 Mar 28, 2026
9d4b3e5
fix: harden hermes update against diverged history, non-main branches…
teknium1 Mar 28, 2026
6cfb734
feat(provider): add xgate provider surface
ponderingdemocritus Mar 17, 2026
322c72e
docs(setup): clarify xgate auth lands in follow-up
ponderingdemocritus Mar 17, 2026
9dc8dcc
feat(payments): add mpp runtime scaffolding
ponderingdemocritus Mar 28, 2026
13318d9
fix(delegate): inherit parent payment runtime
ponderingdemocritus Mar 28, 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
  •  
  •  
  •  
54 changes: 54 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,44 @@ MINIMAX_API_KEY=
MINIMAX_CN_API_KEY=
# MINIMAX_CN_BASE_URL=https://api.minimaxi.com/v1 # Override default base URL

# =============================================================================
# LLM PROVIDER (OpenCode Zen)
# =============================================================================
# OpenCode Zen provides curated, tested models (GPT, Claude, Gemini, MiniMax, GLM, Kimi)
# Pay-as-you-go pricing. Get your key at: https://opencode.ai/auth
OPENCODE_ZEN_API_KEY=
# OPENCODE_ZEN_BASE_URL=https://opencode.ai/zen/v1 # Override default base URL

# =============================================================================
# LLM PROVIDER (OpenCode Go)
# =============================================================================
# OpenCode Go provides access to open models (GLM-5, Kimi K2.5, MiniMax M2.5)
# $10/month subscription. Get your key at: https://opencode.ai/auth
OPENCODE_GO_API_KEY=

# =============================================================================
# LLM PROVIDER (Hugging Face Inference Providers)
# =============================================================================
# Hugging Face routes to 20+ open models via unified OpenAI-compatible endpoint.
# Free tier included ($0.10/month), no markup on provider rates.
# Get your token at: https://huggingface.co/settings/tokens
# Required permission: "Make calls to Inference Providers"
HF_TOKEN=
# OPENCODE_GO_BASE_URL=https://opencode.ai/zen/go/v1 # Override default base URL

# =============================================================================
# TOOL API KEYS
# =============================================================================

# Parallel API Key - AI-native web search and extract
# Get at: https://parallel.ai
PARALLEL_API_KEY=

# Firecrawl API Key - Web search, extract, and crawl
# Get at: https://firecrawl.dev/
FIRECRAWL_API_KEY=


# FAL.ai API Key - Image generation
# Get at: https://fal.ai/
FAL_KEY=
Expand Down Expand Up @@ -275,3 +305,27 @@ WANDB_API_KEY=
# GITHUB_APP_ID=
# GITHUB_APP_PRIVATE_KEY_PATH=
# GITHUB_APP_INSTALLATION_ID=

# Groq API key (free tier β€” used for Whisper STT in voice mode)
# GROQ_API_KEY=

# =============================================================================
# STT PROVIDER SELECTION
# =============================================================================
# Default STT provider is "local" (faster-whisper) β€” runs on your machine, no API key needed.
# Install with: pip install faster-whisper
# Model downloads automatically on first use (~150 MB for "base").
# To use cloud providers instead, set GROQ_API_KEY or VOICE_TOOLS_OPENAI_KEY above.
# Provider priority: local > groq > openai
# Configure in config.yaml: stt.provider: local | groq | openai

# =============================================================================
# STT ADVANCED OVERRIDES (optional)
# =============================================================================
# Override default STT models per provider (normally set via stt.model in config.yaml)
# STT_GROQ_MODEL=whisper-large-v3-turbo
# STT_OPENAI_MODEL=whisper-1

# Override STT provider endpoints (for proxies or self-hosted instances)
# GROQ_BASE_URL=https://api.groq.com/openai/v1
# STT_OPENAI_BASE_URL=https://api.openai.com/v1
1 change: 1 addition & 0 deletions .envrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
use flake
39 changes: 39 additions & 0 deletions .github/workflows/docs-site-checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Docs Site Checks

on:
pull_request:
paths:
- 'website/**'
- '.github/workflows/docs-site-checks.yml'
workflow_dispatch:

jobs:
docs-site-checks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: website/package-lock.json

- name: Install website dependencies
run: npm ci
working-directory: website

- uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Install ascii-guard
run: python -m pip install ascii-guard

- name: Lint docs diagrams
run: npm run lint:diagrams
working-directory: website

- name: Build Docusaurus
run: npm run build
working-directory: website
40 changes: 40 additions & 0 deletions .github/workflows/nix.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: Nix

on:
push:
branches: [main]
pull_request:
paths:
- 'flake.nix'
- 'flake.lock'
- 'nix/**'
- 'pyproject.toml'
- 'uv.lock'
- 'hermes_cli/**'
- 'run_agent.py'
- 'acp_adapter/**'

concurrency:
group: nix-${{ github.ref }}
cancel-in-progress: true

jobs:
nix:
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
- name: Check flake
if: runner.os == 'Linux'
run: nix flake check --print-build-logs
- name: Build package
if: runner.os == 'Linux'
run: nix build --print-build-logs
- name: Evaluate flake (macOS)
if: runner.os == 'macOS'
run: nix flake show --json > /dev/null
192 changes: 192 additions & 0 deletions .github/workflows/supply-chain-audit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
name: Supply Chain Audit

on:
pull_request:
types: [opened, synchronize, reopened]

permissions:
pull-requests: write
contents: read

jobs:
scan:
name: Scan PR for supply chain risks
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Scan diff for suspicious patterns
id: scan
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail

BASE="${{ github.event.pull_request.base.sha }}"
HEAD="${{ github.event.pull_request.head.sha }}"

# Get the full diff (added lines only)
DIFF=$(git diff "$BASE".."$HEAD" -- . ':!uv.lock' ':!*.lock' ':!package-lock.json' ':!yarn.lock' || true)

FINDINGS=""
CRITICAL=false

# --- .pth files (auto-execute on Python startup) ---
PTH_FILES=$(git diff --name-only "$BASE".."$HEAD" | grep '\.pth$' || true)
if [ -n "$PTH_FILES" ]; then
CRITICAL=true
FINDINGS="${FINDINGS}
### 🚨 CRITICAL: .pth file added or modified
Python \`.pth\` files in \`site-packages/\` execute automatically when the interpreter starts β€” no import required. This is the exact mechanism used in the [litellm supply chain attack](https://github.com/BerriAI/litellm/issues/24512).

**Files:**
\`\`\`
${PTH_FILES}
\`\`\`
"
fi

# --- base64 + exec/eval combo (the litellm attack pattern) ---
B64_EXEC_HITS=$(echo "$DIFF" | grep -n '^\+' | grep -iE 'base64\.(b64decode|decodebytes|urlsafe_b64decode)' | grep -iE 'exec\(|eval\(' | head -10 || true)
if [ -n "$B64_EXEC_HITS" ]; then
CRITICAL=true
FINDINGS="${FINDINGS}
### 🚨 CRITICAL: base64 decode + exec/eval combo
This is the exact pattern used in the [litellm supply chain attack](https://github.com/BerriAI/litellm/issues/24512) β€” base64-decoded strings passed to exec/eval to hide credential-stealing payloads.

**Matches:**
\`\`\`
${B64_EXEC_HITS}
\`\`\`
"
fi

# --- base64 decode/encode (alone β€” legitimate uses exist) ---
B64_HITS=$(echo "$DIFF" | grep -n '^\+' | grep -iE 'base64\.(b64decode|b64encode|decodebytes|encodebytes|urlsafe_b64decode)|atob\(|btoa\(|Buffer\.from\(.*base64' | head -20 || true)
if [ -n "$B64_HITS" ]; then
FINDINGS="${FINDINGS}
### ⚠️ WARNING: base64 encoding/decoding detected
Base64 has legitimate uses (images, JWT, etc.) but is also commonly used to obfuscate malicious payloads. Verify the usage is appropriate.

**Matches (first 20):**
\`\`\`
${B64_HITS}
\`\`\`
"
fi

# --- exec/eval with string arguments ---
EXEC_HITS=$(echo "$DIFF" | grep -n '^\+' | grep -E '(exec|eval)\s*\(' | grep -v '^\+\s*#' | grep -v 'test_\|mock\|assert\|# ' | head -20 || true)
if [ -n "$EXEC_HITS" ]; then
FINDINGS="${FINDINGS}
### ⚠️ WARNING: exec() or eval() usage
Dynamic code execution can hide malicious behavior, especially when combined with base64 or network fetches.

**Matches (first 20):**
\`\`\`
${EXEC_HITS}
\`\`\`
"
fi

# --- subprocess with encoded/obfuscated commands ---
PROC_HITS=$(echo "$DIFF" | grep -n '^\+' | grep -E 'subprocess\.(Popen|call|run)\s*\(' | grep -iE 'base64|decode|encode|\\x|chr\(' | head -10 || true)
if [ -n "$PROC_HITS" ]; then
CRITICAL=true
FINDINGS="${FINDINGS}
### 🚨 CRITICAL: subprocess with encoded/obfuscated command
Subprocess calls with encoded arguments are a strong indicator of payload execution.

**Matches:**
\`\`\`
${PROC_HITS}
\`\`\`
"
fi

# --- Network calls to non-standard domains ---
EXFIL_HITS=$(echo "$DIFF" | grep -n '^\+' | grep -iE 'requests\.(post|put)\(|httpx\.(post|put)\(|urllib\.request\.urlopen' | grep -v '^\+\s*#' | grep -v 'test_\|mock\|assert' | head -10 || true)
if [ -n "$EXFIL_HITS" ]; then
FINDINGS="${FINDINGS}
### ⚠️ WARNING: Outbound network calls (POST/PUT)
Outbound POST/PUT requests in new code could be data exfiltration. Verify the destination URLs are legitimate.

**Matches (first 10):**
\`\`\`
${EXFIL_HITS}
\`\`\`
"
fi

# --- setup.py / setup.cfg install hooks ---
SETUP_HITS=$(git diff --name-only "$BASE".."$HEAD" | grep -E '(setup\.py|setup\.cfg|__init__\.pth|sitecustomize\.py|usercustomize\.py)$' || true)
if [ -n "$SETUP_HITS" ]; then
FINDINGS="${FINDINGS}
### ⚠️ WARNING: Install hook files modified
These files can execute code during package installation or interpreter startup.

**Files:**
\`\`\`
${SETUP_HITS}
\`\`\`
"
fi

# --- Compile/marshal/pickle (code object injection) ---
MARSHAL_HITS=$(echo "$DIFF" | grep -n '^\+' | grep -iE 'marshal\.loads|pickle\.loads|compile\(' | grep -v '^\+\s*#' | grep -v 'test_\|re\.compile\|ast\.compile' | head -10 || true)
if [ -n "$MARSHAL_HITS" ]; then
FINDINGS="${FINDINGS}
### ⚠️ WARNING: marshal/pickle/compile usage
These can deserialize or construct executable code objects.

**Matches:**
\`\`\`
${MARSHAL_HITS}
\`\`\`
"
fi

# --- Output results ---
if [ -n "$FINDINGS" ]; then
echo "found=true" >> "$GITHUB_OUTPUT"
if [ "$CRITICAL" = true ]; then
echo "critical=true" >> "$GITHUB_OUTPUT"
else
echo "critical=false" >> "$GITHUB_OUTPUT"
fi
# Write findings to a file (multiline env vars are fragile)
echo "$FINDINGS" > /tmp/findings.md
else
echo "found=false" >> "$GITHUB_OUTPUT"
echo "critical=false" >> "$GITHUB_OUTPUT"
fi

- name: Post warning comment
if: steps.scan.outputs.found == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
SEVERITY="⚠️ Supply Chain Risk Detected"
if [ "${{ steps.scan.outputs.critical }}" = "true" ]; then
SEVERITY="🚨 CRITICAL Supply Chain Risk Detected"
fi

BODY="## ${SEVERITY}

This PR contains patterns commonly associated with supply chain attacks. This does **not** mean the PR is malicious β€” but these patterns require careful human review before merging.

$(cat /tmp/findings.md)

---
*Automated scan triggered by [supply-chain-audit](/.github/workflows/supply-chain-audit.yml). If this is a false positive, a maintainer can approve after manual review.*"

gh pr comment "${{ github.event.pull_request.number }}" --body "$BODY"

- name: Fail on critical findings
if: steps.scan.outputs.critical == 'true'
run: |
echo "::error::CRITICAL supply chain risk patterns detected in this PR. See the PR comment for details."
exit 1
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,8 @@ environments/benchmarks/evals/

# Release script temp files
.release_notes.md
mini-swe-agent/

# Nix
.direnv/
result
3 changes: 0 additions & 3 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
[submodule "mini-swe-agent"]
path = mini-swe-agent
url = https://github.com/SWE-agent/mini-swe-agent
[submodule "tinker-atropos"]
path = tinker-atropos
url = https://github.com/nousresearch/tinker-atropos
Loading
Loading