peak6-x-intelligence-plugin 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/manifest.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // src/constants.ts
2
2
  var PLUGIN_ID = "peak6-labs.x-intelligence";
3
- var PLUGIN_VERSION = "0.1.1";
3
+ var PLUGIN_VERSION = "0.1.2";
4
4
  var JOB_KEYS = {
5
5
  discoveryRun: "discovery-run",
6
6
  authorityDecay: "authority-decay",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/constants.ts", "../src/manifest.ts"],
4
- "sourcesContent": ["export const PLUGIN_ID = \"peak6-labs.x-intelligence\";\nexport const PLUGIN_VERSION = \"0.1.1\";\n\nexport const JOB_KEYS = {\n discoveryRun: \"discovery-run\",\n authorityDecay: \"authority-decay\",\n complianceCheck: \"compliance-check\",\n corpusRetention: \"corpus-retention\",\n} as const;\n\nexport const TOOL_NAMES = {\n searchCorpus: \"search-corpus\",\n getToday: \"get-today\",\n getAuthorities: \"get-authorities\",\n suggestHandles: \"suggest-handles\",\n trackHandle: \"track-handle\",\n analyzeTopic: \"analyze-topic\",\n getThread: \"get-thread\",\n promoteHandle: \"promote-handle\",\n rateTweet: \"rate-tweet\",\n} as const;\n\nexport const SLOT_IDS = {\n dashboardWidget: \"x-intelligence-dashboard\",\n settingsPage: \"x-intelligence-settings\",\n corpusBrowser: \"x-intelligence-corpus-browser\",\n} as const;\n\nexport const EXPORT_NAMES = {\n dashboardWidget: \"DashboardWidget\",\n settingsPage: \"SettingsPage\",\n corpusBrowser: \"CorpusBrowserPage\",\n} as const;\n\nexport const ENTITY_TYPES = {\n tweet: \"tweet\",\n handle: \"handle\",\n} as const;\n\nexport const STATE_KEYS = {\n corpusPrefix: \"corpus:\",\n lastDiscoveryRun: \"last-discovery-run\",\n pipelineStats: \"pipeline-stats\",\n} as const;\n\nexport const EVENT_NAMES = {\n corpusUpdated: \"corpus.updated\",\n handlePromoted: \"handle.promoted\",\n gapIdentified: \"gap.identified\",\n tweetHighEngagement: \"tweet.high-engagement\",\n} as const;\n\nexport const DEFAULT_CONFIG = {\n company_id: \"\",\n xai_api_key_ref: \"XAI_API_KEY\",\n x_api_bearer_ref: \"BEARER_TOKEN\",\n semantic_topics: [\n \"institutional investors discussing market structure reform\",\n \"fintech companies disrupting traditional trading\",\n \"SEC regulatory changes affecting options trading\",\n \"algorithmic trading and quantitative strategies\",\n \"venture capital investing in financial infrastructure\",\n \"PEAK6\",\n \"options market making technology\",\n \"Chicago trading community news\",\n ],\n keyword_searches: [\n \"\\\"PEAK6 Investments\\\" OR \\\"PEAK6\\\" trading fintech\",\n \"fintech and trading technology\",\n \"market structure and regulation\",\n \"options trading strategies and platforms\",\n ],\n content_pillars: [\n \"market structure & regulation\",\n \"fintech & trading technology\",\n \"venture capital & investment\",\n \"Chicago business ecosystem\",\n \"company culture & talent\",\n ],\n scoring_weights: {\n relevance: 0.45,\n recency: 0.25,\n engagement: 0.30,\n },\n engagement_sub_weights: {\n likes: 0.55,\n reposts: 0.25,\n replies: 0.15,\n quotes: 0.05,\n },\n max_corpus_size: 200,\n dedup_threshold: 0.70,\n authority_boost: 0.15,\n authority_lists: {\n market_structure: {\n description: \"Market structure, regulation, SEC reform, options trading\",\n handles: [\n \"LizAnnSonders\",\n \"matt_levine\",\n \"unusual_whales\",\n \"CMEGroup\",\n \"CBOE\",\n \"OptionsHawk\",\n \"InvestorDenis\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n fintech: {\n description: \"Fintech, trading technology, AI in finance\",\n handles: [\n \"twifintech\",\n \"IBSIntelligence\",\n \"privy_io\",\n \"i_Know_First\",\n \"fintech_germany\",\n \"venture_radar\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n venture_capital: {\n description: \"Venture capital investing in financial infrastructure\",\n handles: [\n \"a16z\",\n \"FundersVC\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n chicago_trading: {\n description: \"Chicago trading community, prop firms, PEAK6 ecosystem\",\n handles: [\n \"CBOE\",\n \"CMEGroup\",\n \"boogeymantradez\",\n \"adealafia\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n } as Record<string, AuthorityList>,\n global_excluded: [\"elonmusk\", \"openai\", \"google\", \"microsoft\"],\n authority_promotion_policy: {\n auto_promote_threshold: {\n min_appearances: 7,\n min_avg_relevance: 0.8,\n min_mutual_overlap: 3,\n },\n candidate_threshold: {\n min_appearances: 5,\n min_avg_relevance: 0.7,\n min_mutual_overlap: 2,\n },\n tracking_window_days: 14,\n },\n corpus_retention_days: 90,\n engagement_thresholds: {\n noise_floor: 10,\n expert: 50,\n escalation: 100,\n },\n} as const;\n\nexport interface AuthorityList {\n description: string;\n handles: string[];\n last_reviewed: string;\n}\n", "import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\nimport {\n DEFAULT_CONFIG,\n EXPORT_NAMES,\n JOB_KEYS,\n PLUGIN_ID,\n PLUGIN_VERSION,\n SLOT_IDS,\n TOOL_NAMES,\n} from \"./constants.js\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: PLUGIN_ID,\n apiVersion: 1,\n version: PLUGIN_VERSION,\n displayName: \"X Intelligence\",\n description:\n \"Automated X/Twitter intelligence pipeline \u2014 discovery, enrichment, scoring, deduplication, authority list management, and corpus storage.\",\n author: \"peak6-labs\",\n categories: [\"connector\", \"automation\"],\n capabilities: [\n \"http.outbound\",\n \"secrets.read-ref\",\n \"jobs.schedule\",\n \"agent.tools.register\",\n \"plugin.state.read\",\n \"plugin.state.write\",\n \"events.subscribe\",\n \"events.emit\",\n \"issues.read\",\n \"issues.create\",\n \"activity.log.write\",\n \"metrics.write\",\n \"instance.settings.register\",\n \"ui.dashboardWidget.register\",\n \"ui.page.register\",\n ],\n entrypoints: {\n worker: \"./dist/worker.js\",\n ui: \"./dist/ui\",\n },\n instanceConfigSchema: {\n type: \"object\",\n properties: {\n company_id: {\n type: \"string\",\n title: \"Company ID\",\n description: \"UUID of the company this plugin serves (required for events and activity logging)\",\n default: DEFAULT_CONFIG.company_id,\n },\n xai_api_key_ref: {\n type: \"string\",\n title: \"xAI API Key Secret Reference\",\n default: DEFAULT_CONFIG.xai_api_key_ref,\n },\n x_api_bearer_ref: {\n type: \"string\",\n title: \"X API Bearer Token Secret Reference\",\n default: DEFAULT_CONFIG.x_api_bearer_ref,\n },\n semantic_topics: {\n type: \"array\",\n title: \"Semantic Discovery Topics\",\n items: { type: \"string\" },\n default: DEFAULT_CONFIG.semantic_topics,\n },\n keyword_searches: {\n type: \"array\",\n title: \"Keyword Searches\",\n items: { type: \"string\" },\n default: DEFAULT_CONFIG.keyword_searches,\n },\n content_pillars: {\n type: \"array\",\n title: \"Content Pillars\",\n items: { type: \"string\" },\n default: DEFAULT_CONFIG.content_pillars,\n },\n scoring_weights: {\n type: \"object\",\n title: \"Scoring Weights\",\n properties: {\n relevance: { type: \"number\", default: 0.45 },\n recency: { type: \"number\", default: 0.25 },\n engagement: { type: \"number\", default: 0.30 },\n },\n default: DEFAULT_CONFIG.scoring_weights,\n },\n engagement_sub_weights: {\n type: \"object\",\n title: \"Engagement Sub-Weights\",\n properties: {\n likes: { type: \"number\", default: 0.55 },\n reposts: { type: \"number\", default: 0.25 },\n replies: { type: \"number\", default: 0.15 },\n quotes: { type: \"number\", default: 0.05 },\n },\n default: DEFAULT_CONFIG.engagement_sub_weights,\n },\n max_corpus_size: {\n type: \"number\",\n title: \"Max Corpus Size Per Day\",\n default: DEFAULT_CONFIG.max_corpus_size,\n },\n dedup_threshold: {\n type: \"number\",\n title: \"Dedup Jaccard Threshold\",\n default: DEFAULT_CONFIG.dedup_threshold,\n },\n authority_boost: {\n type: \"number\",\n title: \"Authority Score Boost\",\n default: DEFAULT_CONFIG.authority_boost,\n },\n authority_lists: {\n type: \"object\",\n title: \"Authority Handle Lists\",\n default: DEFAULT_CONFIG.authority_lists,\n },\n global_excluded: {\n type: \"array\",\n title: \"Globally Excluded Handles\",\n items: { type: \"string\" },\n default: DEFAULT_CONFIG.global_excluded,\n },\n authority_promotion_policy: {\n type: \"object\",\n title: \"Authority Promotion Policy\",\n default: DEFAULT_CONFIG.authority_promotion_policy,\n },\n corpus_retention_days: {\n type: \"number\",\n title: \"Corpus Retention (days)\",\n default: DEFAULT_CONFIG.corpus_retention_days,\n },\n engagement_thresholds: {\n type: \"object\",\n title: \"Engagement Thresholds\",\n description: \"Engagement level tiers: noise_floor (filter), expert (highlight), escalation (alert event)\",\n properties: {\n noise_floor: { type: \"number\", default: 10 },\n expert: { type: \"number\", default: 50 },\n escalation: { type: \"number\", default: 100 },\n },\n default: DEFAULT_CONFIG.engagement_thresholds,\n },\n },\n },\n jobs: [\n {\n jobKey: JOB_KEYS.discoveryRun,\n displayName: \"Discovery Run\",\n description:\n \"Two-stage pipeline: xAI open + focused discovery, X API v2 enrichment, scoring, and corpus storage.\",\n schedule: \"0 6 * * *\",\n },\n {\n jobKey: JOB_KEYS.authorityDecay,\n displayName: \"Authority Decay\",\n description:\n \"Weekly handle decay \u2014 downgrade or remove handles not seen within the tracking window.\",\n schedule: \"0 0 * * 0\",\n },\n {\n jobKey: JOB_KEYS.complianceCheck,\n displayName: \"Compliance Check\",\n description:\n \"Weekly re-check of stored tweets \u2014 remove deleted or suspended content.\",\n schedule: \"0 3 * * 0\",\n },\n {\n jobKey: JOB_KEYS.corpusRetention,\n displayName: \"Corpus Retention\",\n description:\n \"Monthly archive/delete corpus older than the retention window.\",\n schedule: \"0 4 1 * *\",\n },\n ],\n tools: [\n {\n name: TOOL_NAMES.searchCorpus,\n displayName: \"Search X Corpus\",\n description:\n \"Search the scored X intelligence corpus by query text, date range, content pillar, score threshold, and engagement level.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query (text match)\" },\n date: { type: \"string\", description: \"Date filter (YYYY-MM-DD)\" },\n pillar: { type: \"string\", description: \"Content pillar filter\" },\n limit: { type: \"number\", description: \"Max results (default 20)\" },\n min_score: { type: \"number\", description: \"Minimum score threshold (0-1)\" },\n min_engagement: { type: \"number\", description: \"Minimum total engagement (likes+reposts+replies+quotes)\" },\n since: { type: \"string\", description: \"Time window: '1h', '3h', '12h', '1d', '7d', or YYYY-MM-DD\" },\n },\n },\n },\n {\n name: TOOL_NAMES.getToday,\n displayName: \"Get Today's Intelligence\",\n description:\n \"Get today's scored X intelligence corpus from entities, optionally filtered by pillar and score threshold.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n pillar: { type: \"string\", description: \"Content pillar filter\" },\n limit: { type: \"number\", description: \"Max results (default 20)\" },\n min_score: { type: \"number\", description: \"Minimum score threshold (0-1)\" },\n },\n },\n },\n {\n name: TOOL_NAMES.getAuthorities,\n displayName: \"Get Authority Handles\",\n description:\n \"Get the authority handle list for a domain, or all domains if none specified.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n list_name: {\n type: \"string\",\n description: \"Domain name (e.g. 'market_structure')\",\n },\n },\n },\n },\n {\n name: TOOL_NAMES.suggestHandles,\n displayName: \"Suggest Handle Promotions\",\n description:\n \"Get handles that are candidates for authority list promotion based on tracking data.\",\n parametersSchema: {\n type: \"object\",\n properties: {},\n },\n },\n {\n name: TOOL_NAMES.trackHandle,\n displayName: \"Track Handle\",\n description:\n \"Record a handle appearance from agent discovery with relevance score and domain.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n handle: { type: \"string\", description: \"X handle (without @)\" },\n relevance: { type: \"number\", description: \"Relevance score (0-1)\" },\n domain: { type: \"string\", description: \"Domain/topic area\" },\n },\n required: [\"handle\", \"relevance\", \"domain\"],\n },\n },\n {\n name: TOOL_NAMES.analyzeTopic,\n displayName: \"Analyze Topic\",\n description:\n \"On-demand xAI search for any topic with 5-perspective decomposition (core, expert voices, pain points, positive signals, link-based) and corpus cross-reference. Returns a synthesis brief.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n topic: { type: \"string\", description: \"Topic to analyze\" },\n include_corpus: { type: \"boolean\", description: \"Cross-reference with stored corpus (default true)\" },\n },\n required: [\"topic\"],\n },\n },\n {\n name: TOOL_NAMES.getThread,\n displayName: \"Get Tweet Thread\",\n description:\n \"Fetch conversation context for a tweet. Returns the target tweet and other tweets in the same conversation thread.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n tweet_id: { type: \"string\", description: \"Tweet ID to get thread for\" },\n },\n required: [\"tweet_id\"],\n },\n },\n {\n name: TOOL_NAMES.promoteHandle,\n displayName: \"Promote Handle\",\n description:\n \"Promote a tracked handle to authority status in a specific domain list. Sets entity status to promoted and records the target list.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n handle: { type: \"string\", description: \"X handle (without @)\" },\n list_name: { type: \"string\", description: \"Authority list to promote to (e.g. 'market_structure')\" },\n note: { type: \"string\", description: \"Optional note about why this handle was promoted\" },\n },\n required: [\"handle\", \"list_name\"],\n },\n },\n {\n name: TOOL_NAMES.rateTweet,\n displayName: \"Rate Tweet\",\n description:\n \"Record relevance feedback on a tweet in the corpus. Agents or humans can rate tweets as relevant, irrelevant, or skip.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n tweet_id: { type: \"string\", description: \"Tweet ID to rate\" },\n rating: { type: \"string\", enum: [\"relevant\", \"irrelevant\", \"skip\"], description: \"Relevance rating\" },\n rated_by: { type: \"string\", description: \"ID of the rater (agent or user)\" },\n },\n required: [\"tweet_id\", \"rating\"],\n },\n },\n ],\n ui: {\n slots: [\n {\n type: \"dashboardWidget\",\n id: SLOT_IDS.dashboardWidget,\n displayName: \"X Intelligence\",\n exportName: EXPORT_NAMES.dashboardWidget,\n },\n {\n type: \"settingsPage\",\n id: SLOT_IDS.settingsPage,\n displayName: \"X Intelligence Settings\",\n exportName: EXPORT_NAMES.settingsPage,\n },\n {\n type: \"page\",\n id: SLOT_IDS.corpusBrowser,\n displayName: \"X Intelligence Corpus\",\n exportName: EXPORT_NAMES.corpusBrowser,\n routePath: \"x-intelligence\",\n },\n ],\n },\n};\n\nexport default manifest;\n"],
4
+ "sourcesContent": ["export const PLUGIN_ID = \"peak6-labs.x-intelligence\";\nexport const PLUGIN_VERSION = \"0.1.2\";\n\nexport const JOB_KEYS = {\n discoveryRun: \"discovery-run\",\n authorityDecay: \"authority-decay\",\n complianceCheck: \"compliance-check\",\n corpusRetention: \"corpus-retention\",\n} as const;\n\nexport const TOOL_NAMES = {\n searchCorpus: \"search-corpus\",\n getToday: \"get-today\",\n getAuthorities: \"get-authorities\",\n suggestHandles: \"suggest-handles\",\n trackHandle: \"track-handle\",\n analyzeTopic: \"analyze-topic\",\n getThread: \"get-thread\",\n promoteHandle: \"promote-handle\",\n rateTweet: \"rate-tweet\",\n} as const;\n\nexport const SLOT_IDS = {\n dashboardWidget: \"x-intelligence-dashboard\",\n settingsPage: \"x-intelligence-settings\",\n corpusBrowser: \"x-intelligence-corpus-browser\",\n} as const;\n\nexport const EXPORT_NAMES = {\n dashboardWidget: \"DashboardWidget\",\n settingsPage: \"SettingsPage\",\n corpusBrowser: \"CorpusBrowserPage\",\n} as const;\n\nexport const ENTITY_TYPES = {\n tweet: \"tweet\",\n handle: \"handle\",\n} as const;\n\nexport const STATE_KEYS = {\n corpusPrefix: \"corpus:\",\n lastDiscoveryRun: \"last-discovery-run\",\n pipelineStats: \"pipeline-stats\",\n} as const;\n\nexport const EVENT_NAMES = {\n corpusUpdated: \"corpus.updated\",\n handlePromoted: \"handle.promoted\",\n gapIdentified: \"gap.identified\",\n tweetHighEngagement: \"tweet.high-engagement\",\n} as const;\n\nexport const DEFAULT_CONFIG = {\n company_id: \"\",\n xai_api_key_ref: \"XAI_API_KEY\",\n x_api_bearer_ref: \"BEARER_TOKEN\",\n semantic_topics: [\n \"institutional investors discussing market structure reform\",\n \"fintech companies disrupting traditional trading\",\n \"SEC regulatory changes affecting options trading\",\n \"algorithmic trading and quantitative strategies\",\n \"venture capital investing in financial infrastructure\",\n \"PEAK6\",\n \"options market making technology\",\n \"Chicago trading community news\",\n ],\n keyword_searches: [\n \"\\\"PEAK6 Investments\\\" OR \\\"PEAK6\\\" trading fintech\",\n \"fintech and trading technology\",\n \"market structure and regulation\",\n \"options trading strategies and platforms\",\n ],\n content_pillars: [\n \"market structure & regulation\",\n \"fintech & trading technology\",\n \"venture capital & investment\",\n \"Chicago business ecosystem\",\n \"company culture & talent\",\n ],\n scoring_weights: {\n relevance: 0.45,\n recency: 0.25,\n engagement: 0.30,\n },\n engagement_sub_weights: {\n likes: 0.55,\n reposts: 0.25,\n replies: 0.15,\n quotes: 0.05,\n },\n max_corpus_size: 200,\n dedup_threshold: 0.70,\n authority_boost: 0.15,\n authority_lists: {\n market_structure: {\n description: \"Market structure, regulation, SEC reform, options trading\",\n handles: [\n \"LizAnnSonders\",\n \"matt_levine\",\n \"unusual_whales\",\n \"CMEGroup\",\n \"CBOE\",\n \"OptionsHawk\",\n \"InvestorDenis\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n fintech: {\n description: \"Fintech, trading technology, AI in finance\",\n handles: [\n \"twifintech\",\n \"IBSIntelligence\",\n \"privy_io\",\n \"i_Know_First\",\n \"fintech_germany\",\n \"venture_radar\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n venture_capital: {\n description: \"Venture capital investing in financial infrastructure\",\n handles: [\n \"a16z\",\n \"FundersVC\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n chicago_trading: {\n description: \"Chicago trading community, prop firms, PEAK6 ecosystem\",\n handles: [\n \"CBOE\",\n \"CMEGroup\",\n \"boogeymantradez\",\n \"adealafia\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n } as Record<string, AuthorityList>,\n global_excluded: [\"elonmusk\", \"openai\", \"google\", \"microsoft\"],\n authority_promotion_policy: {\n auto_promote_threshold: {\n min_appearances: 7,\n min_avg_relevance: 0.8,\n min_mutual_overlap: 3,\n },\n candidate_threshold: {\n min_appearances: 5,\n min_avg_relevance: 0.7,\n min_mutual_overlap: 2,\n },\n tracking_window_days: 14,\n },\n corpus_retention_days: 90,\n engagement_thresholds: {\n noise_floor: 10,\n expert: 50,\n escalation: 100,\n },\n} as const;\n\nexport interface AuthorityList {\n description: string;\n handles: string[];\n last_reviewed: string;\n}\n", "import type { PaperclipPluginManifestV1 } from \"@paperclipai/plugin-sdk\";\nimport {\n DEFAULT_CONFIG,\n EXPORT_NAMES,\n JOB_KEYS,\n PLUGIN_ID,\n PLUGIN_VERSION,\n SLOT_IDS,\n TOOL_NAMES,\n} from \"./constants.js\";\n\nconst manifest: PaperclipPluginManifestV1 = {\n id: PLUGIN_ID,\n apiVersion: 1,\n version: PLUGIN_VERSION,\n displayName: \"X Intelligence\",\n description:\n \"Automated X/Twitter intelligence pipeline \u2014 discovery, enrichment, scoring, deduplication, authority list management, and corpus storage.\",\n author: \"peak6-labs\",\n categories: [\"connector\", \"automation\"],\n capabilities: [\n \"http.outbound\",\n \"secrets.read-ref\",\n \"jobs.schedule\",\n \"agent.tools.register\",\n \"plugin.state.read\",\n \"plugin.state.write\",\n \"events.subscribe\",\n \"events.emit\",\n \"issues.read\",\n \"issues.create\",\n \"activity.log.write\",\n \"metrics.write\",\n \"instance.settings.register\",\n \"ui.dashboardWidget.register\",\n \"ui.page.register\",\n ],\n entrypoints: {\n worker: \"./dist/worker.js\",\n ui: \"./dist/ui\",\n },\n instanceConfigSchema: {\n type: \"object\",\n properties: {\n company_id: {\n type: \"string\",\n title: \"Company ID\",\n description: \"UUID of the company this plugin serves (required for events and activity logging)\",\n default: DEFAULT_CONFIG.company_id,\n },\n xai_api_key_ref: {\n type: \"string\",\n title: \"xAI API Key Secret Reference\",\n default: DEFAULT_CONFIG.xai_api_key_ref,\n },\n x_api_bearer_ref: {\n type: \"string\",\n title: \"X API Bearer Token Secret Reference\",\n default: DEFAULT_CONFIG.x_api_bearer_ref,\n },\n semantic_topics: {\n type: \"array\",\n title: \"Semantic Discovery Topics\",\n items: { type: \"string\" },\n default: DEFAULT_CONFIG.semantic_topics,\n },\n keyword_searches: {\n type: \"array\",\n title: \"Keyword Searches\",\n items: { type: \"string\" },\n default: DEFAULT_CONFIG.keyword_searches,\n },\n content_pillars: {\n type: \"array\",\n title: \"Content Pillars\",\n items: { type: \"string\" },\n default: DEFAULT_CONFIG.content_pillars,\n },\n scoring_weights: {\n type: \"object\",\n title: \"Scoring Weights\",\n properties: {\n relevance: { type: \"number\", default: 0.45 },\n recency: { type: \"number\", default: 0.25 },\n engagement: { type: \"number\", default: 0.30 },\n },\n default: DEFAULT_CONFIG.scoring_weights,\n },\n engagement_sub_weights: {\n type: \"object\",\n title: \"Engagement Sub-Weights\",\n properties: {\n likes: { type: \"number\", default: 0.55 },\n reposts: { type: \"number\", default: 0.25 },\n replies: { type: \"number\", default: 0.15 },\n quotes: { type: \"number\", default: 0.05 },\n },\n default: DEFAULT_CONFIG.engagement_sub_weights,\n },\n max_corpus_size: {\n type: \"number\",\n title: \"Max Corpus Size Per Day\",\n default: DEFAULT_CONFIG.max_corpus_size,\n },\n dedup_threshold: {\n type: \"number\",\n title: \"Dedup Jaccard Threshold\",\n default: DEFAULT_CONFIG.dedup_threshold,\n },\n authority_boost: {\n type: \"number\",\n title: \"Authority Score Boost\",\n default: DEFAULT_CONFIG.authority_boost,\n },\n authority_lists: {\n type: \"object\",\n title: \"Authority Handle Lists\",\n default: DEFAULT_CONFIG.authority_lists,\n },\n global_excluded: {\n type: \"array\",\n title: \"Globally Excluded Handles\",\n items: { type: \"string\" },\n default: DEFAULT_CONFIG.global_excluded,\n },\n authority_promotion_policy: {\n type: \"object\",\n title: \"Authority Promotion Policy\",\n default: DEFAULT_CONFIG.authority_promotion_policy,\n },\n corpus_retention_days: {\n type: \"number\",\n title: \"Corpus Retention (days)\",\n default: DEFAULT_CONFIG.corpus_retention_days,\n },\n engagement_thresholds: {\n type: \"object\",\n title: \"Engagement Thresholds\",\n description: \"Engagement level tiers: noise_floor (filter), expert (highlight), escalation (alert event)\",\n properties: {\n noise_floor: { type: \"number\", default: 10 },\n expert: { type: \"number\", default: 50 },\n escalation: { type: \"number\", default: 100 },\n },\n default: DEFAULT_CONFIG.engagement_thresholds,\n },\n },\n },\n jobs: [\n {\n jobKey: JOB_KEYS.discoveryRun,\n displayName: \"Discovery Run\",\n description:\n \"Two-stage pipeline: xAI open + focused discovery, X API v2 enrichment, scoring, and corpus storage.\",\n schedule: \"0 6 * * *\",\n },\n {\n jobKey: JOB_KEYS.authorityDecay,\n displayName: \"Authority Decay\",\n description:\n \"Weekly handle decay \u2014 downgrade or remove handles not seen within the tracking window.\",\n schedule: \"0 0 * * 0\",\n },\n {\n jobKey: JOB_KEYS.complianceCheck,\n displayName: \"Compliance Check\",\n description:\n \"Weekly re-check of stored tweets \u2014 remove deleted or suspended content.\",\n schedule: \"0 3 * * 0\",\n },\n {\n jobKey: JOB_KEYS.corpusRetention,\n displayName: \"Corpus Retention\",\n description:\n \"Monthly archive/delete corpus older than the retention window.\",\n schedule: \"0 4 1 * *\",\n },\n ],\n tools: [\n {\n name: TOOL_NAMES.searchCorpus,\n displayName: \"Search X Corpus\",\n description:\n \"Search the scored X intelligence corpus by query text, date range, content pillar, score threshold, and engagement level.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query (text match)\" },\n date: { type: \"string\", description: \"Date filter (YYYY-MM-DD)\" },\n pillar: { type: \"string\", description: \"Content pillar filter\" },\n limit: { type: \"number\", description: \"Max results (default 20)\" },\n min_score: { type: \"number\", description: \"Minimum score threshold (0-1)\" },\n min_engagement: { type: \"number\", description: \"Minimum total engagement (likes+reposts+replies+quotes)\" },\n since: { type: \"string\", description: \"Time window: '1h', '3h', '12h', '1d', '7d', or YYYY-MM-DD\" },\n },\n },\n },\n {\n name: TOOL_NAMES.getToday,\n displayName: \"Get Today's Intelligence\",\n description:\n \"Get today's scored X intelligence corpus from entities, optionally filtered by pillar and score threshold.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n pillar: { type: \"string\", description: \"Content pillar filter\" },\n limit: { type: \"number\", description: \"Max results (default 20)\" },\n min_score: { type: \"number\", description: \"Minimum score threshold (0-1)\" },\n },\n },\n },\n {\n name: TOOL_NAMES.getAuthorities,\n displayName: \"Get Authority Handles\",\n description:\n \"Get the authority handle list for a domain, or all domains if none specified.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n list_name: {\n type: \"string\",\n description: \"Domain name (e.g. 'market_structure')\",\n },\n },\n },\n },\n {\n name: TOOL_NAMES.suggestHandles,\n displayName: \"Suggest Handle Promotions\",\n description:\n \"Get handles that are candidates for authority list promotion based on tracking data.\",\n parametersSchema: {\n type: \"object\",\n properties: {},\n },\n },\n {\n name: TOOL_NAMES.trackHandle,\n displayName: \"Track Handle\",\n description:\n \"Record a handle appearance from agent discovery with relevance score and domain.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n handle: { type: \"string\", description: \"X handle (without @)\" },\n relevance: { type: \"number\", description: \"Relevance score (0-1)\" },\n domain: { type: \"string\", description: \"Domain/topic area\" },\n },\n required: [\"handle\", \"relevance\", \"domain\"],\n },\n },\n {\n name: TOOL_NAMES.analyzeTopic,\n displayName: \"Analyze Topic\",\n description:\n \"On-demand xAI search for any topic with 5-perspective decomposition (core, expert voices, pain points, positive signals, link-based) and corpus cross-reference. Returns a synthesis brief.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n topic: { type: \"string\", description: \"Topic to analyze\" },\n include_corpus: { type: \"boolean\", description: \"Cross-reference with stored corpus (default true)\" },\n },\n required: [\"topic\"],\n },\n },\n {\n name: TOOL_NAMES.getThread,\n displayName: \"Get Tweet Thread\",\n description:\n \"Fetch conversation context for a tweet. Returns the target tweet and other tweets in the same conversation thread.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n tweet_id: { type: \"string\", description: \"Tweet ID to get thread for\" },\n },\n required: [\"tweet_id\"],\n },\n },\n {\n name: TOOL_NAMES.promoteHandle,\n displayName: \"Promote Handle\",\n description:\n \"Promote a tracked handle to authority status in a specific domain list. Sets entity status to promoted and records the target list.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n handle: { type: \"string\", description: \"X handle (without @)\" },\n list_name: { type: \"string\", description: \"Authority list to promote to (e.g. 'market_structure')\" },\n note: { type: \"string\", description: \"Optional note about why this handle was promoted\" },\n },\n required: [\"handle\", \"list_name\"],\n },\n },\n {\n name: TOOL_NAMES.rateTweet,\n displayName: \"Rate Tweet\",\n description:\n \"Record relevance feedback on a tweet in the corpus. Agents or humans can rate tweets as relevant, irrelevant, or skip.\",\n parametersSchema: {\n type: \"object\",\n properties: {\n tweet_id: { type: \"string\", description: \"Tweet ID to rate\" },\n rating: { type: \"string\", enum: [\"relevant\", \"irrelevant\", \"skip\"], description: \"Relevance rating\" },\n rated_by: { type: \"string\", description: \"ID of the rater (agent or user)\" },\n },\n required: [\"tweet_id\", \"rating\"],\n },\n },\n ],\n ui: {\n slots: [\n {\n type: \"dashboardWidget\",\n id: SLOT_IDS.dashboardWidget,\n displayName: \"X Intelligence\",\n exportName: EXPORT_NAMES.dashboardWidget,\n },\n {\n type: \"settingsPage\",\n id: SLOT_IDS.settingsPage,\n displayName: \"X Intelligence Settings\",\n exportName: EXPORT_NAMES.settingsPage,\n },\n {\n type: \"page\",\n id: SLOT_IDS.corpusBrowser,\n displayName: \"X Intelligence Corpus\",\n exportName: EXPORT_NAMES.corpusBrowser,\n routePath: \"x-intelligence\",\n },\n ],\n },\n};\n\nexport default manifest;\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/worker.js CHANGED
@@ -1679,6 +1679,9 @@ function crossReferenceCorpus(topic, corpus) {
1679
1679
 
1680
1680
  // src/worker.ts
1681
1681
  function tweetUrl(authorUsername, tweetId) {
1682
+ if (!authorUsername || authorUsername === "unknown") {
1683
+ return `https://x.com/i/status/${tweetId}`;
1684
+ }
1682
1685
  return `https://x.com/${authorUsername}/status/${tweetId}`;
1683
1686
  }
1684
1687
  function withUrl(tweet) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../node_modules/.pnpm/@paperclipai+plugin-sdk@file+.paperclip-sdk+paperclipai-plugin-sdk-1.0.0.tgz_react@19.2.4/node_modules/@paperclipai/plugin-sdk/src/define-plugin.ts", "../node_modules/.pnpm/@paperclipai+plugin-sdk@file+.paperclip-sdk+paperclipai-plugin-sdk-1.0.0.tgz_react@19.2.4/node_modules/@paperclipai/plugin-sdk/src/worker-rpc-host.ts", "../node_modules/.pnpm/@paperclipai+plugin-sdk@file+.paperclip-sdk+paperclipai-plugin-sdk-1.0.0.tgz_react@19.2.4/node_modules/@paperclipai/plugin-sdk/src/protocol.ts", "../src/constants.ts", "../src/pipeline/xai-client.ts", "../src/pipeline/x-api-client.ts", "../src/pipeline/scoring.ts", "../src/pipeline/queries.ts", "../src/pipeline/handles.ts", "../src/pipeline/analyze-topic.ts", "../src/worker.ts"],
4
- "sourcesContent": [null, null, null, "export const PLUGIN_ID = \"peak6-labs.x-intelligence\";\nexport const PLUGIN_VERSION = \"0.1.1\";\n\nexport const JOB_KEYS = {\n discoveryRun: \"discovery-run\",\n authorityDecay: \"authority-decay\",\n complianceCheck: \"compliance-check\",\n corpusRetention: \"corpus-retention\",\n} as const;\n\nexport const TOOL_NAMES = {\n searchCorpus: \"search-corpus\",\n getToday: \"get-today\",\n getAuthorities: \"get-authorities\",\n suggestHandles: \"suggest-handles\",\n trackHandle: \"track-handle\",\n analyzeTopic: \"analyze-topic\",\n getThread: \"get-thread\",\n promoteHandle: \"promote-handle\",\n rateTweet: \"rate-tweet\",\n} as const;\n\nexport const SLOT_IDS = {\n dashboardWidget: \"x-intelligence-dashboard\",\n settingsPage: \"x-intelligence-settings\",\n corpusBrowser: \"x-intelligence-corpus-browser\",\n} as const;\n\nexport const EXPORT_NAMES = {\n dashboardWidget: \"DashboardWidget\",\n settingsPage: \"SettingsPage\",\n corpusBrowser: \"CorpusBrowserPage\",\n} as const;\n\nexport const ENTITY_TYPES = {\n tweet: \"tweet\",\n handle: \"handle\",\n} as const;\n\nexport const STATE_KEYS = {\n corpusPrefix: \"corpus:\",\n lastDiscoveryRun: \"last-discovery-run\",\n pipelineStats: \"pipeline-stats\",\n} as const;\n\nexport const EVENT_NAMES = {\n corpusUpdated: \"corpus.updated\",\n handlePromoted: \"handle.promoted\",\n gapIdentified: \"gap.identified\",\n tweetHighEngagement: \"tweet.high-engagement\",\n} as const;\n\nexport const DEFAULT_CONFIG = {\n company_id: \"\",\n xai_api_key_ref: \"XAI_API_KEY\",\n x_api_bearer_ref: \"BEARER_TOKEN\",\n semantic_topics: [\n \"institutional investors discussing market structure reform\",\n \"fintech companies disrupting traditional trading\",\n \"SEC regulatory changes affecting options trading\",\n \"algorithmic trading and quantitative strategies\",\n \"venture capital investing in financial infrastructure\",\n \"PEAK6\",\n \"options market making technology\",\n \"Chicago trading community news\",\n ],\n keyword_searches: [\n \"\\\"PEAK6 Investments\\\" OR \\\"PEAK6\\\" trading fintech\",\n \"fintech and trading technology\",\n \"market structure and regulation\",\n \"options trading strategies and platforms\",\n ],\n content_pillars: [\n \"market structure & regulation\",\n \"fintech & trading technology\",\n \"venture capital & investment\",\n \"Chicago business ecosystem\",\n \"company culture & talent\",\n ],\n scoring_weights: {\n relevance: 0.45,\n recency: 0.25,\n engagement: 0.30,\n },\n engagement_sub_weights: {\n likes: 0.55,\n reposts: 0.25,\n replies: 0.15,\n quotes: 0.05,\n },\n max_corpus_size: 200,\n dedup_threshold: 0.70,\n authority_boost: 0.15,\n authority_lists: {\n market_structure: {\n description: \"Market structure, regulation, SEC reform, options trading\",\n handles: [\n \"LizAnnSonders\",\n \"matt_levine\",\n \"unusual_whales\",\n \"CMEGroup\",\n \"CBOE\",\n \"OptionsHawk\",\n \"InvestorDenis\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n fintech: {\n description: \"Fintech, trading technology, AI in finance\",\n handles: [\n \"twifintech\",\n \"IBSIntelligence\",\n \"privy_io\",\n \"i_Know_First\",\n \"fintech_germany\",\n \"venture_radar\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n venture_capital: {\n description: \"Venture capital investing in financial infrastructure\",\n handles: [\n \"a16z\",\n \"FundersVC\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n chicago_trading: {\n description: \"Chicago trading community, prop firms, PEAK6 ecosystem\",\n handles: [\n \"CBOE\",\n \"CMEGroup\",\n \"boogeymantradez\",\n \"adealafia\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n } as Record<string, AuthorityList>,\n global_excluded: [\"elonmusk\", \"openai\", \"google\", \"microsoft\"],\n authority_promotion_policy: {\n auto_promote_threshold: {\n min_appearances: 7,\n min_avg_relevance: 0.8,\n min_mutual_overlap: 3,\n },\n candidate_threshold: {\n min_appearances: 5,\n min_avg_relevance: 0.7,\n min_mutual_overlap: 2,\n },\n tracking_window_days: 14,\n },\n corpus_retention_days: 90,\n engagement_thresholds: {\n noise_floor: 10,\n expert: 50,\n escalation: 100,\n },\n} as const;\n\nexport interface AuthorityList {\n description: string;\n handles: string[];\n last_reviewed: string;\n}\n", "import type { PluginHttpClient, PluginSecretsClient, PluginLogger } from \"@paperclipai/plugin-sdk\";\nimport type { XaiResponse, XaiAnnotation } from \"../types.js\";\n\nconst XAI_RESPONSES_URL = \"https://api.x.ai/v1/responses\";\nconst XAI_MODEL = \"grok-4-fast-reasoning\";\n\nconst TWEET_ID_PATTERN = /x\\.com\\/(?:i\\/status|[^/]+\\/status)\\/(\\d+)/;\n\nexport interface XaiSearchOptions {\n query: string;\n fromDate: string;\n toDate: string;\n allowedHandles?: string[];\n excludedHandles?: string[];\n}\n\nexport interface XaiSearchResult {\n tweetIds: string[];\n synthesisText: string;\n annotations: XaiAnnotation[];\n tokensUsed: number;\n costUsdTicks: number;\n}\n\nexport function extractTweetIds(annotations: XaiAnnotation[]): string[] {\n const ids: string[] = [];\n for (const ann of annotations) {\n if (ann.type !== \"url_citation\" || !ann.url) continue;\n const match = TWEET_ID_PATTERN.exec(ann.url);\n if (match?.[1]) {\n ids.push(match[1]);\n }\n }\n return ids;\n}\n\nexport function deduplicateIds(idArrays: string[][]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const ids of idArrays) {\n for (const id of ids) {\n if (!seen.has(id)) {\n seen.add(id);\n result.push(id);\n }\n }\n }\n return result;\n}\n\nexport async function xaiSearch(\n http: PluginHttpClient,\n secrets: PluginSecretsClient,\n logger: PluginLogger,\n apiKeyRef: string,\n options: XaiSearchOptions,\n): Promise<XaiSearchResult> {\n const apiKey = await secrets.resolve(apiKeyRef);\n\n const tool: Record<string, unknown> = {\n type: \"x_search\",\n from_date: options.fromDate,\n to_date: options.toDate,\n };\n if (options.allowedHandles?.length) {\n tool.allowed_x_handles = options.allowedHandles.slice(0, 10);\n }\n if (options.excludedHandles?.length) {\n tool.excluded_x_handles = options.excludedHandles.slice(0, 10);\n }\n\n const body = {\n model: XAI_MODEL,\n input: [{ role: \"user\", content: options.query }],\n tools: [tool],\n inline_citations: true,\n };\n\n logger.debug(\"xAI search request\", { query: options.query, handles: options.allowedHandles });\n\n const response = await globalThis.fetch(XAI_RESPONSES_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`xAI API error ${response.status}: ${errorText}`);\n }\n\n const data = (await response.json()) as XaiResponse;\n\n let synthesisText = \"\";\n const allAnnotations: XaiAnnotation[] = [];\n\n for (const output of data.output) {\n if (output.type === \"message\" && output.content) {\n for (const content of output.content) {\n if (content.type === \"output_text\") {\n if (content.text) synthesisText += content.text + \"\\n\";\n if (content.annotations) allAnnotations.push(...content.annotations);\n }\n }\n }\n }\n\n const tweetIds = extractTweetIds(allAnnotations);\n\n logger.debug(\"xAI search result\", {\n tweetIdsFound: tweetIds.length,\n annotationsCount: allAnnotations.length,\n tokensUsed: data.usage?.total_tokens ?? 0,\n firstAnnotationUrl: allAnnotations[0]?.url ?? \"NONE\",\n });\n\n return {\n tweetIds,\n synthesisText: synthesisText.trim(),\n annotations: allAnnotations,\n tokensUsed: data.usage?.total_tokens ?? 0,\n costUsdTicks: data.usage?.cost_in_usd_ticks ?? 0,\n };\n}\n", "import type { PluginHttpClient, PluginSecretsClient, PluginLogger } from \"@paperclipai/plugin-sdk\";\nimport type { XApiTweetLookupResponse, EnrichedTweet, XApiTweet, XApiUser } from \"../types.js\";\n\nconst X_API_BASE = \"https://api.x.com/2\";\nconst TWEET_FIELDS = \"text,author_id,created_at,public_metrics,entities\";\nconst USER_FIELDS = \"username,name,verified_type,public_metrics\";\nconst EXPANSIONS = \"author_id\";\nconst BATCH_SIZE = 100;\n\nexport async function batchLookupTweets(\n http: PluginHttpClient,\n secrets: PluginSecretsClient,\n logger: PluginLogger,\n bearerRef: string,\n tweetIds: string[],\n source: EnrichedTweet[\"source\"],\n): Promise<EnrichedTweet[]> {\n if (tweetIds.length === 0) return [];\n\n const bearerToken = await secrets.resolve(bearerRef);\n const results: EnrichedTweet[] = [];\n\n for (let i = 0; i < tweetIds.length; i += BATCH_SIZE) {\n const batch = tweetIds.slice(i, i + BATCH_SIZE);\n const url = `${X_API_BASE}/tweets?ids=${batch.join(\",\")}&tweet.fields=${TWEET_FIELDS}&expansions=${EXPANSIONS}&user.fields=${USER_FIELDS}`;\n\n logger.debug(\"X API v2 batch lookup\", { batchSize: batch.length, offset: i });\n\n const response = await http.fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${bearerToken}`,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n logger.warn(\"X API v2 error\", { status: response.status, error: errorText });\n continue;\n }\n\n const data = (await response.json()) as XApiTweetLookupResponse;\n\n if (data.errors?.length) {\n logger.debug(\"X API v2 partial errors\", {\n errors: data.errors.map((e) => `${e.value}: ${e.title}`),\n });\n }\n\n const userMap = new Map<string, XApiUser>();\n if (data.includes?.users) {\n for (const user of data.includes.users) {\n userMap.set(user.id, user);\n }\n }\n\n if (data.data) {\n for (const tweet of data.data) {\n const author = userMap.get(tweet.author_id);\n results.push(mapToEnrichedTweet(tweet, author, source));\n }\n }\n }\n\n return results;\n}\n\nexport function mapToEnrichedTweet(\n tweet: XApiTweet,\n author: XApiUser | undefined,\n source: EnrichedTweet[\"source\"],\n): EnrichedTweet {\n return {\n tweet_id: tweet.id,\n text: tweet.text,\n author_id: tweet.author_id,\n author_username: author?.username ?? \"unknown\",\n author_name: author?.name ?? \"Unknown\",\n author_verified_type: author?.verified_type,\n author_followers_count: author?.public_metrics?.followers_count ?? 0,\n created_at: tweet.created_at,\n metrics: tweet.public_metrics,\n entities: tweet.entities,\n source,\n };\n}\n\nexport async function verifyTweetExists(\n http: PluginHttpClient,\n secrets: PluginSecretsClient,\n bearerRef: string,\n tweetId: string,\n): Promise<boolean> {\n const bearerToken = await secrets.resolve(bearerRef);\n const url = `${X_API_BASE}/tweets?ids=${tweetId}&tweet.fields=id`;\n const response = await http.fetch(url, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${bearerToken}` },\n });\n if (!response.ok) return false;\n const data = (await response.json()) as XApiTweetLookupResponse;\n return (data.data?.length ?? 0) > 0;\n}\n\nexport async function fetchTweetWithConversationId(\n http: PluginHttpClient,\n secrets: PluginSecretsClient,\n logger: PluginLogger,\n bearerRef: string,\n tweetId: string,\n): Promise<{ tweet: EnrichedTweet; conversationId: string }> {\n const bearerToken = await secrets.resolve(bearerRef);\n const url = `${X_API_BASE}/tweets?ids=${tweetId}&tweet.fields=conversation_id,${TWEET_FIELDS}&expansions=${EXPANSIONS}&user.fields=${USER_FIELDS}`;\n\n const response = await http.fetch(url, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${bearerToken}` },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`X API v2 error ${response.status}: ${errorText}`);\n }\n\n const data = (await response.json()) as XApiTweetLookupResponse & {\n data?: Array<XApiTweet & { conversation_id?: string }>;\n };\n\n if (!data.data?.length) {\n throw new Error(`Tweet ${tweetId} not found`);\n }\n\n const rawTweet = data.data[0]!;\n const userMap = new Map<string, XApiUser>();\n if (data.includes?.users) {\n for (const user of data.includes.users) userMap.set(user.id, user);\n }\n\n const tweet = mapToEnrichedTweet(rawTweet, userMap.get(rawTweet.author_id), \"open_discovery\");\n const conversationId = rawTweet.conversation_id ?? tweetId;\n\n logger.debug(\"Fetched tweet with conversation_id\", { tweetId, conversationId });\n\n return { tweet, conversationId };\n}\n\nexport async function fetchConversationTweets(\n http: PluginHttpClient,\n secrets: PluginSecretsClient,\n logger: PluginLogger,\n bearerRef: string,\n conversationId: string,\n): Promise<EnrichedTweet[]> {\n const bearerToken = await secrets.resolve(bearerRef);\n const query = encodeURIComponent(`conversation_id:${conversationId}`);\n const url = `${X_API_BASE}/tweets/search/recent?query=${query}&tweet.fields=${TWEET_FIELDS}&expansions=${EXPANSIONS}&user.fields=${USER_FIELDS}&max_results=100`;\n\n logger.debug(\"Fetching conversation tweets\", { conversationId });\n\n const response = await http.fetch(url, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${bearerToken}` },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n logger.warn(\"Conversation search failed\", { status: response.status, error: errorText });\n return [];\n }\n\n const data = (await response.json()) as XApiTweetLookupResponse;\n\n const userMap = new Map<string, XApiUser>();\n if (data.includes?.users) {\n for (const user of data.includes.users) userMap.set(user.id, user);\n }\n\n const tweets: EnrichedTweet[] = [];\n if (data.data) {\n for (const tweet of data.data) {\n tweets.push(mapToEnrichedTweet(tweet, userMap.get(tweet.author_id), \"open_discovery\"));\n }\n }\n\n logger.debug(\"Conversation tweets fetched\", { conversationId, count: tweets.length });\n return tweets;\n}\n", "import type {\n EnrichedTweet,\n ScoredTweet,\n ScoringWeights,\n EngagementSubWeights,\n TweetPublicMetrics,\n} from \"../types.js\";\n\n// ---------------------------------------------------------------------------\n// Trigram Jaccard deduplication\n// ---------------------------------------------------------------------------\n\nexport function trigrams(text: string): Set<string> {\n const normalized = text.toLowerCase().replace(/\\s+/g, \" \").trim();\n const set = new Set<string>();\n for (let i = 0; i <= normalized.length - 3; i++) {\n set.add(normalized.substring(i, i + 3));\n }\n return set;\n}\n\nexport function jaccardSimilarity(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) return 1;\n let intersection = 0;\n for (const item of a) {\n if (b.has(item)) intersection++;\n }\n const union = a.size + b.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n\nexport function deduplicateTweets(\n tweets: ScoredTweet[],\n threshold: number,\n): ScoredTweet[] {\n const sorted = [...tweets].sort((a, b) => b.score - a.score);\n const kept: ScoredTweet[] = [];\n const keptTrigrams: Set<string>[] = [];\n\n for (const tweet of sorted) {\n const tweetTri = trigrams(tweet.text);\n let isDuplicate = false;\n\n for (const existingTri of keptTrigrams) {\n if (jaccardSimilarity(tweetTri, existingTri) >= threshold) {\n isDuplicate = true;\n break;\n }\n }\n\n if (!isDuplicate) {\n kept.push(tweet);\n keptTrigrams.push(tweetTri);\n }\n }\n\n return kept;\n}\n\n// ---------------------------------------------------------------------------\n// Scoring\n// ---------------------------------------------------------------------------\n\nfunction logNormalize(value: number): number {\n return Math.log1p(value) / Math.log1p(1000000);\n}\n\nfunction computeEngagementScore(\n metrics: EnrichedTweet[\"metrics\"],\n subWeights: EngagementSubWeights,\n): number {\n const likes = logNormalize(metrics.like_count) * subWeights.likes;\n const reposts = logNormalize(metrics.retweet_count) * subWeights.reposts;\n const replies = logNormalize(metrics.reply_count) * subWeights.replies;\n const quotes = logNormalize(metrics.quote_count) * subWeights.quotes;\n return likes + reposts + replies + quotes;\n}\n\nfunction computeRecencyScore(createdAt: string, now: Date): number {\n const created = new Date(createdAt);\n const ageHours = (now.getTime() - created.getTime()) / (1000 * 60 * 60);\n if (ageHours <= 0) return 1;\n if (ageHours <= 6) return 1;\n if (ageHours <= 24) return 0.9;\n if (ageHours <= 48) return 0.7;\n if (ageHours <= 168) return 0.4;\n return 0.1;\n}\n\nfunction computeRelevanceScore(\n tweet: EnrichedTweet,\n topics: string[],\n): number {\n const textLower = tweet.text.toLowerCase();\n let matchCount = 0;\n for (const topic of topics) {\n const words = topic.toLowerCase().split(/\\s+/);\n const wordMatches = words.filter((w) => textLower.includes(w)).length;\n if (wordMatches >= Math.ceil(words.length * 0.5)) {\n matchCount++;\n }\n }\n // Base relevance: xAI selected it (0.5 baseline) + topic match boost\n const topicBoost = Math.min(matchCount * 0.1, 0.5);\n return Math.min(0.5 + topicBoost, 1.0);\n}\n\n// ---------------------------------------------------------------------------\n// Utility functions\n// ---------------------------------------------------------------------------\n\nconst SINCE_PATTERN = /^(\\d+)([hd])$/;\n\nexport function parseSince(since: string): Date | null {\n const match = SINCE_PATTERN.exec(since.trim());\n if (match) {\n const amount = parseInt(match[1]!, 10);\n const unit = match[2];\n const ms = unit === \"h\" ? amount * 3600000 : amount * 86400000;\n return new Date(Date.now() - ms);\n }\n // Try ISO date (YYYY-MM-DD)\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(since)) {\n const d = new Date(since);\n return isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nexport function computeTotalEngagement(metrics: TweetPublicMetrics): number {\n return (\n metrics.like_count +\n metrics.retweet_count +\n metrics.reply_count +\n metrics.quote_count\n );\n}\n\n// ---------------------------------------------------------------------------\n// Composite scoring\n// ---------------------------------------------------------------------------\n\nexport function scoreTweets(\n tweets: EnrichedTweet[],\n weights: ScoringWeights,\n subWeights: EngagementSubWeights,\n authorityBoost: number,\n authorityHandles: Set<string>,\n authorityByDomain: Map<string, string[]>,\n topics: string[],\n now?: Date,\n): ScoredTweet[] {\n const scoreTime = now ?? new Date();\n\n return tweets.map((tweet) => {\n const relevance = computeRelevanceScore(tweet, topics);\n const recency = computeRecencyScore(tweet.created_at, scoreTime);\n const engagement = computeEngagementScore(tweet.metrics, subWeights);\n\n const isAuthority = authorityHandles.has(tweet.author_username.toLowerCase());\n const authorityDomains: string[] = [];\n for (const [domain, handles] of authorityByDomain) {\n if (handles.some((h) => h.toLowerCase() === tweet.author_username.toLowerCase())) {\n authorityDomains.push(domain);\n }\n }\n\n const score =\n relevance * weights.relevance +\n (isAuthority ? authorityBoost : 0) +\n recency * weights.recency +\n engagement * weights.engagement;\n\n return {\n ...tweet,\n score: Math.min(score, 1.0),\n relevance_score: relevance,\n recency_score: recency,\n engagement_score: engagement,\n is_authority: isAuthority,\n authority_domains: authorityDomains,\n };\n });\n}\n", "/**\n * Query decomposition \u2014 builds the set of xAI search queries from config topics.\n */\n\nexport interface DecomposedQuery {\n text: string;\n topic: string;\n phase: \"open\" | \"focused\";\n handles?: string[];\n}\n\nexport function buildOpenQueries(\n topics: string[],\n keywords: string[],\n dateStr: string,\n): DecomposedQuery[] {\n const queries: DecomposedQuery[] = [];\n\n for (const topic of topics) {\n queries.push({\n text: `What are people saying about ${topic} today (${dateStr})?`,\n topic,\n phase: \"open\",\n });\n }\n\n for (const keyword of keywords) {\n queries.push({\n text: `What are people saying about ${keyword} today (${dateStr})?`,\n topic: keyword,\n phase: \"open\",\n });\n }\n\n return queries;\n}\n\nexport function buildFocusedQueries(\n topics: string[],\n authorityByDomain: Map<string, string[]>,\n activeHandles: Map<string, { engagement: number; relevance: number; domains: string[] }>,\n dateStr: string,\n): DecomposedQuery[] {\n const queries: DecomposedQuery[] = [];\n\n // Get top active handles sorted by combined engagement + relevance\n const sortedActive = [...activeHandles.entries()]\n .sort(([, a], [, b]) => (b.engagement + b.relevance) - (a.engagement + a.relevance))\n .map(([handle]) => handle);\n\n for (const topic of topics) {\n // Find which domain this topic best matches\n const domainHandles = findBestDomainHandles(topic, authorityByDomain);\n\n // Build handle rotation: top 5 authority + top 5 active = max 10\n const authoritySlice = domainHandles.slice(0, 5);\n const activeSlice = sortedActive\n .filter((h) => !authoritySlice.includes(h))\n .slice(0, 5);\n const combinedHandles = [...authoritySlice, ...activeSlice].slice(0, 10);\n\n if (combinedHandles.length === 0) continue;\n\n queries.push({\n text: `What are these accounts saying about ${topic} today (${dateStr})?`,\n topic,\n phase: \"focused\",\n handles: combinedHandles,\n });\n }\n\n // Rotation queries for large authority lists\n for (const [domain, handles] of authorityByDomain) {\n if (handles.length <= 5) continue;\n\n // Generate additional rotation queries for handles [6-10], [11-15], etc.\n for (let offset = 5; offset < handles.length; offset += 5) {\n const rotationSlice = handles.slice(offset, offset + 5);\n const activeSlice = sortedActive\n .filter((h) => !rotationSlice.includes(h))\n .slice(0, 5);\n const combinedHandles = [...rotationSlice, ...activeSlice].slice(0, 10);\n\n if (combinedHandles.length === 0) continue;\n\n queries.push({\n text: `What are these accounts saying about ${domain} today (${dateStr})?`,\n topic: domain,\n phase: \"focused\",\n handles: combinedHandles,\n });\n }\n }\n\n return queries;\n}\n\nfunction findBestDomainHandles(\n topic: string,\n authorityByDomain: Map<string, string[]>,\n): string[] {\n const topicLower = topic.toLowerCase();\n let bestMatch = \"\";\n let bestScore = 0;\n\n for (const [domain] of authorityByDomain) {\n const domainWords = domain.toLowerCase().split(/[_\\s]+/);\n const matchCount = domainWords.filter((w) => topicLower.includes(w)).length;\n if (matchCount > bestScore) {\n bestScore = matchCount;\n bestMatch = domain;\n }\n }\n\n return bestMatch ? (authorityByDomain.get(bestMatch) ?? []) : [];\n}\n", "import type { PluginEntitiesClient, PluginLogger } from \"@paperclipai/plugin-sdk\";\nimport type { HandleTrackerData, HandleStatus, PromotionPolicy, EnrichedTweet } from \"../types.js\";\nimport { ENTITY_TYPES } from \"../constants.js\";\n\nexport interface HandleUpdate {\n username: string;\n relevance: number;\n domains: string[];\n followedByExisting: string[];\n tweetId?: string;\n userId?: string;\n followersCount?: number;\n verifiedType?: string;\n}\n\nexport async function updateHandleTracker(\n entities: PluginEntitiesClient,\n logger: PluginLogger,\n updates: HandleUpdate[],\n existingAuthority: Set<string>,\n): Promise<{ discovered: number; updated: number }> {\n let discovered = 0;\n let updated = 0;\n\n for (const update of updates) {\n const usernameLower = update.username.toLowerCase();\n if (existingAuthority.has(usernameLower)) continue;\n\n const existing = await entities.list({\n entityType: ENTITY_TYPES.handle,\n externalId: usernameLower,\n limit: 1,\n });\n\n const now = new Date().toISOString().split(\"T\")[0]!;\n\n if (existing.length > 0) {\n const record = existing[0]!;\n const data = record.data as unknown as HandleTrackerData;\n const newAppearances = data.appearances + 1;\n const newAvgRelevance =\n (data.avg_relevance * data.appearances + update.relevance) / newAppearances;\n const newDomains = [...new Set([...data.domains, ...update.domains])];\n const newSampleIds = update.tweetId\n ? [...new Set([...data.sample_tweet_ids, update.tweetId])].slice(-10)\n : data.sample_tweet_ids;\n const newFollowedBy = [...new Set([...data.followed_by_existing, ...update.followedByExisting])];\n\n await entities.upsert({\n entityType: ENTITY_TYPES.handle,\n scopeKind: \"instance\",\n externalId: usernameLower,\n title: usernameLower,\n status: record.status ?? \"discovered\",\n data: {\n ...data,\n last_seen: now,\n appearances: newAppearances,\n avg_relevance: Math.round(newAvgRelevance * 1000) / 1000,\n domains: newDomains,\n followed_by_existing: newFollowedBy,\n sample_tweet_ids: newSampleIds,\n followers_count: update.followersCount ?? data.followers_count,\n verified_type: update.verifiedType ?? data.verified_type,\n x_user_id: update.userId ?? data.x_user_id,\n } satisfies HandleTrackerData,\n });\n updated++;\n } else {\n const data: HandleTrackerData = {\n first_seen: now,\n last_seen: now,\n appearances: 1,\n avg_relevance: update.relevance,\n domains: update.domains,\n followed_by_existing: update.followedByExisting,\n x_user_id: update.userId,\n followers_count: update.followersCount ?? 0,\n verified_type: update.verifiedType,\n sample_tweet_ids: update.tweetId ? [update.tweetId] : [],\n promoted_to_list: null,\n notes: \"\",\n };\n\n await entities.upsert({\n entityType: ENTITY_TYPES.handle,\n scopeKind: \"instance\",\n externalId: usernameLower,\n title: usernameLower,\n status: \"discovered\",\n data: data as unknown as Record<string, unknown>,\n });\n discovered++;\n }\n }\n\n logger.info(\"Handle tracker updated\", { discovered, updated });\n return { discovered, updated };\n}\n\nexport async function evaluatePromotions(\n entities: PluginEntitiesClient,\n logger: PluginLogger,\n policy: PromotionPolicy,\n): Promise<Array<{ username: string; status: HandleStatus; data: HandleTrackerData }>> {\n const candidates: Array<{ username: string; status: HandleStatus; data: HandleTrackerData }> = [];\n\n const handles = await entities.list({\n entityType: ENTITY_TYPES.handle,\n limit: 200,\n });\n\n for (const handle of handles) {\n const data = handle.data as unknown as HandleTrackerData;\n const currentStatus = (handle.status ?? \"discovered\") as HandleStatus;\n\n if (currentStatus === \"promoted\") continue;\n\n // Check auto-promote threshold\n if (\n data.appearances >= policy.auto_promote_threshold.min_appearances &&\n data.avg_relevance >= policy.auto_promote_threshold.min_avg_relevance &&\n data.followed_by_existing.length >= policy.auto_promote_threshold.min_mutual_overlap\n ) {\n await entities.upsert({\n entityType: ENTITY_TYPES.handle,\n scopeKind: \"instance\",\n externalId: handle.externalId!,\n title: handle.title ?? handle.externalId!,\n status: \"promoted\",\n data: handle.data,\n });\n candidates.push({ username: handle.externalId!, status: \"promoted\", data });\n logger.info(\"Handle auto-promoted\", { handle: handle.externalId });\n continue;\n }\n\n // Check candidate threshold\n if (\n currentStatus === \"discovered\" &&\n data.appearances >= policy.candidate_threshold.min_appearances &&\n data.avg_relevance >= policy.candidate_threshold.min_avg_relevance\n ) {\n await entities.upsert({\n entityType: ENTITY_TYPES.handle,\n scopeKind: \"instance\",\n externalId: handle.externalId!,\n title: handle.title ?? handle.externalId!,\n status: \"candidate\",\n data: handle.data,\n });\n candidates.push({ username: handle.externalId!, status: \"candidate\", data });\n logger.info(\"Handle promoted to candidate\", { handle: handle.externalId });\n }\n }\n\n return candidates;\n}\n\nexport async function decayHandles(\n entities: PluginEntitiesClient,\n logger: PluginLogger,\n trackingWindowDays: number,\n): Promise<number> {\n const handles = await entities.list({\n entityType: ENTITY_TYPES.handle,\n limit: 500,\n });\n\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - trackingWindowDays);\n const cutoffStr = cutoffDate.toISOString().split(\"T\")[0]!;\n\n let decayed = 0;\n\n for (const handle of handles) {\n const data = handle.data as unknown as HandleTrackerData;\n const status = (handle.status ?? \"discovered\") as HandleStatus;\n\n if (status === \"promoted\") continue;\n if (data.last_seen >= cutoffStr) continue;\n\n // Downgrade: candidate \u2192 discovered, discovered \u2192 remove\n if (status === \"candidate\") {\n await entities.upsert({\n entityType: ENTITY_TYPES.handle,\n scopeKind: \"instance\",\n externalId: handle.externalId!,\n title: handle.title ?? handle.externalId!,\n status: \"discovered\",\n data: handle.data,\n });\n decayed++;\n }\n // Note: We don't delete discovered handles \u2014 they just become stale\n // and won't be used in queries since they don't meet any threshold\n }\n\n logger.info(\"Handle decay complete\", { decayed });\n return decayed;\n}\n\nexport function buildHandleUpdatesFromTweets(\n tweets: EnrichedTweet[],\n topics: string[],\n authorityByDomain: Map<string, string[]>,\n): HandleUpdate[] {\n const handleMap = new Map<string, HandleUpdate>();\n\n // Build reverse lookup: authority handle \u2192 domains\n const authorityDomains = new Map<string, string[]>();\n for (const [domain, handles] of authorityByDomain) {\n for (const h of handles) {\n const lower = h.toLowerCase();\n const existing = authorityDomains.get(lower) ?? [];\n existing.push(domain);\n authorityDomains.set(lower, existing);\n }\n }\n\n // Map each topic to authority domain keys where ALL key words appear in the topic\n const topicToDomainKeys = new Map<string, string[]>();\n for (const topic of topics) {\n const topicLower = topic.toLowerCase();\n const matched: string[] = [];\n for (const [domainKey] of authorityByDomain) {\n const keyWords = domainKey.toLowerCase().split(/[_\\s]+/);\n if (keyWords.every((w) => topicLower.includes(w))) {\n matched.push(domainKey);\n }\n }\n if (matched.length > 0) topicToDomainKeys.set(topic, matched);\n }\n\n // Collect which authority domain keys each handle's tweets match\n const handleDomainKeyMap = new Map<string, Set<string>>();\n\n for (const tweet of tweets) {\n const username = tweet.author_username.toLowerCase();\n const existing = handleMap.get(username);\n\n // Topic matching: require \u226550% of topic words to match (aligned with scoring.ts)\n const domains: string[] = [];\n const textLower = tweet.text.toLowerCase();\n for (const topic of topics) {\n const words = topic.toLowerCase().split(/\\s+/);\n const wordMatches = words.filter((w) => textLower.includes(w)).length;\n if (wordMatches >= Math.ceil(words.length * 0.5)) {\n domains.push(topic);\n }\n }\n\n // Track authority domain keys (not topic strings) for co-occurrence\n const domainKeySet = handleDomainKeyMap.get(username) ?? new Set<string>();\n for (const d of domains) {\n const keys = topicToDomainKeys.get(d);\n if (keys) for (const k of keys) domainKeySet.add(k);\n }\n handleDomainKeyMap.set(username, domainKeySet);\n\n if (existing) {\n existing.relevance = Math.max(existing.relevance, 0.5);\n existing.domains = [...new Set([...existing.domains, ...domains])];\n if (tweet.tweet_id) existing.tweetId = tweet.tweet_id;\n } else {\n handleMap.set(username, {\n username,\n relevance: 0.5,\n domains,\n followedByExisting: [],\n tweetId: tweet.tweet_id,\n userId: tweet.author_id,\n followersCount: tweet.author_followers_count,\n verifiedType: tweet.author_verified_type,\n });\n }\n }\n\n // Compute followed_by_existing: authority handles that share domain keys with this handle\n for (const [username, update] of handleMap) {\n const myDomainKeys = handleDomainKeyMap.get(username);\n if (!myDomainKeys || myDomainKeys.size === 0) continue;\n\n const coOccurring = new Set<string>();\n for (const [authHandle, authDomainKeys] of authorityDomains) {\n if (authDomainKeys.some((d) => myDomainKeys.has(d))) {\n coOccurring.add(authHandle);\n }\n }\n update.followedByExisting = [...coOccurring];\n }\n\n return [...handleMap.values()];\n}\n", "import type { DecomposedQuery } from \"./queries.js\";\nimport type { ScoredTweet } from \"../types.js\";\n\n/**\n * Build 5 decomposed queries for a topic, following the x-research-skill\n * pattern of core / expert voices / pain points / positive signals / link-based.\n */\nexport function buildTopicQueries(topic: string, dateStr: string): DecomposedQuery[] {\n return [\n {\n text: `What are people saying about ${topic} today (${dateStr})? Focus on significant discussions, breaking developments, and notable opinions.`,\n topic: \"core\",\n phase: \"open\" as const,\n },\n {\n text: `Which experts, analysts, or thought leaders are currently discussing ${topic}? What insights and perspectives are they sharing?`,\n topic: \"expert_voices\",\n phase: \"open\" as const,\n },\n {\n text: `What problems, complaints, concerns, or risks are people raising about ${topic}? What pain points are being discussed?`,\n topic: \"pain_points\",\n phase: \"open\" as const,\n },\n {\n text: `What positive developments, innovations, breakthroughs, or success stories related to ${topic} are being shared?`,\n topic: \"positive_signals\",\n phase: \"open\" as const,\n },\n {\n text: `What articles, research papers, blog posts, or reports about ${topic} are being shared and discussed on X?`,\n topic: \"link_based\",\n phase: \"open\" as const,\n },\n ];\n}\n\n/**\n * Filter existing corpus tweets by topic relevance using word-match scoring.\n * Returns matches sorted by composite score descending.\n */\nexport function crossReferenceCorpus(topic: string, corpus: ScoredTweet[]): ScoredTweet[] {\n const topicWords = topic.toLowerCase().split(/\\s+/).filter((w) => w.length > 2);\n const threshold = Math.max(1, Math.ceil(topicWords.length * 0.4));\n\n return corpus\n .filter((tweet) => {\n const textLower = tweet.text.toLowerCase();\n const matchCount = topicWords.filter((w) => textLower.includes(w)).length;\n return matchCount >= threshold;\n })\n .sort((a, b) => b.score - a.score);\n}\n", "import {\n definePlugin,\n runWorker,\n type PluginContext,\n type PluginJobContext,\n type ToolResult,\n type ToolRunContext,\n} from \"@paperclipai/plugin-sdk\";\nimport {\n DEFAULT_CONFIG,\n ENTITY_TYPES,\n EVENT_NAMES,\n JOB_KEYS,\n STATE_KEYS,\n TOOL_NAMES,\n} from \"./constants.js\";\nimport type {\n PluginConfig,\n ScoredTweet,\n CorpusSummary,\n EnrichedTweet,\n HandleTrackerData,\n TweetRating,\n TweetRatingValue,\n AnalyzeTopicResult,\n ThreadResult,\n CorpusBrowserData,\n} from \"./types.js\";\nimport {\n xaiSearch,\n deduplicateIds,\n batchLookupTweets,\n scoreTweets,\n deduplicateTweets,\n buildOpenQueries,\n buildFocusedQueries,\n updateHandleTracker,\n evaluatePromotions,\n decayHandles,\n buildHandleUpdatesFromTweets,\n verifyTweetExists,\n parseSince,\n computeTotalEngagement,\n buildTopicQueries,\n crossReferenceCorpus,\n fetchTweetWithConversationId,\n fetchConversationTweets,\n} from \"./pipeline/index.js\";\n\n// ---------------------------------------------------------------------------\n// Tweet URL helper\n// ---------------------------------------------------------------------------\n\nfunction tweetUrl(authorUsername: string, tweetId: string): string {\n return `https://x.com/${authorUsername}/status/${tweetId}`;\n}\n\nfunction withUrl<T extends { tweet_id: string; author_username: string }>(tweet: T): T & { url: string } {\n return { ...tweet, url: tweetUrl(tweet.author_username, tweet.tweet_id) };\n}\n\n// ---------------------------------------------------------------------------\n// Config helper\n// ---------------------------------------------------------------------------\n\nasync function getConfig(ctx: PluginContext): Promise<PluginConfig> {\n const raw = await ctx.config.get();\n return { ...DEFAULT_CONFIG, ...raw } as unknown as PluginConfig;\n}\n\nfunction buildAuthorityMaps(config: PluginConfig) {\n const allHandles = new Set<string>();\n const byDomain = new Map<string, string[]>();\n for (const [domain, list] of Object.entries(config.authority_lists)) {\n const handles = list.handles.map((h) => h.toLowerCase());\n byDomain.set(domain, handles);\n for (const h of handles) allHandles.add(h);\n }\n return { allHandles, byDomain };\n}\n\n// ---------------------------------------------------------------------------\n// Module-level ctx reference for lifecycle hooks\n// ---------------------------------------------------------------------------\n\nlet pluginCtx: PluginContext | null = null;\n\n// ---------------------------------------------------------------------------\n// Discovery pipeline (runs as job handler)\n// ---------------------------------------------------------------------------\n\nasync function runDiscoveryPipeline(ctx: PluginContext, job: PluginJobContext): Promise<void> {\n const config = await getConfig(ctx);\n const today = new Date().toISOString().split(\"T\")[0]!;\n const threeDaysAgo = new Date(Date.now() - 3 * 86400000).toISOString().split(\"T\")[0]!;\n const { allHandles, byDomain } = buildAuthorityMaps(config);\n\n ctx.logger.info(\"Discovery pipeline started\", { date: today, jobRunId: job.runId });\n await ctx.metrics.write(\"pipeline.run.started\", 1);\n\n // ----- Stage 1: Open Discovery -----\n const openQueries = buildOpenQueries(config.semantic_topics, config.keyword_searches, today);\n const openTweetIdArrays: string[][] = [];\n let totalXaiCost = 0;\n\n for (const query of openQueries) {\n try {\n const result = await xaiSearch(\n ctx.http, ctx.secrets, ctx.logger,\n config.xai_api_key_ref,\n { query: query.text, fromDate: threeDaysAgo, toDate: today, excludedHandles: config.global_excluded },\n );\n openTweetIdArrays.push(result.tweetIds);\n totalXaiCost += result.costUsdTicks;\n } catch (err) {\n ctx.logger.warn(\"Open discovery query failed\", {\n query: query.text,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const openTweetIds = deduplicateIds(openTweetIdArrays);\n ctx.logger.info(\"Stage 1 complete: open discovery\", {\n queriesRun: openQueries.length,\n uniqueTweetIds: openTweetIds.length,\n });\n\n // Intermediate enrichment to identify active handles\n const openTweets = await batchLookupTweets(\n ctx.http, ctx.secrets, ctx.logger,\n config.x_api_bearer_ref, openTweetIds, \"open_discovery\",\n );\n\n // Build active handle map from open discovery results\n const activeHandles = new Map<string, { engagement: number; relevance: number; domains: string[] }>();\n for (const tweet of openTweets) {\n const username = tweet.author_username.toLowerCase();\n if (allHandles.has(username) || config.global_excluded.includes(username)) continue;\n const engagement = tweet.metrics.like_count + tweet.metrics.retweet_count * 2;\n const existing = activeHandles.get(username);\n if (existing) {\n existing.engagement = Math.max(existing.engagement, engagement);\n } else {\n activeHandles.set(username, { engagement, relevance: 0.5, domains: [] });\n }\n }\n\n // ----- Stage 2: Focused Discovery -----\n const focusedQueries = buildFocusedQueries(\n config.semantic_topics, byDomain, activeHandles, today,\n );\n const focusedTweetIdArrays: string[][] = [];\n\n for (const query of focusedQueries) {\n try {\n const result = await xaiSearch(\n ctx.http, ctx.secrets, ctx.logger,\n config.xai_api_key_ref,\n {\n query: query.text,\n fromDate: threeDaysAgo,\n toDate: today,\n allowedHandles: query.handles,\n },\n );\n focusedTweetIdArrays.push(result.tweetIds);\n totalXaiCost += result.costUsdTicks;\n\n if (result.tweetIds.length === 0 && query.handles?.length) {\n ctx.logger.warn(\"Focused query returned 0 results \u2014 handle set may be inactive\", {\n topic: query.topic,\n handles: query.handles,\n });\n }\n } catch (err) {\n ctx.logger.warn(\"Focused discovery query failed\", {\n query: query.text,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const focusedTweetIds = deduplicateIds(focusedTweetIdArrays);\n // Remove IDs already fetched in Stage 1\n const openIdSet = new Set(openTweetIds);\n const newFocusedIds = focusedTweetIds.filter((id) => !openIdSet.has(id));\n\n ctx.logger.info(\"Stage 2 complete: focused discovery\", {\n queriesRun: focusedQueries.length,\n newTweetIds: newFocusedIds.length,\n });\n\n // ----- Stage 3: Enrichment -----\n const focusedTweets = await batchLookupTweets(\n ctx.http, ctx.secrets, ctx.logger,\n config.x_api_bearer_ref, newFocusedIds, \"focused\",\n );\n\n // Mark tweets found in both stages\n const focusedIdSet = new Set(focusedTweetIds);\n const allTweets: EnrichedTweet[] = openTweets.map((t) =>\n focusedIdSet.has(t.tweet_id) ? { ...t, source: \"both\" as const } : t,\n );\n allTweets.push(...focusedTweets);\n\n ctx.logger.info(\"Stage 3 complete: enrichment\", { totalTweets: allTweets.length });\n\n // ----- Stage 4: Scoring & Storage -----\n const scored = scoreTweets(\n allTweets,\n config.scoring_weights,\n config.engagement_sub_weights,\n config.authority_boost,\n allHandles,\n byDomain,\n config.semantic_topics,\n );\n\n const deduplicated = deduplicateTweets(scored, config.dedup_threshold);\n const corpus = deduplicated.slice(0, config.max_corpus_size);\n\n ctx.logger.info(\"Stage 4: scoring & dedup\", {\n scored: scored.length,\n afterDedup: deduplicated.length,\n finalCorpus: corpus.length,\n });\n\n // Emit high-engagement events before storage\n const engagementThresholds = config.engagement_thresholds ?? DEFAULT_CONFIG.engagement_thresholds;\n for (const tweet of corpus) {\n const totalEngagement = computeTotalEngagement(tweet.metrics);\n if (totalEngagement >= engagementThresholds.escalation) {\n await ctx.events.emit(EVENT_NAMES.tweetHighEngagement, config.company_id, {\n tweet_id: tweet.tweet_id,\n author_username: tweet.author_username,\n text: tweet.text.slice(0, 280),\n url: tweetUrl(tweet.author_username, tweet.tweet_id),\n score: tweet.score,\n total_engagement: totalEngagement,\n metrics: tweet.metrics,\n is_authority: tweet.is_authority,\n threshold_crossed: \"escalation\",\n });\n await ctx.metrics.write(\"pipeline.tweet.high_engagement\", 1);\n }\n }\n\n // Store tweets as entities\n for (const tweet of corpus) {\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.tweet,\n scopeKind: \"instance\",\n externalId: tweet.tweet_id,\n title: `@${tweet.author_username}: ${tweet.text.slice(0, 80)}`,\n status: \"active\",\n data: tweet as unknown as Record<string, unknown>,\n });\n }\n\n // Update handle tracker\n const handleUpdates = buildHandleUpdatesFromTweets(allTweets, config.semantic_topics, byDomain);\n const handleStats = await updateHandleTracker(\n ctx.entities, ctx.logger, handleUpdates, allHandles,\n );\n\n // Evaluate promotions\n const promotions = await evaluatePromotions(\n ctx.entities, ctx.logger, config.authority_promotion_policy,\n );\n\n // Store daily corpus summary\n const summary: CorpusSummary = {\n date: today,\n total_tweets: corpus.length,\n top_items: corpus.slice(0, 10),\n by_pillar: {},\n discovery_stats: {\n open_queries: openQueries.length,\n focused_queries: focusedQueries.length,\n total_tweet_ids_extracted: openTweetIds.length + focusedTweetIds.length,\n tweets_after_dedup: deduplicated.length,\n tweets_after_scoring: corpus.length,\n new_handles_discovered: handleStats.discovered,\n handles_promoted: promotions.length,\n xai_cost_estimate: totalXaiCost / 1_000_000_000,\n x_api_cost_estimate: allTweets.length * 0.01,\n },\n generated_at: new Date().toISOString(),\n };\n\n await ctx.state.set(\n { scopeKind: \"instance\", stateKey: `${STATE_KEYS.corpusPrefix}${today}` },\n summary,\n );\n await ctx.state.set(\n { scopeKind: \"instance\", stateKey: STATE_KEYS.lastDiscoveryRun },\n { date: today, corpusSize: corpus.length, generatedAt: summary.generated_at },\n );\n\n // Emit enhanced corpus.updated event\n await ctx.events.emit(EVENT_NAMES.corpusUpdated, config.company_id, {\n date: today,\n corpusSize: corpus.length,\n topScore: corpus[0]?.score ?? 0,\n top_items: corpus.slice(0, 5).map((t) => ({\n tweet_id: t.tweet_id,\n author_username: t.author_username,\n score: t.score,\n text: t.text.slice(0, 140),\n url: tweetUrl(t.author_username, t.tweet_id),\n is_authority: t.is_authority,\n })),\n stats: summary.discovery_stats,\n authority_count: Object.values(config.authority_lists).reduce((n, l) => n + l.handles.length, 0),\n handle_candidates: handleStats.discovered,\n });\n\n for (const promo of promotions) {\n if (promo.status === \"promoted\") {\n await ctx.events.emit(EVENT_NAMES.handlePromoted, config.company_id, {\n handle: promo.username,\n status: promo.status,\n appearances: promo.data.appearances,\n avgRelevance: promo.data.avg_relevance,\n });\n }\n }\n\n await ctx.activity.log({\n companyId: config.company_id,\n message: `X Intelligence discovery complete: ${corpus.length} tweets scored, ${handleStats.discovered} new handles discovered`,\n metadata: summary.discovery_stats as unknown as Record<string, unknown>,\n });\n\n await ctx.metrics.write(\"pipeline.run.completed\", 1);\n await ctx.metrics.write(\"pipeline.corpus.size\", corpus.length);\n await ctx.metrics.write(\"pipeline.handles.discovered\", handleStats.discovered);\n await ctx.metrics.write(\"pipeline.cost.xai\", totalXaiCost / 1_000_000_000);\n\n ctx.logger.info(\"Discovery pipeline complete\", {\n date: today,\n corpusSize: corpus.length,\n totalCostEstimate: `$${(totalXaiCost / 1_000_000_000 + allTweets.length * 0.01).toFixed(2)}`,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Job handlers\n// ---------------------------------------------------------------------------\n\nasync function handleAuthorityDecay(ctx: PluginContext, _job: PluginJobContext): Promise<void> {\n const config = await getConfig(ctx);\n const decayed = await decayHandles(\n ctx.entities, ctx.logger, config.authority_promotion_policy.tracking_window_days,\n );\n await ctx.metrics.write(\"handles.decayed\", decayed);\n ctx.logger.info(\"Authority decay job complete\", { decayed });\n}\n\nasync function handleComplianceCheck(ctx: PluginContext, _job: PluginJobContext): Promise<void> {\n const config = await getConfig(ctx);\n const tweets = await ctx.entities.list({ entityType: ENTITY_TYPES.tweet, limit: 200 });\n let removed = 0;\n\n for (const tweet of tweets) {\n const tweetId = tweet.externalId;\n if (!tweetId) continue;\n try {\n const exists = await verifyTweetExists(\n ctx.http, ctx.secrets, config.x_api_bearer_ref, tweetId,\n );\n if (!exists) {\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.tweet,\n scopeKind: \"instance\",\n externalId: tweetId,\n title: tweet.title ?? tweetId,\n status: \"removed\",\n data: { ...tweet.data, removed_reason: \"deleted_or_suspended\", removed_at: new Date().toISOString() },\n });\n removed++;\n }\n } catch {\n // Rate limit or network error \u2014 skip this tweet\n }\n }\n\n await ctx.metrics.write(\"compliance.tweets_removed\", removed);\n ctx.logger.info(\"Compliance check complete\", { checked: tweets.length, removed });\n}\n\nasync function handleCorpusRetention(ctx: PluginContext, _job: PluginJobContext): Promise<void> {\n const config = await getConfig(ctx);\n const cutoff = new Date();\n cutoff.setDate(cutoff.getDate() - config.corpus_retention_days);\n const cutoffStr = cutoff.toISOString().split(\"T\")[0]!;\n\n const tweets = await ctx.entities.list({ entityType: ENTITY_TYPES.tweet, limit: 500 });\n let archived = 0;\n\n for (const tweet of tweets) {\n const data = tweet.data as Record<string, unknown>;\n const createdAt = typeof data.created_at === \"string\" ? data.created_at.split(\"T\")[0] : null;\n if (createdAt && createdAt < cutoffStr) {\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.tweet,\n scopeKind: \"instance\",\n externalId: tweet.externalId!,\n title: tweet.title ?? tweet.externalId!,\n status: \"archived\",\n data: { ...tweet.data, archived_at: new Date().toISOString() },\n });\n archived++;\n }\n }\n\n await ctx.metrics.write(\"retention.tweets_archived\", archived);\n ctx.logger.info(\"Corpus retention complete\", { archived });\n}\n\n// ---------------------------------------------------------------------------\n// Tool handlers \u2014 existing (enhanced)\n// ---------------------------------------------------------------------------\n\nasync function handleSearchCorpus(\n ctx: PluginContext,\n params: unknown,\n _runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const query = typeof p.query === \"string\" ? p.query.toLowerCase() : \"\";\n const date = typeof p.date === \"string\" ? p.date : undefined;\n const pillar = typeof p.pillar === \"string\" ? p.pillar.toLowerCase() : undefined;\n const limit = typeof p.limit === \"number\" ? p.limit : 20;\n const minScore = typeof p.min_score === \"number\" ? p.min_score : 0;\n const minEngagement = typeof p.min_engagement === \"number\" ? p.min_engagement : 0;\n const since = typeof p.since === \"string\" ? p.since : undefined;\n\n const sinceDate = since ? parseSince(since) : null;\n\n const tweets = await ctx.entities.list({\n entityType: ENTITY_TYPES.tweet,\n limit: 500,\n });\n\n const results: ScoredTweet[] = [];\n for (const tweet of tweets) {\n if (tweet.status === \"removed\" || tweet.status === \"archived\") continue;\n const data = tweet.data as unknown as ScoredTweet;\n if (query && !data.text.toLowerCase().includes(query)) continue;\n if (date && !(data.created_at?.startsWith(date) ?? false)) continue;\n if (sinceDate && new Date(data.created_at) < sinceDate) continue;\n if (pillar && !(data.authority_domains?.some((d) => d.toLowerCase().includes(pillar)) ?? false)) continue;\n if (data.score < minScore) continue;\n if (minEngagement > 0 && computeTotalEngagement(data.metrics) < minEngagement) continue;\n results.push(data);\n }\n\n results.sort((a, b) => b.score - a.score);\n const limited = results.slice(0, limit).map(withUrl);\n\n const topLinks = limited.slice(0, 5).map((t) => `- @${t.author_username} (score: ${t.score.toFixed(1)}): ${t.url}`).join(\"\\n\");\n\n return {\n content: `Found ${limited.length} of ${results.length} tweets matching \"${query}\"\\n\\nTop results:\\n${topLinks}`,\n data: limited,\n };\n}\n\nasync function handleGetToday(\n ctx: PluginContext,\n params: unknown,\n _runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const pillar = typeof p.pillar === \"string\" ? p.pillar : undefined;\n const limit = typeof p.limit === \"number\" ? p.limit : 20;\n const minScore = typeof p.min_score === \"number\" ? p.min_score : 0;\n const today = new Date().toISOString().split(\"T\")[0]!;\n\n // Read from entities directly (not truncated state summary)\n const tweets = await ctx.entities.list({\n entityType: ENTITY_TYPES.tweet,\n limit: 500,\n });\n\n const results: ScoredTweet[] = [];\n for (const tweet of tweets) {\n if (tweet.status === \"removed\" || tweet.status === \"archived\") continue;\n const data = tweet.data as unknown as ScoredTweet;\n if (!data.created_at?.startsWith(today)) continue;\n if (data.score < minScore) continue;\n if (pillar && !(data.authority_domains?.some((d) => d.toLowerCase().includes(pillar.toLowerCase())) ?? false)) continue;\n results.push(data);\n }\n\n results.sort((a, b) => b.score - a.score);\n const limited = results.slice(0, limit).map(withUrl);\n\n // Fetch summary stats for metadata\n const summary = (await ctx.state.get({\n scopeKind: \"instance\",\n stateKey: `${STATE_KEYS.corpusPrefix}${today}`,\n })) as CorpusSummary | null;\n\n const topLinks = limited.slice(0, 5).map((t) => `- @${t.author_username} (score: ${t.score.toFixed(1)}): ${t.url}`).join(\"\\n\");\n\n return {\n content: `Today's corpus: ${results.length} tweets total. Showing top ${limited.length}.\\n\\nTop results:\\n${topLinks}`,\n data: {\n date: today,\n total: results.length,\n items: limited,\n stats: summary?.discovery_stats ?? null,\n },\n };\n}\n\nasync function handleGetAuthorities(\n ctx: PluginContext,\n params: unknown,\n _runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const listName = typeof p.list_name === \"string\" ? p.list_name : undefined;\n const config = await getConfig(ctx);\n\n if (listName) {\n const list = config.authority_lists[listName];\n if (!list) {\n return { error: `Authority list \"${listName}\" not found. Available: ${Object.keys(config.authority_lists).join(\", \")}` };\n }\n return {\n content: `Authority list \"${listName}\": ${list.handles.length} handles`,\n data: { name: listName, ...list },\n };\n }\n\n const summary = Object.entries(config.authority_lists).map(([name, list]) => ({\n name,\n description: list.description,\n handleCount: list.handles.length,\n handles: list.handles,\n lastReviewed: list.last_reviewed,\n }));\n\n return {\n content: `${summary.length} authority lists configured`,\n data: summary,\n };\n}\n\nasync function handleSuggestHandles(\n ctx: PluginContext,\n _params: unknown,\n _runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const handles = await ctx.entities.list({\n entityType: ENTITY_TYPES.handle,\n limit: 200,\n });\n\n const candidates = handles\n .filter((h) => h.status === \"candidate\" || h.status === \"promoted\")\n .map((h) => {\n const data = h.data as unknown as HandleTrackerData;\n return {\n username: h.externalId,\n status: h.status,\n appearances: data.appearances,\n avg_relevance: data.avg_relevance,\n domains: data.domains,\n followers_count: data.followers_count,\n first_seen: data.first_seen,\n last_seen: data.last_seen,\n };\n });\n\n candidates.sort((a, b) => {\n const scoreA = (a.avg_relevance ?? 0) * (a.appearances ?? 0);\n const scoreB = (b.avg_relevance ?? 0) * (b.appearances ?? 0);\n return scoreB - scoreA;\n });\n\n return {\n content: `${candidates.length} handles are candidates or recently promoted`,\n data: candidates,\n };\n}\n\nasync function handleTrackHandle(\n ctx: PluginContext,\n params: unknown,\n _runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const handle = typeof p.handle === \"string\" ? p.handle.toLowerCase().replace(/^@/, \"\") : \"\";\n const relevance = typeof p.relevance === \"number\" ? p.relevance : 0.5;\n const domain = typeof p.domain === \"string\" ? p.domain : \"\";\n\n if (!handle) return { error: \"handle is required\" };\n if (!domain) return { error: \"domain is required\" };\n\n const config = await getConfig(ctx);\n const { allHandles } = buildAuthorityMaps(config);\n\n await updateHandleTracker(ctx.entities, ctx.logger, [\n { username: handle, relevance, domains: [domain], followedByExisting: [] },\n ], allHandles);\n\n return {\n content: `Handle @${handle} tracked with relevance ${relevance} in domain \"${domain}\"`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Tool handlers \u2014 new\n// ---------------------------------------------------------------------------\n\nasync function handleAnalyzeTopic(\n ctx: PluginContext,\n params: unknown,\n _runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const topic = typeof p.topic === \"string\" ? p.topic : \"\";\n const includeCorpus = p.include_corpus !== false;\n\n if (!topic) return { error: \"topic is required\" };\n\n const config = await getConfig(ctx);\n const today = new Date().toISOString().split(\"T\")[0]!;\n\n await ctx.metrics.write(\"tool.analyze_topic.invoked\", 1);\n\n // Build and execute 5 decomposed queries\n const queries = buildTopicQueries(topic, today);\n const freshResults: AnalyzeTopicResult[\"fresh_results\"] = [];\n let totalCost = 0;\n\n for (const query of queries) {\n try {\n const result = await xaiSearch(\n ctx.http, ctx.secrets, ctx.logger,\n config.xai_api_key_ref,\n { query: query.text, fromDate: today, toDate: today, excludedHandles: config.global_excluded },\n );\n freshResults.push({\n tweet_ids: result.tweetIds,\n query_type: query.topic,\n synthesis_text: result.synthesisText,\n });\n totalCost += result.costUsdTicks;\n } catch (err) {\n ctx.logger.warn(\"Analyze topic sub-query failed\", {\n queryType: query.topic,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // Cross-reference corpus\n let corpusMatches: ScoredTweet[] = [];\n if (includeCorpus) {\n const allTweets = await ctx.entities.list({ entityType: ENTITY_TYPES.tweet, limit: 500 });\n const corpus = allTweets\n .filter((t) => t.status === \"active\")\n .map((t) => t.data as unknown as ScoredTweet);\n corpusMatches = crossReferenceCorpus(topic, corpus);\n }\n\n await ctx.metrics.write(\"tool.analyze_topic.cost\", totalCost / 1_000_000_000);\n\n const corpusWithUrls = corpusMatches.slice(0, 10).map(withUrl);\n\n const result: AnalyzeTopicResult = {\n topic,\n synthesis: freshResults.map((r) => `## ${r.query_type}\\n${r.synthesis_text}`).join(\"\\n\\n\"),\n corpus_matches: corpusWithUrls,\n fresh_results: freshResults,\n generated_at: new Date().toISOString(),\n };\n\n const matchLinks = corpusWithUrls.slice(0, 5).map((t) => `- @${t.author_username}: ${t.url}`).join(\"\\n\");\n\n return {\n content: `Topic analysis for \"${topic}\": ${freshResults.length} queries completed, ${corpusMatches.length} corpus matches found.${matchLinks ? `\\n\\nTop corpus matches:\\n${matchLinks}` : \"\"}`,\n data: result,\n };\n}\n\nasync function handleGetThread(\n ctx: PluginContext,\n params: unknown,\n _runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const tweetId = typeof p.tweet_id === \"string\" ? p.tweet_id : \"\";\n\n if (!tweetId) return { error: \"tweet_id is required\" };\n\n const config = await getConfig(ctx);\n await ctx.metrics.write(\"tool.get_thread.invoked\", 1);\n\n try {\n const { tweet, conversationId } = await fetchTweetWithConversationId(\n ctx.http, ctx.secrets, ctx.logger, config.x_api_bearer_ref, tweetId,\n );\n\n const conversationTweets = await fetchConversationTweets(\n ctx.http, ctx.secrets, ctx.logger, config.x_api_bearer_ref, conversationId,\n );\n\n const allThreadTweets = [tweet, ...conversationTweets.filter((t) => t.tweet_id !== tweetId)].map(withUrl);\n\n const result: ThreadResult = {\n root_tweet_id: tweetId,\n conversation_id: conversationId,\n tweets: allThreadTweets,\n total_in_conversation: conversationTweets.length + 1,\n };\n\n const threadLinks = allThreadTweets.map((t) => `- @${t.author_username}: ${t.url}`).join(\"\\n\");\n\n return {\n content: `Thread for tweet ${tweetId}: ${result.tweets.length} tweets in conversation ${conversationId}\\n\\n${threadLinks}`,\n data: result,\n };\n } catch (err) {\n return {\n error: `Failed to fetch thread: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n\nasync function handlePromoteHandle(\n ctx: PluginContext,\n params: unknown,\n runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const handle = typeof p.handle === \"string\" ? p.handle.toLowerCase().replace(/^@/, \"\") : \"\";\n const listName = typeof p.list_name === \"string\" ? p.list_name : \"\";\n const note = typeof p.note === \"string\" ? p.note : \"\";\n\n if (!handle) return { error: \"handle is required\" };\n if (!listName) return { error: \"list_name is required\" };\n\n const config = await getConfig(ctx);\n if (!config.authority_lists[listName]) {\n return { error: `Authority list \"${listName}\" not found. Available: ${Object.keys(config.authority_lists).join(\", \")}` };\n }\n\n const existing = await ctx.entities.list({\n entityType: ENTITY_TYPES.handle,\n externalId: handle,\n limit: 1,\n });\n\n const now = new Date().toISOString();\n\n if (existing.length > 0) {\n const record = existing[0]!;\n const data = record.data as unknown as HandleTrackerData;\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.handle,\n scopeKind: \"instance\",\n externalId: handle,\n title: handle,\n status: \"promoted\",\n data: {\n ...data,\n promoted_to_list: listName,\n notes: note ? `${data.notes ? data.notes + \"; \" : \"\"}Promoted to ${listName}: ${note}` : data.notes,\n } satisfies HandleTrackerData,\n });\n } else {\n const data: HandleTrackerData = {\n first_seen: now.split(\"T\")[0]!,\n last_seen: now.split(\"T\")[0]!,\n appearances: 0,\n avg_relevance: 0,\n domains: [listName],\n followed_by_existing: [],\n followers_count: 0,\n sample_tweet_ids: [],\n promoted_to_list: listName,\n notes: note ? `Manually promoted to ${listName}: ${note}` : `Manually promoted to ${listName}`,\n };\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.handle,\n scopeKind: \"instance\",\n externalId: handle,\n title: handle,\n status: \"promoted\",\n data: data as unknown as Record<string, unknown>,\n });\n }\n\n await ctx.events.emit(EVENT_NAMES.handlePromoted, config.company_id, {\n handle,\n list_name: listName,\n promoted_by: runCtx.agentId ?? \"manual\",\n note,\n });\n\n await ctx.activity.log({\n companyId: config.company_id,\n message: `Handle @${handle} promoted to authority list \"${listName}\"`,\n metadata: { list_name: listName, note },\n });\n\n return {\n content: `Handle @${handle} promoted to authority list \"${listName}\"`,\n };\n}\n\nasync function handleRateTweet(\n ctx: PluginContext,\n params: unknown,\n runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const tweetId = typeof p.tweet_id === \"string\" ? p.tweet_id : \"\";\n const rating = typeof p.rating === \"string\" ? p.rating : \"\";\n const ratedBy = typeof p.rated_by === \"string\" ? p.rated_by : runCtx.agentId ?? \"unknown\";\n\n if (!tweetId) return { error: \"tweet_id is required\" };\n if (![\"relevant\", \"irrelevant\", \"skip\"].includes(rating)) {\n return { error: 'rating must be \"relevant\", \"irrelevant\", or \"skip\"' };\n }\n\n const existing = await ctx.entities.list({\n entityType: ENTITY_TYPES.tweet,\n externalId: tweetId,\n limit: 1,\n });\n\n if (existing.length === 0) {\n return { error: `Tweet ${tweetId} not found in corpus` };\n }\n\n const record = existing[0]!;\n const data = record.data as Record<string, unknown>;\n const existingRatings: TweetRating[] = (Array.isArray(data.ratings) ? data.ratings : []) as TweetRating[];\n\n const newRating: TweetRating = {\n rated_by: ratedBy,\n rated_at: new Date().toISOString(),\n value: rating as TweetRatingValue,\n };\n\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.tweet,\n scopeKind: \"instance\",\n externalId: tweetId,\n title: record.title ?? tweetId,\n status: record.status ?? \"active\",\n data: {\n ...data,\n ratings: [...existingRatings, newRating],\n },\n });\n\n await ctx.metrics.write(\"tool.rate_tweet.invoked\", 1);\n\n const data2 = record.data as unknown as ScoredTweet;\n const ratedUrl = data2.author_username ? tweetUrl(data2.author_username, tweetId) : `https://x.com/i/status/${tweetId}`;\n\n return {\n content: `Tweet ${tweetId} rated as \"${rating}\" by ${ratedBy}. Total ratings: ${existingRatings.length + 1}\\n${ratedUrl}`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Plugin definition\n// ---------------------------------------------------------------------------\n\nconst plugin = definePlugin({\n async setup(ctx) {\n pluginCtx = ctx;\n\n // Register job handlers\n ctx.jobs.register(JOB_KEYS.discoveryRun, (job) => runDiscoveryPipeline(ctx, job));\n ctx.jobs.register(JOB_KEYS.authorityDecay, (job) => handleAuthorityDecay(ctx, job));\n ctx.jobs.register(JOB_KEYS.complianceCheck, (job) => handleComplianceCheck(ctx, job));\n ctx.jobs.register(JOB_KEYS.corpusRetention, (job) => handleCorpusRetention(ctx, job));\n\n // Register agent tools \u2014 existing\n ctx.tools.register(\n TOOL_NAMES.searchCorpus,\n { displayName: \"Search X Corpus\", description: \"Search the scored X intelligence corpus\", parametersSchema: {} },\n (params, runCtx) => handleSearchCorpus(ctx, params, runCtx),\n );\n ctx.tools.register(\n TOOL_NAMES.getToday,\n { displayName: \"Get Today's Intelligence\", description: \"Get today's scored corpus\", parametersSchema: {} },\n (params, runCtx) => handleGetToday(ctx, params, runCtx),\n );\n ctx.tools.register(\n TOOL_NAMES.getAuthorities,\n { displayName: \"Get Authority Handles\", description: \"Get authority handle lists\", parametersSchema: {} },\n (params, runCtx) => handleGetAuthorities(ctx, params, runCtx),\n );\n ctx.tools.register(\n TOOL_NAMES.suggestHandles,\n { displayName: \"Suggest Handle Promotions\", description: \"Get promotion candidates\", parametersSchema: {} },\n (params, runCtx) => handleSuggestHandles(ctx, params, runCtx),\n );\n ctx.tools.register(\n TOOL_NAMES.trackHandle,\n { displayName: \"Track Handle\", description: \"Record a handle appearance\", parametersSchema: {} },\n (params, runCtx) => handleTrackHandle(ctx, params, runCtx),\n );\n\n // Register agent tools \u2014 new\n ctx.tools.register(\n TOOL_NAMES.analyzeTopic,\n { displayName: \"Analyze Topic\", description: \"On-demand xAI topic analysis with 5-perspective decomposition and corpus cross-reference\", parametersSchema: {} },\n (params, runCtx) => handleAnalyzeTopic(ctx, params, runCtx),\n );\n ctx.tools.register(\n TOOL_NAMES.getThread,\n { displayName: \"Get Tweet Thread\", description: \"Fetch conversation context for a tweet\", parametersSchema: {} },\n (params, runCtx) => handleGetThread(ctx, params, runCtx),\n );\n ctx.tools.register(\n TOOL_NAMES.promoteHandle,\n { displayName: \"Promote Handle\", description: \"Promote a handle to authority status in a specific list\", parametersSchema: {} },\n (params, runCtx) => handlePromoteHandle(ctx, params, runCtx),\n );\n ctx.tools.register(\n TOOL_NAMES.rateTweet,\n { displayName: \"Rate Tweet\", description: \"Record relevance feedback on a corpus tweet\", parametersSchema: {} },\n (params, runCtx) => handleRateTweet(ctx, params, runCtx),\n );\n\n // Register data handlers for UI\n ctx.data.register(\"dashboard-summary\", async () => {\n const today = new Date().toISOString().split(\"T\")[0]!;\n const summary = (await ctx.state.get({\n scopeKind: \"instance\",\n stateKey: `${STATE_KEYS.corpusPrefix}${today}`,\n })) as CorpusSummary | null;\n\n const lastRun = await ctx.state.get({\n scopeKind: \"instance\",\n stateKey: STATE_KEYS.lastDiscoveryRun,\n });\n\n const handleCount = (await ctx.entities.list({\n entityType: ENTITY_TYPES.handle,\n limit: 1,\n })).length;\n\n return {\n today: summary ?? null,\n lastRun,\n trackedHandles: handleCount,\n };\n });\n\n ctx.data.register(\"corpus\", async (params) => {\n const date = typeof params.date === \"string\"\n ? params.date\n : new Date().toISOString().split(\"T\")[0]!;\n return await ctx.state.get({\n scopeKind: \"instance\",\n stateKey: `${STATE_KEYS.corpusPrefix}${date}`,\n });\n });\n\n ctx.data.register(\"plugin-config\", async () => {\n return await ctx.config.get();\n });\n\n // Corpus browser data handler (paginated, filtered)\n ctx.data.register(\"corpus-browser\", async (params) => {\n const p = params as Record<string, unknown>;\n const date = typeof p.date === \"string\" ? p.date : new Date().toISOString().split(\"T\")[0]!;\n const pillar = typeof p.pillar === \"string\" ? p.pillar : undefined;\n const minScore = typeof p.min_score === \"number\" ? p.min_score : 0;\n const minEngagement = typeof p.min_engagement === \"number\" ? p.min_engagement : 0;\n const authorityOnly = p.authority_only === true;\n const page = typeof p.page === \"number\" ? p.page : 1;\n const pageSize = typeof p.page_size === \"number\" ? p.page_size : 25;\n\n const allTweets = await ctx.entities.list({\n entityType: ENTITY_TYPES.tweet,\n limit: 500,\n });\n\n const filtered: ScoredTweet[] = [];\n for (const tweet of allTweets) {\n if (tweet.status === \"removed\" || tweet.status === \"archived\") continue;\n const data = tweet.data as unknown as ScoredTweet;\n if (!data.created_at?.startsWith(date)) continue;\n if (data.score < minScore) continue;\n if (pillar && !(data.authority_domains?.some((d) => d.toLowerCase().includes(pillar.toLowerCase())) ?? false)) continue;\n if (minEngagement > 0 && computeTotalEngagement(data.metrics) < minEngagement) continue;\n if (authorityOnly && !data.is_authority) continue;\n filtered.push(data);\n }\n\n filtered.sort((a, b) => b.score - a.score);\n\n const totalCount = filtered.length;\n const totalPages = Math.ceil(totalCount / pageSize) || 1;\n const start = (page - 1) * pageSize;\n const items = filtered.slice(start, start + pageSize).map(withUrl);\n\n const dates: string[] = [];\n for (let i = 0; i < 7; i++) {\n const d = new Date();\n d.setDate(d.getDate() - i);\n dates.push(d.toISOString().split(\"T\")[0]!);\n }\n\n const config = await getConfig(ctx);\n\n const result: CorpusBrowserData = {\n items,\n pagination: { page, pageSize, totalCount, totalPages },\n filters: {\n date,\n pillar: pillar ?? null,\n minScore,\n minEngagement,\n authorityOnly,\n },\n available_pillars: config.content_pillars,\n available_dates: dates,\n };\n\n return result;\n });\n\n // Register action handlers for UI\n let discoveryRunning = false;\n ctx.actions.register(\"trigger-discovery\", async () => {\n if (discoveryRunning) {\n return { message: \"Discovery pipeline already running.\" };\n }\n ctx.logger.info(\"Manual discovery trigger requested via UI\");\n discoveryRunning = true;\n const fakeJob = { runId: `manual-${Date.now()}`, jobKey: JOB_KEYS.discoveryRun } as PluginJobContext;\n runDiscoveryPipeline(ctx, fakeJob)\n .catch((err) => {\n ctx.logger.error(\"Manual discovery failed\", { error: err instanceof Error ? err.message : String(err) });\n })\n .finally(() => { discoveryRunning = false; });\n return { message: \"Discovery pipeline started. Check logs for progress.\" };\n });\n\n // Subscribe to events\n ctx.events.on(\"issue.created\", async (event) => {\n ctx.logger.debug(\"Issue created event received\", { issueId: event.entityId });\n });\n\n ctx.logger.info(\"X Intelligence plugin initialized\");\n },\n\n async onHealth() {\n if (!pluginCtx) return { status: \"error\" as const, message: \"Plugin not initialized\" };\n try {\n const config = await getConfig(pluginCtx);\n const lastRun = (await pluginCtx.state.get({\n scopeKind: \"instance\",\n stateKey: STATE_KEYS.lastDiscoveryRun,\n })) as { date: string; generatedAt: string } | null;\n\n const now = new Date();\n const lastRunDate = lastRun?.generatedAt ? new Date(lastRun.generatedAt) : null;\n const hoursSinceLastRun = lastRunDate\n ? (now.getTime() - lastRunDate.getTime()) / (1000 * 60 * 60)\n : null;\n\n const status = hoursSinceLastRun === null\n ? \"degraded\" as const\n : hoursSinceLastRun > 36 ? \"degraded\" as const : \"ok\" as const;\n\n return {\n status,\n message: lastRun\n ? `Last discovery: ${lastRun.date} (${Math.round(hoursSinceLastRun!)}h ago)`\n : \"No discovery runs yet\",\n details: {\n lastDiscoveryRun: lastRun?.date ?? null,\n hoursSinceLastRun: hoursSinceLastRun ? Math.round(hoursSinceLastRun) : null,\n configuredTopics: config.semantic_topics.length,\n configuredAuthorities: Object.keys(config.authority_lists).length,\n },\n };\n } catch (err) {\n return {\n status: \"error\" as const,\n message: `Health check failed: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n },\n\n async onValidateConfig(config: Record<string, unknown>) {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n const xaiRef = config.xai_api_key_ref as string | undefined;\n const xRef = config.x_api_bearer_ref as string | undefined;\n\n if (!xaiRef) errors.push(\"xai_api_key_ref is required\");\n if (!xRef) errors.push(\"x_api_bearer_ref is required\");\n\n if (pluginCtx && xaiRef) {\n try {\n const key = await pluginCtx.secrets.resolve(xaiRef);\n if (!key || key.length < 10) warnings.push(\"xAI API key appears invalid (too short)\");\n } catch {\n errors.push(`Cannot resolve xAI API key secret: ${xaiRef}`);\n }\n }\n if (pluginCtx && xRef) {\n try {\n const key = await pluginCtx.secrets.resolve(xRef);\n if (!key || key.length < 10) warnings.push(\"X API bearer token appears invalid (too short)\");\n } catch {\n errors.push(`Cannot resolve X API bearer secret: ${xRef}`);\n }\n }\n\n const sw = config.scoring_weights as { relevance?: number; recency?: number; engagement?: number } | undefined;\n if (sw) {\n const sum = (sw.relevance ?? 0) + (sw.recency ?? 0) + (sw.engagement ?? 0);\n if (Math.abs(sum - 1) > 0.05) warnings.push(`Scoring weights sum to ${sum.toFixed(2)}, expected ~1.0`);\n }\n\n if ((config.semantic_topics as string[] | undefined)?.length === 0) {\n warnings.push(\"No semantic topics configured \u2014 discovery will produce no results\");\n }\n\n return { ok: errors.length === 0, warnings, errors };\n },\n});\n\nexport default plugin;\nrunWorker(plugin, import.meta.url);\n"],
5
- "mappings": "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",
4
+ "sourcesContent": [null, null, null, "export const PLUGIN_ID = \"peak6-labs.x-intelligence\";\nexport const PLUGIN_VERSION = \"0.1.2\";\n\nexport const JOB_KEYS = {\n discoveryRun: \"discovery-run\",\n authorityDecay: \"authority-decay\",\n complianceCheck: \"compliance-check\",\n corpusRetention: \"corpus-retention\",\n} as const;\n\nexport const TOOL_NAMES = {\n searchCorpus: \"search-corpus\",\n getToday: \"get-today\",\n getAuthorities: \"get-authorities\",\n suggestHandles: \"suggest-handles\",\n trackHandle: \"track-handle\",\n analyzeTopic: \"analyze-topic\",\n getThread: \"get-thread\",\n promoteHandle: \"promote-handle\",\n rateTweet: \"rate-tweet\",\n} as const;\n\nexport const SLOT_IDS = {\n dashboardWidget: \"x-intelligence-dashboard\",\n settingsPage: \"x-intelligence-settings\",\n corpusBrowser: \"x-intelligence-corpus-browser\",\n} as const;\n\nexport const EXPORT_NAMES = {\n dashboardWidget: \"DashboardWidget\",\n settingsPage: \"SettingsPage\",\n corpusBrowser: \"CorpusBrowserPage\",\n} as const;\n\nexport const ENTITY_TYPES = {\n tweet: \"tweet\",\n handle: \"handle\",\n} as const;\n\nexport const STATE_KEYS = {\n corpusPrefix: \"corpus:\",\n lastDiscoveryRun: \"last-discovery-run\",\n pipelineStats: \"pipeline-stats\",\n} as const;\n\nexport const EVENT_NAMES = {\n corpusUpdated: \"corpus.updated\",\n handlePromoted: \"handle.promoted\",\n gapIdentified: \"gap.identified\",\n tweetHighEngagement: \"tweet.high-engagement\",\n} as const;\n\nexport const DEFAULT_CONFIG = {\n company_id: \"\",\n xai_api_key_ref: \"XAI_API_KEY\",\n x_api_bearer_ref: \"BEARER_TOKEN\",\n semantic_topics: [\n \"institutional investors discussing market structure reform\",\n \"fintech companies disrupting traditional trading\",\n \"SEC regulatory changes affecting options trading\",\n \"algorithmic trading and quantitative strategies\",\n \"venture capital investing in financial infrastructure\",\n \"PEAK6\",\n \"options market making technology\",\n \"Chicago trading community news\",\n ],\n keyword_searches: [\n \"\\\"PEAK6 Investments\\\" OR \\\"PEAK6\\\" trading fintech\",\n \"fintech and trading technology\",\n \"market structure and regulation\",\n \"options trading strategies and platforms\",\n ],\n content_pillars: [\n \"market structure & regulation\",\n \"fintech & trading technology\",\n \"venture capital & investment\",\n \"Chicago business ecosystem\",\n \"company culture & talent\",\n ],\n scoring_weights: {\n relevance: 0.45,\n recency: 0.25,\n engagement: 0.30,\n },\n engagement_sub_weights: {\n likes: 0.55,\n reposts: 0.25,\n replies: 0.15,\n quotes: 0.05,\n },\n max_corpus_size: 200,\n dedup_threshold: 0.70,\n authority_boost: 0.15,\n authority_lists: {\n market_structure: {\n description: \"Market structure, regulation, SEC reform, options trading\",\n handles: [\n \"LizAnnSonders\",\n \"matt_levine\",\n \"unusual_whales\",\n \"CMEGroup\",\n \"CBOE\",\n \"OptionsHawk\",\n \"InvestorDenis\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n fintech: {\n description: \"Fintech, trading technology, AI in finance\",\n handles: [\n \"twifintech\",\n \"IBSIntelligence\",\n \"privy_io\",\n \"i_Know_First\",\n \"fintech_germany\",\n \"venture_radar\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n venture_capital: {\n description: \"Venture capital investing in financial infrastructure\",\n handles: [\n \"a16z\",\n \"FundersVC\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n chicago_trading: {\n description: \"Chicago trading community, prop firms, PEAK6 ecosystem\",\n handles: [\n \"CBOE\",\n \"CMEGroup\",\n \"boogeymantradez\",\n \"adealafia\",\n ],\n last_reviewed: \"2026-03-29\",\n },\n } as Record<string, AuthorityList>,\n global_excluded: [\"elonmusk\", \"openai\", \"google\", \"microsoft\"],\n authority_promotion_policy: {\n auto_promote_threshold: {\n min_appearances: 7,\n min_avg_relevance: 0.8,\n min_mutual_overlap: 3,\n },\n candidate_threshold: {\n min_appearances: 5,\n min_avg_relevance: 0.7,\n min_mutual_overlap: 2,\n },\n tracking_window_days: 14,\n },\n corpus_retention_days: 90,\n engagement_thresholds: {\n noise_floor: 10,\n expert: 50,\n escalation: 100,\n },\n} as const;\n\nexport interface AuthorityList {\n description: string;\n handles: string[];\n last_reviewed: string;\n}\n", "import type { PluginHttpClient, PluginSecretsClient, PluginLogger } from \"@paperclipai/plugin-sdk\";\nimport type { XaiResponse, XaiAnnotation } from \"../types.js\";\n\nconst XAI_RESPONSES_URL = \"https://api.x.ai/v1/responses\";\nconst XAI_MODEL = \"grok-4-fast-reasoning\";\n\nconst TWEET_ID_PATTERN = /x\\.com\\/(?:i\\/status|[^/]+\\/status)\\/(\\d+)/;\n\nexport interface XaiSearchOptions {\n query: string;\n fromDate: string;\n toDate: string;\n allowedHandles?: string[];\n excludedHandles?: string[];\n}\n\nexport interface XaiSearchResult {\n tweetIds: string[];\n synthesisText: string;\n annotations: XaiAnnotation[];\n tokensUsed: number;\n costUsdTicks: number;\n}\n\nexport function extractTweetIds(annotations: XaiAnnotation[]): string[] {\n const ids: string[] = [];\n for (const ann of annotations) {\n if (ann.type !== \"url_citation\" || !ann.url) continue;\n const match = TWEET_ID_PATTERN.exec(ann.url);\n if (match?.[1]) {\n ids.push(match[1]);\n }\n }\n return ids;\n}\n\nexport function deduplicateIds(idArrays: string[][]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const ids of idArrays) {\n for (const id of ids) {\n if (!seen.has(id)) {\n seen.add(id);\n result.push(id);\n }\n }\n }\n return result;\n}\n\nexport async function xaiSearch(\n http: PluginHttpClient,\n secrets: PluginSecretsClient,\n logger: PluginLogger,\n apiKeyRef: string,\n options: XaiSearchOptions,\n): Promise<XaiSearchResult> {\n const apiKey = await secrets.resolve(apiKeyRef);\n\n const tool: Record<string, unknown> = {\n type: \"x_search\",\n from_date: options.fromDate,\n to_date: options.toDate,\n };\n if (options.allowedHandles?.length) {\n tool.allowed_x_handles = options.allowedHandles.slice(0, 10);\n }\n if (options.excludedHandles?.length) {\n tool.excluded_x_handles = options.excludedHandles.slice(0, 10);\n }\n\n const body = {\n model: XAI_MODEL,\n input: [{ role: \"user\", content: options.query }],\n tools: [tool],\n inline_citations: true,\n };\n\n logger.debug(\"xAI search request\", { query: options.query, handles: options.allowedHandles });\n\n const response = await globalThis.fetch(XAI_RESPONSES_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`xAI API error ${response.status}: ${errorText}`);\n }\n\n const data = (await response.json()) as XaiResponse;\n\n let synthesisText = \"\";\n const allAnnotations: XaiAnnotation[] = [];\n\n for (const output of data.output) {\n if (output.type === \"message\" && output.content) {\n for (const content of output.content) {\n if (content.type === \"output_text\") {\n if (content.text) synthesisText += content.text + \"\\n\";\n if (content.annotations) allAnnotations.push(...content.annotations);\n }\n }\n }\n }\n\n const tweetIds = extractTweetIds(allAnnotations);\n\n logger.debug(\"xAI search result\", {\n tweetIdsFound: tweetIds.length,\n annotationsCount: allAnnotations.length,\n tokensUsed: data.usage?.total_tokens ?? 0,\n firstAnnotationUrl: allAnnotations[0]?.url ?? \"NONE\",\n });\n\n return {\n tweetIds,\n synthesisText: synthesisText.trim(),\n annotations: allAnnotations,\n tokensUsed: data.usage?.total_tokens ?? 0,\n costUsdTicks: data.usage?.cost_in_usd_ticks ?? 0,\n };\n}\n", "import type { PluginHttpClient, PluginSecretsClient, PluginLogger } from \"@paperclipai/plugin-sdk\";\nimport type { XApiTweetLookupResponse, EnrichedTweet, XApiTweet, XApiUser } from \"../types.js\";\n\nconst X_API_BASE = \"https://api.x.com/2\";\nconst TWEET_FIELDS = \"text,author_id,created_at,public_metrics,entities\";\nconst USER_FIELDS = \"username,name,verified_type,public_metrics\";\nconst EXPANSIONS = \"author_id\";\nconst BATCH_SIZE = 100;\n\nexport async function batchLookupTweets(\n http: PluginHttpClient,\n secrets: PluginSecretsClient,\n logger: PluginLogger,\n bearerRef: string,\n tweetIds: string[],\n source: EnrichedTweet[\"source\"],\n): Promise<EnrichedTweet[]> {\n if (tweetIds.length === 0) return [];\n\n const bearerToken = await secrets.resolve(bearerRef);\n const results: EnrichedTweet[] = [];\n\n for (let i = 0; i < tweetIds.length; i += BATCH_SIZE) {\n const batch = tweetIds.slice(i, i + BATCH_SIZE);\n const url = `${X_API_BASE}/tweets?ids=${batch.join(\",\")}&tweet.fields=${TWEET_FIELDS}&expansions=${EXPANSIONS}&user.fields=${USER_FIELDS}`;\n\n logger.debug(\"X API v2 batch lookup\", { batchSize: batch.length, offset: i });\n\n const response = await http.fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${bearerToken}`,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n logger.warn(\"X API v2 error\", { status: response.status, error: errorText });\n continue;\n }\n\n const data = (await response.json()) as XApiTweetLookupResponse;\n\n if (data.errors?.length) {\n logger.debug(\"X API v2 partial errors\", {\n errors: data.errors.map((e) => `${e.value}: ${e.title}`),\n });\n }\n\n const userMap = new Map<string, XApiUser>();\n if (data.includes?.users) {\n for (const user of data.includes.users) {\n userMap.set(user.id, user);\n }\n }\n\n if (data.data) {\n for (const tweet of data.data) {\n const author = userMap.get(tweet.author_id);\n results.push(mapToEnrichedTweet(tweet, author, source));\n }\n }\n }\n\n return results;\n}\n\nexport function mapToEnrichedTweet(\n tweet: XApiTweet,\n author: XApiUser | undefined,\n source: EnrichedTweet[\"source\"],\n): EnrichedTweet {\n return {\n tweet_id: tweet.id,\n text: tweet.text,\n author_id: tweet.author_id,\n author_username: author?.username ?? \"unknown\",\n author_name: author?.name ?? \"Unknown\",\n author_verified_type: author?.verified_type,\n author_followers_count: author?.public_metrics?.followers_count ?? 0,\n created_at: tweet.created_at,\n metrics: tweet.public_metrics,\n entities: tweet.entities,\n source,\n };\n}\n\nexport async function verifyTweetExists(\n http: PluginHttpClient,\n secrets: PluginSecretsClient,\n bearerRef: string,\n tweetId: string,\n): Promise<boolean> {\n const bearerToken = await secrets.resolve(bearerRef);\n const url = `${X_API_BASE}/tweets?ids=${tweetId}&tweet.fields=id`;\n const response = await http.fetch(url, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${bearerToken}` },\n });\n if (!response.ok) return false;\n const data = (await response.json()) as XApiTweetLookupResponse;\n return (data.data?.length ?? 0) > 0;\n}\n\nexport async function fetchTweetWithConversationId(\n http: PluginHttpClient,\n secrets: PluginSecretsClient,\n logger: PluginLogger,\n bearerRef: string,\n tweetId: string,\n): Promise<{ tweet: EnrichedTweet; conversationId: string }> {\n const bearerToken = await secrets.resolve(bearerRef);\n const url = `${X_API_BASE}/tweets?ids=${tweetId}&tweet.fields=conversation_id,${TWEET_FIELDS}&expansions=${EXPANSIONS}&user.fields=${USER_FIELDS}`;\n\n const response = await http.fetch(url, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${bearerToken}` },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`X API v2 error ${response.status}: ${errorText}`);\n }\n\n const data = (await response.json()) as XApiTweetLookupResponse & {\n data?: Array<XApiTweet & { conversation_id?: string }>;\n };\n\n if (!data.data?.length) {\n throw new Error(`Tweet ${tweetId} not found`);\n }\n\n const rawTweet = data.data[0]!;\n const userMap = new Map<string, XApiUser>();\n if (data.includes?.users) {\n for (const user of data.includes.users) userMap.set(user.id, user);\n }\n\n const tweet = mapToEnrichedTweet(rawTweet, userMap.get(rawTweet.author_id), \"open_discovery\");\n const conversationId = rawTweet.conversation_id ?? tweetId;\n\n logger.debug(\"Fetched tweet with conversation_id\", { tweetId, conversationId });\n\n return { tweet, conversationId };\n}\n\nexport async function fetchConversationTweets(\n http: PluginHttpClient,\n secrets: PluginSecretsClient,\n logger: PluginLogger,\n bearerRef: string,\n conversationId: string,\n): Promise<EnrichedTweet[]> {\n const bearerToken = await secrets.resolve(bearerRef);\n const query = encodeURIComponent(`conversation_id:${conversationId}`);\n const url = `${X_API_BASE}/tweets/search/recent?query=${query}&tweet.fields=${TWEET_FIELDS}&expansions=${EXPANSIONS}&user.fields=${USER_FIELDS}&max_results=100`;\n\n logger.debug(\"Fetching conversation tweets\", { conversationId });\n\n const response = await http.fetch(url, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${bearerToken}` },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n logger.warn(\"Conversation search failed\", { status: response.status, error: errorText });\n return [];\n }\n\n const data = (await response.json()) as XApiTweetLookupResponse;\n\n const userMap = new Map<string, XApiUser>();\n if (data.includes?.users) {\n for (const user of data.includes.users) userMap.set(user.id, user);\n }\n\n const tweets: EnrichedTweet[] = [];\n if (data.data) {\n for (const tweet of data.data) {\n tweets.push(mapToEnrichedTweet(tweet, userMap.get(tweet.author_id), \"open_discovery\"));\n }\n }\n\n logger.debug(\"Conversation tweets fetched\", { conversationId, count: tweets.length });\n return tweets;\n}\n", "import type {\n EnrichedTweet,\n ScoredTweet,\n ScoringWeights,\n EngagementSubWeights,\n TweetPublicMetrics,\n} from \"../types.js\";\n\n// ---------------------------------------------------------------------------\n// Trigram Jaccard deduplication\n// ---------------------------------------------------------------------------\n\nexport function trigrams(text: string): Set<string> {\n const normalized = text.toLowerCase().replace(/\\s+/g, \" \").trim();\n const set = new Set<string>();\n for (let i = 0; i <= normalized.length - 3; i++) {\n set.add(normalized.substring(i, i + 3));\n }\n return set;\n}\n\nexport function jaccardSimilarity(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) return 1;\n let intersection = 0;\n for (const item of a) {\n if (b.has(item)) intersection++;\n }\n const union = a.size + b.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n\nexport function deduplicateTweets(\n tweets: ScoredTweet[],\n threshold: number,\n): ScoredTweet[] {\n const sorted = [...tweets].sort((a, b) => b.score - a.score);\n const kept: ScoredTweet[] = [];\n const keptTrigrams: Set<string>[] = [];\n\n for (const tweet of sorted) {\n const tweetTri = trigrams(tweet.text);\n let isDuplicate = false;\n\n for (const existingTri of keptTrigrams) {\n if (jaccardSimilarity(tweetTri, existingTri) >= threshold) {\n isDuplicate = true;\n break;\n }\n }\n\n if (!isDuplicate) {\n kept.push(tweet);\n keptTrigrams.push(tweetTri);\n }\n }\n\n return kept;\n}\n\n// ---------------------------------------------------------------------------\n// Scoring\n// ---------------------------------------------------------------------------\n\nfunction logNormalize(value: number): number {\n return Math.log1p(value) / Math.log1p(1000000);\n}\n\nfunction computeEngagementScore(\n metrics: EnrichedTweet[\"metrics\"],\n subWeights: EngagementSubWeights,\n): number {\n const likes = logNormalize(metrics.like_count) * subWeights.likes;\n const reposts = logNormalize(metrics.retweet_count) * subWeights.reposts;\n const replies = logNormalize(metrics.reply_count) * subWeights.replies;\n const quotes = logNormalize(metrics.quote_count) * subWeights.quotes;\n return likes + reposts + replies + quotes;\n}\n\nfunction computeRecencyScore(createdAt: string, now: Date): number {\n const created = new Date(createdAt);\n const ageHours = (now.getTime() - created.getTime()) / (1000 * 60 * 60);\n if (ageHours <= 0) return 1;\n if (ageHours <= 6) return 1;\n if (ageHours <= 24) return 0.9;\n if (ageHours <= 48) return 0.7;\n if (ageHours <= 168) return 0.4;\n return 0.1;\n}\n\nfunction computeRelevanceScore(\n tweet: EnrichedTweet,\n topics: string[],\n): number {\n const textLower = tweet.text.toLowerCase();\n let matchCount = 0;\n for (const topic of topics) {\n const words = topic.toLowerCase().split(/\\s+/);\n const wordMatches = words.filter((w) => textLower.includes(w)).length;\n if (wordMatches >= Math.ceil(words.length * 0.5)) {\n matchCount++;\n }\n }\n // Base relevance: xAI selected it (0.5 baseline) + topic match boost\n const topicBoost = Math.min(matchCount * 0.1, 0.5);\n return Math.min(0.5 + topicBoost, 1.0);\n}\n\n// ---------------------------------------------------------------------------\n// Utility functions\n// ---------------------------------------------------------------------------\n\nconst SINCE_PATTERN = /^(\\d+)([hd])$/;\n\nexport function parseSince(since: string): Date | null {\n const match = SINCE_PATTERN.exec(since.trim());\n if (match) {\n const amount = parseInt(match[1]!, 10);\n const unit = match[2];\n const ms = unit === \"h\" ? amount * 3600000 : amount * 86400000;\n return new Date(Date.now() - ms);\n }\n // Try ISO date (YYYY-MM-DD)\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(since)) {\n const d = new Date(since);\n return isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nexport function computeTotalEngagement(metrics: TweetPublicMetrics): number {\n return (\n metrics.like_count +\n metrics.retweet_count +\n metrics.reply_count +\n metrics.quote_count\n );\n}\n\n// ---------------------------------------------------------------------------\n// Composite scoring\n// ---------------------------------------------------------------------------\n\nexport function scoreTweets(\n tweets: EnrichedTweet[],\n weights: ScoringWeights,\n subWeights: EngagementSubWeights,\n authorityBoost: number,\n authorityHandles: Set<string>,\n authorityByDomain: Map<string, string[]>,\n topics: string[],\n now?: Date,\n): ScoredTweet[] {\n const scoreTime = now ?? new Date();\n\n return tweets.map((tweet) => {\n const relevance = computeRelevanceScore(tweet, topics);\n const recency = computeRecencyScore(tweet.created_at, scoreTime);\n const engagement = computeEngagementScore(tweet.metrics, subWeights);\n\n const isAuthority = authorityHandles.has(tweet.author_username.toLowerCase());\n const authorityDomains: string[] = [];\n for (const [domain, handles] of authorityByDomain) {\n if (handles.some((h) => h.toLowerCase() === tweet.author_username.toLowerCase())) {\n authorityDomains.push(domain);\n }\n }\n\n const score =\n relevance * weights.relevance +\n (isAuthority ? authorityBoost : 0) +\n recency * weights.recency +\n engagement * weights.engagement;\n\n return {\n ...tweet,\n score: Math.min(score, 1.0),\n relevance_score: relevance,\n recency_score: recency,\n engagement_score: engagement,\n is_authority: isAuthority,\n authority_domains: authorityDomains,\n };\n });\n}\n", "/**\n * Query decomposition \u2014 builds the set of xAI search queries from config topics.\n */\n\nexport interface DecomposedQuery {\n text: string;\n topic: string;\n phase: \"open\" | \"focused\";\n handles?: string[];\n}\n\nexport function buildOpenQueries(\n topics: string[],\n keywords: string[],\n dateStr: string,\n): DecomposedQuery[] {\n const queries: DecomposedQuery[] = [];\n\n for (const topic of topics) {\n queries.push({\n text: `What are people saying about ${topic} today (${dateStr})?`,\n topic,\n phase: \"open\",\n });\n }\n\n for (const keyword of keywords) {\n queries.push({\n text: `What are people saying about ${keyword} today (${dateStr})?`,\n topic: keyword,\n phase: \"open\",\n });\n }\n\n return queries;\n}\n\nexport function buildFocusedQueries(\n topics: string[],\n authorityByDomain: Map<string, string[]>,\n activeHandles: Map<string, { engagement: number; relevance: number; domains: string[] }>,\n dateStr: string,\n): DecomposedQuery[] {\n const queries: DecomposedQuery[] = [];\n\n // Get top active handles sorted by combined engagement + relevance\n const sortedActive = [...activeHandles.entries()]\n .sort(([, a], [, b]) => (b.engagement + b.relevance) - (a.engagement + a.relevance))\n .map(([handle]) => handle);\n\n for (const topic of topics) {\n // Find which domain this topic best matches\n const domainHandles = findBestDomainHandles(topic, authorityByDomain);\n\n // Build handle rotation: top 5 authority + top 5 active = max 10\n const authoritySlice = domainHandles.slice(0, 5);\n const activeSlice = sortedActive\n .filter((h) => !authoritySlice.includes(h))\n .slice(0, 5);\n const combinedHandles = [...authoritySlice, ...activeSlice].slice(0, 10);\n\n if (combinedHandles.length === 0) continue;\n\n queries.push({\n text: `What are these accounts saying about ${topic} today (${dateStr})?`,\n topic,\n phase: \"focused\",\n handles: combinedHandles,\n });\n }\n\n // Rotation queries for large authority lists\n for (const [domain, handles] of authorityByDomain) {\n if (handles.length <= 5) continue;\n\n // Generate additional rotation queries for handles [6-10], [11-15], etc.\n for (let offset = 5; offset < handles.length; offset += 5) {\n const rotationSlice = handles.slice(offset, offset + 5);\n const activeSlice = sortedActive\n .filter((h) => !rotationSlice.includes(h))\n .slice(0, 5);\n const combinedHandles = [...rotationSlice, ...activeSlice].slice(0, 10);\n\n if (combinedHandles.length === 0) continue;\n\n queries.push({\n text: `What are these accounts saying about ${domain} today (${dateStr})?`,\n topic: domain,\n phase: \"focused\",\n handles: combinedHandles,\n });\n }\n }\n\n return queries;\n}\n\nfunction findBestDomainHandles(\n topic: string,\n authorityByDomain: Map<string, string[]>,\n): string[] {\n const topicLower = topic.toLowerCase();\n let bestMatch = \"\";\n let bestScore = 0;\n\n for (const [domain] of authorityByDomain) {\n const domainWords = domain.toLowerCase().split(/[_\\s]+/);\n const matchCount = domainWords.filter((w) => topicLower.includes(w)).length;\n if (matchCount > bestScore) {\n bestScore = matchCount;\n bestMatch = domain;\n }\n }\n\n return bestMatch ? (authorityByDomain.get(bestMatch) ?? []) : [];\n}\n", "import type { PluginEntitiesClient, PluginLogger } from \"@paperclipai/plugin-sdk\";\nimport type { HandleTrackerData, HandleStatus, PromotionPolicy, EnrichedTweet } from \"../types.js\";\nimport { ENTITY_TYPES } from \"../constants.js\";\n\nexport interface HandleUpdate {\n username: string;\n relevance: number;\n domains: string[];\n followedByExisting: string[];\n tweetId?: string;\n userId?: string;\n followersCount?: number;\n verifiedType?: string;\n}\n\nexport async function updateHandleTracker(\n entities: PluginEntitiesClient,\n logger: PluginLogger,\n updates: HandleUpdate[],\n existingAuthority: Set<string>,\n): Promise<{ discovered: number; updated: number }> {\n let discovered = 0;\n let updated = 0;\n\n for (const update of updates) {\n const usernameLower = update.username.toLowerCase();\n if (existingAuthority.has(usernameLower)) continue;\n\n const existing = await entities.list({\n entityType: ENTITY_TYPES.handle,\n externalId: usernameLower,\n limit: 1,\n });\n\n const now = new Date().toISOString().split(\"T\")[0]!;\n\n if (existing.length > 0) {\n const record = existing[0]!;\n const data = record.data as unknown as HandleTrackerData;\n const newAppearances = data.appearances + 1;\n const newAvgRelevance =\n (data.avg_relevance * data.appearances + update.relevance) / newAppearances;\n const newDomains = [...new Set([...data.domains, ...update.domains])];\n const newSampleIds = update.tweetId\n ? [...new Set([...data.sample_tweet_ids, update.tweetId])].slice(-10)\n : data.sample_tweet_ids;\n const newFollowedBy = [...new Set([...data.followed_by_existing, ...update.followedByExisting])];\n\n await entities.upsert({\n entityType: ENTITY_TYPES.handle,\n scopeKind: \"instance\",\n externalId: usernameLower,\n title: usernameLower,\n status: record.status ?? \"discovered\",\n data: {\n ...data,\n last_seen: now,\n appearances: newAppearances,\n avg_relevance: Math.round(newAvgRelevance * 1000) / 1000,\n domains: newDomains,\n followed_by_existing: newFollowedBy,\n sample_tweet_ids: newSampleIds,\n followers_count: update.followersCount ?? data.followers_count,\n verified_type: update.verifiedType ?? data.verified_type,\n x_user_id: update.userId ?? data.x_user_id,\n } satisfies HandleTrackerData,\n });\n updated++;\n } else {\n const data: HandleTrackerData = {\n first_seen: now,\n last_seen: now,\n appearances: 1,\n avg_relevance: update.relevance,\n domains: update.domains,\n followed_by_existing: update.followedByExisting,\n x_user_id: update.userId,\n followers_count: update.followersCount ?? 0,\n verified_type: update.verifiedType,\n sample_tweet_ids: update.tweetId ? [update.tweetId] : [],\n promoted_to_list: null,\n notes: \"\",\n };\n\n await entities.upsert({\n entityType: ENTITY_TYPES.handle,\n scopeKind: \"instance\",\n externalId: usernameLower,\n title: usernameLower,\n status: \"discovered\",\n data: data as unknown as Record<string, unknown>,\n });\n discovered++;\n }\n }\n\n logger.info(\"Handle tracker updated\", { discovered, updated });\n return { discovered, updated };\n}\n\nexport async function evaluatePromotions(\n entities: PluginEntitiesClient,\n logger: PluginLogger,\n policy: PromotionPolicy,\n): Promise<Array<{ username: string; status: HandleStatus; data: HandleTrackerData }>> {\n const candidates: Array<{ username: string; status: HandleStatus; data: HandleTrackerData }> = [];\n\n const handles = await entities.list({\n entityType: ENTITY_TYPES.handle,\n limit: 200,\n });\n\n for (const handle of handles) {\n const data = handle.data as unknown as HandleTrackerData;\n const currentStatus = (handle.status ?? \"discovered\") as HandleStatus;\n\n if (currentStatus === \"promoted\") continue;\n\n // Check auto-promote threshold\n if (\n data.appearances >= policy.auto_promote_threshold.min_appearances &&\n data.avg_relevance >= policy.auto_promote_threshold.min_avg_relevance &&\n data.followed_by_existing.length >= policy.auto_promote_threshold.min_mutual_overlap\n ) {\n await entities.upsert({\n entityType: ENTITY_TYPES.handle,\n scopeKind: \"instance\",\n externalId: handle.externalId!,\n title: handle.title ?? handle.externalId!,\n status: \"promoted\",\n data: handle.data,\n });\n candidates.push({ username: handle.externalId!, status: \"promoted\", data });\n logger.info(\"Handle auto-promoted\", { handle: handle.externalId });\n continue;\n }\n\n // Check candidate threshold\n if (\n currentStatus === \"discovered\" &&\n data.appearances >= policy.candidate_threshold.min_appearances &&\n data.avg_relevance >= policy.candidate_threshold.min_avg_relevance\n ) {\n await entities.upsert({\n entityType: ENTITY_TYPES.handle,\n scopeKind: \"instance\",\n externalId: handle.externalId!,\n title: handle.title ?? handle.externalId!,\n status: \"candidate\",\n data: handle.data,\n });\n candidates.push({ username: handle.externalId!, status: \"candidate\", data });\n logger.info(\"Handle promoted to candidate\", { handle: handle.externalId });\n }\n }\n\n return candidates;\n}\n\nexport async function decayHandles(\n entities: PluginEntitiesClient,\n logger: PluginLogger,\n trackingWindowDays: number,\n): Promise<number> {\n const handles = await entities.list({\n entityType: ENTITY_TYPES.handle,\n limit: 500,\n });\n\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - trackingWindowDays);\n const cutoffStr = cutoffDate.toISOString().split(\"T\")[0]!;\n\n let decayed = 0;\n\n for (const handle of handles) {\n const data = handle.data as unknown as HandleTrackerData;\n const status = (handle.status ?? \"discovered\") as HandleStatus;\n\n if (status === \"promoted\") continue;\n if (data.last_seen >= cutoffStr) continue;\n\n // Downgrade: candidate \u2192 discovered, discovered \u2192 remove\n if (status === \"candidate\") {\n await entities.upsert({\n entityType: ENTITY_TYPES.handle,\n scopeKind: \"instance\",\n externalId: handle.externalId!,\n title: handle.title ?? handle.externalId!,\n status: \"discovered\",\n data: handle.data,\n });\n decayed++;\n }\n // Note: We don't delete discovered handles \u2014 they just become stale\n // and won't be used in queries since they don't meet any threshold\n }\n\n logger.info(\"Handle decay complete\", { decayed });\n return decayed;\n}\n\nexport function buildHandleUpdatesFromTweets(\n tweets: EnrichedTweet[],\n topics: string[],\n authorityByDomain: Map<string, string[]>,\n): HandleUpdate[] {\n const handleMap = new Map<string, HandleUpdate>();\n\n // Build reverse lookup: authority handle \u2192 domains\n const authorityDomains = new Map<string, string[]>();\n for (const [domain, handles] of authorityByDomain) {\n for (const h of handles) {\n const lower = h.toLowerCase();\n const existing = authorityDomains.get(lower) ?? [];\n existing.push(domain);\n authorityDomains.set(lower, existing);\n }\n }\n\n // Map each topic to authority domain keys where ALL key words appear in the topic\n const topicToDomainKeys = new Map<string, string[]>();\n for (const topic of topics) {\n const topicLower = topic.toLowerCase();\n const matched: string[] = [];\n for (const [domainKey] of authorityByDomain) {\n const keyWords = domainKey.toLowerCase().split(/[_\\s]+/);\n if (keyWords.every((w) => topicLower.includes(w))) {\n matched.push(domainKey);\n }\n }\n if (matched.length > 0) topicToDomainKeys.set(topic, matched);\n }\n\n // Collect which authority domain keys each handle's tweets match\n const handleDomainKeyMap = new Map<string, Set<string>>();\n\n for (const tweet of tweets) {\n const username = tweet.author_username.toLowerCase();\n const existing = handleMap.get(username);\n\n // Topic matching: require \u226550% of topic words to match (aligned with scoring.ts)\n const domains: string[] = [];\n const textLower = tweet.text.toLowerCase();\n for (const topic of topics) {\n const words = topic.toLowerCase().split(/\\s+/);\n const wordMatches = words.filter((w) => textLower.includes(w)).length;\n if (wordMatches >= Math.ceil(words.length * 0.5)) {\n domains.push(topic);\n }\n }\n\n // Track authority domain keys (not topic strings) for co-occurrence\n const domainKeySet = handleDomainKeyMap.get(username) ?? new Set<string>();\n for (const d of domains) {\n const keys = topicToDomainKeys.get(d);\n if (keys) for (const k of keys) domainKeySet.add(k);\n }\n handleDomainKeyMap.set(username, domainKeySet);\n\n if (existing) {\n existing.relevance = Math.max(existing.relevance, 0.5);\n existing.domains = [...new Set([...existing.domains, ...domains])];\n if (tweet.tweet_id) existing.tweetId = tweet.tweet_id;\n } else {\n handleMap.set(username, {\n username,\n relevance: 0.5,\n domains,\n followedByExisting: [],\n tweetId: tweet.tweet_id,\n userId: tweet.author_id,\n followersCount: tweet.author_followers_count,\n verifiedType: tweet.author_verified_type,\n });\n }\n }\n\n // Compute followed_by_existing: authority handles that share domain keys with this handle\n for (const [username, update] of handleMap) {\n const myDomainKeys = handleDomainKeyMap.get(username);\n if (!myDomainKeys || myDomainKeys.size === 0) continue;\n\n const coOccurring = new Set<string>();\n for (const [authHandle, authDomainKeys] of authorityDomains) {\n if (authDomainKeys.some((d) => myDomainKeys.has(d))) {\n coOccurring.add(authHandle);\n }\n }\n update.followedByExisting = [...coOccurring];\n }\n\n return [...handleMap.values()];\n}\n", "import type { DecomposedQuery } from \"./queries.js\";\nimport type { ScoredTweet } from \"../types.js\";\n\n/**\n * Build 5 decomposed queries for a topic, following the x-research-skill\n * pattern of core / expert voices / pain points / positive signals / link-based.\n */\nexport function buildTopicQueries(topic: string, dateStr: string): DecomposedQuery[] {\n return [\n {\n text: `What are people saying about ${topic} today (${dateStr})? Focus on significant discussions, breaking developments, and notable opinions.`,\n topic: \"core\",\n phase: \"open\" as const,\n },\n {\n text: `Which experts, analysts, or thought leaders are currently discussing ${topic}? What insights and perspectives are they sharing?`,\n topic: \"expert_voices\",\n phase: \"open\" as const,\n },\n {\n text: `What problems, complaints, concerns, or risks are people raising about ${topic}? What pain points are being discussed?`,\n topic: \"pain_points\",\n phase: \"open\" as const,\n },\n {\n text: `What positive developments, innovations, breakthroughs, or success stories related to ${topic} are being shared?`,\n topic: \"positive_signals\",\n phase: \"open\" as const,\n },\n {\n text: `What articles, research papers, blog posts, or reports about ${topic} are being shared and discussed on X?`,\n topic: \"link_based\",\n phase: \"open\" as const,\n },\n ];\n}\n\n/**\n * Filter existing corpus tweets by topic relevance using word-match scoring.\n * Returns matches sorted by composite score descending.\n */\nexport function crossReferenceCorpus(topic: string, corpus: ScoredTweet[]): ScoredTweet[] {\n const topicWords = topic.toLowerCase().split(/\\s+/).filter((w) => w.length > 2);\n const threshold = Math.max(1, Math.ceil(topicWords.length * 0.4));\n\n return corpus\n .filter((tweet) => {\n const textLower = tweet.text.toLowerCase();\n const matchCount = topicWords.filter((w) => textLower.includes(w)).length;\n return matchCount >= threshold;\n })\n .sort((a, b) => b.score - a.score);\n}\n", "import {\n definePlugin,\n runWorker,\n type PluginContext,\n type PluginJobContext,\n type ToolResult,\n type ToolRunContext,\n} from \"@paperclipai/plugin-sdk\";\nimport {\n DEFAULT_CONFIG,\n ENTITY_TYPES,\n EVENT_NAMES,\n JOB_KEYS,\n STATE_KEYS,\n TOOL_NAMES,\n} from \"./constants.js\";\nimport type {\n PluginConfig,\n ScoredTweet,\n CorpusSummary,\n EnrichedTweet,\n HandleTrackerData,\n TweetRating,\n TweetRatingValue,\n AnalyzeTopicResult,\n ThreadResult,\n CorpusBrowserData,\n} from \"./types.js\";\nimport {\n xaiSearch,\n deduplicateIds,\n batchLookupTweets,\n scoreTweets,\n deduplicateTweets,\n buildOpenQueries,\n buildFocusedQueries,\n updateHandleTracker,\n evaluatePromotions,\n decayHandles,\n buildHandleUpdatesFromTweets,\n verifyTweetExists,\n parseSince,\n computeTotalEngagement,\n buildTopicQueries,\n crossReferenceCorpus,\n fetchTweetWithConversationId,\n fetchConversationTweets,\n} from \"./pipeline/index.js\";\n\n// ---------------------------------------------------------------------------\n// Tweet URL helper\n// ---------------------------------------------------------------------------\n\nfunction tweetUrl(authorUsername: string, tweetId: string): string {\n if (!authorUsername || authorUsername === \"unknown\") {\n return `https://x.com/i/status/${tweetId}`;\n }\n return `https://x.com/${authorUsername}/status/${tweetId}`;\n}\n\nfunction withUrl<T extends { tweet_id: string; author_username: string }>(tweet: T): T & { url: string } {\n return { ...tweet, url: tweetUrl(tweet.author_username, tweet.tweet_id) };\n}\n\n// ---------------------------------------------------------------------------\n// Config helper\n// ---------------------------------------------------------------------------\n\nasync function getConfig(ctx: PluginContext): Promise<PluginConfig> {\n const raw = await ctx.config.get();\n return { ...DEFAULT_CONFIG, ...raw } as unknown as PluginConfig;\n}\n\nfunction buildAuthorityMaps(config: PluginConfig) {\n const allHandles = new Set<string>();\n const byDomain = new Map<string, string[]>();\n for (const [domain, list] of Object.entries(config.authority_lists)) {\n const handles = list.handles.map((h) => h.toLowerCase());\n byDomain.set(domain, handles);\n for (const h of handles) allHandles.add(h);\n }\n return { allHandles, byDomain };\n}\n\n// ---------------------------------------------------------------------------\n// Module-level ctx reference for lifecycle hooks\n// ---------------------------------------------------------------------------\n\nlet pluginCtx: PluginContext | null = null;\n\n// ---------------------------------------------------------------------------\n// Discovery pipeline (runs as job handler)\n// ---------------------------------------------------------------------------\n\nasync function runDiscoveryPipeline(ctx: PluginContext, job: PluginJobContext): Promise<void> {\n const config = await getConfig(ctx);\n const today = new Date().toISOString().split(\"T\")[0]!;\n const threeDaysAgo = new Date(Date.now() - 3 * 86400000).toISOString().split(\"T\")[0]!;\n const { allHandles, byDomain } = buildAuthorityMaps(config);\n\n ctx.logger.info(\"Discovery pipeline started\", { date: today, jobRunId: job.runId });\n await ctx.metrics.write(\"pipeline.run.started\", 1);\n\n // ----- Stage 1: Open Discovery -----\n const openQueries = buildOpenQueries(config.semantic_topics, config.keyword_searches, today);\n const openTweetIdArrays: string[][] = [];\n let totalXaiCost = 0;\n\n for (const query of openQueries) {\n try {\n const result = await xaiSearch(\n ctx.http, ctx.secrets, ctx.logger,\n config.xai_api_key_ref,\n { query: query.text, fromDate: threeDaysAgo, toDate: today, excludedHandles: config.global_excluded },\n );\n openTweetIdArrays.push(result.tweetIds);\n totalXaiCost += result.costUsdTicks;\n } catch (err) {\n ctx.logger.warn(\"Open discovery query failed\", {\n query: query.text,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const openTweetIds = deduplicateIds(openTweetIdArrays);\n ctx.logger.info(\"Stage 1 complete: open discovery\", {\n queriesRun: openQueries.length,\n uniqueTweetIds: openTweetIds.length,\n });\n\n // Intermediate enrichment to identify active handles\n const openTweets = await batchLookupTweets(\n ctx.http, ctx.secrets, ctx.logger,\n config.x_api_bearer_ref, openTweetIds, \"open_discovery\",\n );\n\n // Build active handle map from open discovery results\n const activeHandles = new Map<string, { engagement: number; relevance: number; domains: string[] }>();\n for (const tweet of openTweets) {\n const username = tweet.author_username.toLowerCase();\n if (allHandles.has(username) || config.global_excluded.includes(username)) continue;\n const engagement = tweet.metrics.like_count + tweet.metrics.retweet_count * 2;\n const existing = activeHandles.get(username);\n if (existing) {\n existing.engagement = Math.max(existing.engagement, engagement);\n } else {\n activeHandles.set(username, { engagement, relevance: 0.5, domains: [] });\n }\n }\n\n // ----- Stage 2: Focused Discovery -----\n const focusedQueries = buildFocusedQueries(\n config.semantic_topics, byDomain, activeHandles, today,\n );\n const focusedTweetIdArrays: string[][] = [];\n\n for (const query of focusedQueries) {\n try {\n const result = await xaiSearch(\n ctx.http, ctx.secrets, ctx.logger,\n config.xai_api_key_ref,\n {\n query: query.text,\n fromDate: threeDaysAgo,\n toDate: today,\n allowedHandles: query.handles,\n },\n );\n focusedTweetIdArrays.push(result.tweetIds);\n totalXaiCost += result.costUsdTicks;\n\n if (result.tweetIds.length === 0 && query.handles?.length) {\n ctx.logger.warn(\"Focused query returned 0 results \u2014 handle set may be inactive\", {\n topic: query.topic,\n handles: query.handles,\n });\n }\n } catch (err) {\n ctx.logger.warn(\"Focused discovery query failed\", {\n query: query.text,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const focusedTweetIds = deduplicateIds(focusedTweetIdArrays);\n // Remove IDs already fetched in Stage 1\n const openIdSet = new Set(openTweetIds);\n const newFocusedIds = focusedTweetIds.filter((id) => !openIdSet.has(id));\n\n ctx.logger.info(\"Stage 2 complete: focused discovery\", {\n queriesRun: focusedQueries.length,\n newTweetIds: newFocusedIds.length,\n });\n\n // ----- Stage 3: Enrichment -----\n const focusedTweets = await batchLookupTweets(\n ctx.http, ctx.secrets, ctx.logger,\n config.x_api_bearer_ref, newFocusedIds, \"focused\",\n );\n\n // Mark tweets found in both stages\n const focusedIdSet = new Set(focusedTweetIds);\n const allTweets: EnrichedTweet[] = openTweets.map((t) =>\n focusedIdSet.has(t.tweet_id) ? { ...t, source: \"both\" as const } : t,\n );\n allTweets.push(...focusedTweets);\n\n ctx.logger.info(\"Stage 3 complete: enrichment\", { totalTweets: allTweets.length });\n\n // ----- Stage 4: Scoring & Storage -----\n const scored = scoreTweets(\n allTweets,\n config.scoring_weights,\n config.engagement_sub_weights,\n config.authority_boost,\n allHandles,\n byDomain,\n config.semantic_topics,\n );\n\n const deduplicated = deduplicateTweets(scored, config.dedup_threshold);\n const corpus = deduplicated.slice(0, config.max_corpus_size);\n\n ctx.logger.info(\"Stage 4: scoring & dedup\", {\n scored: scored.length,\n afterDedup: deduplicated.length,\n finalCorpus: corpus.length,\n });\n\n // Emit high-engagement events before storage\n const engagementThresholds = config.engagement_thresholds ?? DEFAULT_CONFIG.engagement_thresholds;\n for (const tweet of corpus) {\n const totalEngagement = computeTotalEngagement(tweet.metrics);\n if (totalEngagement >= engagementThresholds.escalation) {\n await ctx.events.emit(EVENT_NAMES.tweetHighEngagement, config.company_id, {\n tweet_id: tweet.tweet_id,\n author_username: tweet.author_username,\n text: tweet.text.slice(0, 280),\n url: tweetUrl(tweet.author_username, tweet.tweet_id),\n score: tweet.score,\n total_engagement: totalEngagement,\n metrics: tweet.metrics,\n is_authority: tweet.is_authority,\n threshold_crossed: \"escalation\",\n });\n await ctx.metrics.write(\"pipeline.tweet.high_engagement\", 1);\n }\n }\n\n // Store tweets as entities\n for (const tweet of corpus) {\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.tweet,\n scopeKind: \"instance\",\n externalId: tweet.tweet_id,\n title: `@${tweet.author_username}: ${tweet.text.slice(0, 80)}`,\n status: \"active\",\n data: tweet as unknown as Record<string, unknown>,\n });\n }\n\n // Update handle tracker\n const handleUpdates = buildHandleUpdatesFromTweets(allTweets, config.semantic_topics, byDomain);\n const handleStats = await updateHandleTracker(\n ctx.entities, ctx.logger, handleUpdates, allHandles,\n );\n\n // Evaluate promotions\n const promotions = await evaluatePromotions(\n ctx.entities, ctx.logger, config.authority_promotion_policy,\n );\n\n // Store daily corpus summary\n const summary: CorpusSummary = {\n date: today,\n total_tweets: corpus.length,\n top_items: corpus.slice(0, 10),\n by_pillar: {},\n discovery_stats: {\n open_queries: openQueries.length,\n focused_queries: focusedQueries.length,\n total_tweet_ids_extracted: openTweetIds.length + focusedTweetIds.length,\n tweets_after_dedup: deduplicated.length,\n tweets_after_scoring: corpus.length,\n new_handles_discovered: handleStats.discovered,\n handles_promoted: promotions.length,\n xai_cost_estimate: totalXaiCost / 1_000_000_000,\n x_api_cost_estimate: allTweets.length * 0.01,\n },\n generated_at: new Date().toISOString(),\n };\n\n await ctx.state.set(\n { scopeKind: \"instance\", stateKey: `${STATE_KEYS.corpusPrefix}${today}` },\n summary,\n );\n await ctx.state.set(\n { scopeKind: \"instance\", stateKey: STATE_KEYS.lastDiscoveryRun },\n { date: today, corpusSize: corpus.length, generatedAt: summary.generated_at },\n );\n\n // Emit enhanced corpus.updated event\n await ctx.events.emit(EVENT_NAMES.corpusUpdated, config.company_id, {\n date: today,\n corpusSize: corpus.length,\n topScore: corpus[0]?.score ?? 0,\n top_items: corpus.slice(0, 5).map((t) => ({\n tweet_id: t.tweet_id,\n author_username: t.author_username,\n score: t.score,\n text: t.text.slice(0, 140),\n url: tweetUrl(t.author_username, t.tweet_id),\n is_authority: t.is_authority,\n })),\n stats: summary.discovery_stats,\n authority_count: Object.values(config.authority_lists).reduce((n, l) => n + l.handles.length, 0),\n handle_candidates: handleStats.discovered,\n });\n\n for (const promo of promotions) {\n if (promo.status === \"promoted\") {\n await ctx.events.emit(EVENT_NAMES.handlePromoted, config.company_id, {\n handle: promo.username,\n status: promo.status,\n appearances: promo.data.appearances,\n avgRelevance: promo.data.avg_relevance,\n });\n }\n }\n\n await ctx.activity.log({\n companyId: config.company_id,\n message: `X Intelligence discovery complete: ${corpus.length} tweets scored, ${handleStats.discovered} new handles discovered`,\n metadata: summary.discovery_stats as unknown as Record<string, unknown>,\n });\n\n await ctx.metrics.write(\"pipeline.run.completed\", 1);\n await ctx.metrics.write(\"pipeline.corpus.size\", corpus.length);\n await ctx.metrics.write(\"pipeline.handles.discovered\", handleStats.discovered);\n await ctx.metrics.write(\"pipeline.cost.xai\", totalXaiCost / 1_000_000_000);\n\n ctx.logger.info(\"Discovery pipeline complete\", {\n date: today,\n corpusSize: corpus.length,\n totalCostEstimate: `$${(totalXaiCost / 1_000_000_000 + allTweets.length * 0.01).toFixed(2)}`,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Job handlers\n// ---------------------------------------------------------------------------\n\nasync function handleAuthorityDecay(ctx: PluginContext, _job: PluginJobContext): Promise<void> {\n const config = await getConfig(ctx);\n const decayed = await decayHandles(\n ctx.entities, ctx.logger, config.authority_promotion_policy.tracking_window_days,\n );\n await ctx.metrics.write(\"handles.decayed\", decayed);\n ctx.logger.info(\"Authority decay job complete\", { decayed });\n}\n\nasync function handleComplianceCheck(ctx: PluginContext, _job: PluginJobContext): Promise<void> {\n const config = await getConfig(ctx);\n const tweets = await ctx.entities.list({ entityType: ENTITY_TYPES.tweet, limit: 200 });\n let removed = 0;\n\n for (const tweet of tweets) {\n const tweetId = tweet.externalId;\n if (!tweetId) continue;\n try {\n const exists = await verifyTweetExists(\n ctx.http, ctx.secrets, config.x_api_bearer_ref, tweetId,\n );\n if (!exists) {\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.tweet,\n scopeKind: \"instance\",\n externalId: tweetId,\n title: tweet.title ?? tweetId,\n status: \"removed\",\n data: { ...tweet.data, removed_reason: \"deleted_or_suspended\", removed_at: new Date().toISOString() },\n });\n removed++;\n }\n } catch {\n // Rate limit or network error \u2014 skip this tweet\n }\n }\n\n await ctx.metrics.write(\"compliance.tweets_removed\", removed);\n ctx.logger.info(\"Compliance check complete\", { checked: tweets.length, removed });\n}\n\nasync function handleCorpusRetention(ctx: PluginContext, _job: PluginJobContext): Promise<void> {\n const config = await getConfig(ctx);\n const cutoff = new Date();\n cutoff.setDate(cutoff.getDate() - config.corpus_retention_days);\n const cutoffStr = cutoff.toISOString().split(\"T\")[0]!;\n\n const tweets = await ctx.entities.list({ entityType: ENTITY_TYPES.tweet, limit: 500 });\n let archived = 0;\n\n for (const tweet of tweets) {\n const data = tweet.data as Record<string, unknown>;\n const createdAt = typeof data.created_at === \"string\" ? data.created_at.split(\"T\")[0] : null;\n if (createdAt && createdAt < cutoffStr) {\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.tweet,\n scopeKind: \"instance\",\n externalId: tweet.externalId!,\n title: tweet.title ?? tweet.externalId!,\n status: \"archived\",\n data: { ...tweet.data, archived_at: new Date().toISOString() },\n });\n archived++;\n }\n }\n\n await ctx.metrics.write(\"retention.tweets_archived\", archived);\n ctx.logger.info(\"Corpus retention complete\", { archived });\n}\n\n// ---------------------------------------------------------------------------\n// Tool handlers \u2014 existing (enhanced)\n// ---------------------------------------------------------------------------\n\nasync function handleSearchCorpus(\n ctx: PluginContext,\n params: unknown,\n _runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const query = typeof p.query === \"string\" ? p.query.toLowerCase() : \"\";\n const date = typeof p.date === \"string\" ? p.date : undefined;\n const pillar = typeof p.pillar === \"string\" ? p.pillar.toLowerCase() : undefined;\n const limit = typeof p.limit === \"number\" ? p.limit : 20;\n const minScore = typeof p.min_score === \"number\" ? p.min_score : 0;\n const minEngagement = typeof p.min_engagement === \"number\" ? p.min_engagement : 0;\n const since = typeof p.since === \"string\" ? p.since : undefined;\n\n const sinceDate = since ? parseSince(since) : null;\n\n const tweets = await ctx.entities.list({\n entityType: ENTITY_TYPES.tweet,\n limit: 500,\n });\n\n const results: ScoredTweet[] = [];\n for (const tweet of tweets) {\n if (tweet.status === \"removed\" || tweet.status === \"archived\") continue;\n const data = tweet.data as unknown as ScoredTweet;\n if (query && !data.text.toLowerCase().includes(query)) continue;\n if (date && !(data.created_at?.startsWith(date) ?? false)) continue;\n if (sinceDate && new Date(data.created_at) < sinceDate) continue;\n if (pillar && !(data.authority_domains?.some((d) => d.toLowerCase().includes(pillar)) ?? false)) continue;\n if (data.score < minScore) continue;\n if (minEngagement > 0 && computeTotalEngagement(data.metrics) < minEngagement) continue;\n results.push(data);\n }\n\n results.sort((a, b) => b.score - a.score);\n const limited = results.slice(0, limit).map(withUrl);\n\n const topLinks = limited.slice(0, 5).map((t) => `- @${t.author_username} (score: ${t.score.toFixed(1)}): ${t.url}`).join(\"\\n\");\n\n return {\n content: `Found ${limited.length} of ${results.length} tweets matching \"${query}\"\\n\\nTop results:\\n${topLinks}`,\n data: limited,\n };\n}\n\nasync function handleGetToday(\n ctx: PluginContext,\n params: unknown,\n _runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const pillar = typeof p.pillar === \"string\" ? p.pillar : undefined;\n const limit = typeof p.limit === \"number\" ? p.limit : 20;\n const minScore = typeof p.min_score === \"number\" ? p.min_score : 0;\n const today = new Date().toISOString().split(\"T\")[0]!;\n\n // Read from entities directly (not truncated state summary)\n const tweets = await ctx.entities.list({\n entityType: ENTITY_TYPES.tweet,\n limit: 500,\n });\n\n const results: ScoredTweet[] = [];\n for (const tweet of tweets) {\n if (tweet.status === \"removed\" || tweet.status === \"archived\") continue;\n const data = tweet.data as unknown as ScoredTweet;\n if (!data.created_at?.startsWith(today)) continue;\n if (data.score < minScore) continue;\n if (pillar && !(data.authority_domains?.some((d) => d.toLowerCase().includes(pillar.toLowerCase())) ?? false)) continue;\n results.push(data);\n }\n\n results.sort((a, b) => b.score - a.score);\n const limited = results.slice(0, limit).map(withUrl);\n\n // Fetch summary stats for metadata\n const summary = (await ctx.state.get({\n scopeKind: \"instance\",\n stateKey: `${STATE_KEYS.corpusPrefix}${today}`,\n })) as CorpusSummary | null;\n\n const topLinks = limited.slice(0, 5).map((t) => `- @${t.author_username} (score: ${t.score.toFixed(1)}): ${t.url}`).join(\"\\n\");\n\n return {\n content: `Today's corpus: ${results.length} tweets total. Showing top ${limited.length}.\\n\\nTop results:\\n${topLinks}`,\n data: {\n date: today,\n total: results.length,\n items: limited,\n stats: summary?.discovery_stats ?? null,\n },\n };\n}\n\nasync function handleGetAuthorities(\n ctx: PluginContext,\n params: unknown,\n _runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const listName = typeof p.list_name === \"string\" ? p.list_name : undefined;\n const config = await getConfig(ctx);\n\n if (listName) {\n const list = config.authority_lists[listName];\n if (!list) {\n return { error: `Authority list \"${listName}\" not found. Available: ${Object.keys(config.authority_lists).join(\", \")}` };\n }\n return {\n content: `Authority list \"${listName}\": ${list.handles.length} handles`,\n data: { name: listName, ...list },\n };\n }\n\n const summary = Object.entries(config.authority_lists).map(([name, list]) => ({\n name,\n description: list.description,\n handleCount: list.handles.length,\n handles: list.handles,\n lastReviewed: list.last_reviewed,\n }));\n\n return {\n content: `${summary.length} authority lists configured`,\n data: summary,\n };\n}\n\nasync function handleSuggestHandles(\n ctx: PluginContext,\n _params: unknown,\n _runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const handles = await ctx.entities.list({\n entityType: ENTITY_TYPES.handle,\n limit: 200,\n });\n\n const candidates = handles\n .filter((h) => h.status === \"candidate\" || h.status === \"promoted\")\n .map((h) => {\n const data = h.data as unknown as HandleTrackerData;\n return {\n username: h.externalId,\n status: h.status,\n appearances: data.appearances,\n avg_relevance: data.avg_relevance,\n domains: data.domains,\n followers_count: data.followers_count,\n first_seen: data.first_seen,\n last_seen: data.last_seen,\n };\n });\n\n candidates.sort((a, b) => {\n const scoreA = (a.avg_relevance ?? 0) * (a.appearances ?? 0);\n const scoreB = (b.avg_relevance ?? 0) * (b.appearances ?? 0);\n return scoreB - scoreA;\n });\n\n return {\n content: `${candidates.length} handles are candidates or recently promoted`,\n data: candidates,\n };\n}\n\nasync function handleTrackHandle(\n ctx: PluginContext,\n params: unknown,\n _runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const handle = typeof p.handle === \"string\" ? p.handle.toLowerCase().replace(/^@/, \"\") : \"\";\n const relevance = typeof p.relevance === \"number\" ? p.relevance : 0.5;\n const domain = typeof p.domain === \"string\" ? p.domain : \"\";\n\n if (!handle) return { error: \"handle is required\" };\n if (!domain) return { error: \"domain is required\" };\n\n const config = await getConfig(ctx);\n const { allHandles } = buildAuthorityMaps(config);\n\n await updateHandleTracker(ctx.entities, ctx.logger, [\n { username: handle, relevance, domains: [domain], followedByExisting: [] },\n ], allHandles);\n\n return {\n content: `Handle @${handle} tracked with relevance ${relevance} in domain \"${domain}\"`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Tool handlers \u2014 new\n// ---------------------------------------------------------------------------\n\nasync function handleAnalyzeTopic(\n ctx: PluginContext,\n params: unknown,\n _runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const topic = typeof p.topic === \"string\" ? p.topic : \"\";\n const includeCorpus = p.include_corpus !== false;\n\n if (!topic) return { error: \"topic is required\" };\n\n const config = await getConfig(ctx);\n const today = new Date().toISOString().split(\"T\")[0]!;\n\n await ctx.metrics.write(\"tool.analyze_topic.invoked\", 1);\n\n // Build and execute 5 decomposed queries\n const queries = buildTopicQueries(topic, today);\n const freshResults: AnalyzeTopicResult[\"fresh_results\"] = [];\n let totalCost = 0;\n\n for (const query of queries) {\n try {\n const result = await xaiSearch(\n ctx.http, ctx.secrets, ctx.logger,\n config.xai_api_key_ref,\n { query: query.text, fromDate: today, toDate: today, excludedHandles: config.global_excluded },\n );\n freshResults.push({\n tweet_ids: result.tweetIds,\n query_type: query.topic,\n synthesis_text: result.synthesisText,\n });\n totalCost += result.costUsdTicks;\n } catch (err) {\n ctx.logger.warn(\"Analyze topic sub-query failed\", {\n queryType: query.topic,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // Cross-reference corpus\n let corpusMatches: ScoredTweet[] = [];\n if (includeCorpus) {\n const allTweets = await ctx.entities.list({ entityType: ENTITY_TYPES.tweet, limit: 500 });\n const corpus = allTweets\n .filter((t) => t.status === \"active\")\n .map((t) => t.data as unknown as ScoredTweet);\n corpusMatches = crossReferenceCorpus(topic, corpus);\n }\n\n await ctx.metrics.write(\"tool.analyze_topic.cost\", totalCost / 1_000_000_000);\n\n const corpusWithUrls = corpusMatches.slice(0, 10).map(withUrl);\n\n const result: AnalyzeTopicResult = {\n topic,\n synthesis: freshResults.map((r) => `## ${r.query_type}\\n${r.synthesis_text}`).join(\"\\n\\n\"),\n corpus_matches: corpusWithUrls,\n fresh_results: freshResults,\n generated_at: new Date().toISOString(),\n };\n\n const matchLinks = corpusWithUrls.slice(0, 5).map((t) => `- @${t.author_username}: ${t.url}`).join(\"\\n\");\n\n return {\n content: `Topic analysis for \"${topic}\": ${freshResults.length} queries completed, ${corpusMatches.length} corpus matches found.${matchLinks ? `\\n\\nTop corpus matches:\\n${matchLinks}` : \"\"}`,\n data: result,\n };\n}\n\nasync function handleGetThread(\n ctx: PluginContext,\n params: unknown,\n _runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const tweetId = typeof p.tweet_id === \"string\" ? p.tweet_id : \"\";\n\n if (!tweetId) return { error: \"tweet_id is required\" };\n\n const config = await getConfig(ctx);\n await ctx.metrics.write(\"tool.get_thread.invoked\", 1);\n\n try {\n const { tweet, conversationId } = await fetchTweetWithConversationId(\n ctx.http, ctx.secrets, ctx.logger, config.x_api_bearer_ref, tweetId,\n );\n\n const conversationTweets = await fetchConversationTweets(\n ctx.http, ctx.secrets, ctx.logger, config.x_api_bearer_ref, conversationId,\n );\n\n const allThreadTweets = [tweet, ...conversationTweets.filter((t) => t.tweet_id !== tweetId)].map(withUrl);\n\n const result: ThreadResult = {\n root_tweet_id: tweetId,\n conversation_id: conversationId,\n tweets: allThreadTweets,\n total_in_conversation: conversationTweets.length + 1,\n };\n\n const threadLinks = allThreadTweets.map((t) => `- @${t.author_username}: ${t.url}`).join(\"\\n\");\n\n return {\n content: `Thread for tweet ${tweetId}: ${result.tweets.length} tweets in conversation ${conversationId}\\n\\n${threadLinks}`,\n data: result,\n };\n } catch (err) {\n return {\n error: `Failed to fetch thread: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n\nasync function handlePromoteHandle(\n ctx: PluginContext,\n params: unknown,\n runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const handle = typeof p.handle === \"string\" ? p.handle.toLowerCase().replace(/^@/, \"\") : \"\";\n const listName = typeof p.list_name === \"string\" ? p.list_name : \"\";\n const note = typeof p.note === \"string\" ? p.note : \"\";\n\n if (!handle) return { error: \"handle is required\" };\n if (!listName) return { error: \"list_name is required\" };\n\n const config = await getConfig(ctx);\n if (!config.authority_lists[listName]) {\n return { error: `Authority list \"${listName}\" not found. Available: ${Object.keys(config.authority_lists).join(\", \")}` };\n }\n\n const existing = await ctx.entities.list({\n entityType: ENTITY_TYPES.handle,\n externalId: handle,\n limit: 1,\n });\n\n const now = new Date().toISOString();\n\n if (existing.length > 0) {\n const record = existing[0]!;\n const data = record.data as unknown as HandleTrackerData;\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.handle,\n scopeKind: \"instance\",\n externalId: handle,\n title: handle,\n status: \"promoted\",\n data: {\n ...data,\n promoted_to_list: listName,\n notes: note ? `${data.notes ? data.notes + \"; \" : \"\"}Promoted to ${listName}: ${note}` : data.notes,\n } satisfies HandleTrackerData,\n });\n } else {\n const data: HandleTrackerData = {\n first_seen: now.split(\"T\")[0]!,\n last_seen: now.split(\"T\")[0]!,\n appearances: 0,\n avg_relevance: 0,\n domains: [listName],\n followed_by_existing: [],\n followers_count: 0,\n sample_tweet_ids: [],\n promoted_to_list: listName,\n notes: note ? `Manually promoted to ${listName}: ${note}` : `Manually promoted to ${listName}`,\n };\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.handle,\n scopeKind: \"instance\",\n externalId: handle,\n title: handle,\n status: \"promoted\",\n data: data as unknown as Record<string, unknown>,\n });\n }\n\n await ctx.events.emit(EVENT_NAMES.handlePromoted, config.company_id, {\n handle,\n list_name: listName,\n promoted_by: runCtx.agentId ?? \"manual\",\n note,\n });\n\n await ctx.activity.log({\n companyId: config.company_id,\n message: `Handle @${handle} promoted to authority list \"${listName}\"`,\n metadata: { list_name: listName, note },\n });\n\n return {\n content: `Handle @${handle} promoted to authority list \"${listName}\"`,\n };\n}\n\nasync function handleRateTweet(\n ctx: PluginContext,\n params: unknown,\n runCtx: ToolRunContext,\n): Promise<ToolResult> {\n const p = params as Record<string, unknown>;\n const tweetId = typeof p.tweet_id === \"string\" ? p.tweet_id : \"\";\n const rating = typeof p.rating === \"string\" ? p.rating : \"\";\n const ratedBy = typeof p.rated_by === \"string\" ? p.rated_by : runCtx.agentId ?? \"unknown\";\n\n if (!tweetId) return { error: \"tweet_id is required\" };\n if (![\"relevant\", \"irrelevant\", \"skip\"].includes(rating)) {\n return { error: 'rating must be \"relevant\", \"irrelevant\", or \"skip\"' };\n }\n\n const existing = await ctx.entities.list({\n entityType: ENTITY_TYPES.tweet,\n externalId: tweetId,\n limit: 1,\n });\n\n if (existing.length === 0) {\n return { error: `Tweet ${tweetId} not found in corpus` };\n }\n\n const record = existing[0]!;\n const data = record.data as Record<string, unknown>;\n const existingRatings: TweetRating[] = (Array.isArray(data.ratings) ? data.ratings : []) as TweetRating[];\n\n const newRating: TweetRating = {\n rated_by: ratedBy,\n rated_at: new Date().toISOString(),\n value: rating as TweetRatingValue,\n };\n\n await ctx.entities.upsert({\n entityType: ENTITY_TYPES.tweet,\n scopeKind: \"instance\",\n externalId: tweetId,\n title: record.title ?? tweetId,\n status: record.status ?? \"active\",\n data: {\n ...data,\n ratings: [...existingRatings, newRating],\n },\n });\n\n await ctx.metrics.write(\"tool.rate_tweet.invoked\", 1);\n\n const data2 = record.data as unknown as ScoredTweet;\n const ratedUrl = data2.author_username ? tweetUrl(data2.author_username, tweetId) : `https://x.com/i/status/${tweetId}`;\n\n return {\n content: `Tweet ${tweetId} rated as \"${rating}\" by ${ratedBy}. Total ratings: ${existingRatings.length + 1}\\n${ratedUrl}`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Plugin definition\n// ---------------------------------------------------------------------------\n\nconst plugin = definePlugin({\n async setup(ctx) {\n pluginCtx = ctx;\n\n // Register job handlers\n ctx.jobs.register(JOB_KEYS.discoveryRun, (job) => runDiscoveryPipeline(ctx, job));\n ctx.jobs.register(JOB_KEYS.authorityDecay, (job) => handleAuthorityDecay(ctx, job));\n ctx.jobs.register(JOB_KEYS.complianceCheck, (job) => handleComplianceCheck(ctx, job));\n ctx.jobs.register(JOB_KEYS.corpusRetention, (job) => handleCorpusRetention(ctx, job));\n\n // Register agent tools \u2014 existing\n ctx.tools.register(\n TOOL_NAMES.searchCorpus,\n { displayName: \"Search X Corpus\", description: \"Search the scored X intelligence corpus\", parametersSchema: {} },\n (params, runCtx) => handleSearchCorpus(ctx, params, runCtx),\n );\n ctx.tools.register(\n TOOL_NAMES.getToday,\n { displayName: \"Get Today's Intelligence\", description: \"Get today's scored corpus\", parametersSchema: {} },\n (params, runCtx) => handleGetToday(ctx, params, runCtx),\n );\n ctx.tools.register(\n TOOL_NAMES.getAuthorities,\n { displayName: \"Get Authority Handles\", description: \"Get authority handle lists\", parametersSchema: {} },\n (params, runCtx) => handleGetAuthorities(ctx, params, runCtx),\n );\n ctx.tools.register(\n TOOL_NAMES.suggestHandles,\n { displayName: \"Suggest Handle Promotions\", description: \"Get promotion candidates\", parametersSchema: {} },\n (params, runCtx) => handleSuggestHandles(ctx, params, runCtx),\n );\n ctx.tools.register(\n TOOL_NAMES.trackHandle,\n { displayName: \"Track Handle\", description: \"Record a handle appearance\", parametersSchema: {} },\n (params, runCtx) => handleTrackHandle(ctx, params, runCtx),\n );\n\n // Register agent tools \u2014 new\n ctx.tools.register(\n TOOL_NAMES.analyzeTopic,\n { displayName: \"Analyze Topic\", description: \"On-demand xAI topic analysis with 5-perspective decomposition and corpus cross-reference\", parametersSchema: {} },\n (params, runCtx) => handleAnalyzeTopic(ctx, params, runCtx),\n );\n ctx.tools.register(\n TOOL_NAMES.getThread,\n { displayName: \"Get Tweet Thread\", description: \"Fetch conversation context for a tweet\", parametersSchema: {} },\n (params, runCtx) => handleGetThread(ctx, params, runCtx),\n );\n ctx.tools.register(\n TOOL_NAMES.promoteHandle,\n { displayName: \"Promote Handle\", description: \"Promote a handle to authority status in a specific list\", parametersSchema: {} },\n (params, runCtx) => handlePromoteHandle(ctx, params, runCtx),\n );\n ctx.tools.register(\n TOOL_NAMES.rateTweet,\n { displayName: \"Rate Tweet\", description: \"Record relevance feedback on a corpus tweet\", parametersSchema: {} },\n (params, runCtx) => handleRateTweet(ctx, params, runCtx),\n );\n\n // Register data handlers for UI\n ctx.data.register(\"dashboard-summary\", async () => {\n const today = new Date().toISOString().split(\"T\")[0]!;\n const summary = (await ctx.state.get({\n scopeKind: \"instance\",\n stateKey: `${STATE_KEYS.corpusPrefix}${today}`,\n })) as CorpusSummary | null;\n\n const lastRun = await ctx.state.get({\n scopeKind: \"instance\",\n stateKey: STATE_KEYS.lastDiscoveryRun,\n });\n\n const handleCount = (await ctx.entities.list({\n entityType: ENTITY_TYPES.handle,\n limit: 1,\n })).length;\n\n return {\n today: summary ?? null,\n lastRun,\n trackedHandles: handleCount,\n };\n });\n\n ctx.data.register(\"corpus\", async (params) => {\n const date = typeof params.date === \"string\"\n ? params.date\n : new Date().toISOString().split(\"T\")[0]!;\n return await ctx.state.get({\n scopeKind: \"instance\",\n stateKey: `${STATE_KEYS.corpusPrefix}${date}`,\n });\n });\n\n ctx.data.register(\"plugin-config\", async () => {\n return await ctx.config.get();\n });\n\n // Corpus browser data handler (paginated, filtered)\n ctx.data.register(\"corpus-browser\", async (params) => {\n const p = params as Record<string, unknown>;\n const date = typeof p.date === \"string\" ? p.date : new Date().toISOString().split(\"T\")[0]!;\n const pillar = typeof p.pillar === \"string\" ? p.pillar : undefined;\n const minScore = typeof p.min_score === \"number\" ? p.min_score : 0;\n const minEngagement = typeof p.min_engagement === \"number\" ? p.min_engagement : 0;\n const authorityOnly = p.authority_only === true;\n const page = typeof p.page === \"number\" ? p.page : 1;\n const pageSize = typeof p.page_size === \"number\" ? p.page_size : 25;\n\n const allTweets = await ctx.entities.list({\n entityType: ENTITY_TYPES.tweet,\n limit: 500,\n });\n\n const filtered: ScoredTweet[] = [];\n for (const tweet of allTweets) {\n if (tweet.status === \"removed\" || tweet.status === \"archived\") continue;\n const data = tweet.data as unknown as ScoredTweet;\n if (!data.created_at?.startsWith(date)) continue;\n if (data.score < minScore) continue;\n if (pillar && !(data.authority_domains?.some((d) => d.toLowerCase().includes(pillar.toLowerCase())) ?? false)) continue;\n if (minEngagement > 0 && computeTotalEngagement(data.metrics) < minEngagement) continue;\n if (authorityOnly && !data.is_authority) continue;\n filtered.push(data);\n }\n\n filtered.sort((a, b) => b.score - a.score);\n\n const totalCount = filtered.length;\n const totalPages = Math.ceil(totalCount / pageSize) || 1;\n const start = (page - 1) * pageSize;\n const items = filtered.slice(start, start + pageSize).map(withUrl);\n\n const dates: string[] = [];\n for (let i = 0; i < 7; i++) {\n const d = new Date();\n d.setDate(d.getDate() - i);\n dates.push(d.toISOString().split(\"T\")[0]!);\n }\n\n const config = await getConfig(ctx);\n\n const result: CorpusBrowserData = {\n items,\n pagination: { page, pageSize, totalCount, totalPages },\n filters: {\n date,\n pillar: pillar ?? null,\n minScore,\n minEngagement,\n authorityOnly,\n },\n available_pillars: config.content_pillars,\n available_dates: dates,\n };\n\n return result;\n });\n\n // Register action handlers for UI\n let discoveryRunning = false;\n ctx.actions.register(\"trigger-discovery\", async () => {\n if (discoveryRunning) {\n return { message: \"Discovery pipeline already running.\" };\n }\n ctx.logger.info(\"Manual discovery trigger requested via UI\");\n discoveryRunning = true;\n const fakeJob = { runId: `manual-${Date.now()}`, jobKey: JOB_KEYS.discoveryRun } as PluginJobContext;\n runDiscoveryPipeline(ctx, fakeJob)\n .catch((err) => {\n ctx.logger.error(\"Manual discovery failed\", { error: err instanceof Error ? err.message : String(err) });\n })\n .finally(() => { discoveryRunning = false; });\n return { message: \"Discovery pipeline started. Check logs for progress.\" };\n });\n\n // Subscribe to events\n ctx.events.on(\"issue.created\", async (event) => {\n ctx.logger.debug(\"Issue created event received\", { issueId: event.entityId });\n });\n\n ctx.logger.info(\"X Intelligence plugin initialized\");\n },\n\n async onHealth() {\n if (!pluginCtx) return { status: \"error\" as const, message: \"Plugin not initialized\" };\n try {\n const config = await getConfig(pluginCtx);\n const lastRun = (await pluginCtx.state.get({\n scopeKind: \"instance\",\n stateKey: STATE_KEYS.lastDiscoveryRun,\n })) as { date: string; generatedAt: string } | null;\n\n const now = new Date();\n const lastRunDate = lastRun?.generatedAt ? new Date(lastRun.generatedAt) : null;\n const hoursSinceLastRun = lastRunDate\n ? (now.getTime() - lastRunDate.getTime()) / (1000 * 60 * 60)\n : null;\n\n const status = hoursSinceLastRun === null\n ? \"degraded\" as const\n : hoursSinceLastRun > 36 ? \"degraded\" as const : \"ok\" as const;\n\n return {\n status,\n message: lastRun\n ? `Last discovery: ${lastRun.date} (${Math.round(hoursSinceLastRun!)}h ago)`\n : \"No discovery runs yet\",\n details: {\n lastDiscoveryRun: lastRun?.date ?? null,\n hoursSinceLastRun: hoursSinceLastRun ? Math.round(hoursSinceLastRun) : null,\n configuredTopics: config.semantic_topics.length,\n configuredAuthorities: Object.keys(config.authority_lists).length,\n },\n };\n } catch (err) {\n return {\n status: \"error\" as const,\n message: `Health check failed: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n },\n\n async onValidateConfig(config: Record<string, unknown>) {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n const xaiRef = config.xai_api_key_ref as string | undefined;\n const xRef = config.x_api_bearer_ref as string | undefined;\n\n if (!xaiRef) errors.push(\"xai_api_key_ref is required\");\n if (!xRef) errors.push(\"x_api_bearer_ref is required\");\n\n if (pluginCtx && xaiRef) {\n try {\n const key = await pluginCtx.secrets.resolve(xaiRef);\n if (!key || key.length < 10) warnings.push(\"xAI API key appears invalid (too short)\");\n } catch {\n errors.push(`Cannot resolve xAI API key secret: ${xaiRef}`);\n }\n }\n if (pluginCtx && xRef) {\n try {\n const key = await pluginCtx.secrets.resolve(xRef);\n if (!key || key.length < 10) warnings.push(\"X API bearer token appears invalid (too short)\");\n } catch {\n errors.push(`Cannot resolve X API bearer secret: ${xRef}`);\n }\n }\n\n const sw = config.scoring_weights as { relevance?: number; recency?: number; engagement?: number } | undefined;\n if (sw) {\n const sum = (sw.relevance ?? 0) + (sw.recency ?? 0) + (sw.engagement ?? 0);\n if (Math.abs(sum - 1) > 0.05) warnings.push(`Scoring weights sum to ${sum.toFixed(2)}, expected ~1.0`);\n }\n\n if ((config.semantic_topics as string[] | undefined)?.length === 0) {\n warnings.push(\"No semantic topics configured \u2014 discovery will produce no results\");\n }\n\n return { ok: errors.length === 0, warnings, errors };\n },\n});\n\nexport default plugin;\nrunWorker(plugin, import.meta.url);\n"],
5
+ "mappings": "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",
6
6
  "names": ["plugin", "result"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "peak6-x-intelligence-plugin",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "description": "X/Twitter intelligence plugin for Paperclip",
6
6
  "repository": {