32992834ee
- Xiaohongshu search via local MCP service (opt-in, zero impact if service not running) - Reddit public JSON fallback (works with zero API keys) - Reddit priority: ScrapeCreators -> OpenAI -> public fallback - Updated env.py: Reddit always available via public fallback Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
80 lines
3.2 KiB
JavaScript
80 lines
3.2 KiB
JavaScript
import { getFeatureOverridesSnapshot, refreshFeatureOverridesCache, } from '../lib/runtime-features.js';
|
|
import { runtimeQueryIds } from '../lib/runtime-query-ids.js';
|
|
function countFeatureOverrides(overrides) {
|
|
let count = 0;
|
|
if (overrides.global) {
|
|
count += Object.keys(overrides.global).length;
|
|
}
|
|
if (overrides.sets) {
|
|
for (const setOverrides of Object.values(overrides.sets)) {
|
|
count += Object.keys(setOverrides).length;
|
|
}
|
|
}
|
|
return count;
|
|
}
|
|
export function registerQueryIdsCommand(program, ctx) {
|
|
program
|
|
.command('query-ids')
|
|
.description('Show or refresh cached Twitter GraphQL query IDs')
|
|
.option('--json', 'Output as JSON')
|
|
.option('--fresh', 'Force refresh (downloads X client bundles)', false)
|
|
.action(async (cmdOpts) => {
|
|
const operations = [
|
|
'CreateTweet',
|
|
'CreateRetweet',
|
|
'FavoriteTweet',
|
|
'TweetDetail',
|
|
'SearchTimeline',
|
|
'UserArticlesTweets',
|
|
'Bookmarks',
|
|
'Following',
|
|
'Followers',
|
|
'Likes',
|
|
];
|
|
if (cmdOpts.fresh) {
|
|
console.error(`${ctx.p('info')}Refreshing GraphQL query IDs…`);
|
|
await runtimeQueryIds.refresh(operations, { force: true });
|
|
console.error(`${ctx.p('info')}Refreshing feature overrides…`);
|
|
await refreshFeatureOverridesCache();
|
|
}
|
|
const featureSnapshot = getFeatureOverridesSnapshot();
|
|
const info = await runtimeQueryIds.getSnapshotInfo();
|
|
if (!info) {
|
|
if (cmdOpts.json) {
|
|
console.log(JSON.stringify({
|
|
cached: false,
|
|
cachePath: runtimeQueryIds.cachePath,
|
|
featuresPath: featureSnapshot.cachePath,
|
|
features: featureSnapshot.overrides,
|
|
}, null, 2));
|
|
return;
|
|
}
|
|
console.log(`${ctx.p('warn')}No cached query IDs yet.`);
|
|
console.log(`${ctx.p('info')}Run: bird query-ids --fresh`);
|
|
console.log(`features_path: ${featureSnapshot.cachePath}`);
|
|
return;
|
|
}
|
|
if (cmdOpts.json) {
|
|
console.log(JSON.stringify({
|
|
cached: true,
|
|
cachePath: info.cachePath,
|
|
fetchedAt: info.snapshot.fetchedAt,
|
|
isFresh: info.isFresh,
|
|
ageMs: info.ageMs,
|
|
ids: info.snapshot.ids,
|
|
discovery: info.snapshot.discovery,
|
|
featuresPath: featureSnapshot.cachePath,
|
|
features: featureSnapshot.overrides,
|
|
}, null, 2));
|
|
return;
|
|
}
|
|
console.log(`${ctx.p('ok')}GraphQL query IDs cached`);
|
|
console.log(`path: ${info.cachePath}`);
|
|
console.log(`fetched_at: ${info.snapshot.fetchedAt}`);
|
|
console.log(`fresh: ${info.isFresh ? 'yes' : 'no'}`);
|
|
console.log(`ops: ${Object.keys(info.snapshot.ids).length}`);
|
|
console.log(`features_path: ${featureSnapshot.cachePath}`);
|
|
console.log(`features: ${countFeatureOverrides(featureSnapshot.overrides)}`);
|
|
});
|
|
}
|
|
//# sourceMappingURL=query-ids.js.map
|