whale-code 6.5.8 → 6.5.9

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.
Files changed (99) hide show
  1. package/dist/cli/services/agent-loop.js +26 -2
  2. package/dist/cli/services/agent-loop.js.map +1 -1
  3. package/dist/cli/services/hooks.js +2 -1
  4. package/dist/cli/services/hooks.js.map +1 -1
  5. package/dist/cli/services/telemetry-spans.js +1 -0
  6. package/dist/cli/services/telemetry-spans.js.map +1 -1
  7. package/dist/cli/services/telemetry.d.ts +23 -0
  8. package/dist/cli/services/telemetry.js +45 -1
  9. package/dist/cli/services/telemetry.js.map +1 -1
  10. package/dist/server/handlers/__test-utils__/test-db.d.ts +17 -3
  11. package/dist/server/handlers/__test-utils__/test-db.js +113 -14
  12. package/dist/server/handlers/__test-utils__/test-db.js.map +1 -1
  13. package/dist/server/handlers/affiliates.d.ts +9 -0
  14. package/dist/server/handlers/affiliates.js +197 -0
  15. package/dist/server/handlers/affiliates.js.map +1 -0
  16. package/dist/server/handlers/api-docs.d.ts +4 -2
  17. package/dist/server/handlers/api-docs.js +204 -1681
  18. package/dist/server/handlers/api-docs.js.map +1 -1
  19. package/dist/server/handlers/campaigns.d.ts +9 -0
  20. package/dist/server/handlers/campaigns.js +237 -0
  21. package/dist/server/handlers/campaigns.js.map +1 -0
  22. package/dist/server/handlers/catalog-schemas.js +9 -9
  23. package/dist/server/handlers/catalog-schemas.js.map +1 -1
  24. package/dist/server/handlers/catalog.js +1 -1
  25. package/dist/server/handlers/catalog.js.map +1 -1
  26. package/dist/server/handlers/comms-documents.js +28 -2
  27. package/dist/server/handlers/comms-documents.js.map +1 -1
  28. package/dist/server/handlers/comms-pdf-generation.js +25 -3
  29. package/dist/server/handlers/comms-pdf-generation.js.map +1 -1
  30. package/dist/server/handlers/comms-pdf-helpers.js +4 -4
  31. package/dist/server/handlers/comms-pdf-helpers.js.map +1 -1
  32. package/dist/server/handlers/comms.d.ts +100 -0
  33. package/dist/server/handlers/comms.js +146 -12
  34. package/dist/server/handlers/comms.js.map +1 -1
  35. package/dist/server/handlers/coupons.d.ts +9 -0
  36. package/dist/server/handlers/coupons.js +220 -0
  37. package/dist/server/handlers/coupons.js.map +1 -0
  38. package/dist/server/handlers/embeddings.js +1 -1
  39. package/dist/server/handlers/embeddings.js.map +1 -1
  40. package/dist/server/handlers/enrichment.js +2 -622
  41. package/dist/server/handlers/enrichment.js.map +1 -1
  42. package/dist/server/handlers/fulfillment.d.ts +9 -0
  43. package/dist/server/handlers/fulfillment.js +209 -0
  44. package/dist/server/handlers/fulfillment.js.map +1 -0
  45. package/dist/server/handlers/google-ads.d.ts +24 -0
  46. package/dist/server/handlers/google-ads.js +2199 -0
  47. package/dist/server/handlers/google-ads.js.map +1 -0
  48. package/dist/server/handlers/invoices.d.ts +9 -0
  49. package/dist/server/handlers/invoices.js +252 -0
  50. package/dist/server/handlers/invoices.js.map +1 -0
  51. package/dist/server/handlers/loyalty.d.ts +9 -0
  52. package/dist/server/handlers/loyalty.js +197 -0
  53. package/dist/server/handlers/loyalty.js.map +1 -0
  54. package/dist/server/handlers/meta-ads-graph-api.js +18 -3
  55. package/dist/server/handlers/meta-ads-graph-api.js.map +1 -1
  56. package/dist/server/handlers/phone.d.ts +9 -0
  57. package/dist/server/handlers/phone.js +197 -0
  58. package/dist/server/handlers/phone.js.map +1 -0
  59. package/dist/server/handlers/pipeline.d.ts +9 -0
  60. package/dist/server/handlers/pipeline.js +277 -0
  61. package/dist/server/handlers/pipeline.js.map +1 -0
  62. package/dist/server/handlers/qr-codes.d.ts +9 -0
  63. package/dist/server/handlers/qr-codes.js +198 -0
  64. package/dist/server/handlers/qr-codes.js.map +1 -0
  65. package/dist/server/handlers/reviews.d.ts +9 -0
  66. package/dist/server/handlers/reviews.js +171 -0
  67. package/dist/server/handlers/reviews.js.map +1 -0
  68. package/dist/server/handlers/segments.d.ts +9 -0
  69. package/dist/server/handlers/segments.js +229 -0
  70. package/dist/server/handlers/segments.js.map +1 -0
  71. package/dist/server/handlers/social.d.ts +9 -0
  72. package/dist/server/handlers/social.js +81 -0
  73. package/dist/server/handlers/social.js.map +1 -0
  74. package/dist/server/handlers/tax.d.ts +9 -0
  75. package/dist/server/handlers/tax.js +182 -0
  76. package/dist/server/handlers/tax.js.map +1 -0
  77. package/dist/server/handlers/wallet.d.ts +9 -0
  78. package/dist/server/handlers/wallet.js +203 -0
  79. package/dist/server/handlers/wallet.js.map +1 -0
  80. package/dist/server/handlers/webhooks-mgmt.d.ts +9 -0
  81. package/dist/server/handlers/webhooks-mgmt.js +181 -0
  82. package/dist/server/handlers/webhooks-mgmt.js.map +1 -0
  83. package/dist/server/handlers/wholesale.d.ts +9 -0
  84. package/dist/server/handlers/wholesale.js +219 -0
  85. package/dist/server/handlers/wholesale.js.map +1 -0
  86. package/dist/server/index.js +20 -9
  87. package/dist/server/index.js.map +1 -1
  88. package/dist/server/lib/clickhouse-buffer.js +1 -0
  89. package/dist/server/lib/clickhouse-buffer.js.map +1 -1
  90. package/dist/server/lib/coa-renderer.d.ts +1 -1
  91. package/dist/server/lib/coa-renderer.js +32 -10
  92. package/dist/server/lib/coa-renderer.js.map +1 -1
  93. package/dist/server/server-worker.d.ts +1 -0
  94. package/dist/server/server-worker.js +464 -3
  95. package/dist/server/server-worker.js.map +1 -1
  96. package/dist/server/tool-router.js +118 -4
  97. package/dist/server/tool-router.js.map +1 -1
  98. package/package.json +26 -3
  99. package/vendor/ink/package.json +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-ads.js","names":["createLogger","log","GOOGLE_ADS_API","GOOGLE_ADS_BASE","GOOGLE_TOKEN_URL","DAILY_MUTATION_LIMIT","getIntegration","sb","storeId","data","config","error","rpcErr","rpc","p_store_id","getIntegrationDirect","Error","accessToken","access_token","refreshToken","refresh_token","clientId","client_id","clientSecret","client_secret","customerId","customer_id","developerToken","developer_token","status","refreshed","refreshAccessToken","loginCustomerId","login_customer_id","tokenExpiresAt","finalToken","token_expires_at","expiresAt","Date","bufferMs","getTime","now","from","select","eq","limit","single","client_secret_encrypted","developer_token_encrypted","access_token_encrypted","refresh_token_encrypted","info","res","fetch","method","headers","body","URLSearchParams","grant_type","ok","errText","text","err","update","slice","updated_at","toISOString","tokenData","json","newToken","expiresIn","expires_in","checkAndIncrementMutationQuota","operationCount","operation","today","usage","maybeSingle","currentCount","mutation_count","upsert","store_id","usage_date","last_operation","onConflict","authHeaders","int","h","parseGoogleError","parsed","JSON","parse","details","length","detail","errors","map","e","errorCode","stringify","message","join","gaqlSearch","query","cid","errBody","results","mutate","resourcePath","operations","startMs","durationMs","errMsg","ops","batchMutate","mutateOperations","downloadAndEncodeImage","url","maxBytes","buf","Buffer","arrayBuffer","warn","split","pop","size","toString","getResource","resourceName","isLocalId","id","test","toMicros","dollars","Math","round","fromMicros","micros","publishCampaignToGoogle","campaignId","campaign","campaign_type","pmaxResult","publishPMaxCampaign","googleCampaignId","google_campaign_id","budgetOps","create","name","amountMicros","daily_budget","deliveryMethod","budgetResult","budgetResourceName","campaignOp","advertisingChannelType","campaignBudget","containsEuPoliticalAdvertising","bidding","bidding_strategy","targetSpend","maximizeConversions","maximizeConversionValue","targetCpa","targetCpaMicros","bidding_target","targetRoas","manualCpc","start_date","startDate","replace","end_date","endDate","result","google_customer_id","google_status","publishAdGroupToGoogle","adGroupId","adGroup","google_ad_group_id","googleAdGroupId","campaignResource","adGroupOp","type","ad_group_type","cpc_bid","cpcBidMicros","publishAdToGoogle","adId","ad","google_ad_id","googleAdId","adGroupResource","ad_group_id","adOp","buildAdPayload","adType","ad_type","headlines","i","pinnedField","undefined","descriptions","responsiveSearchAd","finalUrls","final_urls","path1","path2","responsiveDisplayAd","longHeadline","businessName","creative","business_name","assetGroupId","imageAssets","adGroups","longHeadlines","long_headlines","logoUrls","logo_urls","marketingImages","marketing_images","squareImages","square_marketing_images","nextTempId","getTempId","toTransformUrl","w","includes","logos","landscape","square","logoB64","landscapeB64","b64","push","squareB64","agAssetLinks","budgetTempId","campaignTempId","assetGroupTempId","campaignBudgetOperation","resource_name","amount_micros","delivery_method","explicitly_shared","campaignCreate","advertising_channel_type","campaign_budget","contains_eu_political_advertising","maximize_conversions","maximize_conversion_value","target_cpa","target_cpa_micros","target_roas","campaignOperation","bnTempId","assetOperation","text_asset","campaignAssetOperation","asset","field_type","logoTempId","image_asset","tempId","fieldType","d","lh","assetGroupOperation","link","assetGroupAssetOperation","asset_group","imageAssetsCreated","images","campaignName","responses","mutateOperationResponses","mutate_operation_responses","campaignResourceName","assetGroupResourceName","r","key","cr","rn","agr","ag","publishKeywordsToGoogle","keywords","is","published","kw","keyword","matchType","match_type","criterionId","google_criterion_id","publishConversionAction","conversionActionId","ca","google_conversion_id","CATEGORY_MAP","PURCHASE","LEAD","SIGNUP","ADD_TO_CART","PAGE_VIEW","OTHER","category","countingType","counting_type","attributionModelSettings","attributionModel","attribution_model","default_value","defaultValue","alwaysUseDefaultValue","always_use_default_value","googleId","tagSnippet","rows","snippets","conversionAction","tagSnippets","eventSnippet","google_tag_snippet","syncCampaignMetrics","dateRange","VALID_DATE_RANGES","range","synced","row","c","m","metrics","b","String","Number","ignoreDuplicates","handleGoogleAds","args","success","action","campaign_id","insert","order","ascending","updates","googleUpdates","budgetQuery","budgetRows","budgetResource","updateMask","warning","remove","delete","deleted","targeting","ad_id","keyword_id","keywordsPublished","kResult","newStatus","date_range","totalResults","audience_type","description","language","geoTargetConstants","geo_targets","keywordPlanNetwork","keywordSeed","urlSeed","campaignRow","campErr","adGroupRow","ad_group_name","agErr","adRow","adErr","keywordCount","kwRows","kwErr","auto_publish","pubErr","publishError"],"sources":["../../../src/server/handlers/google-ads.ts"],"sourcesContent":["/**\n * Google Ads Handler — campaign/ad group/ad/keyword CRUD + publish to Google Ads API v23.\n *\n * Mirrors the Meta Ads handler pattern:\n * - Draft objects stored in Supabase with local UUIDs\n * - Publish pushes drafts to Google Ads API\n * - Sync pulls metrics from Google Ads into local DB\n * - GAQL queries for custom reporting\n *\n * Actions:\n * create_campaign, list_campaigns, get_campaign, update_campaign, delete_campaign,\n * create_ad_group, list_ad_groups, get_ad_group, update_ad_group,\n * create_ad, list_ads, get_ad, update_ad,\n * create_keyword, list_keywords, update_keyword, delete_keyword,\n * publish, sync, search (GAQL), list_accessible_customers,\n * keyword_ideas, create_conversion_action, list_conversion_actions,\n * create_audience, list_audiences, pause, enable\n */\n\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\nimport { createLogger } from \"../lib/logger.js\";\n\nconst log = createLogger(\"google-ads\");\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nconst GOOGLE_ADS_API = \"v23\";\nconst GOOGLE_ADS_BASE = `https://googleads.googleapis.com/${GOOGLE_ADS_API}`;\nconst GOOGLE_TOKEN_URL = \"https://oauth2.googleapis.com/token\";\nconst DAILY_MUTATION_LIMIT = 10_000; // Google Basic Access limit\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\ninterface GoogleIntegration {\n accessToken: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n customerId: string;\n loginCustomerId: string | null;\n developerToken: string;\n tokenExpiresAt: string | null;\n}\n\n// ============================================================================\n// CREDENTIALS\n// ============================================================================\n\nasync function getIntegration(sb: SupabaseClient, storeId: string): Promise<GoogleIntegration> {\n // Use RPC to read platform secrets + per-store data in one call\n const { data: config, error: rpcErr } = await sb.rpc(\"get_google_config\", { p_store_id: storeId });\n\n // Fallback to direct table read if RPC not yet deployed\n const data = rpcErr ? await getIntegrationDirect(sb, storeId) : config;\n if (!data || data.error) {\n throw new Error(data?.error || \"Google Ads not connected. Go to Settings → Google Ads to link your account.\");\n }\n\n const accessToken = data.access_token;\n const refreshToken = data.refresh_token;\n const clientId = data.client_id;\n const clientSecret = data.client_secret;\n const customerId = data.customer_id;\n const developerToken = data.developer_token;\n const status = data.status;\n\n if (!accessToken || !customerId) {\n throw new Error(\"Google Ads not connected. Go to Settings → Google Ads to link your account.\");\n }\n\n if (status === \"token_expired\") {\n // Attempt one auto-refresh before giving up\n if (refreshToken && clientId && clientSecret) {\n const refreshed = await refreshAccessToken(sb, storeId, refreshToken, clientId, clientSecret);\n return { accessToken: refreshed, refreshToken, clientId, clientSecret, customerId, loginCustomerId: data.login_customer_id || null, developerToken, tokenExpiresAt: null };\n }\n throw new Error(\"Google Ads token expired. Reconnect in Settings → Google Ads.\");\n }\n\n if (status !== \"connected\") {\n throw new Error(`Google Ads integration status is '${status}'. Reconnect in Settings → Google Ads.`);\n }\n\n // Check token expiry and auto-refresh if needed\n let finalToken = accessToken;\n if (data.token_expires_at) {\n const expiresAt = new Date(data.token_expires_at);\n const bufferMs = 5 * 60 * 1000; // refresh 5 min before expiry\n if (expiresAt.getTime() - Date.now() < bufferMs && refreshToken && clientId && clientSecret) {\n finalToken = await refreshAccessToken(sb, storeId, refreshToken, clientId, clientSecret);\n }\n }\n\n return {\n accessToken: finalToken,\n refreshToken,\n clientId,\n clientSecret,\n customerId,\n loginCustomerId: data.login_customer_id || null,\n developerToken,\n tokenExpiresAt: data.token_expires_at || null,\n };\n}\n\n/** Fallback: direct table read (used if get_google_config RPC not deployed) */\nasync function getIntegrationDirect(sb: SupabaseClient, storeId: string): Promise<Record<string, unknown> | null> {\n const { data, error } = await sb\n .from(\"google_integrations\")\n .select(\"client_id, client_secret_encrypted, developer_token_encrypted, customer_id, login_customer_id, access_token_encrypted, refresh_token_encrypted, token_expires_at, status, measurement_id, ga4_api_secret_encrypted\")\n .eq(\"store_id\", storeId)\n .limit(1)\n .single();\n if (error || !data) return null;\n return {\n client_id: data.client_id,\n client_secret: data.client_secret_encrypted,\n developer_token: data.developer_token_encrypted,\n customer_id: data.customer_id,\n login_customer_id: data.login_customer_id,\n access_token: data.access_token_encrypted,\n refresh_token: data.refresh_token_encrypted,\n token_expires_at: data.token_expires_at,\n status: data.status,\n };\n}\n\nasync function refreshAccessToken(\n sb: SupabaseClient,\n storeId: string,\n refreshToken: string,\n clientId: string,\n clientSecret: string,\n): Promise<string> {\n log.info({ storeId }, \"refreshing Google Ads access token\");\n\n const res = await fetch(GOOGLE_TOKEN_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n client_id: clientId,\n client_secret: clientSecret,\n refresh_token: refreshToken,\n grant_type: \"refresh_token\",\n }),\n });\n\n if (!res.ok) {\n const errText = await res.text();\n log.error({ storeId, status: res.status, err: errText }, \"token refresh failed\");\n\n // Mark integration as token_expired so UI can prompt reconnect\n await sb.from(\"google_integrations\").update({\n status: \"token_expired\",\n error: `Token refresh failed (${res.status}): ${errText.slice(0, 200)}`,\n updated_at: new Date().toISOString(),\n }).eq(\"store_id\", storeId);\n\n throw new Error(`Token refresh failed (${res.status}). Reconnect in Settings → Google Ads.`);\n }\n\n const tokenData = (await res.json()) as Record<string, unknown>;\n const newToken = tokenData.access_token as string;\n const expiresIn = (tokenData.expires_in as number) ?? 3600;\n const expiresAt = new Date(Date.now() + expiresIn * 1000).toISOString();\n\n // Persist the new token and ensure status is connected\n await sb.from(\"google_integrations\").update({\n access_token_encrypted: newToken,\n token_expires_at: expiresAt,\n status: \"connected\",\n error: null,\n updated_at: new Date().toISOString(),\n }).eq(\"store_id\", storeId);\n\n log.info({ storeId, expiresAt }, \"Google Ads token refreshed\");\n return newToken;\n}\n\n// ============================================================================\n// RATE LIMITING — 10,000 mutations/day (Google Basic Access)\n// ============================================================================\n\nasync function checkAndIncrementMutationQuota(\n sb: SupabaseClient,\n storeId: string,\n operationCount: number,\n operation: string,\n): Promise<void> {\n const today = new Date().toISOString().slice(0, 10);\n\n // Upsert today's counter\n const { data: usage } = await sb\n .from(\"google_ads_daily_usage\")\n .select(\"mutation_count\")\n .eq(\"store_id\", storeId)\n .eq(\"usage_date\", today)\n .maybeSingle();\n\n const currentCount = usage?.mutation_count ?? 0;\n if (currentCount + operationCount > DAILY_MUTATION_LIMIT) {\n throw new Error(`Google Ads daily mutation limit reached (${currentCount}/${DAILY_MUTATION_LIMIT}). Resets at midnight UTC.`);\n }\n\n await sb.from(\"google_ads_daily_usage\").upsert({\n store_id: storeId,\n usage_date: today,\n mutation_count: currentCount + operationCount,\n last_operation: operation,\n updated_at: new Date().toISOString(),\n }, { onConflict: \"store_id,usage_date\" });\n}\n\n// ============================================================================\n// GOOGLE ADS API HELPERS\n// ============================================================================\n\nfunction authHeaders(int: GoogleIntegration): Record<string, string> {\n const h: Record<string, string> = {\n \"Authorization\": `Bearer ${int.accessToken}`,\n \"developer-token\": int.developerToken,\n \"Content-Type\": \"application/json\",\n };\n if (int.loginCustomerId) {\n h[\"login-customer-id\"] = int.loginCustomerId;\n }\n return h;\n}\n\nfunction parseGoogleError(body: string, status: number): string {\n try {\n const parsed = JSON.parse(body);\n const err = parsed.error;\n if (err?.details?.length) {\n const detail = err.details[0];\n if (detail.errors?.length) {\n return detail.errors.map((e: Record<string, unknown>) =>\n `${e.errorCode ? JSON.stringify(e.errorCode) : \"\"}: ${e.message}`\n ).join(\"; \");\n }\n }\n return err?.message || body.slice(0, 500);\n } catch {\n return body.slice(0, 500);\n }\n}\n\n/** Execute a GAQL search query. */\nasync function gaqlSearch(\n int: GoogleIntegration,\n query: string,\n customerId?: string,\n): Promise<Record<string, unknown>[]> {\n const cid = customerId || int.customerId;\n const res = await fetch(`${GOOGLE_ADS_BASE}/customers/${cid}/googleAds:search`, {\n method: \"POST\",\n headers: authHeaders(int),\n body: JSON.stringify({ query }),\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n throw new Error(`GAQL query failed (${res.status}): ${parseGoogleError(errBody, res.status)}`);\n }\n\n const json = (await res.json()) as Record<string, unknown>;\n return (json.results as Record<string, unknown>[]) || [];\n}\n\n/** Execute a Google Ads API mutate operation with rate limiting and telemetry. */\nasync function mutate(\n int: GoogleIntegration,\n resourcePath: string,\n operations: Record<string, unknown>[],\n sb?: SupabaseClient,\n storeId?: string,\n): Promise<Record<string, unknown>> {\n // Rate limit check (if sb/storeId available)\n if (sb && storeId) {\n await checkAndIncrementMutationQuota(sb, storeId, operations.length, `mutate:${resourcePath}`);\n }\n\n const cid = int.customerId;\n const startMs = Date.now();\n const res = await fetch(`${GOOGLE_ADS_BASE}/customers/${cid}/${resourcePath}:mutate`, {\n method: \"POST\",\n headers: authHeaders(int),\n body: JSON.stringify({ operations }),\n });\n\n const durationMs = Date.now() - startMs;\n\n if (!res.ok) {\n const errBody = await res.text();\n const errMsg = parseGoogleError(errBody, res.status);\n log.error({ resourcePath, status: res.status, durationMs, storeId, err: errMsg }, \"Google Ads mutate failed\");\n throw new Error(`Mutate ${resourcePath} failed (${res.status}): ${errMsg}`);\n }\n\n log.info({ resourcePath, ops: operations.length, durationMs, storeId }, \"Google Ads mutate succeeded\");\n return (await res.json()) as Record<string, unknown>;\n}\n\n/** Unified batch mutate — creates multiple resource types atomically with temporary IDs. */\nasync function batchMutate(\n int: GoogleIntegration,\n mutateOperations: Record<string, unknown>[],\n sb?: SupabaseClient,\n storeId?: string,\n): Promise<Record<string, unknown>> {\n if (sb && storeId) {\n await checkAndIncrementMutationQuota(sb, storeId, mutateOperations.length, \"batchMutate\");\n }\n\n const cid = int.customerId;\n const startMs = Date.now();\n const res = await fetch(`${GOOGLE_ADS_BASE}/customers/${cid}/googleAds:mutate`, {\n method: \"POST\",\n headers: authHeaders(int),\n body: JSON.stringify({ mutateOperations }),\n });\n\n const durationMs = Date.now() - startMs;\n\n if (!res.ok) {\n const errBody = await res.text();\n const errMsg = parseGoogleError(errBody, res.status);\n log.error({ status: res.status, durationMs, storeId, err: errMsg }, \"Google Ads batch mutate failed\");\n throw new Error(`Batch mutate failed (${res.status}): ${errMsg}`);\n }\n\n log.info({ ops: mutateOperations.length, durationMs, storeId }, \"Google Ads batch mutate succeeded\");\n return (await res.json()) as Record<string, unknown>;\n}\n\n/** Download image from URL and return base64 data. Returns null if download fails or exceeds maxBytes. */\nasync function downloadAndEncodeImage(url: string, maxBytes = 5_000_000): Promise<string | null> {\n try {\n const res = await fetch(url);\n if (!res.ok) return null;\n const buf = Buffer.from(await res.arrayBuffer());\n if (buf.length > maxBytes) {\n log.warn({ url: url.split(\"/\").pop(), size: buf.length }, \"Image exceeds size limit, skipping\");\n return null;\n }\n return buf.toString(\"base64\");\n } catch (err) {\n log.warn({ url: url.split(\"/\").pop(), err }, \"Failed to download image\");\n return null;\n }\n}\n\n/** Get a resource by resource name. */\nasync function getResource(int: GoogleIntegration, resourceName: string): Promise<Record<string, unknown>> {\n const res = await fetch(`${GOOGLE_ADS_BASE}/${resourceName}`, {\n method: \"GET\",\n headers: authHeaders(int),\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n throw new Error(`GET ${resourceName} failed (${res.status}): ${parseGoogleError(errBody, res.status)}`);\n }\n\n return (await res.json()) as Record<string, unknown>;\n}\n\n// ============================================================================\n// ID HELPERS\n// ============================================================================\n\n/** Local draft IDs contain non-numeric chars. Google IDs are purely numeric. */\nfunction isLocalId(id: string | null | undefined): boolean {\n if (!id) return true;\n return /[^0-9]/.test(id);\n}\n\n/** Convert budget in dollars to micros (Google uses micros). */\nfunction toMicros(dollars: number): number {\n return Math.round(dollars * 1_000_000);\n}\n\n/** Convert micros to dollars. */\nfunction fromMicros(micros: number): number {\n return micros / 1_000_000;\n}\n\n// ============================================================================\n// PUBLISH HELPERS\n// ============================================================================\n\nasync function publishCampaignToGoogle(\n sb: SupabaseClient,\n int: GoogleIntegration,\n storeId: string,\n campaignId: string,\n): Promise<{ googleCampaignId: string; resourceName: string }> {\n // Fetch the draft campaign\n const { data: campaign, error } = await sb\n .from(\"google_campaigns\")\n .select(\"*\")\n .eq(\"id\", campaignId)\n .eq(\"store_id\", storeId)\n .single();\n\n if (error || !campaign) throw new Error(`Campaign ${campaignId} not found`);\n\n // Performance Max uses a dedicated publish path (asset groups, not ad groups)\n if (campaign.campaign_type === \"PERFORMANCE_MAX\") {\n const pmaxResult = await publishPMaxCampaign(sb, int, storeId, campaignId);\n return { googleCampaignId: pmaxResult.googleCampaignId, resourceName: pmaxResult.resourceName };\n }\n\n // Already published?\n if (campaign.google_campaign_id && !isLocalId(campaign.google_campaign_id)) {\n return { googleCampaignId: campaign.google_campaign_id, resourceName: `customers/${int.customerId}/campaigns/${campaign.google_campaign_id}` };\n }\n\n // Create budget first\n const budgetOps = [{\n create: {\n name: `${campaign.name} Budget`,\n amountMicros: toMicros(campaign.daily_budget || 10).toString(),\n deliveryMethod: \"STANDARD\",\n },\n }];\n const budgetResult = await mutate(int, \"campaignBudgets\", budgetOps, sb, storeId);\n const budgetResourceName = (budgetResult as Record<string, unknown>).results\n ? ((budgetResult as Record<string, unknown>).results as Array<Record<string, unknown>>)[0]?.resourceName as string\n : null;\n\n if (!budgetResourceName) throw new Error(\"Failed to create campaign budget\");\n\n // Build campaign operation\n const campaignOp: Record<string, unknown> = {\n create: {\n name: campaign.name,\n advertisingChannelType: campaign.campaign_type || \"SEARCH\",\n status: \"PAUSED\",\n campaignBudget: budgetResourceName,\n },\n };\n\n // EU political advertising compliance (required in v23+)\n (campaignOp.create as Record<string, unknown>).containsEuPoliticalAdvertising = \"DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING\";\n\n // Bidding strategy (v23: maximizeClicks → targetSpend)\n const bidding = campaign.bidding_strategy || \"MAXIMIZE_CLICKS\";\n switch (bidding) {\n case \"MAXIMIZE_CLICKS\":\n (campaignOp.create as Record<string, unknown>).targetSpend = {};\n break;\n case \"MAXIMIZE_CONVERSIONS\":\n (campaignOp.create as Record<string, unknown>).maximizeConversions = {};\n break;\n case \"MAXIMIZE_CONVERSION_VALUE\":\n (campaignOp.create as Record<string, unknown>).maximizeConversionValue = {};\n break;\n case \"TARGET_CPA\":\n (campaignOp.create as Record<string, unknown>).targetCpa = {\n targetCpaMicros: toMicros(campaign.bidding_target || 10).toString(),\n };\n break;\n case \"TARGET_ROAS\":\n (campaignOp.create as Record<string, unknown>).targetRoas = {\n targetRoas: campaign.bidding_target || 1.0,\n };\n break;\n case \"MANUAL_CPC\":\n (campaignOp.create as Record<string, unknown>).manualCpc = {};\n break;\n default:\n (campaignOp.create as Record<string, unknown>).targetSpend = {};\n }\n\n // Start/end dates\n if (campaign.start_date) {\n (campaignOp.create as Record<string, unknown>).startDate = campaign.start_date.slice(0, 10).replace(/-/g, \"-\");\n }\n if (campaign.end_date) {\n (campaignOp.create as Record<string, unknown>).endDate = campaign.end_date.slice(0, 10).replace(/-/g, \"-\");\n }\n\n const result = await mutate(int, \"campaigns\", [campaignOp], sb, storeId);\n const results = (result as Record<string, unknown>).results as Array<Record<string, unknown>>;\n const resourceName = results?.[0]?.resourceName as string;\n\n if (!resourceName) throw new Error(\"Campaign creation returned no resource name\");\n\n const googleCampaignId = resourceName.split(\"/\").pop()!;\n\n // Update local record\n await sb.from(\"google_campaigns\").update({\n google_campaign_id: googleCampaignId,\n google_customer_id: int.customerId,\n google_status: \"PAUSED\",\n status: \"PUBLISHED\",\n updated_at: new Date().toISOString(),\n }).eq(\"id\", campaignId);\n\n return { googleCampaignId, resourceName };\n}\n\nasync function publishAdGroupToGoogle(\n sb: SupabaseClient,\n int: GoogleIntegration,\n storeId: string,\n adGroupId: string,\n): Promise<{ googleAdGroupId: string; resourceName: string }> {\n const { data: adGroup, error } = await sb\n .from(\"google_ad_groups\")\n .select(\"*\")\n .eq(\"id\", adGroupId)\n .eq(\"store_id\", storeId)\n .single();\n\n if (error || !adGroup) throw new Error(`Ad group ${adGroupId} not found`);\n\n if (adGroup.google_ad_group_id && !isLocalId(adGroup.google_ad_group_id)) {\n return { googleAdGroupId: adGroup.google_ad_group_id, resourceName: `customers/${int.customerId}/adGroups/${adGroup.google_ad_group_id}` };\n }\n\n // Auto-publish parent campaign if needed\n const { googleCampaignId, resourceName: campaignResource } = await publishCampaignToGoogle(sb, int, storeId, adGroup.google_campaign_id);\n\n const adGroupOp = {\n create: {\n name: adGroup.name,\n campaign: campaignResource,\n type: adGroup.ad_group_type || \"SEARCH_STANDARD\",\n status: \"ENABLED\",\n ...(adGroup.cpc_bid ? { cpcBidMicros: toMicros(adGroup.cpc_bid).toString() } : {}),\n },\n };\n\n const result = await mutate(int, \"adGroups\", [adGroupOp], sb, storeId);\n const results = (result as Record<string, unknown>).results as Array<Record<string, unknown>>;\n const resourceName = results?.[0]?.resourceName as string;\n\n if (!resourceName) throw new Error(\"Ad group creation returned no resource name\");\n\n const googleAdGroupId = resourceName.split(\"/\").pop()!;\n\n await sb.from(\"google_ad_groups\").update({\n google_ad_group_id: googleAdGroupId,\n google_status: \"ENABLED\",\n status: \"PUBLISHED\",\n updated_at: new Date().toISOString(),\n }).eq(\"id\", adGroupId);\n\n return { googleAdGroupId, resourceName };\n}\n\nasync function publishAdToGoogle(\n sb: SupabaseClient,\n int: GoogleIntegration,\n storeId: string,\n adId: string,\n): Promise<{ googleAdId: string }> {\n const { data: ad, error } = await sb\n .from(\"google_ads\")\n .select(\"*\")\n .eq(\"id\", adId)\n .eq(\"store_id\", storeId)\n .single();\n\n if (error || !ad) throw new Error(`Ad ${adId} not found`);\n\n if (ad.google_ad_id && !isLocalId(ad.google_ad_id)) {\n return { googleAdId: ad.google_ad_id };\n }\n\n // Auto-publish parent ad group\n const { resourceName: adGroupResource } = await publishAdGroupToGoogle(sb, int, storeId, ad.ad_group_id);\n\n // Build ad group ad operation based on ad type\n const adOp: Record<string, unknown> = {\n create: {\n adGroup: adGroupResource,\n status: \"PAUSED\",\n ad: buildAdPayload(ad),\n },\n };\n\n const result = await mutate(int, \"adGroupAds\", [adOp], sb, storeId);\n const results = (result as Record<string, unknown>).results as Array<Record<string, unknown>>;\n const resourceName = results?.[0]?.resourceName as string;\n\n if (!resourceName) throw new Error(\"Ad creation returned no resource name\");\n\n // Resource name format: customers/{cid}/adGroupAds/{agid}~{adId}\n const googleAdId = resourceName.split(\"~\").pop() || resourceName.split(\"/\").pop()!;\n\n await sb.from(\"google_ads\").update({\n google_ad_id: googleAdId,\n google_status: \"PAUSED\",\n status: \"PUBLISHED\",\n updated_at: new Date().toISOString(),\n }).eq(\"id\", adId);\n\n return { googleAdId };\n}\n\nfunction buildAdPayload(ad: Record<string, unknown>): Record<string, unknown> {\n const adType = ad.ad_type as string;\n\n if (adType === \"RESPONSIVE_SEARCH_AD\") {\n const headlines = (ad.headlines as string[] || []).map((text: string, i: number) => ({\n text,\n pinnedField: i < 3 ? undefined : undefined, // no pinning by default\n }));\n const descriptions = (ad.descriptions as string[] || []).map((text: string) => ({ text }));\n\n return {\n responsiveSearchAd: {\n headlines,\n descriptions,\n },\n finalUrls: ad.final_urls || [],\n ...(ad.path1 ? { path1: ad.path1 } : {}),\n ...(ad.path2 ? { path2: ad.path2 } : {}),\n };\n }\n\n if (adType === \"RESPONSIVE_DISPLAY_AD\") {\n return {\n responsiveDisplayAd: {\n headlines: (ad.headlines as string[] || []).map((text: string) => ({ text })),\n longHeadline: { text: (ad.headlines as string[])?.[0] || \"\" },\n descriptions: (ad.descriptions as string[] || []).map((text: string) => ({ text })),\n businessName: (ad.creative as Record<string, unknown>)?.business_name || \"\",\n },\n finalUrls: ad.final_urls || [],\n };\n }\n\n // Default: responsive search ad\n return {\n responsiveSearchAd: {\n headlines: (ad.headlines as string[] || []).map((text: string) => ({ text })),\n descriptions: (ad.descriptions as string[] || []).map((text: string) => ({ text })),\n },\n finalUrls: ad.final_urls || [],\n };\n}\n\n// ============================================================================\n// PERFORMANCE MAX PUBLISH\n// ============================================================================\n\nasync function publishPMaxCampaign(\n sb: SupabaseClient,\n int: GoogleIntegration,\n storeId: string,\n campaignId: string,\n): Promise<{ googleCampaignId: string; resourceName: string; assetGroupId: string; imageAssets: number }> {\n const { data: campaign } = await sb\n .from(\"google_campaigns\")\n .select(\"*\")\n .eq(\"id\", campaignId)\n .eq(\"store_id\", storeId)\n .single();\n\n if (!campaign) throw new Error(`Campaign ${campaignId} not found`);\n\n if (campaign.google_campaign_id && !isLocalId(campaign.google_campaign_id)) {\n return {\n googleCampaignId: campaign.google_campaign_id,\n resourceName: `customers/${int.customerId}/campaigns/${campaign.google_campaign_id}`,\n assetGroupId: \"\",\n imageAssets: 0,\n };\n }\n\n // Get the ad row (holds headlines, descriptions, creative with image URLs)\n const { data: adGroups } = await sb\n .from(\"google_ad_groups\")\n .select(\"id\")\n .eq(\"google_campaign_id\", campaignId)\n .eq(\"store_id\", storeId);\n\n let ad: Record<string, unknown> | null = null;\n if (adGroups?.length) {\n const { data } = await sb\n .from(\"google_ads\")\n .select(\"*\")\n .eq(\"ad_group_id\", adGroups[0].id)\n .eq(\"store_id\", storeId)\n .limit(1);\n ad = data?.[0] || null;\n }\n\n const creative = (ad?.creative || {}) as Record<string, unknown>;\n const headlines = (ad?.headlines || []) as string[];\n const descriptions = (ad?.descriptions || []) as string[];\n const finalUrls = (ad?.final_urls || []) as string[];\n const longHeadlines = (creative.long_headlines || []) as string[];\n const businessName = ((creative.business_name || campaign.name) as string).slice(0, 25);\n const logoUrls = (creative.logo_urls || []) as string[];\n const marketingImages = (creative.marketing_images || []) as string[];\n const squareImages = (creative.square_marketing_images || []) as string[];\n\n if (!finalUrls.length) throw new Error(\"PMax requires at least one final URL\");\n if (headlines.length < 3) throw new Error(\"PMax requires at least 3 headlines\");\n if (descriptions.length < 2) throw new Error(\"PMax requires at least 2 descriptions\");\n\n const cid = int.customerId;\n let nextTempId = -1;\n const getTempId = () => nextTempId--;\n\n // ---- Download images first (they must all be in the atomic batch) ----\n // Use Supabase image transforms for correct aspect ratios when URLs are from Supabase Storage\n const toTransformUrl = (url: string, w: number, h: number): string => {\n // Convert /storage/v1/object/public/ → /storage/v1/render/image/public/ with resize params\n if (url.includes(\"supabase.co/storage/v1/object/public/\")) {\n return url.replace(\"/storage/v1/object/public/\", `/storage/v1/render/image/public/`) + `?width=${w}&height=${h}&resize=cover`;\n }\n return url; // External URLs used as-is\n };\n\n log.info({ logos: logoUrls.length, landscape: marketingImages.length, square: squareImages.length }, \"Downloading PMax image assets\");\n\n // Download logo (1:1, 1200x1200)\n let logoB64: string | null = null;\n for (const url of logoUrls.slice(0, 2)) {\n logoB64 = await downloadAndEncodeImage(toTransformUrl(url, 1200, 1200));\n if (logoB64) break;\n }\n\n // Download landscape images (1.91:1, 1200x628)\n const landscapeB64: string[] = [];\n for (const url of marketingImages.slice(0, 5)) {\n const b64 = await downloadAndEncodeImage(toTransformUrl(url, 1200, 628));\n if (b64) landscapeB64.push(b64);\n }\n\n // Download square images (1:1, 1200x1200)\n const squareB64: string[] = [];\n for (const url of squareImages.slice(0, 5)) {\n const b64 = await downloadAndEncodeImage(toTransformUrl(url, 1200, 1200));\n if (b64) squareB64.push(b64);\n }\n\n // ---- Build ONE atomic batch (unified googleAds:mutate uses snake_case) ----\n const ops: Record<string, unknown>[] = [];\n const agAssetLinks: { tempId: number; fieldType: string }[] = [];\n const budgetTempId = getTempId();\n const campaignTempId = getTempId();\n const assetGroupTempId = getTempId();\n\n // Budget (PMax requires explicitly_shared: false)\n ops.push({\n campaignBudgetOperation: {\n create: {\n resource_name: `customers/${cid}/campaignBudgets/${budgetTempId}`,\n name: `${campaign.name} Budget`,\n amount_micros: toMicros(campaign.daily_budget || 10).toString(),\n delivery_method: \"STANDARD\",\n explicitly_shared: false,\n },\n },\n });\n\n // Campaign (note: start_date/end_date not supported on create via unified endpoint)\n const campaignCreate: Record<string, unknown> = {\n resource_name: `customers/${cid}/campaigns/${campaignTempId}`,\n name: campaign.name,\n advertising_channel_type: \"PERFORMANCE_MAX\",\n status: \"PAUSED\",\n campaign_budget: `customers/${cid}/campaignBudgets/${budgetTempId}`,\n contains_eu_political_advertising: \"DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING\",\n };\n\n const bidding = campaign.bidding_strategy || \"MAXIMIZE_CONVERSIONS\";\n switch (bidding) {\n case \"MAXIMIZE_CONVERSIONS\":\n campaignCreate.maximize_conversions = {};\n break;\n case \"MAXIMIZE_CONVERSION_VALUE\":\n campaignCreate.maximize_conversion_value = {};\n break;\n case \"TARGET_CPA\":\n campaignCreate.target_cpa = { target_cpa_micros: toMicros(campaign.bidding_target || 10).toString() };\n break;\n case \"TARGET_ROAS\":\n campaignCreate.target_roas = { target_roas: campaign.bidding_target || 1.0 };\n break;\n default:\n campaignCreate.maximize_conversions = {};\n }\n\n ops.push({ campaignOperation: { create: campaignCreate } });\n\n // Business Name → CampaignAsset ONLY (Brand Guidelines requirement)\n const bnTempId = getTempId();\n ops.push({ assetOperation: { create: { resource_name: `customers/${cid}/assets/${bnTempId}`, type: \"TEXT\", text_asset: { text: businessName }, name: `Business Name: ${businessName}` } } });\n ops.push({ campaignAssetOperation: { create: { campaign: `customers/${cid}/campaigns/${campaignTempId}`, asset: `customers/${cid}/assets/${bnTempId}`, field_type: \"BUSINESS_NAME\" } } });\n\n // Logo → CampaignAsset ONLY (Brand Guidelines: logo must be campaign-level, NOT asset group)\n if (logoB64) {\n const logoTempId = getTempId();\n ops.push({ assetOperation: { create: { resource_name: `customers/${cid}/assets/${logoTempId}`, type: \"IMAGE\", image_asset: { data: logoB64 }, name: \"Logo\" } } });\n ops.push({ campaignAssetOperation: { create: { campaign: `customers/${cid}/campaigns/${campaignTempId}`, asset: `customers/${cid}/assets/${logoTempId}`, field_type: \"LOGO\" } } });\n }\n\n // Headlines → AssetGroupAsset\n for (const h of headlines.slice(0, 15)) {\n const id = getTempId();\n ops.push({ assetOperation: { create: { resource_name: `customers/${cid}/assets/${id}`, type: \"TEXT\", text_asset: { text: h }, name: `Headline: ${h.slice(0, 50)}` } } });\n agAssetLinks.push({ tempId: id, fieldType: \"HEADLINE\" });\n }\n\n // Descriptions → AssetGroupAsset\n for (const d of descriptions.slice(0, 5)) {\n const id = getTempId();\n ops.push({ assetOperation: { create: { resource_name: `customers/${cid}/assets/${id}`, type: \"TEXT\", text_asset: { text: d }, name: `Desc: ${d.slice(0, 50)}` } } });\n agAssetLinks.push({ tempId: id, fieldType: \"DESCRIPTION\" });\n }\n\n // Long headlines → AssetGroupAsset\n for (const lh of longHeadlines.slice(0, 5)) {\n const id = getTempId();\n ops.push({ assetOperation: { create: { resource_name: `customers/${cid}/assets/${id}`, type: \"TEXT\", text_asset: { text: lh }, name: `Long: ${lh.slice(0, 50)}` } } });\n agAssetLinks.push({ tempId: id, fieldType: \"LONG_HEADLINE\" });\n }\n\n // Landscape images → AssetGroupAsset\n for (const b64 of landscapeB64) {\n const id = getTempId();\n ops.push({ assetOperation: { create: { resource_name: `customers/${cid}/assets/${id}`, type: \"IMAGE\", image_asset: { data: b64 }, name: \"Landscape\" } } });\n agAssetLinks.push({ tempId: id, fieldType: \"MARKETING_IMAGE\" });\n }\n\n // Square images → AssetGroupAsset\n for (const b64 of squareB64) {\n const id = getTempId();\n ops.push({ assetOperation: { create: { resource_name: `customers/${cid}/assets/${id}`, type: \"IMAGE\", image_asset: { data: b64 }, name: \"Square\" } } });\n agAssetLinks.push({ tempId: id, fieldType: \"SQUARE_MARKETING_IMAGE\" });\n }\n\n // Asset Group\n ops.push({\n assetGroupOperation: {\n create: {\n resource_name: `customers/${cid}/assetGroups/${assetGroupTempId}`,\n campaign: `customers/${cid}/campaigns/${campaignTempId}`,\n name: `${campaign.name} — Asset Group`,\n final_urls: finalUrls,\n status: \"ENABLED\",\n },\n },\n });\n\n // Link all assets to asset group (text + images, NOT business name/logo)\n for (const link of agAssetLinks) {\n ops.push({\n assetGroupAssetOperation: {\n create: {\n asset_group: `customers/${cid}/assetGroups/${assetGroupTempId}`,\n asset: `customers/${cid}/assets/${link.tempId}`,\n field_type: link.fieldType,\n },\n },\n });\n }\n\n const imageAssetsCreated = landscapeB64.length + squareB64.length + (logoB64 ? 1 : 0);\n log.info({ ops: ops.length, images: imageAssetsCreated, campaignName: campaign.name }, \"Publishing PMax (atomic batch)\");\n\n const result = await batchMutate(int, ops, sb, storeId);\n\n // Extract real resource names from response (supports both camelCase and snake_case)\n const responses = (\n (result as Record<string, unknown>).mutateOperationResponses ||\n (result as Record<string, unknown>).mutate_operation_responses ||\n []\n ) as Array<Record<string, unknown>>;\n\n let campaignResourceName = \"\";\n let googleCampaignId = \"\";\n let assetGroupResourceName = \"\";\n\n for (const r of responses) {\n for (const key of [\"campaignResult\", \"campaign_result\"]) {\n const cr = r[key] as Record<string, string> | undefined;\n const rn = cr?.resourceName || cr?.resource_name;\n if (rn?.includes(\"/campaigns/\")) {\n campaignResourceName = rn;\n googleCampaignId = rn.split(\"/\").pop()!;\n }\n }\n for (const key of [\"assetGroupResult\", \"asset_group_result\"]) {\n const agr = r[key] as Record<string, string> | undefined;\n const rn = agr?.resourceName || agr?.resource_name;\n if (rn?.includes(\"/assetGroups/\")) {\n assetGroupResourceName = rn;\n }\n }\n }\n\n if (!googleCampaignId) throw new Error(\"PMax batch mutate returned no campaign resource name\");\n\n log.info({ googleCampaignId, imageAssetsCreated, assetGroupResourceName }, \"PMax campaign published\");\n\n // Update local records\n await sb.from(\"google_campaigns\").update({\n google_campaign_id: googleCampaignId,\n google_customer_id: int.customerId,\n google_status: \"PAUSED\",\n status: \"PUBLISHED\",\n updated_at: new Date().toISOString(),\n }).eq(\"id\", campaignId);\n\n if (adGroups?.length) {\n for (const ag of adGroups) {\n await sb.from(\"google_ad_groups\").update({\n google_status: \"PUBLISHED\",\n status: \"PUBLISHED\",\n updated_at: new Date().toISOString(),\n }).eq(\"id\", ag.id);\n }\n }\n\n return { googleCampaignId, resourceName: campaignResourceName, assetGroupId: assetGroupResourceName, imageAssets: imageAssetsCreated };\n}\n\nasync function publishKeywordsToGoogle(\n sb: SupabaseClient,\n int: GoogleIntegration,\n storeId: string,\n adGroupId: string,\n): Promise<{ published: number }> {\n const { data: keywords } = await sb\n .from(\"google_keywords\")\n .select(\"*\")\n .eq(\"ad_group_id\", adGroupId)\n .eq(\"store_id\", storeId)\n .is(\"google_criterion_id\", null);\n\n if (!keywords?.length) return { published: 0 };\n\n // Get the google ad group resource\n const { data: adGroup } = await sb\n .from(\"google_ad_groups\")\n .select(\"google_ad_group_id\")\n .eq(\"id\", adGroupId)\n .single();\n\n if (!adGroup?.google_ad_group_id || isLocalId(adGroup.google_ad_group_id)) {\n throw new Error(\"Ad group must be published before keywords\");\n }\n\n const adGroupResource = `customers/${int.customerId}/adGroups/${adGroup.google_ad_group_id}`;\n\n const operations = keywords.map((kw: Record<string, unknown>) => ({\n create: {\n adGroup: adGroupResource,\n status: \"ENABLED\",\n keyword: {\n text: kw.text,\n matchType: kw.match_type || \"BROAD\",\n },\n ...(kw.cpc_bid ? { cpcBidMicros: toMicros(kw.cpc_bid as number).toString() } : {}),\n },\n }));\n\n const result = await mutate(int, \"adGroupCriteria\", operations, sb, storeId);\n const results = (result as Record<string, unknown>).results as Array<Record<string, unknown>>;\n\n // Update local records with Google criterion IDs\n for (let i = 0; i < (results?.length || 0); i++) {\n const resourceName = results[i]?.resourceName as string;\n if (resourceName) {\n const criterionId = resourceName.split(\"~\").pop();\n await sb.from(\"google_keywords\").update({\n google_criterion_id: criterionId,\n google_status: \"ENABLED\",\n updated_at: new Date().toISOString(),\n }).eq(\"id\", keywords[i].id);\n }\n }\n\n return { published: results?.length || 0 };\n}\n\n/** Publish a local conversion action to Google Ads API. */\nasync function publishConversionAction(\n sb: SupabaseClient,\n int: GoogleIntegration,\n storeId: string,\n conversionActionId: string,\n): Promise<Record<string, unknown>> {\n const { data: ca } = await sb.from(\"google_conversion_actions\")\n .select(\"*\")\n .eq(\"id\", conversionActionId)\n .eq(\"store_id\", storeId)\n .single();\n\n if (!ca) throw new Error(\"Conversion action not found\");\n if (ca.google_conversion_id) {\n return { message: \"Already published\", google_conversion_id: ca.google_conversion_id };\n }\n\n const CATEGORY_MAP: Record<string, string> = {\n PURCHASE: \"PURCHASE\", LEAD: \"SUBMIT_LEAD_FORM\", SIGNUP: \"SIGNUP\",\n ADD_TO_CART: \"ADD_TO_CART\", PAGE_VIEW: \"PAGE_VIEW\", OTHER: \"DEFAULT\",\n };\n\n const result = await mutate(int, \"conversionActions\", [{\n create: {\n name: ca.name,\n category: CATEGORY_MAP[ca.category] || \"DEFAULT\",\n type: \"WEBPAGE\",\n status: \"ENABLED\",\n countingType: ca.counting_type || \"ONE_PER_CLICK\",\n attributionModelSettings: {\n attributionModel: ca.attribution_model || \"GOOGLE_LAST_CLICK\",\n },\n ...(ca.default_value ? {\n defaultValue: ca.default_value,\n alwaysUseDefaultValue: ca.always_use_default_value ?? false,\n } : {}),\n },\n }], sb, storeId);\n\n const results = (result as Record<string, unknown>).results as Array<Record<string, unknown>>;\n const resourceName = results?.[0]?.resourceName as string;\n const googleId = resourceName?.split(\"/\").pop();\n\n if (googleId) {\n // Fetch the tag snippet for the newly created conversion action\n let tagSnippet: string | null = null;\n try {\n const rows = await gaqlSearch(int,\n `SELECT conversion_action.tag_snippets FROM conversion_action WHERE conversion_action.resource_name = '${resourceName}'`,\n );\n const snippets = (rows[0]?.conversionAction as Record<string, unknown>)?.tagSnippets as Array<Record<string, unknown>> | undefined;\n if (snippets?.length) tagSnippet = (snippets[0].eventSnippet as string) || null;\n } catch { /* non-fatal — snippet fetch can fail */ }\n\n await sb.from(\"google_conversion_actions\").update({\n google_conversion_id: googleId,\n google_tag_snippet: tagSnippet,\n status: \"ENABLED\",\n updated_at: new Date().toISOString(),\n }).eq(\"id\", conversionActionId);\n }\n\n return { google_conversion_id: googleId, resourceName };\n}\n\n// ============================================================================\n// SYNC — pull metrics from Google Ads into local DB\n// ============================================================================\n\nasync function syncCampaignMetrics(\n sb: SupabaseClient,\n int: GoogleIntegration,\n storeId: string,\n dateRange?: string,\n): Promise<{ synced: number }> {\n const VALID_DATE_RANGES = [\"LAST_7_DAYS\", \"LAST_14_DAYS\", \"LAST_30_DAYS\", \"LAST_90_DAYS\", \"THIS_MONTH\", \"LAST_MONTH\", \"TODAY\", \"YESTERDAY\"];\n const range = VALID_DATE_RANGES.includes(dateRange || \"\") ? dateRange! : \"LAST_30_DAYS\";\n const query = `\n SELECT\n campaign.id,\n campaign.name,\n campaign.status,\n campaign.advertising_channel_type,\n campaign_budget.amount_micros,\n metrics.impressions,\n metrics.clicks,\n metrics.cost_micros,\n metrics.conversions,\n metrics.conversions_value,\n metrics.ctr,\n metrics.average_cpc\n FROM campaign\n WHERE segments.date DURING ${range}\n `;\n\n const rows = await gaqlSearch(int, query);\n\n let synced = 0;\n for (const row of rows) {\n const c = row.campaign as Record<string, unknown>;\n const m = row.metrics as Record<string, unknown>;\n const b = row.campaignBudget as Record<string, unknown>;\n\n const googleCampaignId = String(c.id);\n\n await sb.from(\"google_campaigns\").upsert({\n store_id: storeId,\n google_campaign_id: googleCampaignId,\n google_customer_id: int.customerId,\n name: c.name,\n campaign_type: c.advertisingChannelType,\n google_status: c.status,\n daily_budget: b?.amountMicros ? fromMicros(Number(b.amountMicros)) : null,\n status: \"SYNCED\",\n updated_at: new Date().toISOString(),\n }, { onConflict: \"store_id,google_campaign_id\", ignoreDuplicates: false });\n\n synced++;\n }\n\n return { synced };\n}\n\n// ============================================================================\n// MAIN HANDLER\n// ============================================================================\n\nexport async function handleGoogleAds(\n sb: SupabaseClient,\n args: Record<string, unknown>,\n storeId?: string,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n if (!storeId) return { success: false, error: \"store_id required\" };\n const action = args.action as string;\n\n try {\n switch (action) {\n\n // ====================================================================\n // CAMPAIGNS\n // ====================================================================\n\n case \"create_campaign\": {\n const name = args.name as string;\n if (!name) return { success: false, error: \"name required\" };\n\n const row: Record<string, unknown> = {\n store_id: storeId,\n name,\n campaign_type: (args.campaign_type as string) || \"SEARCH\",\n status: \"DRAFT\",\n daily_budget: args.daily_budget ? Number(args.daily_budget) : null,\n bidding_strategy: (args.bidding_strategy as string) || \"MAXIMIZE_CLICKS\",\n bidding_target: args.bidding_target ? Number(args.bidding_target) : null,\n start_date: (args.start_date as string) || null,\n end_date: (args.end_date as string) || null,\n };\n\n if (args.campaign_id) row.campaign_id = args.campaign_id; // link to local campaigns table\n\n const { data, error } = await sb.from(\"google_campaigns\").insert(row).select().single();\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n case \"list_campaigns\": {\n const query = sb.from(\"google_campaigns\").select(\"*\").eq(\"store_id\", storeId).order(\"created_at\", { ascending: false });\n if (args.status) query.eq(\"status\", args.status);\n if (args.limit) query.limit(Number(args.limit));\n const { data, error } = await query;\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n case \"get_campaign\": {\n const id = (args.campaign_id || args.id) as string;\n if (!id) return { success: false, error: \"campaign_id required\" };\n const { data, error } = await sb.from(\"google_campaigns\").select(\"*\").eq(\"id\", id).eq(\"store_id\", storeId).single();\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n case \"update_campaign\": {\n const id = (args.campaign_id || args.id) as string;\n if (!id) return { success: false, error: \"campaign_id required\" };\n\n const updates: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (args.name) updates.name = args.name;\n if (args.daily_budget) updates.daily_budget = Number(args.daily_budget);\n if (args.bidding_strategy) updates.bidding_strategy = args.bidding_strategy;\n if (args.bidding_target) updates.bidding_target = Number(args.bidding_target);\n if (args.status) updates.status = args.status;\n if (args.start_date) updates.start_date = args.start_date;\n if (args.end_date) updates.end_date = args.end_date;\n\n const { data, error } = await sb.from(\"google_campaigns\").update(updates).eq(\"id\", id).eq(\"store_id\", storeId).select().single();\n if (error) return { success: false, error: error.message };\n\n // If published campaign, also update on Google\n if (data.google_campaign_id && !isLocalId(data.google_campaign_id)) {\n try {\n const int = await getIntegration(sb, storeId);\n const googleUpdates: Record<string, unknown> = {\n resourceName: `customers/${int.customerId}/campaigns/${data.google_campaign_id}`,\n };\n if (args.name) googleUpdates.name = args.name;\n if (args.daily_budget) {\n // Update budget separately\n const budgetQuery = `SELECT campaign_budget.resource_name FROM campaign WHERE campaign.id = ${data.google_campaign_id} LIMIT 1`;\n const budgetRows = await gaqlSearch(int, budgetQuery);\n if (budgetRows.length) {\n const budgetResource = (budgetRows[0].campaignBudget as Record<string, unknown>)?.resourceName as string;\n if (budgetResource) {\n await mutate(int, \"campaignBudgets\", [{\n update: { resourceName: budgetResource, amountMicros: toMicros(Number(args.daily_budget)).toString() },\n updateMask: \"amountMicros\",\n }], sb, storeId);\n }\n }\n }\n } catch (e) {\n // Non-fatal: local update succeeded, Google update failed\n return { success: true, data: { ...data, warning: `Local updated, but Google sync failed: ${e instanceof Error ? e.message : String(e)}` } };\n }\n }\n\n return { success: true, data };\n }\n\n case \"delete_campaign\": {\n const id = (args.campaign_id || args.id) as string;\n if (!id) return { success: false, error: \"campaign_id required\" };\n\n // If published, remove from Google\n const { data: campaign } = await sb.from(\"google_campaigns\").select(\"google_campaign_id\").eq(\"id\", id).eq(\"store_id\", storeId).single();\n if (campaign?.google_campaign_id && !isLocalId(campaign.google_campaign_id)) {\n try {\n const int = await getIntegration(sb, storeId);\n await mutate(int, \"campaigns\", [{\n remove: `customers/${int.customerId}/campaigns/${campaign.google_campaign_id}`,\n }], sb, storeId);\n } catch { /* best-effort deletion from Google */ }\n }\n\n const { error } = await sb.from(\"google_campaigns\").delete().eq(\"id\", id).eq(\"store_id\", storeId);\n if (error) return { success: false, error: error.message };\n return { success: true, data: { deleted: id } };\n }\n\n // ====================================================================\n // AD GROUPS\n // ====================================================================\n\n case \"create_ad_group\": {\n const name = args.name as string;\n const campaignId = args.campaign_id as string;\n if (!name) return { success: false, error: \"name required\" };\n if (!campaignId) return { success: false, error: \"campaign_id required\" };\n\n const row: Record<string, unknown> = {\n store_id: storeId,\n google_campaign_id: campaignId,\n name,\n ad_group_type: (args.ad_group_type as string) || \"SEARCH_STANDARD\",\n status: \"DRAFT\",\n cpc_bid: args.cpc_bid ? Number(args.cpc_bid) : null,\n targeting: args.targeting || null,\n };\n\n const { data, error } = await sb.from(\"google_ad_groups\").insert(row).select().single();\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n case \"list_ad_groups\": {\n const query = sb.from(\"google_ad_groups\").select(\"*\").eq(\"store_id\", storeId).order(\"created_at\", { ascending: false });\n if (args.campaign_id) query.eq(\"google_campaign_id\", args.campaign_id);\n if (args.limit) query.limit(Number(args.limit));\n const { data, error } = await query;\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n case \"get_ad_group\": {\n const id = (args.ad_group_id || args.id) as string;\n if (!id) return { success: false, error: \"ad_group_id required\" };\n const { data, error } = await sb.from(\"google_ad_groups\").select(\"*\").eq(\"id\", id).eq(\"store_id\", storeId).single();\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n case \"update_ad_group\": {\n const id = (args.ad_group_id || args.id) as string;\n if (!id) return { success: false, error: \"ad_group_id required\" };\n\n const updates: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (args.name) updates.name = args.name;\n if (args.cpc_bid) updates.cpc_bid = Number(args.cpc_bid);\n if (args.status) updates.status = args.status;\n if (args.targeting) updates.targeting = args.targeting;\n\n const { data, error } = await sb.from(\"google_ad_groups\").update(updates).eq(\"id\", id).eq(\"store_id\", storeId).select().single();\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n // ====================================================================\n // ADS\n // ====================================================================\n\n case \"create_ad\": {\n const adGroupId = args.ad_group_id as string;\n if (!adGroupId) return { success: false, error: \"ad_group_id required\" };\n\n const row: Record<string, unknown> = {\n store_id: storeId,\n ad_group_id: adGroupId,\n ad_type: (args.ad_type as string) || \"RESPONSIVE_SEARCH_AD\",\n headlines: args.headlines || [],\n descriptions: args.descriptions || [],\n final_urls: args.final_urls || [],\n path1: (args.path1 as string) || null,\n path2: (args.path2 as string) || null,\n creative: args.creative || null,\n status: \"DRAFT\",\n };\n\n const { data, error } = await sb.from(\"google_ads\").insert(row).select().single();\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n case \"list_ads\": {\n const query = sb.from(\"google_ads\").select(\"*\").eq(\"store_id\", storeId).order(\"created_at\", { ascending: false });\n if (args.ad_group_id) query.eq(\"ad_group_id\", args.ad_group_id);\n if (args.limit) query.limit(Number(args.limit));\n const { data, error } = await query;\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n case \"get_ad\": {\n const id = (args.ad_id || args.id) as string;\n if (!id) return { success: false, error: \"ad_id required\" };\n const { data, error } = await sb.from(\"google_ads\").select(\"*\").eq(\"id\", id).eq(\"store_id\", storeId).single();\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n case \"update_ad\": {\n const id = (args.ad_id || args.id) as string;\n if (!id) return { success: false, error: \"ad_id required\" };\n\n const updates: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (args.headlines) updates.headlines = args.headlines;\n if (args.descriptions) updates.descriptions = args.descriptions;\n if (args.final_urls) updates.final_urls = args.final_urls;\n if (args.path1 !== undefined) updates.path1 = args.path1;\n if (args.path2 !== undefined) updates.path2 = args.path2;\n if (args.status) updates.status = args.status;\n\n const { data, error } = await sb.from(\"google_ads\").update(updates).eq(\"id\", id).eq(\"store_id\", storeId).select().single();\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n // ====================================================================\n // KEYWORDS\n // ====================================================================\n\n case \"create_keyword\": {\n const adGroupId = args.ad_group_id as string;\n const text = args.text as string;\n if (!adGroupId) return { success: false, error: \"ad_group_id required\" };\n if (!text) return { success: false, error: \"text required\" };\n\n const row: Record<string, unknown> = {\n store_id: storeId,\n ad_group_id: adGroupId,\n text,\n match_type: (args.match_type as string) || \"BROAD\",\n cpc_bid: args.cpc_bid ? Number(args.cpc_bid) : null,\n status: \"DRAFT\",\n };\n\n const { data, error } = await sb.from(\"google_keywords\").insert(row).select().single();\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n case \"list_keywords\": {\n const query = sb.from(\"google_keywords\").select(\"*\").eq(\"store_id\", storeId).order(\"created_at\", { ascending: false });\n if (args.ad_group_id) query.eq(\"ad_group_id\", args.ad_group_id);\n if (args.limit) query.limit(Number(args.limit));\n const { data, error } = await query;\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n case \"update_keyword\": {\n const id = (args.keyword_id || args.id) as string;\n if (!id) return { success: false, error: \"keyword_id required\" };\n\n const updates: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (args.text) updates.text = args.text;\n if (args.match_type) updates.match_type = args.match_type;\n if (args.cpc_bid) updates.cpc_bid = Number(args.cpc_bid);\n if (args.status) updates.status = args.status;\n\n const { data, error } = await sb.from(\"google_keywords\").update(updates).eq(\"id\", id).eq(\"store_id\", storeId).select().single();\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n case \"delete_keyword\": {\n const id = (args.keyword_id || args.id) as string;\n if (!id) return { success: false, error: \"keyword_id required\" };\n\n const { data: kw } = await sb.from(\"google_keywords\").select(\"google_criterion_id, ad_group_id\").eq(\"id\", id).eq(\"store_id\", storeId).single();\n if (kw?.google_criterion_id) {\n try {\n const int = await getIntegration(sb, storeId);\n const { data: ag } = await sb.from(\"google_ad_groups\").select(\"google_ad_group_id\").eq(\"id\", kw.ad_group_id).eq(\"store_id\", storeId).single();\n if (ag?.google_ad_group_id) {\n await mutate(int, \"adGroupCriteria\", [{\n remove: `customers/${int.customerId}/adGroupCriteria/${ag.google_ad_group_id}~${kw.google_criterion_id}`,\n }], sb, storeId);\n }\n } catch { /* best-effort */ }\n }\n\n const { error } = await sb.from(\"google_keywords\").delete().eq(\"id\", id).eq(\"store_id\", storeId);\n if (error) return { success: false, error: error.message };\n return { success: true, data: { deleted: id } };\n }\n\n // ====================================================================\n // PUBLISH — push drafts to Google Ads\n // ====================================================================\n\n case \"publish\": {\n const int = await getIntegration(sb, storeId);\n const type = (args.type as string) || \"campaign\";\n const id = (args.id || args.campaign_id || args.ad_group_id || args.ad_id) as string;\n if (!id) return { success: false, error: \"id required\" };\n\n switch (type) {\n case \"campaign\": {\n const result = await publishCampaignToGoogle(sb, int, storeId, id);\n // Also publish keywords for all ad groups in this campaign\n const { data: adGroups } = await sb.from(\"google_ad_groups\").select(\"id\").eq(\"google_campaign_id\", id).eq(\"store_id\", storeId);\n let keywordsPublished = 0;\n for (const ag of adGroups || []) {\n try {\n const kResult = await publishKeywordsToGoogle(sb, int, storeId, ag.id);\n keywordsPublished += kResult.published;\n } catch { /* non-fatal */ }\n }\n return { success: true, data: { ...result, keywordsPublished } };\n }\n case \"ad_group\": {\n const result = await publishAdGroupToGoogle(sb, int, storeId, id);\n const kResult = await publishKeywordsToGoogle(sb, int, storeId, id);\n return { success: true, data: { ...result, keywordsPublished: kResult.published } };\n }\n case \"ad\": {\n const result = await publishAdToGoogle(sb, int, storeId, id);\n return { success: true, data: result };\n }\n case \"conversion_action\": {\n const result = await publishConversionAction(sb, int, storeId, id);\n return { success: true, data: result };\n }\n default:\n return { success: false, error: `Unknown publish type: ${type}. Use campaign, ad_group, ad, or conversion_action.` };\n }\n }\n\n // ====================================================================\n // PAUSE / ENABLE — change status on Google\n // ====================================================================\n\n case \"pause\":\n case \"enable\": {\n const int = await getIntegration(sb, storeId);\n const type = (args.type as string) || \"campaign\";\n const id = (args.id || args.campaign_id || args.ad_group_id) as string;\n if (!id) return { success: false, error: \"id required\" };\n const newStatus = action === \"pause\" ? \"PAUSED\" : \"ENABLED\";\n\n if (type === \"campaign\") {\n const { data: c } = await sb.from(\"google_campaigns\").select(\"google_campaign_id\").eq(\"id\", id).eq(\"store_id\", storeId).single();\n if (!c?.google_campaign_id || isLocalId(c.google_campaign_id)) {\n return { success: false, error: \"Campaign not published to Google yet\" };\n }\n await mutate(int, \"campaigns\", [{\n update: { resourceName: `customers/${int.customerId}/campaigns/${c.google_campaign_id}`, status: newStatus },\n updateMask: \"status\",\n }], sb, storeId);\n await sb.from(\"google_campaigns\").update({ google_status: newStatus, updated_at: new Date().toISOString() }).eq(\"id\", id).eq(\"store_id\", storeId);\n return { success: true, data: { status: newStatus } };\n }\n\n if (type === \"ad_group\") {\n const { data: ag } = await sb.from(\"google_ad_groups\").select(\"google_ad_group_id\").eq(\"id\", id).eq(\"store_id\", storeId).single();\n if (!ag?.google_ad_group_id || isLocalId(ag.google_ad_group_id)) {\n return { success: false, error: \"Ad group not published to Google yet\" };\n }\n await mutate(int, \"adGroups\", [{\n update: { resourceName: `customers/${int.customerId}/adGroups/${ag.google_ad_group_id}`, status: newStatus },\n updateMask: \"status\",\n }], sb, storeId);\n await sb.from(\"google_ad_groups\").update({ google_status: newStatus, updated_at: new Date().toISOString() }).eq(\"id\", id).eq(\"store_id\", storeId);\n return { success: true, data: { status: newStatus } };\n }\n\n return { success: false, error: `Unknown type: ${type}` };\n }\n\n // ====================================================================\n // SYNC — pull metrics from Google into local DB\n // ====================================================================\n\n case \"sync\": {\n const int = await getIntegration(sb, storeId);\n const dateRange = (args.date_range as string) || \"LAST_30_DAYS\";\n const result = await syncCampaignMetrics(sb, int, storeId, dateRange);\n return { success: true, data: result };\n }\n\n // ====================================================================\n // SEARCH — raw GAQL queries\n // ====================================================================\n\n case \"search\": {\n const query = args.query as string;\n if (!query) return { success: false, error: \"query (GAQL) required\" };\n\n const int = await getIntegration(sb, storeId);\n const customerId = (args.customer_id as string) || int.customerId;\n const results = await gaqlSearch(int, query, customerId);\n return { success: true, data: { results, totalResults: results.length } };\n }\n\n // ====================================================================\n // LIST ACCESSIBLE CUSTOMERS\n // ====================================================================\n\n case \"list_accessible_customers\": {\n const int = await getIntegration(sb, storeId);\n const res = await fetch(`${GOOGLE_ADS_BASE}/customers:listAccessibleCustomers`, {\n method: \"GET\",\n headers: authHeaders(int),\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n throw new Error(`listAccessibleCustomers failed (${res.status}): ${parseGoogleError(errBody, res.status)}`);\n }\n\n const data = await res.json();\n return { success: true, data };\n }\n\n // ====================================================================\n // CONVERSION ACTIONS\n // ====================================================================\n\n case \"create_conversion_action\": {\n const name = args.name as string;\n if (!name) return { success: false, error: \"name required\" };\n\n const row: Record<string, unknown> = {\n store_id: storeId,\n name,\n category: (args.category as string) || \"PURCHASE\",\n counting_type: (args.counting_type as string) || \"ONE_PER_CLICK\",\n attribution_model: (args.attribution_model as string) || \"GOOGLE_LAST_CLICK\",\n default_value: args.default_value ? Number(args.default_value) : null,\n status: \"DRAFT\",\n };\n\n const { data, error } = await sb.from(\"google_conversion_actions\").insert(row).select().single();\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n case \"list_conversion_actions\": {\n const { data, error } = await sb.from(\"google_conversion_actions\").select(\"*\").eq(\"store_id\", storeId).order(\"created_at\", { ascending: false });\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n // ====================================================================\n // AUDIENCES\n // ====================================================================\n\n case \"create_audience\": {\n const name = args.name as string;\n if (!name) return { success: false, error: \"name required\" };\n\n const row: Record<string, unknown> = {\n store_id: storeId,\n name,\n audience_type: (args.audience_type as string) || \"CUSTOM\",\n description: (args.description as string) || null,\n status: \"DRAFT\",\n };\n\n const { data, error } = await sb.from(\"google_audiences\").insert(row).select().single();\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n case \"list_audiences\": {\n const { data, error } = await sb.from(\"google_audiences\").select(\"*\").eq(\"store_id\", storeId).order(\"created_at\", { ascending: false });\n if (error) return { success: false, error: error.message };\n return { success: true, data };\n }\n\n // ====================================================================\n // KEYWORD IDEAS (Keyword Planner)\n // ====================================================================\n\n case \"keyword_ideas\": {\n const int = await getIntegration(sb, storeId);\n const keywords = args.keywords as string[];\n const url = args.url as string;\n\n if (!keywords?.length && !url) {\n return { success: false, error: \"Provide keywords (array) or url for keyword ideas\" };\n }\n\n const body: Record<string, unknown> = {\n language: (args.language as string) || \"languageConstants/1000\", // English\n geoTargetConstants: (args.geo_targets as string[]) || [\"geoTargetConstants/2840\"], // US\n keywordPlanNetwork: \"GOOGLE_SEARCH\",\n };\n\n if (keywords?.length) {\n body.keywordSeed = { keywords };\n }\n if (url) {\n body.urlSeed = { url };\n }\n\n const res = await fetch(\n `${GOOGLE_ADS_BASE}/customers/${int.customerId}:generateKeywordIdeas`,\n {\n method: \"POST\",\n headers: authHeaders(int),\n body: JSON.stringify(body),\n },\n );\n\n if (!res.ok) {\n const errBody = await res.text();\n throw new Error(`Keyword ideas failed (${res.status}): ${parseGoogleError(errBody, res.status)}`);\n }\n\n const data = await res.json();\n return { success: true, data };\n }\n\n // ====================================================================\n // CREATE FULL — campaign + ad group + ad + keywords in one call\n // ====================================================================\n\n case \"create_full\": {\n const name = args.name as string;\n if (!name) return { success: false, error: \"name required\" };\n\n // 1. Create campaign\n const campaignRow: Record<string, unknown> = {\n store_id: storeId,\n name,\n campaign_type: (args.campaign_type as string) || \"SEARCH\",\n status: \"DRAFT\",\n daily_budget: args.daily_budget ? Number(args.daily_budget) : 10,\n bidding_strategy: (args.bidding_strategy as string) || \"MAXIMIZE_CLICKS\",\n bidding_target: args.bidding_target ? Number(args.bidding_target) : null,\n start_date: (args.start_date as string) || null,\n end_date: (args.end_date as string) || null,\n };\n const { data: campaign, error: campErr } = await sb.from(\"google_campaigns\").insert(campaignRow).select().single();\n if (campErr) return { success: false, error: campErr.message };\n\n // 2. Create ad group\n const adGroupRow: Record<string, unknown> = {\n store_id: storeId,\n google_campaign_id: campaign.id,\n name: (args.ad_group_name as string) || `${name} — Ad Group`,\n ad_group_type: (args.ad_group_type as string) || \"SEARCH_STANDARD\",\n status: \"DRAFT\",\n cpc_bid: args.cpc_bid ? Number(args.cpc_bid) : null,\n };\n const { data: adGroup, error: agErr } = await sb.from(\"google_ad_groups\").insert(adGroupRow).select().single();\n if (agErr) return { success: false, error: agErr.message };\n\n // 3. Create ad\n const adRow: Record<string, unknown> = {\n store_id: storeId,\n ad_group_id: adGroup.id,\n ad_type: (args.ad_type as string) || \"RESPONSIVE_SEARCH_AD\",\n headlines: args.headlines || [],\n descriptions: args.descriptions || [],\n final_urls: args.final_urls || [],\n path1: (args.path1 as string) || null,\n path2: (args.path2 as string) || null,\n creative: args.creative || null,\n status: \"DRAFT\",\n };\n const { data: ad, error: adErr } = await sb.from(\"google_ads\").insert(adRow).select().single();\n if (adErr) return { success: false, error: adErr.message };\n\n // 4. Create keywords (if provided)\n const keywords = args.keywords as Array<{ text: string; match_type?: string }>;\n let keywordCount = 0;\n if (keywords?.length) {\n const kwRows = keywords.map((kw) => ({\n store_id: storeId,\n ad_group_id: adGroup.id,\n text: kw.text,\n match_type: kw.match_type || \"BROAD\",\n status: \"DRAFT\",\n }));\n const { error: kwErr } = await sb.from(\"google_keywords\").insert(kwRows);\n if (kwErr) throw new Error(`Failed to insert keywords: ${kwErr.message}`);\n keywordCount = kwRows.length;\n }\n\n // 5. Auto-publish if requested\n let published = false;\n if (args.auto_publish) {\n try {\n const int = await getIntegration(sb, storeId);\n // PMax: publishCampaignToGoogle handles everything (asset group, assets, links)\n await publishCampaignToGoogle(sb, int, storeId, campaign.id);\n if (campaignRow.campaign_type !== \"PERFORMANCE_MAX\") {\n await publishAdGroupToGoogle(sb, int, storeId, adGroup.id);\n await publishAdToGoogle(sb, int, storeId, ad.id);\n await publishKeywordsToGoogle(sb, int, storeId, adGroup.id);\n }\n published = true;\n } catch (pubErr) {\n return {\n success: true,\n data: {\n campaign, adGroup, ad, keywordCount,\n published: false,\n publishError: pubErr instanceof Error ? pubErr.message : String(pubErr),\n },\n };\n }\n }\n\n return {\n success: true,\n data: { campaign, adGroup, ad, keywordCount, published },\n };\n }\n\n // ====================================================================\n // DEFAULT\n // ====================================================================\n\n default:\n return { success: false, error: `Unknown action: ${action}. Valid actions: create_campaign, list_campaigns, get_campaign, update_campaign, delete_campaign, create_ad_group, list_ad_groups, get_ad_group, update_ad_group, create_ad, list_ads, get_ad, update_ad, create_keyword, list_keywords, update_keyword, delete_keyword, publish, pause, enable, sync, search, list_accessible_customers, keyword_ideas, create_conversion_action, list_conversion_actions, create_audience, list_audiences, create_full` };\n }\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,9 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
