* feat(quota): add OpenCode Go usage tracking * fix(quota): align OpenCode Go VS Code parsing
69 lines
2.5 KiB
JavaScript
69 lines
2.5 KiB
JavaScript
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 {
|
|
const { listConfiguredQuotaProviders } = await getQuotaProviders();
|
|
const providers = listConfiguredQuotaProviders();
|
|
res.json({ providers });
|
|
} catch (error) {
|
|
console.error('Failed to list quota providers:', error);
|
|
res.status(500).json({ error: error.message || 'Failed to list quota providers' });
|
|
}
|
|
});
|
|
|
|
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;
|
|
if (!providerId) {
|
|
return res.status(400).json({ error: 'Provider ID is required' });
|
|
}
|
|
const { fetchQuotaForProvider } = await getQuotaProviders();
|
|
const result = await fetchQuotaForProvider(providerId);
|
|
res.json(result);
|
|
} catch (error) {
|
|
console.error('Failed to fetch quota:', error);
|
|
res.status(500).json({ error: error.message || 'Failed to fetch quota' });
|
|
}
|
|
});
|
|
}
|