From 06c5c302e9b3c47fd56fdce31b41d995493cab71 Mon Sep 17 00:00:00 2001 From: ywkj Date: Thu, 19 Mar 2026 07:16:46 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20simplify=20index.ts=20=E2=80=94=20u?= =?UTF-8?q?se=20ctx=20object=20instead=20of=208-param=20helpers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace createFailedResult/createSuccessResult (8+ params each) with a single result() builder + ctx spread. Default country to 'US'. -117 lines, same output_schema.json contract. Co-Authored-By: Claude Opus 4.6 --- scripts/run.ts | 2 +- src/index.ts | 157 +++++++++++++------------------------------------ 2 files changed, 42 insertions(+), 117 deletions(-) diff --git a/scripts/run.ts b/scripts/run.ts index 45490e7..ebd8aeb 100755 --- a/scripts/run.ts +++ b/scripts/run.ts @@ -87,7 +87,7 @@ async function main(): Promise { if (parsed.clientKey) process.env.CLIENT_KEY = parsed.clientKey; if (parsed.authBase) process.env.AUTH_BASE = parsed.authBase; - const result = await runClientFinder(parsed.query, parsed.country, parsed.dryRun); + const result = await runClientFinder(parsed.query, parsed.country || 'US', parsed.dryRun); console.log(JSON.stringify(result, null, 2)); } diff --git a/src/index.ts b/src/index.ts index 63db655..495894b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,121 +3,78 @@ import { createSkillClient } from '@clawd/auth-runtime'; import { normalizeQuery, resolveExpansion } from './expansion.js'; import { startWorkflow } from './workflow.js'; -/** - * Main entry point for client-finder skill - */ export async function runClientFinder( query: string, - country: string, + country: string = 'US', dryRun: boolean = false, ): Promise { - // Validate query if (!query) { - return createFailedResult('', 'missing query argument'); + return result('failed', { error: 'missing query argument' }); } - // Normalize query const rawQuery = normalizeQuery(query); const countryUpper = country.toUpperCase(); - const countryLower = country.toLowerCase(); + const llmExpansion = process.env.QUERY_EXPANSION_JSON || ''; + const expansion = resolveExpansion(rawQuery, countryUpper, llmExpansion); - // Resolve expansion - const queryExpansionJson = process.env.QUERY_EXPANSION_JSON || ''; - const expansion = resolveExpansion(rawQuery, countryUpper, queryExpansionJson); + // Build expansion context + const ctx: Partial = { + inputQuery: rawQuery, + expandedQueries: expansion.expandedQueries, + primaryQuery: expansion.primaryQuery, + expansionStatus: expansion.ok ? 'success' : 'failed', + expansionSource: expansion.expansionSource, + expansionError: expansion.error || null, + usedFallbackQuery: false, + }; - let expandedQueries = expansion.expandedQueries; - let primaryQuery = expansion.primaryQuery; - let expansionStatus = expansion.ok ? 'success' : ('failed' as const); - let expansionSource = expansion.expansionSource; - let expansionError = expansion.error || ''; - let usedFallbackQuery = false; - - // Handle expansion failure + // Handle expansion failure — fallback to raw query if (!expansion.ok) { - if (rawQuery) { - primaryQuery = rawQuery; - expandedQueries = [rawQuery]; - expansionSource = 'raw_query'; - expansionError = `query expansion failed: ${expansion.error}; fallback to raw query`; - usedFallbackQuery = true; - } else { - expansionError = expansionError || 'query expansion failed: primary query is empty'; - return createFailedResult( - rawQuery, expansionError, expandedQueries, primaryQuery, - expansionStatus, expansionSource, expansionError, usedFallbackQuery, - ); + if (!rawQuery) { + return result('failed', { ...ctx, error: expansion.error || 'query is empty' }); } + ctx.primaryQuery = rawQuery; + ctx.expandedQueries = [rawQuery]; + ctx.expansionSource = 'raw_query'; + ctx.expansionError = `query expansion failed: ${expansion.error}; fallback to raw query`; + ctx.usedFallbackQuery = true; } - // Validate primary query - if (!primaryQuery) { - expansionError = expansionError || 'query expansion failed: primary query is empty'; - return createFailedResult( - rawQuery, expansionError, expandedQueries, primaryQuery, - expansionStatus, expansionSource, expansionError, usedFallbackQuery, - ); + if (!ctx.primaryQuery) { + return result('failed', { ...ctx, error: 'primary query is empty after expansion' }); } - // Dry run mode if (dryRun) { - return createSuccessResult( - rawQuery, expandedQueries, primaryQuery, - expansionStatus, expansionSource, expansionError, usedFallbackQuery, - '', 'dry_run', - ); + return result('success', { ...ctx, workflowStatus: 'dry_run' }); } - // Create client (validates CLIENT_KEY) let client; try { client = createSkillClient(); } catch (error) { - return createFailedResult( - rawQuery, error instanceof Error ? error.message : 'failed to create client', - expandedQueries, primaryQuery, - expansionStatus, expansionSource, expansionError, usedFallbackQuery, - ); + return result('failed', { ...ctx, error: error instanceof Error ? error.message : String(error) }); } - // Start workflow - const workflowResult = await startWorkflow(client, primaryQuery, countryLower); + const wf = await startWorkflow(client, ctx.primaryQuery, country.toLowerCase()); - if (!workflowResult.workflowId) { - return createFailedResult( - rawQuery, `start failed: ${workflowResult.error}`, - expandedQueries, primaryQuery, - expansionStatus, expansionSource, expansionError, usedFallbackQuery, - ); + if (!wf.workflowId) { + return result('failed', { ...ctx, error: `start failed: ${wf.error}` }); } - // Return accepted immediately - return createSuccessResult( - rawQuery, expandedQueries, primaryQuery, - expansionStatus, expansionSource, expansionError, usedFallbackQuery, - '', 'accepted', workflowResult.workflowId, - ); + return result('success', { ...ctx, workflowId: wf.workflowId, workflowStatus: 'accepted' }); } -function createFailedResult( - inputQuery: string, - error: string, - expandedQueries: string[] = [], - primaryQuery: string = '', - expansionStatus: 'success' | 'failed' = 'failed', - expansionSource: 'llm' | 'rule' | 'raw_query' | '' = '', - expansionError: string | null = null, - usedFallbackQuery: boolean = false, -): OutputResult { +function result(status: 'success' | 'failed', overrides: Partial = {}): OutputResult { return { - status: 'failed', - error: error || null, - inputQuery, - expandedQueries, - primaryQuery, - expansionStatus, - expansionSource, - expansionError: expansionError || null, - usedFallbackQuery, + status, + error: null, + inputQuery: '', + expandedQueries: [], + primaryQuery: '', + expansionStatus: 'failed', + expansionSource: '', + expansionError: null, + usedFallbackQuery: false, runId: '', workflowId: '', workflowStatus: '', @@ -126,38 +83,6 @@ function createFailedResult( businessesCount: 0, contactsCount: 0, uniqueContactDomains: 0, - }; -} - -function createSuccessResult( - inputQuery: string, - expandedQueries: string[], - primaryQuery: string, - expansionStatus: 'success' | 'failed', - expansionSource: 'llm' | 'rule' | 'raw_query' | '', - expansionError: string | null, - usedFallbackQuery: boolean, - runId: string, - workflowStatus: string, - workflowId: string = '', -): OutputResult { - return { - status: 'success', - error: null, - inputQuery, - expandedQueries, - primaryQuery, - expansionStatus, - expansionSource, - expansionError, - usedFallbackQuery, - runId, - workflowId, - workflowStatus, - billingReserveStatus: 'SKIPPED', - billingFinalizeStatus: 'SKIPPED', - businessesCount: 0, - contactsCount: 0, - uniqueContactDomains: 0, + ...overrides, }; }