The SDK dropped minTotalTokens/maxTotalTokens from AggregateUsageOptions
(routstr-sdk c98de6b), so replace the five aggregate() calls with a single
list() and bucket entries in-process.
routstrd providers list --refresh now:
- Re-fetches Nostr kind 38421 provider discovery events
- Re-fetches Nostr kind 38423 routstr21 model list
- Re-fetches Nostr kind 38425 review events (applies LGTM-based disable)
- Fetches models from all discovered providers
- Syncs fresh provider list and disabled status into the store
Usage: routstrd providers list --refresh
- Import ModelManager from @routstr/sdk/bun instead of @routstr/sdk
- Import storage helpers from @routstr/sdk/storage/bun instead of @routstr/sdk/storage
- Fix createBunSqliteUsageTrackingDriver call: async and no longer needs
manual bun:sqlite import (now handled internally by the sdk entrypoint)
- Verified sharded discovery adapter setup matches SDK pattern in
scripts/routstr-daemon.ts at 6077aa7
- Add optional contextWindow field to PiModelEntry type
- Map model.context_length to contextWindow when available
- Add context_length to RoutstrModel type in registry
Adds an authUrl field to RoutstrdConfig so CLI management commands
(npubs, clients, usage) can be directed to the routstrd-auth proxy
instead of the daemon. This fixes 'routstrd npubs list' failing with
'Only POST is supported' when the auth proxy and daemon run on
separate ports (e.g., Cloudron setup: proxy on 8008, daemon on 8009).
Changes:
- config.ts: add authUrl to RoutstrdConfig
- daemon-client.ts: add getAuthBaseUrl(), callAuth(), refactor callDaemon
- cli.ts: npubs/usage commands use callAuth, remote command accepts --auth-url
- clients.ts: clients commands use callAuth
The logger utility in this project is a file-only logger — every call to
logger.log() / logger.error() writes to ~/.routstrd/logs/YYYY-MM-DD.log
and produces no terminal output whatsoever. This is intentional and correct
for the background daemon (daemon/, start-daemon.ts), which has no attached
terminal.
However, the onboarding and integration code was mistakenly using logger.log
instead of console.log for all of its user-facing output:
- setupIntegration() printed the 1-6 integration menu with logger.log, so
the user only ever saw the bare prompt 'Select integration [1]: ' with no
options above it. The selection appeared to be broken.
- Every install*Integration function (opencode, openclaw, claudecode, hermes,
pi) reported all progress and results with logger.log, so after picking an
integration nothing appeared to happen.
- initDaemon() used logger.log for 'Initialization complete!' and the
follow-up wallet instructions, so those were also silently dropped.
- installCocodOrExit() used logger.log for the 'cocod not found, installing'
message and the success/failure result.
Fix: replace logger.log/logger.error with console.log/console.error in all
CLI-facing code paths (cli.ts, integrations/index.ts, and all five
integration installers). Remove the now-unused logger import from the five
integration files. The logger import in integrations/index.ts is kept because
refreshModelsAndIntegrations() is called by the daemon's internal scheduler
and correctly logs to file there.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add cooldownMinutes field to /nwc/status and /nwc/auto-refill responses
- Change auto-refill log from ms to minutes display
- Keep cooldownMs internally for calculations
Two bugs caused the auto-refill loop to retry every 5s regardless of outcome:
1) Backoff used lastRefillAt which was only set on success. On failure
it stayed at 0, so now - 0 < backoffInterval never blocked once the
daemon had been running > 30s. Switched to a separate lastAttemptAt
that is updated on every attempt (success or failure).
2) preimage.slice() crashed when NWC returned a payment result without
a preimage field. This turned successful payments into exceptions,
triggering retries and causing the wallet to be charged repeatedly.
Guard preimage with an if-check before calling .slice().
- Add reconnect() method to wallet adapter that tears down old
WalletConnect/RelayPool and creates a new one on the fly
- Auto-refill loop now uses a getWallet() getter so it always
references the latest wallet instance after reconnect
- POST /nwc/connect and /nwc/disconnect handlers call reconnect()
after saving config, no restart needed
- Remove 'Run routstrd restart' messages from CLI connect/disconnect
Changed startAutoRefillLoop to accept a config getter instead of a static
config object. The getter reads config from disk on every check cycle, so
CLI changes (nwc auto-refill on/off) take effect immediately.
- auto-refill.ts: config parameter replaced with getConfig() callback
- wallet/index.ts: always start loop when wallet exists, use getter
- daemon/index.ts: pass getAutoRefillConfig reading from disk sync
- config-store.ts: added loadDaemonConfigSync() for sync disk reads
- http/index.ts + cli.ts: removed 'Restart daemon to apply' messages