Loading...
Loading...
Researches a person across podcasts and YouTube for interview or meeting prep: where they appeared, their own words, who discusses them. Uses arcmira.
npx skill4agent add arcmira/mcp person-researchmomentummentionsis_appearancesearchspeakerIdsaboutarcmira_execute_readarcmira_describeid_requiredcontextbestsuggestedsuggestedsuggested.evidenceaskask.options{ type: "person" }contextaskarcmira_execute_readCONTEXTaskIDarcmira.daysAgo(n)arcmira.today()const NAME = "Jensen Huang", CONTEXT = undefined, ID = null; // CONTEXT: the user's own words about the name, never a guess. After an ask, set ID to the picked option's id and run again
const r = ID ? null : await arcmira.resolve(NAME, { type: "person", context: CONTEXT });
const e = r && (r.best ?? r.suggested);
if (r && !e) return { ask: r.ask };
const id = ID ?? e.id;
const assumed = Boolean(r?.suggested), why = r?.suggested?.evidence ?? null;
const [m, rows, own] = await Promise.all([
arcmira.momentum(id),
arcmira.mentions({ entityId: id, after: arcmira.daysAgo(90), limit: 40 }),
arcmira.search({ query: "AI", speakerIds: [id], after: arcmira.daysAgo(180), limit: 5 }),
]);
const about = await arcmira.search({ query: m.entity.name, about: [id], after: arcmira.daysAgo(90), limit: 3 });
const appeared = new Map();
for (const x of rows.mentions) if (x.is_appearance) appeared.set(x.media.video_id, { show: x.media.source_channel?.name ?? null, episode: x.media.title, date: x.media.published_at });
let fromAppearance = null; // no speaker-tagged chunks: read their newest appearance instead
const ep = own.chunks.length === 0 ? rows.mentions.find(x => x.is_appearance) : undefined;
if (ep) {
try {
const t = await arcmira.transcript(ep.media.video_id, { start: Math.max(0, ep.start_seconds - 5), end: ep.start_seconds + 90 });
const s = Math.floor(t.lines[0]?.start ?? ep.start_seconds);
fromAppearance = { episode: t.video.title, show: t.video.channel_name, date: t.video.published_at, url: `${t.video.watch_url}${t.video.watch_url.includes("?") ? "&" : "?"}t=${s}`, lines: t.lines.map(l => `[${Math.round(l.start)}s] ${l.text}`), speaker_labelled: t.lines.some(l => l.speaker) };
} catch (err) {
fromAppearance = { episode: ep.media.title, error: err.code };
}
}
return {
person: { id, name: m.entity.name, page: m.entity.page, assumed, why },
attention: { verdict: m.verdict, last_30d: m.volume.mentions_30d, prior_30d: m.volume.mentions_prior_30d, as_of: m.as_of, top_shows: m.top_shows.map(s => [s.channel_name, s.mentions]) },
appeared_on: [...appeared.values()].slice(0, 8),
appeared_on_partial: rows.has_more, // true: only the newest 40 mention rows were read
in_their_words: own.chunks.map(c => ({ said: c.text.slice(0, 300), episode: c.video_title, show: c.channel_name, date: c.published_at, url: c.watch_url })),
from_their_appearance: fromAppearance,
said_about_them: about.chunks.map(c => ({ said: c.text.slice(0, 200), show: c.channel_name, date: c.published_at, url: c.watch_url })),
};as_ofaboutspeakerIdsspeakerIdsquerycompany-watch