60 lines
3.2 KiB
JavaScript
60 lines
3.2 KiB
JavaScript
const path = require('path');
|
|
const { openRuntimeDb, isPostgresEnabled } = require('../db/runtime');
|
|
const pg = require('../db/pgAsync');
|
|
|
|
const intelligencePath = process.env.INTELLIGENCE_DB || path.resolve(process.cwd(), 'intelligence.sqlite');
|
|
const db = openRuntimeDb(intelligencePath, { schema: 'intelligence', readonly: true });
|
|
|
|
async function autonomyRoutes(fastify) {
|
|
fastify.get('/health', async () => ({ ok: true, service: 'duriin-api' }));
|
|
|
|
fastify.get('/autonomy/status', async () => {
|
|
if (isPostgresEnabled()) {
|
|
const exists = await pg.get('intelligence', "SELECT 1 FROM information_schema.tables WHERE table_schema = $1 AND table_name = $2", ['intelligence', 'autonomy_jobs']);
|
|
if (!exists) return { enabled: false, reason: 'autonomy schema is not initialized' };
|
|
const [jobs, predictions, decisions, outcomes, legacy, instruments] = await Promise.all([
|
|
pg.all('intelligence', 'SELECT lane, status, COUNT(*) AS count FROM autonomy_jobs GROUP BY lane, status ORDER BY lane, status'),
|
|
pg.all('intelligence', 'SELECT status, COUNT(*) AS count FROM autonomy_predictions GROUP BY status ORDER BY status'),
|
|
pg.all('intelligence', 'SELECT action, COUNT(*) AS count FROM autonomy_decisions GROUP BY action ORDER BY action'),
|
|
pg.get('intelligence', 'SELECT COUNT(*) AS total, SUM(direction_correct) AS correct, AVG(excess_return) AS average_excess_return FROM autonomy_outcomes'),
|
|
pg.get('intelligence', 'SELECT COUNT(*) AS count FROM autonomy_legacy_records'),
|
|
pg.get('intelligence', 'SELECT COUNT(*) AS count FROM autonomy_instruments WHERE active=1 AND tradable=1'),
|
|
]);
|
|
return { enabled: true, jobs, predictions, decisions, outcomes, legacyRecords: legacy.count, allowlistedInstruments: instruments.count };
|
|
}
|
|
const exists = isPostgresEnabled()
|
|
? db.prepare("SELECT 1 FROM information_schema.tables WHERE table_schema = ? AND table_name = ?").get('intelligence', 'autonomy_jobs')
|
|
: db.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='autonomy_jobs'").get();
|
|
if (!exists) return { enabled: false, reason: 'autonomy schema is not initialized' };
|
|
const jobs = db.prepare(`
|
|
SELECT lane, status, COUNT(*) AS count
|
|
FROM autonomy_jobs
|
|
GROUP BY lane, status
|
|
ORDER BY lane, status
|
|
`).all();
|
|
const predictions = db.prepare(`
|
|
SELECT status, COUNT(*) AS count
|
|
FROM autonomy_predictions
|
|
GROUP BY status
|
|
ORDER BY status
|
|
`).all();
|
|
const decisions = db.prepare(`
|
|
SELECT action, COUNT(*) AS count
|
|
FROM autonomy_decisions
|
|
GROUP BY action
|
|
ORDER BY action
|
|
`).all();
|
|
const outcomes = db.prepare(`
|
|
SELECT COUNT(*) AS total,
|
|
SUM(direction_correct) AS correct,
|
|
AVG(excess_return) AS average_excess_return
|
|
FROM autonomy_outcomes
|
|
`).get();
|
|
const legacy = db.prepare('SELECT COUNT(*) AS count FROM autonomy_legacy_records').get();
|
|
const instruments = db.prepare('SELECT COUNT(*) AS count FROM autonomy_instruments WHERE active=1 AND tradable=1').get();
|
|
return { enabled: true, jobs, predictions, decisions, outcomes, legacyRecords: legacy.count, allowlistedInstruments: instruments.count };
|
|
});
|
|
}
|
|
|
|
module.exports = autonomyRoutes;
|