feat(quota): add OpenCode Go usage tracking (#2155)

* feat(quota): add OpenCode Go usage tracking

* fix(quota): align OpenCode Go VS Code parsing
This commit is contained in:
Bohdan Triapitsyn
2026-07-12 14:48:50 +03:00
committed by GitHub
parent b4f50e0a01
commit 3d90eddcaf
26 changed files with 658 additions and 1 deletions
+41
View File
@@ -1,3 +1,13 @@
import express from 'express';
import {
deleteOpenCodeGoCredential,
getOpenCodeGoCredentialStatus,
normalizeOpenCodeGoCredential,
readOpenCodeGoCredential,
writeOpenCodeGoCredential,
} from './opencode-go-credentials.js';
import { fetchOpenCodeGoUsage } from './providers/opencode-go.js';
export function registerQuotaRoutes(app, { getQuotaProviders }) {
app.get('/api/quota/providers', async (_req, res) => {
try {
@@ -10,6 +20,37 @@ export function registerQuotaRoutes(app, { getQuotaProviders }) {
}
});
app.get('/api/quota/credentials/opencode-go', (_req, res) => {
res.json(getOpenCodeGoCredentialStatus());
});
app.put('/api/quota/credentials/opencode-go', express.json({ limit: '16kb' }), async (req, res) => {
try {
const credential = normalizeOpenCodeGoCredential(req.body);
if (!credential) return res.status(400).json({ error: 'Workspace ID and auth cookie are required' });
await fetchOpenCodeGoUsage(credential);
res.json(writeOpenCodeGoCredential(credential));
} catch (error) {
res.status(400).json({ error: error instanceof Error ? error.message : 'Credential validation failed' });
}
});
app.post('/api/quota/credentials/opencode-go/validate', async (_req, res) => {
try {
const credential = readOpenCodeGoCredential();
if (!credential) return res.status(404).json({ error: 'Not configured' });
await fetchOpenCodeGoUsage(credential);
res.json({ valid: true });
} catch (error) {
res.status(400).json({ valid: false, error: error instanceof Error ? error.message : 'Credential validation failed' });
}
});
app.delete('/api/quota/credentials/opencode-go', (_req, res) => {
deleteOpenCodeGoCredential();
res.json({ configured: false });
});
app.get('/api/quota/:providerId', async (req, res) => {
try {
const { providerId } = req.params;