Commit Graph

49141 Commits

Author SHA1 Message Date
kshitijk4poor
cff9305fe6 refactor(agent): drop redundant str() wrapping around custom_provider_slug args
Gate C11 r4 quality: custom_provider_slug already coerces with
str(value or "").strip(), so the caller-side wrapping was noise.
No behaviour change.
2026-10-06 13:01:39 +05:30
kshitijk4poor
a1bccf3344 fix(agent): accept only a real bool provider-level answer_in_reasoning
Gate C11 r4 quality: the `flags &= {True, False}` set filter let YAML
`1` count as an opt-in because 1 == True in a set. Keep only bool values
so a stray 1/0 never promotes private reasoning. New parametrize row
(acme-int, value 1) is red without this.
2026-10-06 13:01:39 +05:30
kshitijk4poor
c4895a27a9 fix(agent): match answer_in_reasoning entries against requested_provider too
Gate C11 r4 2c: startup, gateway and TUI build the agent with
provider="custom" and the named identity in requested_provider; only a
/model switch sets provider to the custom:<slug>. Matching entries against
agent.provider alone left the live-entry set empty at startup, so an
unflagged sibling on a shared endpoint still inherited the opt-in and a
sibling's false cancelled the provider that opted in. Collect the
custom:<slug> identity from both fields. The acme-plain parametrize row now
uses the startup shape (red before this change) and one opted-in row pins
the positive startup path.
2026-10-06 13:01:39 +05:30
kshitijk4poor
246a1e2eec refactor(agent): drop the unwritten runtime_capabilities answer_in_reasoning branch
Gate finding (C11 r3 quality, Low): 5769ff4aa9 removed the only writer of
runtime_capabilities["answer_in_reasoning"] (the agent_init seed); every
remaining writer stores resolve_native_compaction_capabilities(), which
yields only native_compaction. The reader was an unconfigurable second
trust source that could override the live config read, reachable only
from a test seam. The test now opts in the way users do, through a
custom_providers capabilities block on its base_url.

Also import _entries_for_route from hermes_cli.config like its neighbour.
2026-10-06 13:01:39 +05:30
kshitijk4poor
14701564b4 fix(agent): scope the provider-level answer_in_reasoning opt-in to the live entry
Gate finding (C11 r3, Low): the provider-level loop returned the first
entry on the base_url carrying an answer_in_reasoning bool, whatever
provider was live. Two providers: entries on one endpoint (LiteLLM/vLLM
router) leaked one's opt-in to the other, and an earlier sibling's true
overrode the live entry's explicit false (probe: vllm-nemo true + vllm-ds
false on one URL, live custom:vllm-ds -> True).

Match the live custom:<slug> via custom_provider_slug, the helper that
derives that identity from an entry. With no slug match (bare 'custom'),
trust only when every flagged sibling on the endpoint opts in.
2026-10-06 13:01:39 +05:30
kshitijk4poor
b659f9a1d1 docs(models): the answer_in_reasoning opt-in is re-read on the active route
The provider-level `capabilities:` block is no longer handed to the agent
by the gateway; the promotion gate re-reads it on the live route in CLI,
TUI and gateway alike. Say so, and that it survives /model on the same
provider but is not inherited by fallback or other providers (OpenRouter
never trusted) (fold2 finding 1).
2026-10-06 13:01:39 +05:30
kshitijk4poor
0044d3a7d0 refactor(agent): drop the constructor answer_in_reasoning seed now the gate reads the route
52e8ecd495 merged the constructor `capabilities=` answer_in_reasoning bool
into runtime_capabilities at startup so a provider-level opt-in reached
the promotion gate. The gate now re-reads the provider-level
`capabilities:` block on the live route (previous commit), which covers
CLI/TUI and /model switches the seed never did, so the seed is redundant.
Forward removal, not a revert: 52e8ecd495's test coverage stays, but the
fixture now opts in through the custom_providers entry-level
`capabilities` block instead of the constructor (fold2 finding 1).
2026-10-06 13:01:39 +05:30
kshitijk4poor
1ddcb56a64 fix(agent): re-read the provider-level answer_in_reasoning opt-in on the live route
The provider-level `capabilities: {answer_in_reasoning: true}` block only
reached the promotion gate through the constructor `capabilities=` arg,
which only the gateway passes. CLI and TUI never pass it, and every
/model switch rebuilds runtime_capabilities without it, so the documented
provider-level opt-in was silently ignored on CLI/TUI and lost after
/model in the gateway (fold2 finding 1, 2c review).

Read the entry-level block live, like the per-model key: when no
per-model capability is set, scan the custom_providers entries serving
the live base_url. It now holds on any model of that provider, is never
inherited by a fallback on another base_url, and OpenRouter stays
untrusted. The trusted-route test opts in through the entry-level block
with no constructor capabilities and gains /model-switch and fallback
rows (the first two are red without this change).
2026-10-06 13:01:39 +05:30
kshitijk4poor
cde277aa99 docs(models): document the answer_in_reasoning custom-provider opt-in
Reasoning-only clean stops are now promoted to the reply only on trusted
routes, so a local parser that puts the answer in `reasoning` needs an
explicit opt-in. Document the per-model key and the provider-level
`capabilities:` block next to prompt_caching, plus the route scoping
(no fallback inheritance, OpenRouter never trusted). Finding from the 2c review.
2026-10-06 13:01:39 +05:30
kshitijk4poor
e5517d2a03 test(agent): drop a no-op capability write and blank-line runs in the reasoning-surface tests
The exhaustion test pins an OpenRouter route, where the promotion gate
returns False before it reads runtime_capabilities, so setting
answer_in_reasoning=False there changed nothing (quality review). Also
collapse the leftover 3-5 blank-line runs to two.
2026-10-06 13:01:39 +05:30
kshitijk4poor
d1024897ac fix(agent): honour the constructor answer_in_reasoning opt-in at the promotion gate
The live-trust refactor dropped the writer of
runtime_capabilities["answer_in_reasoning"] but kept its reader, so an
explicit opt-in passed as AIAgent(capabilities={"answer_in_reasoning": True})
(what _lift_model_capabilities builds from a provider-level `capabilities:`
block and gateway/run.py passes through) never reached the gate and private
reasoning-only stops on that route were retried instead of promoted.

Seed it into runtime_capabilities at startup, merged into the existing
expression so agent_init.py does not grow past its size cap. The opt-in is
scoped to the primary route: a fallback rebuild drops it and the primary
restore brings it back from the snapshot. The fixture now opts in through
the constructor and the trusted-route test gains a constructor-opt-in row
(red without this change).
2026-10-06 13:01:39 +05:30
kshitijk4poor
2f0efe8f66 refactor(agent): derive reasoning-promotion trust live in agent/reasoning_promotion
The code-health ratchet blocks growth of agent_runtime_helpers.py
(3909), agent_init.py (2527), chat_completion_helpers.py (4122) and
finish_text_response (309 lines); the gate added 60+ lines to those
facades.

Move answer_in_reasoning_capability into a topical sibling and evaluate
it from the agent's live route at the promotion site instead of caching
the decision in runtime_capabilities. That removes the plumbing at
startup, primary snapshot/restore, switch_model and fallback activation:
a live check cannot go stale across a route change, so the whole
sibling-site class is covered by construction. The unused constructor
`capabilities={"answer_in_reasoning": ...}` hook goes too (no caller
sets it); an explicit runtime_capabilities bool and the
custom_providers per-model opt-in still work.
2026-10-06 13:01:39 +05:30
kshitijk4poor
f6cb23383d test(agent): trim reasoning-promotion tests to two invariants
Keep two behavioural invariants for the route gate: an untrusted
OpenRouter/DeepSeek route retries past private reasoning to the visible
answer while the local Nemotron parser route still promotes in one call
(one parametrized test), and exhausted recovery never echoes private
reasoning. The capability-helper, constructor-plumbing and fallback-
restore unit tests duplicate what those end-to-end paths already cover.
2026-10-06 13:01:39 +05:30
kshitijk4poor
806b1e99c9 refactor(agent): drop defensive capability try/except and dead reasoning_only copy
get_custom_provider_model_capability already returns None when the
config cannot be read, so the try/except around it in
answer_in_reasoning_capability only hid real bugs.