2
+ type Result = {
3
+ success: boolean;
4
+ data?: unknown;
5
+ error?: string;
6
+ [key: string]: unknown;
7
+ };
8
+ export declare function handleInvoices(sb: SupabaseClient, args: Record<string, unknown>, storeId?: string): Promise<Result>;
9
+ export {};
@@ -0,0 +1,252 @@
1
+ // server/handlers/invoices.ts — Invoice creation and management
2
+
3
+ import { sanitizeFilterValue } from "../lib/utils.js";
4
+ export async function handleInvoices(sb, args, storeId) {
5
+ const sid = storeId;
6
+ switch (args.action) {
7
+ // ---- LIST: list invoices ----
8
+ case "list":
9
+ {
10
+ let q = sb.from("invoices").select("id, invoice_number, customer_name, customer_email, total_amount, status, payment_status, amount_paid, amount_due, due_date, sent_at, paid_at, created_at").eq("store_id", sid).order("created_at", {
11
+ ascending: false
12
+ });
13
+ if (args.status) q = q.eq("status", args.status);
14
+ if (args.payment_status) q = q.eq("payment_status", args.payment_status);
15
+ if (args.customer_id) q = q.eq("customer_id", args.customer_id);
16
+ if (args.query) {
17
+ const sq = sanitizeFilterValue(String(args.query));
18
+ q = q.or(`invoice_number.ilike.%${sq}%,customer_name.ilike.%${sq}%,customer_email.ilike.%${sq}%`);
19
+ }
20
+ q = q.limit(args.limit || 50);
21
+ const {
22
+ data,
23
+ error
24
+ } = await q;
25
+ return error ? {
26
+ success: false,
27
+ error: error.message
28
+ } : {
29
+ success: true,
30
+ count: data?.length,
31
+ data
32
+ };
33
+ }
34
+
35
+ // ---- GET: get invoice detail ----
36
+ case "get":
37
+ {
38
+ const invoiceId = args.invoice_id;
39
+ if (!invoiceId) return {
40
+ success: false,
41
+ error: "invoice_id is required"
42
+ };
43
+ const {
44
+ data,
45
+ error
46
+ } = await sb.from("invoices").select("*").eq("id", invoiceId).eq("store_id", sid).single();
47
+ return error ? {
48
+ success: false,
49
+ error: error.message
50
+ } : {
51
+ success: true,
52
+ data
53
+ };
54
+ }
55
+
56
+ // ---- CREATE: create a new invoice ----
57
+ case "create":
58
+ {
59
+ const customerEmail = args.customer_email;
60
+ if (!customerEmail) return {
61
+ success: false,
62
+ error: "customer_email is required"
63
+ };
64
+
65
+ // Generate sequential invoice number
66
+ const {
67
+ data: maxInv
68
+ } = await sb.from("invoices").select("invoice_number").eq("store_id", sid).order("created_at", {
69
+ ascending: false
70
+ }).limit(1).single();
71
+ let nextNum = 1001;
72
+ if (maxInv?.invoice_number) {
73
+ const parsed = parseInt(maxInv.invoice_number.replace(/\D/g, ""), 10);
74
+ if (!isNaN(parsed)) nextNum = parsed + 1;
75
+ }
76
+ const invoiceNumber = `INV-${String(nextNum).padStart(5, "0")}`;
77
+ const lineItems = args.line_items || [];
78
+ const subtotal = lineItems.reduce((s, li) => s + (li.quantity || 0) * (li.unit_price || 0), 0);
79
+ const taxAmount = args.tax_amount || 0;
80
+ const discountAmount = args.discount_amount || 0;
81
+ const totalAmount = args.total_amount || Math.round((subtotal + taxAmount - discountAmount) * 100) / 100;
82
+ const record = {
83
+ store_id: sid,
84
+ invoice_number: invoiceNumber,
85
+ customer_email: customerEmail,
86
+ line_items: lineItems,
87
+ subtotal: Math.round(subtotal * 100) / 100,
88
+ tax_amount: taxAmount,
89
+ discount_amount: discountAmount,
90
+ total_amount: totalAmount,
91
+ status: "draft",
92
+ payment_status: "pending",
93
+ amount_paid: 0
94
+ };
95
+ if (args.customer_id !== undefined) record.customer_id = args.customer_id;
96
+ if (args.order_id !== undefined) record.order_id = args.order_id;
97
+ if (args.customer_name !== undefined) record.customer_name = args.customer_name;
98
+ if (args.customer_phone !== undefined) record.customer_phone = args.customer_phone;
99
+ if (args.description !== undefined) record.description = args.description;
100
+ if (args.due_date !== undefined) record.due_date = args.due_date;
101
+ if (args.notes !== undefined) record.notes = args.notes;
102
+ if (args.internal_notes !== undefined) record.internal_notes = args.internal_notes;
103
+ const {
104
+ data,
105
+ error
106
+ } = await sb.from("invoices").insert(record).select().single();
107
+ return error ? {
108
+ success: false,
109
+ error: error.message
110
+ } : {
111
+ success: true,
112
+ data
113
+ };
114
+ }
115
+
116
+ // ---- UPDATE: modify an invoice ----
117
+ case "update":
118
+ {
119
+ const invoiceId = args.invoice_id;
120
+ if (!invoiceId) return {
121
+ success: false,
122
+ error: "invoice_id is required"
123
+ };
124
+ const updates = {
125
+ updated_at: new Date().toISOString()
126
+ };
127
+ if (args.status !== undefined) updates.status = args.status;
128
+ if (args.payment_status !== undefined) updates.payment_status = args.payment_status;
129
+ if (args.line_items !== undefined) updates.line_items = args.line_items;
130
+ if (args.subtotal !== undefined) updates.subtotal = args.subtotal;
131
+ if (args.tax_amount !== undefined) updates.tax_amount = args.tax_amount;
132
+ if (args.discount_amount !== undefined) updates.discount_amount = args.discount_amount;
133
+ if (args.total_amount !== undefined) updates.total_amount = args.total_amount;
134
+ if (args.amount_paid !== undefined) updates.amount_paid = args.amount_paid;
135
+ if (args.due_date !== undefined) updates.due_date = args.due_date;
136
+ if (args.notes !== undefined) updates.notes = args.notes;
137
+ if (args.internal_notes !== undefined) updates.internal_notes = args.internal_notes;
138
+ if (args.customer_name !== undefined) updates.customer_name = args.customer_name;
139
+ if (args.customer_email !== undefined) updates.customer_email = args.customer_email;
140
+ const {
141
+ data,
142
+ error
143
+ } = await sb.from("invoices").update(updates).eq("id", invoiceId).eq("store_id", sid).select().single();
144
+ return error ? {
145
+ success: false,
146
+ error: error.message
147
+ } : {
148
+ success: true,
149
+ data
150
+ };
151
+ }
152
+
153
+ // ---- MARK_SENT: mark an invoice as sent ----
154
+ case "mark_sent":
155
+ {
156
+ const invoiceId = args.invoice_id;
157
+ if (!invoiceId) return {
158
+ success: false,
159
+ error: "invoice_id is required"
160
+ };
161
+ const {
162
+ data,
163
+ error
164
+ } = await sb.from("invoices").update({
165
+ status: "sent",
166
+ sent_at: new Date().toISOString(),
167
+ updated_at: new Date().toISOString()
168
+ }).eq("id", invoiceId).eq("store_id", sid).select().single();
169
+ return error ? {
170
+ success: false,
171
+ error: error.message
172
+ } : {
173
+ success: true,
174
+ data
175
+ };
176
+ }
177
+
178
+ // ---- RECORD_PAYMENT: record a payment against an invoice ----
179
+ case "record_payment":
180
+ {
181
+ const invoiceId = args.invoice_id;
182
+ const amount = args.amount;
183
+ if (!invoiceId || amount === undefined) return {
184
+ success: false,
185
+ error: "invoice_id and amount are required"
186
+ };
187
+ const {
188
+ data: inv,
189
+ error: invErr
190
+ } = await sb.from("invoices").select("total_amount, amount_paid").eq("id", invoiceId).eq("store_id", sid).single();
191
+ if (invErr || !inv) return {
192
+ success: false,
193
+ error: invErr?.message || "Invoice not found"
194
+ };
195
+ const newAmountPaid = Math.round(((Number(inv.amount_paid) || 0) + amount) * 100) / 100;
196
+ const totalAmount = Number(inv.total_amount) || 0;
197
+ const newPaymentStatus = newAmountPaid >= totalAmount ? "paid" : "partial";
198
+ const newStatus = newAmountPaid >= totalAmount ? "paid" : "partially_paid";
199
+ const updates = {
200
+ amount_paid: newAmountPaid,
201
+ amount_due: Math.round((totalAmount - newAmountPaid) * 100) / 100,
202
+ payment_status: newPaymentStatus,
203
+ status: newStatus,
204
+ updated_at: new Date().toISOString()
205
+ };
206
+ if (newAmountPaid >= totalAmount) updates.paid_at = new Date().toISOString();
207
+ if (args.payment_method) updates.payment_method = args.payment_method;
208
+ if (args.transaction_id) updates.transaction_id = args.transaction_id;
209
+ const {
210
+ data,
211
+ error
212
+ } = await sb.from("invoices").update(updates).eq("id", invoiceId).eq("store_id", sid).select().single();
213
+ return error ? {
214
+ success: false,
215
+ error: error.message
216
+ } : {
217
+ success: true,
218
+ data
219
+ };
220
+ }
221
+
222
+ // ---- CANCEL: cancel an invoice ----
223
+ case "cancel":
224
+ {
225
+ const invoiceId = args.invoice_id;
226
+ if (!invoiceId) return {
227
+ success: false,
228
+ error: "invoice_id is required"
229
+ };
230
+ const {
231
+ data,
232
+ error
233
+ } = await sb.from("invoices").update({
234
+ status: "cancelled",
235
+ updated_at: new Date().toISOString()
236
+ }).eq("id", invoiceId).eq("store_id", sid).select().single();
237
+ return error ? {
238
+ success: false,
239
+ error: error.message
240
+ } : {
241
+ success: true,
242
+ data
243
+ };
244
+ }
245
+ default:
246
+ return {
247
+ success: false,
248
+ error: `Unknown invoices action: ${args.action}. Valid: list, get, create, update, mark_sent, record_payment, cancel`
249
+ };
250
+ }
251
+ }
252
+ //# sourceMappingURL=invoices.js.map