NousResearch/hermes-agent · error

billing.charge_status returned no response

Error message

billing.charge_status returned no response

What it means

Thrown by the TUI topup command's charge-status fetcher inside driveChargeSettlement: the gateway RPC 'billing.charge_status' resolved to a falsy value (null/undefined) instead of a status object. The settlement driver needs a concrete status to decide succeeded/failed/ambiguous, so a missing response aborts settlement polling with this error rather than guessing.

Source

Thrown at ui-tui/src/app/slash/commands/topup.ts:236

        if (portalUrl) {
          sys(`Portal: ${portalUrl}`)
        }

        return

      case 'cancelled':
        return
    }
  }

  void driveChargeSettlement({
    fetchStatus: async () => {
      const status = await ctx.gateway.rpc<BillingChargeStatusResponse>('billing.charge_status', {
        charge_id: chargeId
      })

      if (!status) {
        throw new Error('billing.charge_status returned no response')
      }

      return status
    },
    isCancelled: () => ctx.stale(),
    now: () => Date.now(),
    sleep: ms => new Promise(resolve => setTimeout(resolve, ms))
  }).then(outcome => {
    if (outcome.kind === 'ambiguous' && !outcome.status) {
      renderOutcome(outcome)

      return
    }

    ctx.guarded<SettlementOutcome>(renderOutcome)(outcome)
  })
}

View on GitHub (pinned to c896c09c42)

Solutions

  1. Update the backend/gateway to a version that implements billing.charge_status.
  2. Check gateway logs for an exception in the charge_status handler for your charge_id.
  3. Retry the topup flow after backend restart; verify the charge id was created by the same gateway instance.
  4. Confirm billing/topup is enabled in the backend configuration.
Defensive patterns

Strategy: try-catch

Validate before calling

const status = await ctx.gateway.rpc('billing.charge_status', { charge_id: chargeId })
if (!status) throw new Error('billing.charge_status unavailable — update the backend?')

Type guard

function isChargeStatus(r: unknown): r is BillingChargeStatusResponse {
  return typeof r === 'object' && r !== null && 'status' in r
}

Try / catch

try {
  await driveChargeSettlement(deps)
} catch (e) {
  if (e instanceof Error && e.message.includes('returned no response'))
    renderOutcome({ kind: 'ambiguous' }) // keep user informed, don't crash
  else throw e
}

Prevention

When it happens

Trigger: Running /topup in the TUI, completing the charge flow, and the gateway's billing.charge_status handler returns nothing — backend method missing in an older gateway version, handler error swallowed into a null result, or connection-level middleware dropping the response.

Common situations: TUI newer than the connected backend (method not implemented yet), backend billing subsystem disabled, or a gateway bug returning null on lookup miss for the charge_id.

Related errors


AI-assisted analysis of NousResearch/hermes-agent@c896c09c42 (2026-08-14). Data as JSON: /api/errors/cb1483eb6e41732b. Report an issue: GitHub.