_terminal_empty no longer returns site_copy("reasoning_only") with a
reasoning preview, and nothing else references that entry, so remove it
instead of leaving dead copy behind.
2026-10-06 13:01:39 +05:30
Mohamad Kanso
71c1669404 fix(agent): gate reasoning-only answer promotion by route
A clean-stop response with empty content and a reasoning payload was
promoted to the visible answer on every route. A field name is not
provenance: OpenRouter, DeepSeek and other adapters put private
chain-of-thought in `reasoning`, so users saw the model's private
thoughts as the reply (#111761, #114082). Exhausted recovery also echoed
a 500-char reasoning preview.

Promotion now requires a trusted route: an explicit
`answer_in_reasoning` runtime capability, a custom_providers per-model
opt-in, or the local Nemotron-3.5-Lightning parser route from #109205.
The decision lives in runtime_capabilities and is re-derived at startup,
fallback activation, primary restore and model switch. Exhausted
recovery returns the empty sentinel without a reasoning preview.

Rebuilt by hand on current main (keeps the Anthropic signed-thinking
skip and the _refund_api_call import added since the PR's base).

Salvaged from #112833 (a339569d77, 15a19b2fc0, 1d240e7b24).
2026-10-06 13:01:39 +05:30
Ethan Carter
aa7edd3dee Re-pin agora to v2.0.9 (fix #5: completion gate missed todo/triage/review) 2026-10-06 00:31:33 -07:00
Ethan Carter
de2afca9d6 Re-pin agora to v2.0.8 (5e90c30 — security-clean, no core override) 2026-10-06 00:31:33 -07:00
Ethan Carter
0aad613828 Re-pin agora to v2.0.8 (b78b42a — cold-load fix per review) 2026-10-06 00:31:33 -07:00
Ethan Carter
786b88b7bc Re-pin agora to v2.0.8 (security-clean shim per review) 2026-10-06 00:31:33 -07:00
Ethan Carter
430d17493d Re-pin agora to v2.0.7 (auto-patch finder + test fixes) 2026-10-06 00:31:33 -07:00
Ethan Carter
bafd8a1032 Re-pin agora to v2.0.7 (7e7e270 — includes test fixture fix) 2026-10-06 00:31:33 -07:00
Ethan Carter
48b6524049 Re-pin agora to v2.0.7 (fix #3: dashboard 500) 2026-10-06 00:31:33 -07:00
Teknium
dde31a0a45 chore: map contributor email(s) for PR #132619 2026-10-06 00:31:04 -07:00
Teknium
dce88743d0 chore(plugin-catalog): tabro disclosure at merge 2026-10-06 00:31:04 -07:00
Runkun Miao
a6a932c5d2 fix(catalog): pin Tabro relay and installation review fixes 2026-10-06 00:31:04 -07:00
Runkun Miao
7b2f1254ed fix(catalog): pin Tabro browser compatibility and host gate update 2026-10-06 00:31:04 -07:00
Runkun Miao
f34d582873 feat(catalog): add Tabro local browser automation plugin 2026-10-06 00:31:04 -07:00
George Pickett
060059a881 fix(catalog): refresh Parallel Search listing status 2026-10-06 00:28:17 -07:00
Teknium
651350b2de chore(plugin-catalog): bento disclosure at merge
Applies the reviewed Disclosure line from the catalog sweep review (catalog PR #133524).
2026-10-06 00:27:48 -07:00
shagghiesuperstar
07405b8330 feat(plugin-catalog): add bento plugin 2026-10-06 00:27:48 -07:00
Teknium
03f8da0886 chore(plugin-catalog): stalkchain disclosure at merge
Applies the reviewed Disclosure line from the catalog sweep review (catalog PR #133356).
2026-10-06 00:27:17 -07:00
Arpit Singh
4153fe1eed feat(plugin-catalog): add stalkchain 2026-10-06 00:27:17 -07:00
olric3015
de0773a424 feat(plugin-catalog): add the error-ledger catalog card 2026-10-06 00:26:47 -07:00
olric3015
4f36567571 feat(plugin-catalog): add error-ledger 2026-10-06 00:26:47 -07:00
D Yiapanis
9d8510483a chore(catalog): pin pass-secrets @ 485f105 — publish-identity scrub (replaces 55189d3, same tree) 2026-10-06 00:26:19 -07:00
100yenadmin
25f0b1f7aa feat(plugin-catalog): add hermes-teammates plugin 2026-10-06 00:25:50 -07:00
Teknium
3861011c31 chore: map vsemagush@gmail.com to @Vsemagush for attribution (catalog PR #133144) 2026-10-06 00:25:21 -07:00
Max Slastuhin
14414baf28 plugin-catalog: add session-token-counter 2026-10-06 00:25:21 -07:00
Teknium
cefe1db95c test(update): the parked-branch fetch guard is proven by a Trace2 fetch count
Review on #132378 (@andrexibiza) showed the regression oracle was the net pack
count: with foreground auto-GC (gc.auto=1, autoPackLimit=1, autoDetach=false)
a guard with the override removed still made two lazy fetches and left the
count at 2 -> 2. The test now captures Trace2 around the assessment and
requires zero fetch child starts, pins global/system git config, and runs
plain and foreground-GC variants; removing the override fails both.

The cherry child's environment now comes from noninteractive_git_env() like
the other no-lazy-fetch callers, instead of a raw os.environ copy that the
spawn-env guard rejects.
2026-10-06 00:25:12 -07:00
teknium1
13f105ed15 chore(tests): explicit encodings in the parked-branch guard tests
The Windows footgun ratchet flags every bare read_text()/write_text() in a
touched file; this file predates the rule.
2026-10-06 00:25:12 -07:00
teknium1
3bcbfdce34 fix(update): the parked-branch cherry refinement never lazy-fetches
`_assess_parked_branch_switch` still ran `git cherry origin/<target>` whenever the
commit-graph count found parked-only commits. On a tree:0 partial clone that
patch-id walk lazy-fetches a tree batch per upstream commit, and nothing bounded
it: the #131444 trace identifies exactly this child (`git cherry origin/main`,
6 h 45 m, 332 packs / 180 GiB) as the writer behind the silent disk runaway.

Run the refinement with GIT_NO_LAZY_FETCH=1 (the NO_LAZY_FETCH_ENV every other
read-only updater probe already uses). A missing object now fails `git cherry`
fast and the conservative rev-list count stands in, so the guard can never turn
into a fetch loop; full clones keep the patch-equivalence refinement.

Test: a reachable promisor remote, a parked branch one commit ahead — the guard
must not add a single pack. Red on origin/main and on #124777 alone (4 packs
after vs 2 before), green here.

Refs #131444. Supersedes the bound/offline variants in #125529, #126693, #128335.
2026-10-06 00:25:12 -07:00
liuhao1024
85aa4b32d2 fix(update): verify a parked branch from the commit graph before git cherry
git cherry's patch-id walk needs upstream-side trees, which a tree:0
partial clone lazy-fetches in many promisor batches; one failed batch
made the guard call a clean checkout unverifiable and skip the update
(#124767). Count parked-only commits with rev-list (commit graph only)
first, keep cherry as a refinement, and degrade a cherry failure to the
conservative commit count instead of unverifiable.
2026-10-06 00:25:12 -07:00
Teknium
daefc2b735 chore: map contributor email for honcho (#133486) 2026-10-06 00:10:03 -07:00
Teknium
bfcaf15bd7 chore(plugin-catalog): honcho disclosure at merge 2026-10-06 00:10:03 -07:00
ajspig
727c1354ec catalog: bump honcho (pin 3dd3b7a)
Adopts plastic-labs/honcho#1203: the plugin sends X-Honcho-Host and
X-Honcho-Plugin on its Honcho client. No capability changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:10:03 -07:00
Teknium
ba2f9b9cbb chore(plugin-catalog): fxmacrodata disclosure at merge
Normalizes 'Disclosure:' to 'Disclosure —' and appends the reviewed note on the system-prompt section, tool count and remote MCP behaviour (salvage of #133564).
2026-10-06 00:09:32 -07:00
Robert Tidball
170702e57d chore: map contributor email for @roberttidball 2026-10-06 00:09:32 -07:00
Robert Tidball
84718da668 feat(plugin-catalog): add fxmacrodata 2026-10-06 00:09:32 -07:00
witcheer
7301a9aa71 docs(user-stories): add 45 business and professional stories (#133708)
Prepends 45 verified first-person stories of Hermes Agent used at work
(companies, agencies, practices, shops and solo operators) to
userStories.json. Every quote is verbatim from the linked public source.
No existing entries are changed or removed.

Co-authored-by: witcheer <208820874+notwitcheer@users.noreply.github.com>
2026-10-06 00:07:45 -07:00
kshitijk4poor
a94c1065be docs(ssl): note SSL_CERT_FILE sits on top of the platform store
The module docstring still said only explicit per-provider config sits
above the platform store; platform_ssl_context() now honours an exported
SSL_CERT_FILE bundle in addition to it.

Fold3 finding 3 (quality Low).
2026-10-06 12:25:01 +05:30