{"record":{"id":"cb1483eb6e41732b","repo":"NousResearch/hermes-agent","slug":"billing-charge-status-returned-no-response","errorCode":null,"errorMessage":"billing.charge_status returned no response","messagePattern":"billing\\.charge_status returned no response","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"ui-tui/src/app/slash/commands/topup.ts","lineNumber":236,"sourceCode":"        if (portalUrl) {\n          sys(`Portal: ${portalUrl}`)\n        }\n\n        return\n\n      case 'cancelled':\n        return\n    }\n  }\n\n  void driveChargeSettlement({\n    fetchStatus: async () => {\n      const status = await ctx.gateway.rpc<BillingChargeStatusResponse>('billing.charge_status', {\n        charge_id: chargeId\n      })\n\n      if (!status) {\n        throw new Error('billing.charge_status returned no response')\n      }\n\n      return status\n    },\n    isCancelled: () => ctx.stale(),\n    now: () => Date.now(),\n    sleep: ms => new Promise(resolve => setTimeout(resolve, ms))\n  }).then(outcome => {\n    if (outcome.kind === 'ambiguous' && !outcome.status) {\n      renderOutcome(outcome)\n\n      return\n    }\n\n    ctx.guarded<SettlementOutcome>(renderOutcome)(outcome)\n  })\n}\n","sourceCodeStart":218,"sourceCodeEnd":254,"githubUrl":"https://github.com/NousResearch/hermes-agent/blob/c896c09c42910c584c4c7d2325b58c14713ea42c/ui-tui/src/app/slash/commands/topup.ts#L218-L254","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"const status = await ctx.gateway.rpc('billing.charge_status', { charge_id: chargeId })\nif (!status) throw new Error('billing.charge_status unavailable — update the backend?')","typeGuard":"function isChargeStatus(r: unknown): r is BillingChargeStatusResponse {\n  return typeof r === 'object' && r !== null && 'status' in r\n}","tryCatchPattern":"try {\n  await driveChargeSettlement(deps)\n} catch (e) {\n  if (e instanceof Error && e.message.includes('returned no response'))\n    renderOutcome({ kind: 'ambiguous' }) // keep user informed, don't crash\n  else throw e\n}","preventionTips":["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."],"tags":["tui","billing","topup","gateway-rpc","version-skew"],"backgroundTag":null,"analyzedSha":"c896c09c42910c584c4c7d2325b58c14713ea42c","analyzedAt":"2026-08-14T17:18:01.089Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}