diff --git a/.gitignore b/.gitignore index 6b06d2d..cf7579e 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,9 @@ node_modules/ issue-drafts/ *.issue-draft.md +# Data directory (postgres, redis persistence) +data/ + # Accidental literal "~" directories (e.g. when a configured path contains "~" but isn't expanded) backend/~/ backend/coverage.* diff --git a/compose.yml b/compose.yml index a5f1f95..e1d8e97 100644 --- a/compose.yml +++ b/compose.yml @@ -8,7 +8,7 @@ services: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} volumes: - - postgres_data:/var/lib/postgresql/data + - ./data/postgres:/var/lib/postgresql/data ports: - "127.0.0.1:${POSTGRES_PORT:-5432}:5432" healthcheck: @@ -99,5 +99,4 @@ services: FORGEJO_SYNC_STARTUP_DELAY_SECONDS: ${FORGEJO_SYNC_STARTUP_DELAY_SECONDS:-60} restart: unless-stopped -volumes: - postgres_data: + diff --git a/frontend/src/app/settings/ai-providers/page.tsx b/frontend/src/app/settings/ai-providers/page.tsx index d0f71b9..159ff45 100644 --- a/frontend/src/app/settings/ai-providers/page.tsx +++ b/frontend/src/app/settings/ai-providers/page.tsx @@ -253,8 +253,10 @@ function UsageStrip({ credentialId, provider }: { credentialId: string; provider } const tok = usage.tokens; + const inputTok = usage.input_tokens; const req = usage.requests; const isOllama = provider === "ollama"; + const modelCount = usage.models?.length ?? 0; return (
@@ -273,6 +275,15 @@ function UsageStrip({ credentialId, provider }: { credentialId: string; provider
) : (
+ {modelCount > 0 && ( +
+ Models + + {modelCount} available + +
+ )} + {/* Tokens */} {tok.limit != null ? (
@@ -300,6 +311,33 @@ function UsageStrip({ credentialId, provider }: { credentialId: string; provider
) : null} + {/* Anthropic input tokens */} + {inputTok.limit != null ? ( +
+
+ Input tokens + + {fmtTokens(inputTok.remaining)} / {fmtTokens(inputTok.limit)} remaining + {inputTok.reset_in_ms != null && ( + ยท resets in {fmtResetMs(inputTok.reset_in_ms)} + )} + +
+ {inputTok.pct_used != null && ( +
+
90 ? "bg-[color:var(--danger)]" : + inputTok.pct_used > 75 ? "bg-[color:var(--warning)]" : + "bg-[color:var(--success)]" + }`} + style={{ width: `${Math.min(100, inputTok.pct_used)}%` }} + /> +
+ )} +
+ ) : null} + {/* Requests */} {req.limit != null ? (
@@ -313,9 +351,9 @@ function UsageStrip({ credentialId, provider }: { credentialId: string; provider
) : null} - {tok.limit == null && req.limit == null && ( + {tok.limit == null && inputTok.limit == null && req.limit == null && (

- Connected โ€” no rate limit headers returned by this key tier. + Connected โ€” provider did not return token/request limit headers for this key tier.

)} diff --git a/scripts/docker-test.sh b/scripts/docker-test.sh index cff1815..220c9b7 100755 --- a/scripts/docker-test.sh +++ b/scripts/docker-test.sh @@ -10,8 +10,9 @@ # `docker image prune`, `docker volume prune`). Those commands operate on # ALL Docker resources system-wide and will destroy other running services. # -# DATA PERSISTENCE: The postgres database volume is preserved across rebuilds. -# Only app containers/images are cycled. DB data (gateways, keys, etc.) survives. +# DATA PERSISTENCE: The postgres database lives in ./data/postgres (bind mount). +# It is NOT a Docker volume โ€” it survives rebuilds automatically. +# DB data (gateways, keys, etc.) persists across docker-test.sh runs. set -euo pipefail cd "$(git rev-parse --show-toplevel)"