scripts/_sbx_nicky_keys.mjs
Rama main · réplica de lectura del repositorio original.
// READ-ONLY openhermit: Nicky model config + secrets, vs a working amiko/deepseek-flash twin.
import pg from 'pg';
const c = new pg.Client({ connectionString: process.env.DATABASE_URL });
await c.connect();
const q = async (s,p)=>(await c.query(s,p)).rows;
// secrets table columns
const cols = await q(`select column_name from information_schema.columns where table_schema='openhermit' and table_name='agent_secrets' order by ordinal_position`);
console.log('agent_secrets columns:', cols.map(x=>x.column_name).join(', '));
const TW = [["cmv65sb2g000007jqrr2w3571","Nicky (BROKEN)"],["cmv465akm000007l5nedpujvs","勋哥 (BROKEN)"],["cmv6bawgy000707jmrtoqiu2r","幺儿 (WORKING)"],["cmv3xucop000007jykxlh5igz","刘美美 (WORKING)"]];
for (const [id,label] of TW) {
console.log(`\n===== ${label} =====`);
const a=(await q(`select config_json from openhermit.agents where agent_id=$1`,[id]))[0];
const cfg=JSON.parse(a?.config_json||'{}');
console.log(' model:', JSON.stringify(cfg.model));
// secrets: show key names + whether value present, NOT the secret value
const secs = await q(`select * from openhermit.agent_secrets where agent_id=$1`,[id]);
if(!secs.length) console.log(' secrets: (none)');
for (const s of secs) {
const redacted = {};
for (const [k,v] of Object.entries(s)) {
if (k==='agent_id') continue;
if (typeof v==='string' && v.length>8 && /key|secret|token|value|val/i.test(k)) redacted[k]=`<${v.length} chars: ${v.slice(0,4)}…${v.slice(-2)}>`;
else redacted[k]=v;
}
console.log(' secret:', JSON.stringify(redacted));
}
}
// How does amiko provider auth? check for env-level key names on the gateway (names only)
console.log('\n=== amiko-related env var NAMES present (values hidden) ===');
console.log(Object.keys(process.env).filter(k=>/amiko|deepseek|model|api_key|provider|router/i.test(k)).sort().join(', '));
await c.end();