Surfaced while reviewing PR #647 (picker copy disclosure), confirmed by running the real code, not inferred.
The bug
@hypaware/hermes sets compose.requires_gateway: true (hypaware-core/plugins-workspace/hermes/hypaware.plugin.json:27-29) but declares no gateway_upstream, unlike every other requires_gateway row (claude, claude-desktop, codex, openclaw, the raw rows).
So a picker run that selects hermes and nothing else composes @hypaware/ai-gateway with { upstreams: [] } (already pinned at test/core/compose-picker-config.test.js:148-160), and starting that source throws:
ai-gateway: at least one upstream must be configured before start
from hypaware-core/plugins-workspace/ai-gateway/src/proxy.js:52-54.
Reproduction
Confirmed against the real modules rather than in theory: mergeUpstreams([], createGatewayState()) returns [], and startProxy({ upstreams: [], ... }) then throws the message above.
Why it matters
Hermes is offered as a standalone picker row, so "capture Hermes only" is a reachable, reasonable first-run choice, and it produces a source-start failure rather than a working install. Every other requires_gateway row brings its own upstream, which is why this has stayed hidden.
Possible directions (needs a decision, not just a patch)
- Drop
requires_gateway from the hermes manifest if hermes does not actually need the gateway (it reads its own state.db, so this looks likely).
- Or make
composePickerConfig omit @hypaware/ai-gateway when no picked row contributes an upstream.
- Or make an upstream-less gateway start as a no-op instead of throwing.
The first looks right on the evidence, but it is a manifest semantics question worth deciding deliberately.
Not fixed in #647, which is a copy-only PR; filed separately so it does not ride along unreviewed.
Surfaced while reviewing PR #647 (picker copy disclosure), confirmed by running the real code, not inferred.
The bug
@hypaware/hermessetscompose.requires_gateway: true(hypaware-core/plugins-workspace/hermes/hypaware.plugin.json:27-29) but declares nogateway_upstream, unlike every otherrequires_gatewayrow (claude, claude-desktop, codex, openclaw, the raw rows).So a picker run that selects hermes and nothing else composes
@hypaware/ai-gatewaywith{ upstreams: [] }(already pinned attest/core/compose-picker-config.test.js:148-160), and starting that source throws:from
hypaware-core/plugins-workspace/ai-gateway/src/proxy.js:52-54.Reproduction
Confirmed against the real modules rather than in theory:
mergeUpstreams([], createGatewayState())returns[], andstartProxy({ upstreams: [], ... })then throws the message above.Why it matters
Hermes is offered as a standalone picker row, so "capture Hermes only" is a reachable, reasonable first-run choice, and it produces a source-start failure rather than a working install. Every other
requires_gatewayrow brings its own upstream, which is why this has stayed hidden.Possible directions (needs a decision, not just a patch)
requires_gatewayfrom the hermes manifest if hermes does not actually need the gateway (it reads its ownstate.db, so this looks likely).composePickerConfigomit@hypaware/ai-gatewaywhen no picked row contributes an upstream.The first looks right on the evidence, but it is a manifest semantics question worth deciding deliberately.
Not fixed in #647, which is a copy-only PR; filed separately so it does not ride along unreviewed.