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
- Update the backend/gateway to a version that implements billing.charge_status.
- Check gateway logs for an exception in the charge_status handler for your charge_id.
- Retry the topup flow after backend restart; verify the charge id was created by the same gateway instance.
- 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
- Version-check gateway capability (method list / version RPC) before starting a topup.
- Treat a null charge_status as 'ambiguous', never as success — surface it to the user.
- Keep TUI and backend versions aligned; charge settlement needs matching billing APIs.
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
- Saving is not available
- This Desktop build cannot refresh OAuth WebSocket tickets. U
- gateway not running
- gateway not connected: ${method}
- image upload did not return a path
AI-assisted analysis of NousResearch/hermes-agent@c896c09c42 (2026-08-14).
Data as JSON: /api/errors/cb1483eb6e41732b.
Report an issue: GitHub.