Files
2025-11-30 08:39:54 +08:00

220 lines
6.3 KiB
TypeScript

/**
* Data gathering utilities for company analysis
*/
import type { CompanyData, SearchResult } from './company-analyzer';
import { RESEARCH_DEPTH } from './constants';
import {
extractBasicInfo,
extractLeadershipInfo,
extractFinancialInfo,
extractMarketPositionInfo,
extractCultureInfo,
} from './data-extractors';
import type { WebResearcher } from './web-researcher';
const logger = {
log: (message: string) => Bun.write(Bun.stdout, `${message}\n`),
warn: (message: string) => Bun.write(Bun.stderr, `${message}\n`),
error: (message: string) => Bun.write(Bun.stderr, `${message}\n`),
};
/**
* Gathers basic company information from multiple sources
* @param webResearcher
* @param companyData
*/
export async function gatherBasicInfo(
webResearcher: WebResearcher,
companyData: CompanyData
): Promise<void> {
const queries = [
`${companyData..company_name} company profile Wikipedia`,
`${companyData..company_name} about us official website`,
`${companyData..company_name} company information Crunchbase`,
];
for (const query of queries) {
try {
const results = await webResearcher.performResearch({
query,
depth: 'quick',
maxResults: RESEARCH_DEPTH.QUICK,
});
for (const result of results) {
await extractBasicInfo(result, companyData);
}
} catch {
logger.warn(`⚠️ Failed to gather basic info for query: ${query}`);
}
}
}
/**
* Gathers foundational company information including leadership and business model
* @param webResearcher
* @param companyData
*/
export async function gatherFoundationInfo(
webResearcher: WebResearcher,
companyData: CompanyData
): Promise<void> {
const queries = [
`${companyData..company_name} CEO leadership team`,
`${companyData..company_name} mission vision values`,
`${companyData..company_name} business model revenue streams`,
];
for (const query of queries) {
try {
const results = await webResearcher.performResearch({
query,
depth: 'comprehensive',
maxResults: RESEARCH_DEPTH.COMPREHENSIVE,
});
for (const result of results) {
await extractLeadershipInfo(result, companyData);
}
} catch {
logger.warn(`⚠️ Failed to gather foundation info for query: ${query}`);
}
}
}
/**
* Gathers financial information about the company
* @param webResearcher
* @param companyData
*/
export async function gatherFinancialInfo(
webResearcher: WebResearcher,
companyData: CompanyData
): Promise<void> {
const queries = [
`${companyData..company_name} annual revenue financial results`,
`${companyData..company_name} market cap stock price`,
`${companyData..company_name} financial performance profit margin`,
`${companyData..company_name} revenue growth quarterly results`,
];
for (const query of queries) {
try {
const results = await webResearcher.performResearch({
query,
depth: 'comprehensive',
maxResults: RESEARCH_DEPTH.COMPREHENSIVE + RESEARCH_DEPTH.QUICK,
});
for (const result of results) {
await extractFinancialInfo(result, companyData);
}
} catch {
logger.warn(`⚠️ Failed to gather financial info for query: ${query}`);
}
}
}
/**
* Gathers market position information about the company
* @param webResearcher
* @param companyData
*/
export async function gatherMarketPositionInfo(
webResearcher: WebResearcher,
companyData: CompanyData
): Promise<void> {
const queries = [
`${companyData..company_name} market share competitors`,
`${companyData..company_name} customer base target market`,
`${companyData..company_name} competitive advantages differentiation`,
`${companyData..company_name} industry ranking position`,
];
for (const query of queries) {
try {
const results = await webResearcher.performResearch({
query,
depth: 'comprehensive',
maxResults: RESEARCH_DEPTH.COMPREHENSIVE,
});
for (const result of results) {
await extractMarketPositionInfo(result, companyData);
}
} catch {
logger.warn(`⚠️ Failed to gather market position info for query: ${query}`);
}
}
}
/**
* Gathers company culture and employment information
* @param webResearcher
* @param companyData
*/
export async function gatherCultureInfo(
webResearcher: WebResearcher,
companyData: CompanyData
): Promise<void> {
const queries = [
`${companyData..company_name} employee reviews Glassdoor`,
`${companyData..company_name} company culture work life balance`,
`${companyData..company_name} benefits compensation packages`,
`${companyData..company_name} diversity inclusion initiatives`,
];
for (const query of queries) {
try {
const results = await webResearcher.performResearch({
query,
depth: 'comprehensive',
maxResults: RESEARCH_DEPTH.RECENT,
});
for (const result of results) {
await extractCultureInfo(result, companyData);
}
} catch {
logger.warn(`⚠️ Failed to gather culture info for query: ${query}`);
}
}
}
/**
* Gathers recent developments and news about the company
* @param webResearcher
* @param companyData
*/
export async function gatherRecentDevelopments(
webResearcher: WebResearcher,
companyData: CompanyData
): Promise<void> {
const queries = [
`${companyData..company_name} recent news 2024`,
`${companyData..company_name} latest developments`,
`${companyData..company_name} partnerships acquisitions 2024`,
];
for (const query of queries) {
try {
const results = await webResearcher.performResearch({
query,
depth: 'recent',
maxResults: RESEARCH_DEPTH.QUICK,
});
for (const result of results) {
companyData.recent_developments.push({
date: new Date().toISOString().split('T')[0],
type: 'news',
description: result.snippet,
source: result.source,
});
}
} catch {
logger.warn(`⚠️ Failed to gather recent developments for query: ${query}`);
}
}
}