Skip to content

A hermes-only picker run composes an upstream-less gateway and throws at source start #649

Description

@philcunliffe

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    neutral:fixDelegate this issue to neutral for an autonomous fix attempt (reproduce -> fix -> PR)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions