whale-code 6.5.7 → 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.
- package/README.md +14 -2
- package/dist/cli/services/agent-loop.js +26 -2
- package/dist/cli/services/agent-loop.js.map +1 -1
- package/dist/cli/services/hooks.js +2 -1
- package/dist/cli/services/hooks.js.map +1 -1
- package/dist/cli/services/telemetry-spans.js +1 -0
- package/dist/cli/services/telemetry-spans.js.map +1 -1
- package/dist/cli/services/telemetry.d.ts +23 -0
- package/dist/cli/services/telemetry.js +45 -1
- package/dist/cli/services/telemetry.js.map +1 -1
- package/dist/server/handlers/__test-utils__/test-db.d.ts +17 -3
- package/dist/server/handlers/__test-utils__/test-db.js +113 -14
- package/dist/server/handlers/__test-utils__/test-db.js.map +1 -1
- package/dist/server/handlers/affiliates.d.ts +9 -0
- package/dist/server/handlers/affiliates.js +197 -0
- package/dist/server/handlers/affiliates.js.map +1 -0
- package/dist/server/handlers/api-docs.d.ts +4 -2
- package/dist/server/handlers/api-docs.js +204 -1681
- package/dist/server/handlers/api-docs.js.map +1 -1
- package/dist/server/handlers/campaigns.d.ts +9 -0
- package/dist/server/handlers/campaigns.js +237 -0
- package/dist/server/handlers/campaigns.js.map +1 -0
- package/dist/server/handlers/catalog-schemas.js +9 -9
- package/dist/server/handlers/catalog-schemas.js.map +1 -1
- package/dist/server/handlers/catalog.js +1 -1
- package/dist/server/handlers/catalog.js.map +1 -1
- package/dist/server/handlers/comms-documents.js +28 -2
- package/dist/server/handlers/comms-documents.js.map +1 -1
- package/dist/server/handlers/comms-pdf-generation.js +25 -3
- package/dist/server/handlers/comms-pdf-generation.js.map +1 -1
- package/dist/server/handlers/comms-pdf-helpers.js +4 -4
- package/dist/server/handlers/comms-pdf-helpers.js.map +1 -1
- package/dist/server/handlers/comms.d.ts +100 -0
- package/dist/server/handlers/comms.js +146 -12
- package/dist/server/handlers/comms.js.map +1 -1
- package/dist/server/handlers/coupons.d.ts +9 -0
- package/dist/server/handlers/coupons.js +220 -0
- package/dist/server/handlers/coupons.js.map +1 -0
- package/dist/server/handlers/embeddings.js +1 -1
- package/dist/server/handlers/embeddings.js.map +1 -1
- package/dist/server/handlers/enrichment.js +2 -622
- package/dist/server/handlers/enrichment.js.map +1 -1
- package/dist/server/handlers/fulfillment.d.ts +9 -0
- package/dist/server/handlers/fulfillment.js +209 -0
- package/dist/server/handlers/fulfillment.js.map +1 -0
- package/dist/server/handlers/google-ads.d.ts +24 -0
- package/dist/server/handlers/google-ads.js +2199 -0
- package/dist/server/handlers/google-ads.js.map +1 -0
- package/dist/server/handlers/invoices.d.ts +9 -0
- package/dist/server/handlers/invoices.js +252 -0
- package/dist/server/handlers/invoices.js.map +1 -0
- package/dist/server/handlers/loyalty.d.ts +9 -0
- package/dist/server/handlers/loyalty.js +197 -0
- package/dist/server/handlers/loyalty.js.map +1 -0
- package/dist/server/handlers/meta-ads-graph-api.js +18 -3
- package/dist/server/handlers/meta-ads-graph-api.js.map +1 -1
- package/dist/server/handlers/phone.d.ts +9 -0
- package/dist/server/handlers/phone.js +197 -0
- package/dist/server/handlers/phone.js.map +1 -0
- package/dist/server/handlers/pipeline.d.ts +9 -0
- package/dist/server/handlers/pipeline.js +277 -0
- package/dist/server/handlers/pipeline.js.map +1 -0
- package/dist/server/handlers/qr-codes.d.ts +9 -0
- package/dist/server/handlers/qr-codes.js +198 -0
- package/dist/server/handlers/qr-codes.js.map +1 -0
- package/dist/server/handlers/reviews.d.ts +9 -0
- package/dist/server/handlers/reviews.js +171 -0
- package/dist/server/handlers/reviews.js.map +1 -0
- package/dist/server/handlers/segments.d.ts +9 -0
- package/dist/server/handlers/segments.js +229 -0
- package/dist/server/handlers/segments.js.map +1 -0
- package/dist/server/handlers/social.d.ts +9 -0
- package/dist/server/handlers/social.js +81 -0
- package/dist/server/handlers/social.js.map +1 -0
- package/dist/server/handlers/tax.d.ts +9 -0
- package/dist/server/handlers/tax.js +182 -0
- package/dist/server/handlers/tax.js.map +1 -0
- package/dist/server/handlers/wallet.d.ts +9 -0
- package/dist/server/handlers/wallet.js +203 -0
- package/dist/server/handlers/wallet.js.map +1 -0
- package/dist/server/handlers/webhooks-mgmt.d.ts +9 -0
- package/dist/server/handlers/webhooks-mgmt.js +181 -0
- package/dist/server/handlers/webhooks-mgmt.js.map +1 -0
- package/dist/server/handlers/wholesale.d.ts +9 -0
- package/dist/server/handlers/wholesale.js +219 -0
- package/dist/server/handlers/wholesale.js.map +1 -0
- package/dist/server/index.js +20 -9
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/clickhouse-buffer.js +1 -0
- package/dist/server/lib/clickhouse-buffer.js.map +1 -1
- package/dist/server/lib/coa-renderer.d.ts +1 -1
- package/dist/server/lib/coa-renderer.js +32 -10
- package/dist/server/lib/coa-renderer.js.map +1 -1
- package/dist/server/server-worker.d.ts +1 -0
- package/dist/server/server-worker.js +464 -3
- package/dist/server/server-worker.js.map +1 -1
- package/dist/server/tool-router.js +118 -4
- package/dist/server/tool-router.js.map +1 -1
- package/package.json +28 -4
- package/vendor/ink/package.json +0 -2
- package/whale-logo.png +0 -0
|
@@ -42,12 +42,29 @@ import { handleVideoGen } from "./handlers/video-gen.js";
|
|
|
42
42
|
import { handleAPIKeys } from "./handlers/api-keys.js";
|
|
43
43
|
import { handleCreations } from "./handlers/creations.js";
|
|
44
44
|
import { handleMetaAds } from "./handlers/meta-ads.js";
|
|
45
|
+
import { handleGoogleAds } from "./handlers/google-ads.js";
|
|
45
46
|
import { handleKali } from "./handlers/kali.js";
|
|
46
47
|
import { handleLocalAgent } from "./handlers/local-agent.js";
|
|
47
48
|
import { handleEnrichment } from "./handlers/enrichment.js";
|
|
48
49
|
import { handleStorefront } from "./handlers/storefront.js";
|
|
49
50
|
import { handleApiDocs } from "./handlers/api-docs.js";
|
|
50
51
|
import { handleClickHouse } from "./handlers/clickhouse.js";
|
|
52
|
+
import { handleLoyalty } from "./handlers/loyalty.js";
|
|
53
|
+
import { handleCoupons } from "./handlers/coupons.js";
|
|
54
|
+
import { handleFulfillment } from "./handlers/fulfillment.js";
|
|
55
|
+
import { handleSegments } from "./handlers/segments.js";
|
|
56
|
+
import { handleCampaigns } from "./handlers/campaigns.js";
|
|
57
|
+
import { handleReviews } from "./handlers/reviews.js";
|
|
58
|
+
import { handleTax } from "./handlers/tax.js";
|
|
59
|
+
import { handleWebhooksMgmt } from "./handlers/webhooks-mgmt.js";
|
|
60
|
+
import { handleAffiliates } from "./handlers/affiliates.js";
|
|
61
|
+
import { handleQRCodes } from "./handlers/qr-codes.js";
|
|
62
|
+
import { handlePhone } from "./handlers/phone.js";
|
|
63
|
+
import { handleSocial } from "./handlers/social.js";
|
|
64
|
+
import { handleWallet } from "./handlers/wallet.js";
|
|
65
|
+
import { handlePipeline } from "./handlers/pipeline.js";
|
|
66
|
+
import { handleInvoices } from "./handlers/invoices.js";
|
|
67
|
+
import { handleWholesale } from "./handlers/wholesale.js";
|
|
51
68
|
import { summarizeResult, withTimeout } from "./lib/utils.js";
|
|
52
69
|
|
|
53
70
|
// ============================================================================
|
|
@@ -485,7 +502,7 @@ export const TOOL_HANDLERS = {
|
|
|
485
502
|
},
|
|
486
503
|
api_docs: {
|
|
487
504
|
handler: handleApiDocs,
|
|
488
|
-
timeout:
|
|
505
|
+
timeout: 15_000,
|
|
489
506
|
requiresStore: false
|
|
490
507
|
},
|
|
491
508
|
// --- Advertising ---
|
|
@@ -494,6 +511,11 @@ export const TOOL_HANDLERS = {
|
|
|
494
511
|
timeout: 300_000,
|
|
495
512
|
requiresStore: true
|
|
496
513
|
},
|
|
514
|
+
google_ads: {
|
|
515
|
+
handler: handleGoogleAds,
|
|
516
|
+
timeout: 300_000,
|
|
517
|
+
requiresStore: true
|
|
518
|
+
},
|
|
497
519
|
// --- Security & Local ---
|
|
498
520
|
kali: {
|
|
499
521
|
handler: handleKali,
|
|
@@ -506,7 +528,7 @@ export const TOOL_HANDLERS = {
|
|
|
506
528
|
timeout: 600_000,
|
|
507
529
|
requiresStore: false
|
|
508
530
|
},
|
|
509
|
-
// --- Customer
|
|
531
|
+
// --- Customer Enrichment ---
|
|
510
532
|
enrichment: {
|
|
511
533
|
handler: handleEnrichment,
|
|
512
534
|
timeout: 60_000,
|
|
@@ -518,6 +540,98 @@ export const TOOL_HANDLERS = {
|
|
|
518
540
|
timeout: 60_000,
|
|
519
541
|
requiresStore: false
|
|
520
542
|
},
|
|
543
|
+
// --- Loyalty & Promotions ---
|
|
544
|
+
loyalty: {
|
|
545
|
+
handler: handleLoyalty,
|
|
546
|
+
timeout: DEFAULT_TIMEOUT,
|
|
547
|
+
requiresStore: true
|
|
548
|
+
},
|
|
549
|
+
coupons: {
|
|
550
|
+
handler: handleCoupons,
|
|
551
|
+
timeout: DEFAULT_TIMEOUT,
|
|
552
|
+
requiresStore: true
|
|
553
|
+
},
|
|
554
|
+
// --- Fulfillment ---
|
|
555
|
+
fulfillment: {
|
|
556
|
+
handler: handleFulfillment,
|
|
557
|
+
timeout: DEFAULT_TIMEOUT,
|
|
558
|
+
requiresStore: true
|
|
559
|
+
},
|
|
560
|
+
// --- CRM & Marketing ---
|
|
561
|
+
segments: {
|
|
562
|
+
handler: handleSegments,
|
|
563
|
+
timeout: DEFAULT_TIMEOUT,
|
|
564
|
+
requiresStore: true
|
|
565
|
+
},
|
|
566
|
+
campaigns: {
|
|
567
|
+
handler: handleCampaigns,
|
|
568
|
+
timeout: DEFAULT_TIMEOUT,
|
|
569
|
+
requiresStore: true
|
|
570
|
+
},
|
|
571
|
+
reviews: {
|
|
572
|
+
handler: handleReviews,
|
|
573
|
+
timeout: DEFAULT_TIMEOUT,
|
|
574
|
+
requiresStore: true
|
|
575
|
+
},
|
|
576
|
+
// --- Finance & Tax ---
|
|
577
|
+
tax: {
|
|
578
|
+
handler: handleTax,
|
|
579
|
+
timeout: DEFAULT_TIMEOUT,
|
|
580
|
+
requiresStore: true
|
|
581
|
+
},
|
|
582
|
+
invoices: {
|
|
583
|
+
handler: handleInvoices,
|
|
584
|
+
timeout: DEFAULT_TIMEOUT,
|
|
585
|
+
requiresStore: true
|
|
586
|
+
},
|
|
587
|
+
// --- Webhooks ---
|
|
588
|
+
webhooks_mgmt: {
|
|
589
|
+
handler: handleWebhooksMgmt,
|
|
590
|
+
timeout: DEFAULT_TIMEOUT,
|
|
591
|
+
requiresStore: true
|
|
592
|
+
},
|
|
593
|
+
// --- Affiliates ---
|
|
594
|
+
affiliates: {
|
|
595
|
+
handler: handleAffiliates,
|
|
596
|
+
timeout: DEFAULT_TIMEOUT,
|
|
597
|
+
requiresStore: true
|
|
598
|
+
},
|
|
599
|
+
// --- QR Codes ---
|
|
600
|
+
qr_codes: {
|
|
601
|
+
handler: handleQRCodes,
|
|
602
|
+
timeout: DEFAULT_TIMEOUT,
|
|
603
|
+
requiresStore: true
|
|
604
|
+
},
|
|
605
|
+
// --- Phone (RingCentral) ---
|
|
606
|
+
phone: {
|
|
607
|
+
handler: handlePhone,
|
|
608
|
+
timeout: DEFAULT_TIMEOUT,
|
|
609
|
+
requiresStore: true
|
|
610
|
+
},
|
|
611
|
+
// --- Social / Multi-platform Ads ---
|
|
612
|
+
social: {
|
|
613
|
+
handler: handleSocial,
|
|
614
|
+
timeout: 300_000,
|
|
615
|
+
requiresStore: true
|
|
616
|
+
},
|
|
617
|
+
// --- Wallet ---
|
|
618
|
+
wallet: {
|
|
619
|
+
handler: handleWallet,
|
|
620
|
+
timeout: DEFAULT_TIMEOUT,
|
|
621
|
+
requiresStore: true
|
|
622
|
+
},
|
|
623
|
+
// --- Sales Pipeline ---
|
|
624
|
+
pipeline: {
|
|
625
|
+
handler: handlePipeline,
|
|
626
|
+
timeout: DEFAULT_TIMEOUT,
|
|
627
|
+
requiresStore: true
|
|
628
|
+
},
|
|
629
|
+
// --- Wholesale ---
|
|
630
|
+
wholesale: {
|
|
631
|
+
handler: handleWholesale,
|
|
632
|
+
timeout: DEFAULT_TIMEOUT,
|
|
633
|
+
requiresStore: true
|
|
634
|
+
},
|
|
521
635
|
// --- Meta: Tool Discovery (lazy loading) ---
|
|
522
636
|
discover_tools: {
|
|
523
637
|
handler: handleDiscoverTools,
|
|
@@ -1141,9 +1255,9 @@ export async function loadAgentConfig(supabase, agentId, storeId) {
|
|
|
1141
1255
|
// storeId is required for tenant isolation — only omit for internal/migration callers
|
|
1142
1256
|
let query = supabase.from("ai_agent_config").select("*").eq("id", agentId);
|
|
1143
1257
|
|
|
1144
|
-
//
|
|
1258
|
+
// Filter by store_id for tenant isolation, but also allow platform agents (store_id IS NULL)
|
|
1145
1259
|
if (storeId) {
|
|
1146
|
-
query = query.
|
|
1260
|
+
query = query.or(`store_id.eq.${storeId},store_id.is.null`);
|
|
1147
1261
|
}
|
|
1148
1262
|
const {
|
|
1149
1263
|
data,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-router.js","names":["sanitizeError","validateToolArgs","sanitizeToolDescription","validateUrl","handleInventory","handleInventoryQuery","handleInventoryAudit","handlePurchaseOrders","handleTransfers","handleProducts","handleCollections","handleCustomers","handleOrders","handleAnalytics","handleLocations","handleSuppliers","handleAlerts","handleAuditTrail","handleStore","handleEmail","handleDocuments","handleWebSearch","handleTelemetry","handleBrowser","handleDiscovery","handleVoice","handleWorkflows","handleEmbeddings","handleLLM","handleImageGen","handleRemoveBg","handleMedia","handleVideoGen","handleAPIKeys","handleCreations","handleMetaAds","handleKali","handleLocalAgent","handleEnrichment","handleStorefront","handleApiDocs","handleClickHouse","summarizeResult","withTimeout","queueSpan","flushSpans","auditRowToSpan","classifyErrorType","toolMetrics","Map","getToolMetrics","result","name","m","invocations","errors","avgMs","Math","round","totalMs","lastMs","recordToolMetric","toolName","durationMs","success","get","set","cachedResult","cacheTime","cachedApiToolDefs","truncateDescription","desc","maxLen","length","cut","lastIndexOf","substring","loadTools","supabase","forceRefresh","Date","now","data","error","from","select","eq","neq","core","extended","all","allTools","map","t","description","definition","input_schema","type","properties","migrationApplied","some","auto_load","push","i","DISCOVER_TOOLS_DEF","getCachedToolDefs","tools","cached","names","items","category","refresh","userToolCache","USER_TOOL_CACHE_MAX","evictUserToolCache","size","entries","sort","a","b","lastAccessed","excess","delete","loadUserTools","storeId","time","rows","defs","display_name","requires_approval","getUserToolByPrefixedName","prefixedName","replace","find","getToolsForAgent","agent","coreTools","userToolDefs","enabled_tools","filteredUserTools","filter","includes","DEFAULT_TIMEOUT","TOOL_HANDLERS","inventory","handler","sb","args","sid","action","startsWith","slice","timeout","requiresStore","purchase_orders","transfers","products","collections","customers","orders","analytics","locations","suppliers","store","storefront","email","documents","alerts","audit_trail","workflows","voice","image_gen","remove_bg","media","video_gen","llm","embeddings","creations","web_search","telemetry","browser","discovery","api_keys","api_docs","meta_ads","kali","supportsProgress","local_agent","enrichment","clickhouse","discover_tools","handleDiscoverTools","Object","freeze","getRegisteredToolNames","keys","_extendedToolsCache","_extendedToolsIndex","setExtendedToolsCache","split","getExtendedToolsCache","getExtendedToolsIndex","getFullToolSchemas","toolNames","nameSet","Set","has","TOOL_CATEGORIES","freshResult","matching","cat","toLowerCase","categoryTools","existingNames","available","join","count","refreshed","executeUserTool","userTool","agentId","conversationId","max_execution_time_ms","execution_type","executeHTTPUserTool","rpc","p_tool_id","id","p_store_id","p_args","p_agent_id","p_conversation_id","message","pending_approval","execution_id","execute_sql","executeSQLUserTool","err","config","http_config","url","httpCfg","headers","configStr","JSON","stringify","body","body_template","secretRefs","matchAll","secretMap","Promise","p_name","resolveSecrets","text","_","resolveArgs","val","undefined","String","resolve","key","method","toUpperCase","resolvedBody","ssrfError","controller","AbortController","timer","setTimeout","abort","resp","fetch","signal","clearTimeout","clear","contentType","json","ok","status","sqlConfig","is_read_only","template","p_sql","p_params","p_allowed_tables","allowed_tables","executeSupplyChain","traceId","userId","userEmail","source","userToolRows","scAction","PO_ALIASES","create","list","add_items","approve","mark_ordered","receive","cancel","executeTool","onToolProgress","skipAudit","startTime","entry","test","agentFlags","single","can_query","readActions","can_modify","writeActions","wa","validation","valid","execStartMs","toolPromise","progressCb","progress","timeoutMs","stepTimeout","_step_timeout_seconds","console","warn","endTime","inputJson","outputJson","inputBytes","outputBytes","details","tool_input","input_bytes","output_bytes","result_summary","tool_result","_truncated","_type","Array","isArray","_size","_count","tool_error","errorType","error_type","bytes","Uint8Array","crypto","getRandomValues","spanId","toString","padStart","auditRow","severity","store_id","resource_type","resource_id","request_id","conversation_id","error_message","duration_ms","user_id","user_email","trace_id","span_id","span_kind","service_name","status_code","start_time","toISOString","end_time","loadAgentConfig","query"],"sources":["../../src/server/tool-router.ts"],"sourcesContent":["/**\n * Tool Router — unified tool registry, dispatch, and execution.\n *\n * SINGLE SOURCE OF TRUTH for all AI systems (MCP server, HTTP agent, workflows, CLI).\n *\n * Architecture:\n * - ai_tool_registry (DB): tool definitions (name, description, schema) — queried by ALL clients\n * - TOOL_HANDLERS (code): name → handler function mapping — the only place handler routing lives\n * - user_tools (DB): per-store custom tools — additive, never filtered from built-ins\n * - getToolsForAgent(): consistent tool set — all registry tools always available\n * - executeTool(): unified dispatch — handler lookup + timeout + audit logging\n *\n * To add a new tool:\n * 1. Add handler in src/server/handlers/\n * 2. Import and register in TOOL_HANDLERS below\n * 3. Add row to ai_tool_registry table (defines schema for all clients)\n * That's it — MCP, WhaleChat, workflows, CLI all pick it up automatically.\n */\n\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\nimport { sanitizeError } from \"../shared/agent-core.js\";\nimport { validateToolArgs } from \"./validation.js\";\nimport { sanitizeToolDescription } from \"./lib/prompt-sanitizer.js\";\nimport { validateUrl } from \"./lib/ssrf-guard.js\";\n\nimport { handleInventory, handleInventoryQuery, handleInventoryAudit } from \"./handlers/inventory.js\";\nimport { handlePurchaseOrders, handleTransfers } from \"./handlers/supply-chain.js\";\nimport { handleProducts, handleCollections } from \"./handlers/catalog.js\";\nimport { handleCustomers, handleOrders } from \"./handlers/crm.js\";\nimport { handleAnalytics } from \"./handlers/analytics.js\";\nimport { handleLocations, handleSuppliers, handleAlerts, handleAuditTrail, handleStore } from \"./handlers/operations.js\";\nimport { handleEmail, handleDocuments } from \"./handlers/comms.js\";\nimport { handleWebSearch, handleTelemetry } from \"./handlers/platform.js\";\nimport { handleBrowser } from \"./handlers/browser.js\";\nimport { handleDiscovery } from \"./handlers/discovery.js\";\nimport { handleVoice } from \"./handlers/voice.js\";\nimport { handleWorkflows } from \"./handlers/workflows.js\";\nimport { handleEmbeddings } from \"./handlers/embeddings.js\";\nimport { handleLLM } from \"./handlers/llm-providers.js\";\nimport { handleImageGen } from \"./handlers/image-gen.js\";\nimport { handleRemoveBg } from \"./handlers/remove-bg.js\";\nimport { handleMedia } from \"./handlers/media.js\";\nimport { handleVideoGen } from \"./handlers/video-gen.js\";\nimport { handleAPIKeys } from \"./handlers/api-keys.js\";\nimport { handleCreations } from \"./handlers/creations.js\";\nimport { handleMetaAds } from \"./handlers/meta-ads.js\";\nimport { handleKali } from \"./handlers/kali.js\";\nimport { handleLocalAgent } from \"./handlers/local-agent.js\";\nimport { handleEnrichment } from \"./handlers/enrichment.js\";\nimport { handleStorefront } from \"./handlers/storefront.js\";\nimport { handleApiDocs } from \"./handlers/api-docs.js\";\nimport { handleClickHouse } from \"./handlers/clickhouse.js\";\nimport { summarizeResult, withTimeout } from \"./lib/utils.js\";\n\n// ============================================================================\n// TELEMETRY — ClickHouse span buffer (replaces Postgres audit_logs buffer)\n// ============================================================================\n\nimport { queueSpan, flushSpans, auditRowToSpan, classifyErrorType } from \"./lib/clickhouse-buffer.js\";\n\n// Re-export for callers that used flushAuditLogs (e.g. index.ts shutdown)\nexport { flushSpans };\n\n// ============================================================================\n// IN-MEMORY EXECUTION METRICS\n// ============================================================================\n\nconst toolMetrics = new Map<string, { invocations: number; errors: number; totalMs: number; lastMs: number }>();\n\nexport function getToolMetrics(): Record<string, { invocations: number; errors: number; avgMs: number; lastMs: number }> {\n const result: Record<string, { invocations: number; errors: number; avgMs: number; lastMs: number }> = {};\n for (const [name, m] of toolMetrics) {\n result[name] = { invocations: m.invocations, errors: m.errors, avgMs: m.invocations > 0 ? Math.round(m.totalMs / m.invocations) : 0, lastMs: m.lastMs };\n }\n return result;\n}\n\nfunction recordToolMetric(toolName: string, durationMs: number, success: boolean): void {\n let m = toolMetrics.get(toolName);\n if (!m) { m = { invocations: 0, errors: 0, totalMs: 0, lastMs: 0 }; toolMetrics.set(toolName, m); }\n m.invocations++;\n m.totalMs += durationMs;\n m.lastMs = durationMs;\n if (!success) m.errors++;\n}\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ToolDef {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n}\n\nexport interface UserToolRow {\n id: string;\n name: string;\n display_name: string;\n description: string;\n input_schema: Record<string, unknown>;\n execution_type: \"rpc\" | \"http\" | \"sql\";\n is_read_only: boolean;\n requires_approval: boolean;\n http_config: Record<string, unknown> | null;\n rpc_function: string | null;\n sql_template: string | null;\n allowed_tables: string[] | null;\n max_execution_time_ms: number;\n}\n\nexport interface AgentConfig {\n id: string;\n name: string;\n description: string;\n system_prompt: string;\n model: string;\n max_tokens: number;\n max_tool_calls: number;\n temperature: number;\n enabled_tools: string[];\n can_query: boolean;\n can_send: boolean;\n can_modify: boolean;\n tone: string;\n verbosity: string;\n api_key: string | null;\n store_id: string | null;\n context_config: {\n includeLocations?: boolean;\n locationIds?: string[];\n includeCustomers?: boolean;\n customerSegments?: string[];\n max_history_chars?: number;\n max_tool_result_chars?: number;\n max_message_chars?: number;\n // Context management overrides — match Anthropic API defaults when unset\n compaction_trigger_tokens?: number;\n compaction_total_budget?: number;\n clear_thinking_keep?: number;\n clear_tool_uses_trigger?: number;\n clear_tool_uses_keep?: number;\n session_cost_budget_usd?: number;\n // Agent loop behavior — DB is single source of truth, defaults in AGENT_DEFAULTS\n max_concurrent_tools?: number;\n enable_delegation?: boolean;\n max_duration_ms?: number;\n enable_model_routing?: boolean;\n subagent_max_tokens?: number;\n subagent_max_turns?: number;\n subagent_temperature?: number;\n } | null;\n}\n\n// ============================================================================\n// TOOL REGISTRY (loaded from database — same as CLI and edge function)\n// ============================================================================\n\nexport interface ToolLoadResult {\n /** Core tools — always sent to the model (auto_load=true + discover_tools) */\n core: ToolDef[];\n /** Extended tools — only name+description sent; full schema loaded on demand */\n extended: ToolDef[];\n /** All tools combined (backward compat for callers that don't need the split) */\n all: ToolDef[];\n}\n\nlet cachedResult: ToolLoadResult | null = null;\nlet cacheTime = 0;\n\n/** Pre-computed API-ready tool defs (name + truncated description + input_schema).\n * Computed once at load time, reused every turn without re-serialization. */\nlet cachedApiToolDefs: Map<string, { name: string; description: string; input_schema: Record<string, unknown> }> | null = null;\n\n/** Truncate a description to maxLen characters, ending at a word boundary with ellipsis. */\nfunction truncateDescription(desc: string, maxLen = 150): string {\n if (desc.length <= maxLen) return desc;\n const cut = desc.lastIndexOf(\" \", maxLen - 3);\n return desc.substring(0, cut > 0 ? cut : maxLen - 3) + \"...\";\n}\n\n/**\n * Load tools from ai_tool_registry, split into core (auto_load=true) and extended.\n * The `discover_tools` meta-tool is always injected into core.\n * Descriptions are truncated to 150 chars at load time.\n */\nexport async function loadTools(supabase: SupabaseClient, forceRefresh = false): Promise<ToolLoadResult> {\n if (!forceRefresh && cachedResult && Date.now() - cacheTime < 60_000) return cachedResult;\n\n const { data, error } = await supabase\n .from(\"ai_tool_registry\")\n .select(\"name, description, definition, auto_load\")\n .eq(\"is_active\", true)\n .neq(\"tool_mode\", \"code\");\n\n if (error || !data) {\n return cachedResult || { core: [], extended: [], all: [] };\n }\n\n const allTools: ToolDef[] = data.map((t: any) => ({\n name: t.name,\n description: sanitizeToolDescription(\n truncateDescription(t.description || t.definition?.description || t.name),\n ),\n input_schema: t.definition?.input_schema || { type: \"object\", properties: {} },\n }));\n\n const core: ToolDef[] = [];\n const extended: ToolDef[] = [];\n\n // Check if any row has auto_load set — if the column doesn't exist yet\n // (migration not run), all values will be null/undefined. In that case,\n // treat ALL tools as core to preserve pre-migration behavior.\n const migrationApplied = data.some((t: any) => t.auto_load === true || t.auto_load === false);\n\n if (!migrationApplied) {\n // Pre-migration: all tools are core (original behavior)\n core.push(...allTools);\n } else {\n for (let i = 0; i < data.length; i++) {\n if (data[i].auto_load) {\n core.push(allTools[i]);\n } else {\n extended.push(allTools[i]);\n }\n }\n }\n\n // Always inject discover_tools into core set\n if (!core.some(t => t.name === \"discover_tools\")) {\n core.push(DISCOVER_TOOLS_DEF);\n }\n\n // Pre-compute API-ready tool defs keyed by name — avoids per-turn .map()\n cachedApiToolDefs = new Map();\n for (const t of [...core, ...extended]) {\n cachedApiToolDefs.set(t.name, {\n name: t.name,\n description: t.description,\n input_schema: t.input_schema,\n });\n }\n\n cachedResult = { core, extended, all: allTools };\n cacheTime = Date.now();\n return cachedResult;\n}\n\n/**\n * Get pre-computed API-ready tool definitions. Returns frozen objects keyed by name\n * so the agent loop can look up defs without re-mapping every turn.\n * Falls back to building from a ToolDef[] if cache not yet populated.\n */\nexport function getCachedToolDefs(\n tools: ToolDef[],\n): Array<{ name: string; description: string; input_schema: Record<string, unknown> }> {\n if (cachedApiToolDefs) {\n // Fast path: look up each active tool in the pre-computed map\n const result: Array<{ name: string; description: string; input_schema: Record<string, unknown> }> = [];\n for (const t of tools) {\n const cached = cachedApiToolDefs.get(t.name);\n if (cached) {\n result.push(cached);\n } else {\n // Dynamic tool (e.g. delegate_task, user tools, discovered tools) — build on the fly\n result.push({\n name: t.name,\n description: truncateDescription(t.description),\n input_schema: t.input_schema,\n });\n }\n }\n return result;\n }\n // Fallback: cache not populated yet — build from scratch with truncation\n return tools.map((t) => ({\n name: t.name,\n description: truncateDescription(t.description),\n input_schema: t.input_schema,\n }));\n}\n\n/** discover_tools meta-tool — lets the model load extended tool schemas on demand */\nconst DISCOVER_TOOLS_DEF: ToolDef = {\n name: \"discover_tools\",\n description: \"Load full schemas for extended tools not in your core set. Call this before using a tool that is listed under 'Extended Tools' in your system prompt. You can load tools by name or by category.\",\n input_schema: {\n type: \"object\",\n properties: {\n names: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Specific tool names to load (e.g. ['kali', 'browser', 'voice'])\",\n },\n category: {\n type: \"string\",\n description: \"Load all tools in this category (e.g. 'security', 'media', 'operations')\",\n },\n refresh: {\n type: \"boolean\",\n description: \"Force reload tool definitions from DB (bust cache). Use when tools may have been updated mid-conversation.\",\n },\n },\n },\n};\n\n// ============================================================================\n// USER TOOLS (per-store custom tools from user_tools table)\n// ============================================================================\n\nconst userToolCache = new Map<string, { tools: UserToolRow[]; defs: ToolDef[]; time: number; lastAccessed: number }>();\nconst USER_TOOL_CACHE_MAX = 100;\n\nfunction evictUserToolCache(): void {\n if (userToolCache.size <= USER_TOOL_CACHE_MAX) return;\n const entries = [...userToolCache.entries()].sort((a, b) => a[1].lastAccessed - b[1].lastAccessed);\n const excess = userToolCache.size - USER_TOOL_CACHE_MAX;\n for (let i = 0; i < excess; i++) {\n userToolCache.delete(entries[i][0]);\n }\n}\n\nexport async function loadUserTools(supabase: SupabaseClient, storeId: string): Promise<{ rows: UserToolRow[]; defs: ToolDef[] }> {\n const cached = userToolCache.get(storeId);\n if (cached && Date.now() - cached.time < 60_000) {\n cached.lastAccessed = Date.now();\n return { rows: cached.tools, defs: cached.defs };\n }\n\n const { data, error } = await supabase\n .from(\"user_tools\")\n .select(\"id, name, display_name, description, input_schema, execution_type, is_read_only, requires_approval, http_config, rpc_function, sql_template, allowed_tables, max_execution_time_ms\")\n .eq(\"store_id\", storeId)\n .eq(\"is_active\", true);\n\n if (error || !data?.length) return { rows: [], defs: [] };\n\n const rows: UserToolRow[] = data as UserToolRow[];\n const defs: ToolDef[] = rows.map((t) => ({\n name: `user_tool__${t.name}`,\n description: sanitizeToolDescription(\n `[Custom Tool] ${t.display_name}: ${t.description}${t.requires_approval ? \" (requires approval)\" : \"\"}`,\n ),\n input_schema: t.input_schema || { type: \"object\", properties: {} },\n }));\n\n userToolCache.set(storeId, { tools: rows, defs, time: Date.now(), lastAccessed: Date.now() });\n evictUserToolCache();\n return { rows, defs };\n}\n\nexport function getUserToolByPrefixedName(rows: UserToolRow[], prefixedName: string): UserToolRow | undefined {\n const toolName = prefixedName.replace(/^user_tool__/, \"\");\n return rows.find((t) => t.name === toolName);\n}\n\nexport function getToolsForAgent(agent: AgentConfig, coreTools: ToolDef[], userToolDefs: ToolDef[] = []): ToolDef[] {\n // Core registry tools are always available (matches MCP server behavior).\n // enabled_tools only restricts custom user tools.\n if (agent.enabled_tools?.length > 0) {\n const filteredUserTools = userToolDefs.filter((t) => agent.enabled_tools.includes(t.name));\n return [...coreTools, ...filteredUserTools];\n }\n return [...coreTools, ...userToolDefs];\n}\n\n// ============================================================================\n// UNIFIED HANDLER REGISTRY — single source of truth for all tool dispatch\n// ============================================================================\n\nexport type ToolProgressCallback = (toolName: string, progress: unknown) => void;\n\ntype ToolHandler = (\n sb: SupabaseClient,\n args: Record<string, unknown>,\n storeId?: string,\n onToolProgress?: (progress: unknown) => void,\n) => Promise<{ success: boolean; data?: unknown; error?: string }>;\n\ninterface ToolHandlerEntry {\n handler: ToolHandler;\n timeout: number; // ms — execution timeout\n requiresStore: boolean; // whether store_id is mandatory\n supportsProgress?: boolean; // handler accepts onToolProgress (4th param)\n}\n\nconst DEFAULT_TIMEOUT = 30_000;\n\n/**\n * Every built-in tool MUST be registered here. This map is the single source\n * of truth for handler routing, timeouts, and store requirements.\n * Adding a tool to ai_tool_registry without an entry here → \"Unknown tool\" error.\n */\nexport const TOOL_HANDLERS: Record<string, ToolHandlerEntry> = {\n // --- Business Data ---\n inventory: { handler: (sb, args, sid) => {\n const a = args.action as string || \"\";\n if (a.startsWith(\"audit_\")) return handleInventoryAudit(sb, { ...args, action: a.slice(6) }, sid);\n if ([\"summary\",\"velocity\",\"by_location\",\"in_stock\",\"out_of_stock\",\"by_category\"].includes(a)) return handleInventoryQuery(sb, args, sid);\n return handleInventory(sb, args, sid);\n }, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n purchase_orders: { handler: handlePurchaseOrders, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n transfers: { handler: handleTransfers, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n products: { handler: handleProducts, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n collections: { handler: handleCollections, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n customers: { handler: handleCustomers, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n orders: { handler: handleOrders, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n analytics: { handler: handleAnalytics, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n locations: { handler: handleLocations, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n suppliers: { handler: handleSuppliers, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n store: { handler: handleStore, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n storefront: { handler: handleStorefront, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Communication ---\n email: { handler: handleEmail, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n documents: { handler: handleDocuments, timeout: 120_000, requiresStore: true },\n\n // --- Operations ---\n alerts: { handler: handleAlerts, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n audit_trail: { handler: handleAuditTrail, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n workflows: { handler: handleWorkflows, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- AI & Generation ---\n voice: { handler: handleVoice, timeout: 120_000, requiresStore: true },\n image_gen: { handler: handleImageGen, timeout: 60_000, requiresStore: true },\n remove_bg: { handler: handleRemoveBg, timeout: 60_000, requiresStore: true },\n media: { handler: handleMedia, timeout: 60_000, requiresStore: true },\n video_gen: { handler: handleVideoGen, timeout: 600_000, requiresStore: true },\n llm: { handler: handleLLM, timeout: 120_000, requiresStore: true },\n embeddings: { handler: handleEmbeddings, timeout: 60_000, requiresStore: true },\n creations: { handler: handleCreations, timeout: 60_000, requiresStore: true },\n\n // --- Platform & Infrastructure (no store required) ---\n web_search: { handler: handleWebSearch, timeout: DEFAULT_TIMEOUT, requiresStore: false },\n telemetry: { handler: handleTelemetry, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n browser: { handler: handleBrowser, timeout: 120_000, requiresStore: true },\n discovery: { handler: handleDiscovery, timeout: DEFAULT_TIMEOUT, requiresStore: false },\n api_keys: { handler: handleAPIKeys, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n api_docs: { handler: handleApiDocs, timeout: 5000, requiresStore: false },\n\n // --- Advertising ---\n meta_ads: { handler: handleMetaAds, timeout: 300_000, requiresStore: true },\n\n // --- Security & Local ---\n kali: { handler: handleKali as ToolHandler, timeout: 600_000, requiresStore: true, supportsProgress: true },\n local_agent: { handler: handleLocalAgent, timeout: 600_000, requiresStore: false },\n\n // --- Customer Data Protection ---\n enrichment: { handler: handleEnrichment, timeout: 60_000, requiresStore: true },\n\n // --- Observability (ClickHouse) ---\n clickhouse: { handler: handleClickHouse, timeout: 60_000, requiresStore: false },\n\n // --- Meta: Tool Discovery (lazy loading) ---\n discover_tools: { handler: handleDiscoverTools, timeout: 5000, requiresStore: false },\n};\n\nObject.freeze(TOOL_HANDLERS);\n\n/** Get all registered built-in tool names */\nexport function getRegisteredToolNames(): string[] {\n return Object.keys(TOOL_HANDLERS);\n}\n\n// ============================================================================\n// DISCOVER_TOOLS HANDLER — returns full schemas for extended tools on demand\n// ============================================================================\n\n/** Full extended tool defs (with schemas) — used by handleDiscoverTools to return schemas on demand */\nlet _extendedToolsCache: ToolDef[] = [];\n\n/** Lightweight extended tool index — name + first-sentence description only (for system prompt) */\nlet _extendedToolsIndex: Array<{ name: string; description: string }> = [];\n\n/** Called by index.ts after loadTools() to populate the discover_tools cache.\n * Stores full schemas for on-demand loading, plus a lightweight index for the system prompt. */\nexport function setExtendedToolsCache(tools: ToolDef[]): void {\n _extendedToolsCache = tools;\n // Pre-compute lightweight index: name + first sentence only (no schemas)\n _extendedToolsIndex = tools.map(t => ({\n name: t.name,\n description: t.description.split(\".\")[0],\n }));\n}\n\n/** Get full extended tools with schemas (for discover_tools handler) */\nexport function getExtendedToolsCache(): ToolDef[] {\n return _extendedToolsCache;\n}\n\n/** Get lightweight extended tools index — name + short description only (for system prompt).\n * Avoids serializing full schemas into the prompt. */\nexport function getExtendedToolsIndex(): Array<{ name: string; description: string }> {\n return _extendedToolsIndex;\n}\n\n/**\n * Get full tool schemas for specific tool names from the extended tools cache.\n * Used by the agent loop to inject discovered tool schemas into the active tool set.\n * Returns only tools that exist in the cache; unknown names are silently skipped.\n */\nexport function getFullToolSchemas(toolNames: string[]): ToolDef[] {\n if (!toolNames.length || !_extendedToolsCache.length) return [];\n const nameSet = new Set(toolNames);\n return _extendedToolsCache.filter(t => nameSet.has(t.name));\n}\n\n// Tool category heuristics — maps tool names to categories for category-based discovery\nconst TOOL_CATEGORIES: Record<string, string> = {\n // Business Data\n inventory: \"business\", purchase_orders: \"business\", transfers: \"business\",\n products: \"business\", collections: \"business\", customers: \"business\",\n orders: \"business\", analytics: \"business\", locations: \"business\",\n suppliers: \"business\", store: \"business\", storefront: \"business\",\n // Communication\n email: \"communication\", documents: \"communication\",\n // Operations\n alerts: \"operations\", audit_trail: \"operations\", workflows: \"operations\",\n telemetry: \"operations\",\n // Media & AI\n voice: \"media\", image_gen: \"media\", video_gen: \"media\", remove_bg: \"media\", media: \"media\",\n llm: \"ai\", embeddings: \"ai\", creations: \"media\",\n // Platform\n web_search: \"platform\", browser: \"platform\", discovery: \"platform\",\n api_keys: \"platform\", api_docs: \"platform\",\n // Security\n kali: \"security\", local_agent: \"platform\",\n // Advertising\n meta_ads: \"advertising\",\n // Data\n enrichment: \"data\",\n};\n\nasync function handleDiscoverTools(\n sb: SupabaseClient,\n args: Record<string, unknown>,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const names = args.names as string[] | undefined;\n const category = args.category as string | undefined;\n const refresh = args.refresh as boolean | undefined;\n\n // Force reload from DB if refresh requested — busts the 60s cache\n if (refresh) {\n try {\n const freshResult = await loadTools(sb, true);\n setExtendedToolsCache(freshResult.extended);\n } catch {\n // If refresh fails, continue with stale cache — better than erroring\n }\n }\n\n if (!names?.length && !category) {\n return { success: false, error: \"Provide 'names' (array of tool names) or 'category' to discover tools.\" };\n }\n\n let matching: ToolDef[] = [];\n\n if (names?.length) {\n const nameSet = new Set(names);\n matching = _extendedToolsCache.filter(t => nameSet.has(t.name));\n }\n\n if (category) {\n const cat = category.toLowerCase();\n const categoryTools = _extendedToolsCache.filter(t => TOOL_CATEGORIES[t.name] === cat);\n // Merge without duplicates\n const existingNames = new Set(matching.map(t => t.name));\n for (const t of categoryTools) {\n if (!existingNames.has(t.name)) matching.push(t);\n }\n }\n\n if (matching.length === 0) {\n const available = _extendedToolsCache.map(t => t.name).join(\", \");\n return { success: false, error: `No matching extended tools found. Available: ${available}` };\n }\n\n return {\n success: true,\n data: {\n tools: matching.map(t => ({ name: t.name, description: t.description, input_schema: t.input_schema })),\n count: matching.length,\n refreshed: !!refresh,\n },\n };\n}\n\n// ============================================================================\n// USER TOOL EXECUTOR — handles RPC, HTTP, SQL execution types\n// ============================================================================\n\nasync function executeUserTool(\n supabase: SupabaseClient,\n userTool: UserToolRow,\n args: Record<string, unknown>,\n storeId: string,\n agentId?: string,\n conversationId?: string,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const timeout = userTool.max_execution_time_ms || 5000;\n\n if (userTool.execution_type === \"http\") {\n return executeHTTPUserTool(supabase, userTool, args, storeId, timeout);\n }\n\n try {\n const { data, error } = await supabase.rpc(\"execute_user_tool\", {\n p_tool_id: userTool.id,\n p_store_id: storeId,\n p_args: args,\n p_agent_id: agentId || null,\n p_conversation_id: conversationId || null,\n });\n\n if (error) return { success: false, error: error.message };\n\n const result = data as { success: boolean; data?: unknown; error?: string; pending_approval?: boolean; execution_id?: string; message?: string };\n\n if (result.pending_approval) {\n return { success: false, error: `Tool requires approval. Execution ID: ${result.execution_id}. ${result.message}` };\n }\n\n if (result.success && result.data && (result.data as any).execute_sql) {\n return executeSQLUserTool(supabase, result.data as any, args, storeId);\n }\n\n return result.success\n ? { success: true, data: result.data }\n : { success: false, error: result.error || \"Unknown error\" };\n } catch (err) {\n return { success: false, error: sanitizeError(err) };\n }\n}\n\nasync function executeHTTPUserTool(\n supabase: SupabaseClient,\n userTool: UserToolRow,\n args: Record<string, unknown>,\n storeId: string,\n timeout: number,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const config = userTool.http_config;\n if (!config || !(config as any).url) {\n return { success: false, error: \"HTTP tool has no URL configured\" };\n }\n\n const httpCfg = config as { url: string; method?: string; headers?: Record<string, string>; body_template?: Record<string, unknown> };\n\n let url = httpCfg.url;\n let headers: Record<string, string> = { ...(httpCfg.headers || {}) };\n\n // Collect secret names referenced in the URL, headers, and body template\n const configStr = JSON.stringify({ url: httpCfg.url, headers: httpCfg.headers, body: httpCfg.body_template });\n const secretRefs = [...configStr.matchAll(/\\{\\{secret:(\\w+)\\}\\}/g)].map(m => m[1]);\n\n // Decrypt each referenced secret via RPC (consistent with all other handlers)\n const secretMap = new Map<string, string>();\n await Promise.all(\n [...new Set(secretRefs)].map(async (name) => {\n try {\n const { data } = await supabase.rpc(\"decrypt_secret\", { p_name: name, p_store_id: storeId });\n if (data) secretMap.set(name, data as string);\n } catch { /* secret not found — will remain as {{secret:NAME}} placeholder */ }\n }),\n );\n\n const resolveSecrets = (text: string): string => {\n return text.replace(/\\{\\{secret:(\\w+)\\}\\}/g, (_, name) => secretMap.get(name) || `{{secret:${name}}}`);\n };\n\n const resolveArgs = (text: string): string => {\n return text.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => {\n if (name === \"secret\") return `{{${name}}}`;\n const val = args[name];\n return val !== undefined ? String(val) : `{{${name}}}`;\n });\n };\n\n const resolve = (text: string): string => resolveSecrets(resolveArgs(text));\n\n url = resolve(url);\n for (const [key, val] of Object.entries(headers)) {\n headers[key] = resolve(val);\n }\n\n let body: string | undefined;\n const method = (httpCfg.method || \"GET\").toUpperCase();\n if (method !== \"GET\" && method !== \"HEAD\") {\n if (httpCfg.body_template) {\n const resolvedBody: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(httpCfg.body_template)) {\n if (typeof val === \"string\") {\n resolvedBody[key] = resolve(val);\n } else {\n resolvedBody[key] = val;\n }\n }\n for (const [key, val] of Object.entries(args)) {\n if (!(key in resolvedBody)) {\n resolvedBody[key] = val;\n }\n }\n body = JSON.stringify(resolvedBody);\n } else {\n body = JSON.stringify(args);\n }\n if (!headers[\"Content-Type\"] && !headers[\"content-type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n }\n\n // P0 FIX: Use shared SSRF guard with DNS resolve-then-check (replaces inline regex)\n const ssrfError = await validateUrl(url);\n if (ssrfError) {\n return { success: false, error: `Blocked: ${ssrfError}` };\n }\n\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n const resp = await fetch(url, { method, headers, body, signal: controller.signal });\n clearTimeout(timer);\n\n // Clear secrets from memory as soon as the request is sent\n secretMap.clear();\n\n const contentType = resp.headers.get(\"content-type\") || \"\";\n let data: unknown;\n if (contentType.includes(\"json\")) {\n data = await resp.json();\n } else {\n data = await resp.text();\n }\n\n if (!resp.ok) {\n return { success: false, error: `HTTP ${resp.status}: ${typeof data === \"string\" ? data.substring(0, 500) : JSON.stringify(data).substring(0, 500)}` };\n }\n\n return { success: true, data };\n } catch (err: any) {\n // Clear secrets from memory even on error\n secretMap.clear();\n if (err.name === \"AbortError\") {\n return { success: false, error: `HTTP request timed out after ${timeout}ms` };\n }\n return { success: false, error: sanitizeError(err) };\n }\n}\n\nasync function executeSQLUserTool(\n supabase: SupabaseClient,\n sqlConfig: { template: string; allowed_tables: string[]; is_read_only: boolean },\n args: Record<string, unknown>,\n storeId: string,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n if (!sqlConfig.is_read_only) {\n return { success: false, error: \"Write SQL tools are not supported in server execution\" };\n }\n\n if (!sqlConfig.template) {\n return { success: false, error: \"No SQL template configured\" };\n }\n\n try {\n const { data, error } = await supabase.rpc(\"execute_safe_sql\", {\n p_sql: sqlConfig.template,\n p_params: args,\n p_store_id: storeId,\n p_allowed_tables: sqlConfig.allowed_tables || [],\n });\n\n if (error) return { success: false, error: error.message };\n\n if (data?.success) {\n return { success: true, data: data.data };\n }\n return { success: false, error: data?.error || \"SQL execution failed\" };\n } catch (err) {\n return { success: false, error: sanitizeError(err) };\n }\n}\n\n// ============================================================================\n// SUPPLY CHAIN — action aliasing (LLMs omit po_/transfer_ prefix)\n// ============================================================================\n\nasync function executeSupplyChain(\n supabase: SupabaseClient,\n args: Record<string, unknown>,\n storeId?: string,\n traceId?: string,\n userId?: string | null,\n userEmail?: string | null,\n source?: string,\n conversationId?: string,\n userToolRows?: UserToolRow[],\n agentId?: string,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n let scAction = args.action as string || \"\";\n const PO_ALIASES: Record<string, string> = {\n create: \"po_create\", list: \"po_list\", get: \"po_get\",\n add_items: \"po_add_items\", approve: \"po_approve\", mark_ordered: \"po_mark_ordered\",\n receive: \"po_receive\", cancel: \"po_cancel\",\n };\n if (PO_ALIASES[scAction]) scAction = PO_ALIASES[scAction];\n\n if (scAction === \"find_suppliers\") {\n return executeTool(supabase, \"suppliers\", { ...args, action: \"find_suppliers\" }, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n if (scAction.startsWith(\"po_\")) {\n return executeTool(supabase, \"purchase_orders\", { ...args, action: scAction.slice(3) }, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n if (scAction.startsWith(\"transfer_\")) {\n return executeTool(supabase, \"transfers\", { ...args, action: scAction.slice(9) }, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n return { success: false, error: `Unknown supply_chain action: ${scAction}. Use po_create, po_list, po_get, po_approve, po_receive, po_cancel, transfer_create, transfer_list, transfer_approve, transfer_ship, transfer_receive, transfer_cancel, find_suppliers.` };\n}\n\n// ============================================================================\n// TOOL EXECUTOR — dispatches via unified handler registry\n// ============================================================================\n\nexport async function executeTool(\n supabase: SupabaseClient,\n toolName: string,\n args: Record<string, unknown>,\n storeId?: string,\n traceId?: string,\n userId?: string | null,\n userEmail?: string | null,\n source?: string,\n conversationId?: string,\n userToolRows?: UserToolRow[],\n agentId?: string,\n onToolProgress?: ToolProgressCallback,\n /** Skip per-tool audit when called within a conversation — persistAgentTurn handles it */\n skipAudit?: boolean,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const startTime = Date.now();\n const action = args.action as string | undefined;\n let result: { success: boolean; data?: unknown; error?: string };\n\n // Handle supply_chain aliases (LLMs often omit po_/transfer_ prefix)\n if (toolName === \"supply_chain\") {\n return executeSupplyChain(supabase, args, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n\n // Look up handler from unified registry\n const entry = TOOL_HANDLERS[toolName];\n\n // Check store requirement from registry (not hardcoded)\n const requiresStore = entry ? entry.requiresStore : true;\n if (requiresStore && (!storeId || !/^[0-9a-fA-F]{8}-/.test(storeId))) {\n return { success: false, error: `store_id is required for ${toolName}. Ensure a store is selected.` };\n }\n\n // Permission enforcement — check agent flags before tool execution\n if (agentId) {\n const { data: agentFlags } = await supabase.from(\"ai_agent_config\")\n .select(\"can_query, can_modify\")\n .eq(\"id\", agentId).single();\n if (agentFlags) {\n // Read-only agent check — block ALL tool calls if can_query is false\n if (!agentFlags.can_query) {\n const readActions = [\"list\", \"get\", \"search\", \"query\", \"summary\", \"stats\", \"count\", \"by_location\", \"in_stock\", \"out_of_stock\", \"velocity\"];\n const action = args.action as string | undefined;\n if (action && readActions.includes(action)) {\n return { success: false, error: `Agent does not have query permission (can_query=false). Contact an admin.` };\n }\n }\n // Mutation check — already in system prompt but enforce at execution level\n if (!agentFlags.can_modify) {\n const writeActions = [\"create\", \"update\", \"delete\", \"upsert\", \"send\", \"approve\", \"cancel\", \"add\", \"remove\", \"set\", \"adjust\", \"transfer\"];\n const action = args.action as string | undefined;\n if (action && writeActions.some(wa => action.startsWith(wa))) {\n return { success: false, error: `Agent has read-only access (can_modify=false). Cannot perform \"${action}\".` };\n }\n }\n }\n }\n\n // User tool approval check — requires_approval enforced at execution level\n if (toolName.startsWith(\"user_tool__\") && userToolRows?.length) {\n const userTool = getUserToolByPrefixedName(userToolRows, toolName);\n if (userTool?.requires_approval) {\n return { success: false, error: `Tool \"${userTool.display_name}\" requires approval before execution. Use the workflow approval system to request permission.` };\n }\n }\n\n // Validate mutation args before dispatch — read-only actions pass through\n const validation = validateToolArgs(toolName, args);\n if (!validation.valid) {\n return { success: false, error: validation.error };\n }\n args = validation.data;\n\n const execStartMs = Date.now();\n try {\n let toolPromise: Promise<{ success: boolean; data?: unknown; error?: string }>;\n\n if (entry) {\n // Dispatch via unified handler registry — pass progress callback to handlers that support it\n const progressCb = entry.supportsProgress && onToolProgress\n ? (progress: unknown) => onToolProgress(toolName, progress)\n : undefined;\n toolPromise = entry.handler(supabase, args, storeId, progressCb);\n } else if (toolName.startsWith(\"user_tool__\") && userToolRows && storeId) {\n // Custom user tools\n const userTool = getUserToolByPrefixedName(userToolRows, toolName);\n if (userTool) {\n toolPromise = executeUserTool(supabase, userTool, args, storeId, agentId, conversationId);\n } else {\n toolPromise = Promise.resolve({ success: false, error: `Unknown user tool: ${toolName}` });\n }\n } else {\n toolPromise = Promise.resolve({ success: false, error: `Unknown tool: ${toolName}. Use the discover_tools action to see available tools.` });\n }\n\n const timeoutMs = entry?.timeout || DEFAULT_TIMEOUT;\n\n // FIX 7: Timeout cascade validation — warn if step timeout < tool timeout\n const stepTimeout = args._step_timeout_seconds as number | undefined;\n if (stepTimeout && stepTimeout * 1000 < timeoutMs) {\n console.warn(`[timeout-cascade] Step timeout (${stepTimeout}s) < tool timeout (${timeoutMs / 1000}s) for ${toolName}. Tool may outlive step.`);\n }\n\n result = await withTimeout(toolPromise, timeoutMs, toolName);\n } catch (err) {\n result = { success: false, error: sanitizeError(err) };\n }\n\n // Record execution metrics\n recordToolMetric(toolName, Date.now() - execStartMs, result.success);\n\n // Audit log — enriched with OTEL fields for distributed tracing\n // Skipped when tool is called within a conversation (SSE chat, channel agent, workflow)\n // because persistAgentTurn already logs the full conversation with tool details\n if (skipAudit) return result;\n try {\n const endTime = Date.now();\n // Compute payload sizes for observability\n const inputJson = JSON.stringify(args);\n const outputJson = result.data ? JSON.stringify(result.data) : \"\";\n const inputBytes = inputJson.length;\n const outputBytes = outputJson.length;\n\n const details: Record<string, unknown> = {\n source: source || \"fly_container\",\n args,\n // Keys that SwiftUI telemetry panel reads for rich display\n tool_input: args,\n input_bytes: inputBytes,\n output_bytes: outputBytes,\n };\n if (result.success && result.data) {\n details.result_summary = summarizeResult(toolName, action, result.data);\n // Store full result for rich telemetry display (capped at 50KB to prevent JSONB bloat)\n if (outputBytes <= 50_000) {\n details.tool_result = result.data;\n } else {\n details.tool_result = {\n _truncated: true,\n _type: Array.isArray(result.data) ? \"array\" : \"object\",\n _size: outputBytes,\n _count: Array.isArray(result.data) ? result.data.length : Object.keys(result.data as object).length,\n };\n }\n }\n if (result.error) {\n details.tool_error = result.error;\n const errorType = classifyErrorType(result.error);\n if (errorType) details.error_type = errorType;\n }\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n const spanId = Array.from(bytes).map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n const auditRow: Record<string, unknown> = {\n action: `tool.${toolName}${action ? `.${action}` : \"\"}`,\n severity: result.success ? \"info\" : \"error\",\n store_id: storeId || null,\n resource_type: \"mcp_tool\",\n resource_id: toolName,\n request_id: traceId || null,\n conversation_id: conversationId || null,\n source: source || \"fly_container\",\n details,\n error_message: result.error || null,\n error_type: classifyErrorType(result.error) || undefined,\n duration_ms: endTime - startTime,\n user_id: userId || null,\n user_email: userEmail || null,\n input_bytes: inputBytes,\n output_bytes: outputBytes,\n // OTEL fields\n trace_id: traceId || null,\n span_id: spanId,\n span_kind: \"INTERNAL\",\n service_name: \"agent-server\",\n status_code: result.success ? \"OK\" : \"ERROR\",\n start_time: new Date(startTime).toISOString(),\n end_time: new Date(endTime).toISOString(),\n };\n queueSpan(auditRowToSpan(auditRow));\n } catch (err) {\n console.error(\"[audit] exception:\", err);\n }\n\n return result;\n}\n\n// ============================================================================\n// AGENT LOADER\n// ============================================================================\n\nexport async function loadAgentConfig(supabase: SupabaseClient, agentId: string, storeId?: string): Promise<AgentConfig | null> {\n // storeId is required for tenant isolation — only omit for internal/migration callers\n let query = supabase\n .from(\"ai_agent_config\")\n .select(\"*\")\n .eq(\"id\", agentId);\n\n // ALWAYS filter by store_id when provided (which should be always for user requests)\n if (storeId) {\n query = query.eq(\"store_id\", storeId);\n }\n\n const { data, error } = await query.single();\n\n if (error || !data) return null;\n return data as AgentConfig;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"tool-router.js","names":["sanitizeError","validateToolArgs","sanitizeToolDescription","validateUrl","handleInventory","handleInventoryQuery","handleInventoryAudit","handlePurchaseOrders","handleTransfers","handleProducts","handleCollections","handleCustomers","handleOrders","handleAnalytics","handleLocations","handleSuppliers","handleAlerts","handleAuditTrail","handleStore","handleEmail","handleDocuments","handleWebSearch","handleTelemetry","handleBrowser","handleDiscovery","handleVoice","handleWorkflows","handleEmbeddings","handleLLM","handleImageGen","handleRemoveBg","handleMedia","handleVideoGen","handleAPIKeys","handleCreations","handleMetaAds","handleGoogleAds","handleKali","handleLocalAgent","handleEnrichment","handleStorefront","handleApiDocs","handleClickHouse","handleLoyalty","handleCoupons","handleFulfillment","handleSegments","handleCampaigns","handleReviews","handleTax","handleWebhooksMgmt","handleAffiliates","handleQRCodes","handlePhone","handleSocial","handleWallet","handlePipeline","handleInvoices","handleWholesale","summarizeResult","withTimeout","queueSpan","flushSpans","auditRowToSpan","classifyErrorType","toolMetrics","Map","getToolMetrics","result","name","m","invocations","errors","avgMs","Math","round","totalMs","lastMs","recordToolMetric","toolName","durationMs","success","get","set","cachedResult","cacheTime","cachedApiToolDefs","truncateDescription","desc","maxLen","length","cut","lastIndexOf","substring","loadTools","supabase","forceRefresh","Date","now","data","error","from","select","eq","neq","core","extended","all","allTools","map","t","description","definition","input_schema","type","properties","migrationApplied","some","auto_load","push","i","DISCOVER_TOOLS_DEF","getCachedToolDefs","tools","cached","names","items","category","refresh","userToolCache","USER_TOOL_CACHE_MAX","evictUserToolCache","size","entries","sort","a","b","lastAccessed","excess","delete","loadUserTools","storeId","time","rows","defs","display_name","requires_approval","getUserToolByPrefixedName","prefixedName","replace","find","getToolsForAgent","agent","coreTools","userToolDefs","enabled_tools","filteredUserTools","filter","includes","DEFAULT_TIMEOUT","TOOL_HANDLERS","inventory","handler","sb","args","sid","action","startsWith","slice","timeout","requiresStore","purchase_orders","transfers","products","collections","customers","orders","analytics","locations","suppliers","store","storefront","email","documents","alerts","audit_trail","workflows","voice","image_gen","remove_bg","media","video_gen","llm","embeddings","creations","web_search","telemetry","browser","discovery","api_keys","api_docs","meta_ads","google_ads","kali","supportsProgress","local_agent","enrichment","clickhouse","loyalty","coupons","fulfillment","segments","campaigns","reviews","tax","invoices","webhooks_mgmt","affiliates","qr_codes","phone","social","wallet","pipeline","wholesale","discover_tools","handleDiscoverTools","Object","freeze","getRegisteredToolNames","keys","_extendedToolsCache","_extendedToolsIndex","setExtendedToolsCache","split","getExtendedToolsCache","getExtendedToolsIndex","getFullToolSchemas","toolNames","nameSet","Set","has","TOOL_CATEGORIES","freshResult","matching","cat","toLowerCase","categoryTools","existingNames","available","join","count","refreshed","executeUserTool","userTool","agentId","conversationId","max_execution_time_ms","execution_type","executeHTTPUserTool","rpc","p_tool_id","id","p_store_id","p_args","p_agent_id","p_conversation_id","message","pending_approval","execution_id","execute_sql","executeSQLUserTool","err","config","http_config","url","httpCfg","headers","configStr","JSON","stringify","body","body_template","secretRefs","matchAll","secretMap","Promise","p_name","resolveSecrets","text","_","resolveArgs","val","undefined","String","resolve","key","method","toUpperCase","resolvedBody","ssrfError","controller","AbortController","timer","setTimeout","abort","resp","fetch","signal","clearTimeout","clear","contentType","json","ok","status","sqlConfig","is_read_only","template","p_sql","p_params","p_allowed_tables","allowed_tables","executeSupplyChain","traceId","userId","userEmail","source","userToolRows","scAction","PO_ALIASES","create","list","add_items","approve","mark_ordered","receive","cancel","executeTool","onToolProgress","skipAudit","startTime","entry","test","agentFlags","single","can_query","readActions","can_modify","writeActions","wa","validation","valid","execStartMs","toolPromise","progressCb","progress","timeoutMs","stepTimeout","_step_timeout_seconds","console","warn","endTime","inputJson","outputJson","inputBytes","outputBytes","details","tool_input","input_bytes","output_bytes","result_summary","tool_result","_truncated","_type","Array","isArray","_size","_count","tool_error","errorType","error_type","bytes","Uint8Array","crypto","getRandomValues","spanId","toString","padStart","auditRow","severity","store_id","resource_type","resource_id","request_id","conversation_id","error_message","duration_ms","user_id","user_email","trace_id","span_id","span_kind","service_name","status_code","start_time","toISOString","end_time","loadAgentConfig","query","or"],"sources":["../../src/server/tool-router.ts"],"sourcesContent":["/**\n * Tool Router — unified tool registry, dispatch, and execution.\n *\n * SINGLE SOURCE OF TRUTH for all AI systems (MCP server, HTTP agent, workflows, CLI).\n *\n * Architecture:\n * - ai_tool_registry (DB): tool definitions (name, description, schema) — queried by ALL clients\n * - TOOL_HANDLERS (code): name → handler function mapping — the only place handler routing lives\n * - user_tools (DB): per-store custom tools — additive, never filtered from built-ins\n * - getToolsForAgent(): consistent tool set — all registry tools always available\n * - executeTool(): unified dispatch — handler lookup + timeout + audit logging\n *\n * To add a new tool:\n * 1. Add handler in src/server/handlers/\n * 2. Import and register in TOOL_HANDLERS below\n * 3. Add row to ai_tool_registry table (defines schema for all clients)\n * That's it — MCP, WhaleChat, workflows, CLI all pick it up automatically.\n */\n\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\nimport { sanitizeError } from \"../shared/agent-core.js\";\nimport { validateToolArgs } from \"./validation.js\";\nimport { sanitizeToolDescription } from \"./lib/prompt-sanitizer.js\";\nimport { validateUrl } from \"./lib/ssrf-guard.js\";\n\nimport { handleInventory, handleInventoryQuery, handleInventoryAudit } from \"./handlers/inventory.js\";\nimport { handlePurchaseOrders, handleTransfers } from \"./handlers/supply-chain.js\";\nimport { handleProducts, handleCollections } from \"./handlers/catalog.js\";\nimport { handleCustomers, handleOrders } from \"./handlers/crm.js\";\nimport { handleAnalytics } from \"./handlers/analytics.js\";\nimport { handleLocations, handleSuppliers, handleAlerts, handleAuditTrail, handleStore } from \"./handlers/operations.js\";\nimport { handleEmail, handleDocuments } from \"./handlers/comms.js\";\nimport { handleWebSearch, handleTelemetry } from \"./handlers/platform.js\";\nimport { handleBrowser } from \"./handlers/browser.js\";\nimport { handleDiscovery } from \"./handlers/discovery.js\";\nimport { handleVoice } from \"./handlers/voice.js\";\nimport { handleWorkflows } from \"./handlers/workflows.js\";\nimport { handleEmbeddings } from \"./handlers/embeddings.js\";\nimport { handleLLM } from \"./handlers/llm-providers.js\";\nimport { handleImageGen } from \"./handlers/image-gen.js\";\nimport { handleRemoveBg } from \"./handlers/remove-bg.js\";\nimport { handleMedia } from \"./handlers/media.js\";\nimport { handleVideoGen } from \"./handlers/video-gen.js\";\nimport { handleAPIKeys } from \"./handlers/api-keys.js\";\nimport { handleCreations } from \"./handlers/creations.js\";\nimport { handleMetaAds } from \"./handlers/meta-ads.js\";\nimport { handleGoogleAds } from \"./handlers/google-ads.js\";\nimport { handleKali } from \"./handlers/kali.js\";\nimport { handleLocalAgent } from \"./handlers/local-agent.js\";\nimport { handleEnrichment } from \"./handlers/enrichment.js\";\nimport { handleStorefront } from \"./handlers/storefront.js\";\nimport { handleApiDocs } from \"./handlers/api-docs.js\";\nimport { handleClickHouse } from \"./handlers/clickhouse.js\";\nimport { handleLoyalty } from \"./handlers/loyalty.js\";\nimport { handleCoupons } from \"./handlers/coupons.js\";\nimport { handleFulfillment } from \"./handlers/fulfillment.js\";\nimport { handleSegments } from \"./handlers/segments.js\";\nimport { handleCampaigns } from \"./handlers/campaigns.js\";\nimport { handleReviews } from \"./handlers/reviews.js\";\nimport { handleTax } from \"./handlers/tax.js\";\nimport { handleWebhooksMgmt } from \"./handlers/webhooks-mgmt.js\";\nimport { handleAffiliates } from \"./handlers/affiliates.js\";\nimport { handleQRCodes } from \"./handlers/qr-codes.js\";\nimport { handlePhone } from \"./handlers/phone.js\";\nimport { handleSocial } from \"./handlers/social.js\";\nimport { handleWallet } from \"./handlers/wallet.js\";\nimport { handlePipeline } from \"./handlers/pipeline.js\";\nimport { handleInvoices } from \"./handlers/invoices.js\";\nimport { handleWholesale } from \"./handlers/wholesale.js\";\nimport { summarizeResult, withTimeout } from \"./lib/utils.js\";\n\n// ============================================================================\n// TELEMETRY — ClickHouse span buffer (replaces Postgres audit_logs buffer)\n// ============================================================================\n\nimport { queueSpan, flushSpans, auditRowToSpan, classifyErrorType } from \"./lib/clickhouse-buffer.js\";\n\n// Re-export for callers that used flushAuditLogs (e.g. index.ts shutdown)\nexport { flushSpans };\n\n// ============================================================================\n// IN-MEMORY EXECUTION METRICS\n// ============================================================================\n\nconst toolMetrics = new Map<string, { invocations: number; errors: number; totalMs: number; lastMs: number }>();\n\nexport function getToolMetrics(): Record<string, { invocations: number; errors: number; avgMs: number; lastMs: number }> {\n const result: Record<string, { invocations: number; errors: number; avgMs: number; lastMs: number }> = {};\n for (const [name, m] of toolMetrics) {\n result[name] = { invocations: m.invocations, errors: m.errors, avgMs: m.invocations > 0 ? Math.round(m.totalMs / m.invocations) : 0, lastMs: m.lastMs };\n }\n return result;\n}\n\nfunction recordToolMetric(toolName: string, durationMs: number, success: boolean): void {\n let m = toolMetrics.get(toolName);\n if (!m) { m = { invocations: 0, errors: 0, totalMs: 0, lastMs: 0 }; toolMetrics.set(toolName, m); }\n m.invocations++;\n m.totalMs += durationMs;\n m.lastMs = durationMs;\n if (!success) m.errors++;\n}\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ToolDef {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n}\n\nexport interface UserToolRow {\n id: string;\n name: string;\n display_name: string;\n description: string;\n input_schema: Record<string, unknown>;\n execution_type: \"rpc\" | \"http\" | \"sql\";\n is_read_only: boolean;\n requires_approval: boolean;\n http_config: Record<string, unknown> | null;\n rpc_function: string | null;\n sql_template: string | null;\n allowed_tables: string[] | null;\n max_execution_time_ms: number;\n}\n\nexport interface AgentConfig {\n id: string;\n name: string;\n description: string;\n system_prompt: string;\n model: string;\n max_tokens: number;\n max_tool_calls: number;\n temperature: number;\n enabled_tools: string[];\n can_query: boolean;\n can_send: boolean;\n can_modify: boolean;\n tone: string;\n verbosity: string;\n api_key: string | null;\n store_id: string | null;\n context_config: {\n includeLocations?: boolean;\n locationIds?: string[];\n includeCustomers?: boolean;\n customerSegments?: string[];\n max_history_chars?: number;\n max_tool_result_chars?: number;\n max_message_chars?: number;\n // Context management overrides — match Anthropic API defaults when unset\n compaction_trigger_tokens?: number;\n compaction_total_budget?: number;\n clear_thinking_keep?: number;\n clear_tool_uses_trigger?: number;\n clear_tool_uses_keep?: number;\n session_cost_budget_usd?: number;\n // Agent loop behavior — DB is single source of truth, defaults in AGENT_DEFAULTS\n max_concurrent_tools?: number;\n enable_delegation?: boolean;\n max_duration_ms?: number;\n enable_model_routing?: boolean;\n subagent_max_tokens?: number;\n subagent_max_turns?: number;\n subagent_temperature?: number;\n } | null;\n}\n\n// ============================================================================\n// TOOL REGISTRY (loaded from database — same as CLI and edge function)\n// ============================================================================\n\nexport interface ToolLoadResult {\n /** Core tools — always sent to the model (auto_load=true + discover_tools) */\n core: ToolDef[];\n /** Extended tools — only name+description sent; full schema loaded on demand */\n extended: ToolDef[];\n /** All tools combined (backward compat for callers that don't need the split) */\n all: ToolDef[];\n}\n\nlet cachedResult: ToolLoadResult | null = null;\nlet cacheTime = 0;\n\n/** Pre-computed API-ready tool defs (name + truncated description + input_schema).\n * Computed once at load time, reused every turn without re-serialization. */\nlet cachedApiToolDefs: Map<string, { name: string; description: string; input_schema: Record<string, unknown> }> | null = null;\n\n/** Truncate a description to maxLen characters, ending at a word boundary with ellipsis. */\nfunction truncateDescription(desc: string, maxLen = 150): string {\n if (desc.length <= maxLen) return desc;\n const cut = desc.lastIndexOf(\" \", maxLen - 3);\n return desc.substring(0, cut > 0 ? cut : maxLen - 3) + \"...\";\n}\n\n/**\n * Load tools from ai_tool_registry, split into core (auto_load=true) and extended.\n * The `discover_tools` meta-tool is always injected into core.\n * Descriptions are truncated to 150 chars at load time.\n */\nexport async function loadTools(supabase: SupabaseClient, forceRefresh = false): Promise<ToolLoadResult> {\n if (!forceRefresh && cachedResult && Date.now() - cacheTime < 60_000) return cachedResult;\n\n const { data, error } = await supabase\n .from(\"ai_tool_registry\")\n .select(\"name, description, definition, auto_load\")\n .eq(\"is_active\", true)\n .neq(\"tool_mode\", \"code\");\n\n if (error || !data) {\n return cachedResult || { core: [], extended: [], all: [] };\n }\n\n const allTools: ToolDef[] = data.map((t: any) => ({\n name: t.name,\n description: sanitizeToolDescription(\n truncateDescription(t.description || t.definition?.description || t.name),\n ),\n input_schema: t.definition?.input_schema || { type: \"object\", properties: {} },\n }));\n\n const core: ToolDef[] = [];\n const extended: ToolDef[] = [];\n\n // Check if any row has auto_load set — if the column doesn't exist yet\n // (migration not run), all values will be null/undefined. In that case,\n // treat ALL tools as core to preserve pre-migration behavior.\n const migrationApplied = data.some((t: any) => t.auto_load === true || t.auto_load === false);\n\n if (!migrationApplied) {\n // Pre-migration: all tools are core (original behavior)\n core.push(...allTools);\n } else {\n for (let i = 0; i < data.length; i++) {\n if (data[i].auto_load) {\n core.push(allTools[i]);\n } else {\n extended.push(allTools[i]);\n }\n }\n }\n\n // Always inject discover_tools into core set\n if (!core.some(t => t.name === \"discover_tools\")) {\n core.push(DISCOVER_TOOLS_DEF);\n }\n\n // Pre-compute API-ready tool defs keyed by name — avoids per-turn .map()\n cachedApiToolDefs = new Map();\n for (const t of [...core, ...extended]) {\n cachedApiToolDefs.set(t.name, {\n name: t.name,\n description: t.description,\n input_schema: t.input_schema,\n });\n }\n\n cachedResult = { core, extended, all: allTools };\n cacheTime = Date.now();\n return cachedResult;\n}\n\n/**\n * Get pre-computed API-ready tool definitions. Returns frozen objects keyed by name\n * so the agent loop can look up defs without re-mapping every turn.\n * Falls back to building from a ToolDef[] if cache not yet populated.\n */\nexport function getCachedToolDefs(\n tools: ToolDef[],\n): Array<{ name: string; description: string; input_schema: Record<string, unknown> }> {\n if (cachedApiToolDefs) {\n // Fast path: look up each active tool in the pre-computed map\n const result: Array<{ name: string; description: string; input_schema: Record<string, unknown> }> = [];\n for (const t of tools) {\n const cached = cachedApiToolDefs.get(t.name);\n if (cached) {\n result.push(cached);\n } else {\n // Dynamic tool (e.g. delegate_task, user tools, discovered tools) — build on the fly\n result.push({\n name: t.name,\n description: truncateDescription(t.description),\n input_schema: t.input_schema,\n });\n }\n }\n return result;\n }\n // Fallback: cache not populated yet — build from scratch with truncation\n return tools.map((t) => ({\n name: t.name,\n description: truncateDescription(t.description),\n input_schema: t.input_schema,\n }));\n}\n\n/** discover_tools meta-tool — lets the model load extended tool schemas on demand */\nconst DISCOVER_TOOLS_DEF: ToolDef = {\n name: \"discover_tools\",\n description: \"Load full schemas for extended tools not in your core set. Call this before using a tool that is listed under 'Extended Tools' in your system prompt. You can load tools by name or by category.\",\n input_schema: {\n type: \"object\",\n properties: {\n names: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Specific tool names to load (e.g. ['kali', 'browser', 'voice'])\",\n },\n category: {\n type: \"string\",\n description: \"Load all tools in this category (e.g. 'security', 'media', 'operations')\",\n },\n refresh: {\n type: \"boolean\",\n description: \"Force reload tool definitions from DB (bust cache). Use when tools may have been updated mid-conversation.\",\n },\n },\n },\n};\n\n// ============================================================================\n// USER TOOLS (per-store custom tools from user_tools table)\n// ============================================================================\n\nconst userToolCache = new Map<string, { tools: UserToolRow[]; defs: ToolDef[]; time: number; lastAccessed: number }>();\nconst USER_TOOL_CACHE_MAX = 100;\n\nfunction evictUserToolCache(): void {\n if (userToolCache.size <= USER_TOOL_CACHE_MAX) return;\n const entries = [...userToolCache.entries()].sort((a, b) => a[1].lastAccessed - b[1].lastAccessed);\n const excess = userToolCache.size - USER_TOOL_CACHE_MAX;\n for (let i = 0; i < excess; i++) {\n userToolCache.delete(entries[i][0]);\n }\n}\n\nexport async function loadUserTools(supabase: SupabaseClient, storeId: string): Promise<{ rows: UserToolRow[]; defs: ToolDef[] }> {\n const cached = userToolCache.get(storeId);\n if (cached && Date.now() - cached.time < 60_000) {\n cached.lastAccessed = Date.now();\n return { rows: cached.tools, defs: cached.defs };\n }\n\n const { data, error } = await supabase\n .from(\"user_tools\")\n .select(\"id, name, display_name, description, input_schema, execution_type, is_read_only, requires_approval, http_config, rpc_function, sql_template, allowed_tables, max_execution_time_ms\")\n .eq(\"store_id\", storeId)\n .eq(\"is_active\", true);\n\n if (error || !data?.length) return { rows: [], defs: [] };\n\n const rows: UserToolRow[] = data as UserToolRow[];\n const defs: ToolDef[] = rows.map((t) => ({\n name: `user_tool__${t.name}`,\n description: sanitizeToolDescription(\n `[Custom Tool] ${t.display_name}: ${t.description}${t.requires_approval ? \" (requires approval)\" : \"\"}`,\n ),\n input_schema: t.input_schema || { type: \"object\", properties: {} },\n }));\n\n userToolCache.set(storeId, { tools: rows, defs, time: Date.now(), lastAccessed: Date.now() });\n evictUserToolCache();\n return { rows, defs };\n}\n\nexport function getUserToolByPrefixedName(rows: UserToolRow[], prefixedName: string): UserToolRow | undefined {\n const toolName = prefixedName.replace(/^user_tool__/, \"\");\n return rows.find((t) => t.name === toolName);\n}\n\nexport function getToolsForAgent(agent: AgentConfig, coreTools: ToolDef[], userToolDefs: ToolDef[] = []): ToolDef[] {\n // Core registry tools are always available (matches MCP server behavior).\n // enabled_tools only restricts custom user tools.\n if (agent.enabled_tools?.length > 0) {\n const filteredUserTools = userToolDefs.filter((t) => agent.enabled_tools.includes(t.name));\n return [...coreTools, ...filteredUserTools];\n }\n return [...coreTools, ...userToolDefs];\n}\n\n// ============================================================================\n// UNIFIED HANDLER REGISTRY — single source of truth for all tool dispatch\n// ============================================================================\n\nexport type ToolProgressCallback = (toolName: string, progress: unknown) => void;\n\ntype ToolHandler = (\n sb: SupabaseClient,\n args: Record<string, unknown>,\n storeId?: string,\n onToolProgress?: (progress: unknown) => void,\n) => Promise<{ success: boolean; data?: unknown; error?: string }>;\n\ninterface ToolHandlerEntry {\n handler: ToolHandler;\n timeout: number; // ms — execution timeout\n requiresStore: boolean; // whether store_id is mandatory\n supportsProgress?: boolean; // handler accepts onToolProgress (4th param)\n}\n\nconst DEFAULT_TIMEOUT = 30_000;\n\n/**\n * Every built-in tool MUST be registered here. This map is the single source\n * of truth for handler routing, timeouts, and store requirements.\n * Adding a tool to ai_tool_registry without an entry here → \"Unknown tool\" error.\n */\nexport const TOOL_HANDLERS: Record<string, ToolHandlerEntry> = {\n // --- Business Data ---\n inventory: { handler: (sb, args, sid) => {\n const a = args.action as string || \"\";\n if (a.startsWith(\"audit_\")) return handleInventoryAudit(sb, { ...args, action: a.slice(6) }, sid);\n if ([\"summary\",\"velocity\",\"by_location\",\"in_stock\",\"out_of_stock\",\"by_category\"].includes(a)) return handleInventoryQuery(sb, args, sid);\n return handleInventory(sb, args, sid);\n }, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n purchase_orders: { handler: handlePurchaseOrders, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n transfers: { handler: handleTransfers, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n products: { handler: handleProducts, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n collections: { handler: handleCollections, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n customers: { handler: handleCustomers, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n orders: { handler: handleOrders, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n analytics: { handler: handleAnalytics, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n locations: { handler: handleLocations, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n suppliers: { handler: handleSuppliers, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n store: { handler: handleStore, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n storefront: { handler: handleStorefront, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Communication ---\n email: { handler: handleEmail, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n documents: { handler: handleDocuments, timeout: 120_000, requiresStore: true },\n\n // --- Operations ---\n alerts: { handler: handleAlerts, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n audit_trail: { handler: handleAuditTrail, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n workflows: { handler: handleWorkflows, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- AI & Generation ---\n voice: { handler: handleVoice, timeout: 120_000, requiresStore: true },\n image_gen: { handler: handleImageGen, timeout: 60_000, requiresStore: true },\n remove_bg: { handler: handleRemoveBg, timeout: 60_000, requiresStore: true },\n media: { handler: handleMedia, timeout: 60_000, requiresStore: true },\n video_gen: { handler: handleVideoGen, timeout: 600_000, requiresStore: true },\n llm: { handler: handleLLM, timeout: 120_000, requiresStore: true },\n embeddings: { handler: handleEmbeddings, timeout: 60_000, requiresStore: true },\n creations: { handler: handleCreations, timeout: 60_000, requiresStore: true },\n\n // --- Platform & Infrastructure (no store required) ---\n web_search: { handler: handleWebSearch, timeout: DEFAULT_TIMEOUT, requiresStore: false },\n telemetry: { handler: handleTelemetry, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n browser: { handler: handleBrowser, timeout: 120_000, requiresStore: true },\n discovery: { handler: handleDiscovery, timeout: DEFAULT_TIMEOUT, requiresStore: false },\n api_keys: { handler: handleAPIKeys, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n api_docs: { handler: handleApiDocs, timeout: 15_000, requiresStore: false },\n\n // --- Advertising ---\n meta_ads: { handler: handleMetaAds, timeout: 300_000, requiresStore: true },\n google_ads: { handler: handleGoogleAds, timeout: 300_000, requiresStore: true },\n\n // --- Security & Local ---\n kali: { handler: handleKali as ToolHandler, timeout: 600_000, requiresStore: true, supportsProgress: true },\n local_agent: { handler: handleLocalAgent, timeout: 600_000, requiresStore: false },\n\n // --- Customer Enrichment ---\n enrichment: { handler: handleEnrichment, timeout: 60_000, requiresStore: true },\n\n // --- Observability (ClickHouse) ---\n clickhouse: { handler: handleClickHouse, timeout: 60_000, requiresStore: false },\n\n // --- Loyalty & Promotions ---\n loyalty: { handler: handleLoyalty, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n coupons: { handler: handleCoupons, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Fulfillment ---\n fulfillment: { handler: handleFulfillment, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- CRM & Marketing ---\n segments: { handler: handleSegments, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n campaigns: { handler: handleCampaigns, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n reviews: { handler: handleReviews, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Finance & Tax ---\n tax: { handler: handleTax, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n invoices: { handler: handleInvoices, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Webhooks ---\n webhooks_mgmt: { handler: handleWebhooksMgmt, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Affiliates ---\n affiliates: { handler: handleAffiliates, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- QR Codes ---\n qr_codes: { handler: handleQRCodes, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Phone (RingCentral) ---\n phone: { handler: handlePhone, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Social / Multi-platform Ads ---\n social: { handler: handleSocial, timeout: 300_000, requiresStore: true },\n\n // --- Wallet ---\n wallet: { handler: handleWallet, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Sales Pipeline ---\n pipeline: { handler: handlePipeline, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Wholesale ---\n wholesale: { handler: handleWholesale, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Meta: Tool Discovery (lazy loading) ---\n discover_tools: { handler: handleDiscoverTools, timeout: 5000, requiresStore: false },\n};\n\nObject.freeze(TOOL_HANDLERS);\n\n/** Get all registered built-in tool names */\nexport function getRegisteredToolNames(): string[] {\n return Object.keys(TOOL_HANDLERS);\n}\n\n// ============================================================================\n// DISCOVER_TOOLS HANDLER — returns full schemas for extended tools on demand\n// ============================================================================\n\n/** Full extended tool defs (with schemas) — used by handleDiscoverTools to return schemas on demand */\nlet _extendedToolsCache: ToolDef[] = [];\n\n/** Lightweight extended tool index — name + first-sentence description only (for system prompt) */\nlet _extendedToolsIndex: Array<{ name: string; description: string }> = [];\n\n/** Called by index.ts after loadTools() to populate the discover_tools cache.\n * Stores full schemas for on-demand loading, plus a lightweight index for the system prompt. */\nexport function setExtendedToolsCache(tools: ToolDef[]): void {\n _extendedToolsCache = tools;\n // Pre-compute lightweight index: name + first sentence only (no schemas)\n _extendedToolsIndex = tools.map(t => ({\n name: t.name,\n description: t.description.split(\".\")[0],\n }));\n}\n\n/** Get full extended tools with schemas (for discover_tools handler) */\nexport function getExtendedToolsCache(): ToolDef[] {\n return _extendedToolsCache;\n}\n\n/** Get lightweight extended tools index — name + short description only (for system prompt).\n * Avoids serializing full schemas into the prompt. */\nexport function getExtendedToolsIndex(): Array<{ name: string; description: string }> {\n return _extendedToolsIndex;\n}\n\n/**\n * Get full tool schemas for specific tool names from the extended tools cache.\n * Used by the agent loop to inject discovered tool schemas into the active tool set.\n * Returns only tools that exist in the cache; unknown names are silently skipped.\n */\nexport function getFullToolSchemas(toolNames: string[]): ToolDef[] {\n if (!toolNames.length || !_extendedToolsCache.length) return [];\n const nameSet = new Set(toolNames);\n return _extendedToolsCache.filter(t => nameSet.has(t.name));\n}\n\n// Tool category heuristics — maps tool names to categories for category-based discovery\nconst TOOL_CATEGORIES: Record<string, string> = {\n // Business Data\n inventory: \"business\", purchase_orders: \"business\", transfers: \"business\",\n products: \"business\", collections: \"business\", customers: \"business\",\n orders: \"business\", analytics: \"business\", locations: \"business\",\n suppliers: \"business\", store: \"business\", storefront: \"business\",\n // Communication\n email: \"communication\", documents: \"communication\",\n // Operations\n alerts: \"operations\", audit_trail: \"operations\", workflows: \"operations\",\n telemetry: \"operations\",\n // Media & AI\n voice: \"media\", image_gen: \"media\", video_gen: \"media\", remove_bg: \"media\", media: \"media\",\n llm: \"ai\", embeddings: \"ai\", creations: \"media\",\n // Platform\n web_search: \"platform\", browser: \"platform\", discovery: \"platform\",\n api_keys: \"platform\", api_docs: \"platform\",\n // Security\n kali: \"security\", local_agent: \"platform\",\n // Advertising\n meta_ads: \"advertising\",\n // Data\n enrichment: \"data\",\n};\n\nasync function handleDiscoverTools(\n sb: SupabaseClient,\n args: Record<string, unknown>,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const names = args.names as string[] | undefined;\n const category = args.category as string | undefined;\n const refresh = args.refresh as boolean | undefined;\n\n // Force reload from DB if refresh requested — busts the 60s cache\n if (refresh) {\n try {\n const freshResult = await loadTools(sb, true);\n setExtendedToolsCache(freshResult.extended);\n } catch {\n // If refresh fails, continue with stale cache — better than erroring\n }\n }\n\n if (!names?.length && !category) {\n return { success: false, error: \"Provide 'names' (array of tool names) or 'category' to discover tools.\" };\n }\n\n let matching: ToolDef[] = [];\n\n if (names?.length) {\n const nameSet = new Set(names);\n matching = _extendedToolsCache.filter(t => nameSet.has(t.name));\n }\n\n if (category) {\n const cat = category.toLowerCase();\n const categoryTools = _extendedToolsCache.filter(t => TOOL_CATEGORIES[t.name] === cat);\n // Merge without duplicates\n const existingNames = new Set(matching.map(t => t.name));\n for (const t of categoryTools) {\n if (!existingNames.has(t.name)) matching.push(t);\n }\n }\n\n if (matching.length === 0) {\n const available = _extendedToolsCache.map(t => t.name).join(\", \");\n return { success: false, error: `No matching extended tools found. Available: ${available}` };\n }\n\n return {\n success: true,\n data: {\n tools: matching.map(t => ({ name: t.name, description: t.description, input_schema: t.input_schema })),\n count: matching.length,\n refreshed: !!refresh,\n },\n };\n}\n\n// ============================================================================\n// USER TOOL EXECUTOR — handles RPC, HTTP, SQL execution types\n// ============================================================================\n\nasync function executeUserTool(\n supabase: SupabaseClient,\n userTool: UserToolRow,\n args: Record<string, unknown>,\n storeId: string,\n agentId?: string,\n conversationId?: string,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const timeout = userTool.max_execution_time_ms || 5000;\n\n if (userTool.execution_type === \"http\") {\n return executeHTTPUserTool(supabase, userTool, args, storeId, timeout);\n }\n\n try {\n const { data, error } = await supabase.rpc(\"execute_user_tool\", {\n p_tool_id: userTool.id,\n p_store_id: storeId,\n p_args: args,\n p_agent_id: agentId || null,\n p_conversation_id: conversationId || null,\n });\n\n if (error) return { success: false, error: error.message };\n\n const result = data as { success: boolean; data?: unknown; error?: string; pending_approval?: boolean; execution_id?: string; message?: string };\n\n if (result.pending_approval) {\n return { success: false, error: `Tool requires approval. Execution ID: ${result.execution_id}. ${result.message}` };\n }\n\n if (result.success && result.data && (result.data as any).execute_sql) {\n return executeSQLUserTool(supabase, result.data as any, args, storeId);\n }\n\n return result.success\n ? { success: true, data: result.data }\n : { success: false, error: result.error || \"Unknown error\" };\n } catch (err) {\n return { success: false, error: sanitizeError(err) };\n }\n}\n\nasync function executeHTTPUserTool(\n supabase: SupabaseClient,\n userTool: UserToolRow,\n args: Record<string, unknown>,\n storeId: string,\n timeout: number,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const config = userTool.http_config;\n if (!config || !(config as any).url) {\n return { success: false, error: \"HTTP tool has no URL configured\" };\n }\n\n const httpCfg = config as { url: string; method?: string; headers?: Record<string, string>; body_template?: Record<string, unknown> };\n\n let url = httpCfg.url;\n let headers: Record<string, string> = { ...(httpCfg.headers || {}) };\n\n // Collect secret names referenced in the URL, headers, and body template\n const configStr = JSON.stringify({ url: httpCfg.url, headers: httpCfg.headers, body: httpCfg.body_template });\n const secretRefs = [...configStr.matchAll(/\\{\\{secret:(\\w+)\\}\\}/g)].map(m => m[1]);\n\n // Decrypt each referenced secret via RPC (consistent with all other handlers)\n const secretMap = new Map<string, string>();\n await Promise.all(\n [...new Set(secretRefs)].map(async (name) => {\n try {\n const { data } = await supabase.rpc(\"decrypt_secret\", { p_name: name, p_store_id: storeId });\n if (data) secretMap.set(name, data as string);\n } catch { /* secret not found — will remain as {{secret:NAME}} placeholder */ }\n }),\n );\n\n const resolveSecrets = (text: string): string => {\n return text.replace(/\\{\\{secret:(\\w+)\\}\\}/g, (_, name) => secretMap.get(name) || `{{secret:${name}}}`);\n };\n\n const resolveArgs = (text: string): string => {\n return text.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => {\n if (name === \"secret\") return `{{${name}}}`;\n const val = args[name];\n return val !== undefined ? String(val) : `{{${name}}}`;\n });\n };\n\n const resolve = (text: string): string => resolveSecrets(resolveArgs(text));\n\n url = resolve(url);\n for (const [key, val] of Object.entries(headers)) {\n headers[key] = resolve(val);\n }\n\n let body: string | undefined;\n const method = (httpCfg.method || \"GET\").toUpperCase();\n if (method !== \"GET\" && method !== \"HEAD\") {\n if (httpCfg.body_template) {\n const resolvedBody: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(httpCfg.body_template)) {\n if (typeof val === \"string\") {\n resolvedBody[key] = resolve(val);\n } else {\n resolvedBody[key] = val;\n }\n }\n for (const [key, val] of Object.entries(args)) {\n if (!(key in resolvedBody)) {\n resolvedBody[key] = val;\n }\n }\n body = JSON.stringify(resolvedBody);\n } else {\n body = JSON.stringify(args);\n }\n if (!headers[\"Content-Type\"] && !headers[\"content-type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n }\n\n // P0 FIX: Use shared SSRF guard with DNS resolve-then-check (replaces inline regex)\n const ssrfError = await validateUrl(url);\n if (ssrfError) {\n return { success: false, error: `Blocked: ${ssrfError}` };\n }\n\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n const resp = await fetch(url, { method, headers, body, signal: controller.signal });\n clearTimeout(timer);\n\n // Clear secrets from memory as soon as the request is sent\n secretMap.clear();\n\n const contentType = resp.headers.get(\"content-type\") || \"\";\n let data: unknown;\n if (contentType.includes(\"json\")) {\n data = await resp.json();\n } else {\n data = await resp.text();\n }\n\n if (!resp.ok) {\n return { success: false, error: `HTTP ${resp.status}: ${typeof data === \"string\" ? data.substring(0, 500) : JSON.stringify(data).substring(0, 500)}` };\n }\n\n return { success: true, data };\n } catch (err: any) {\n // Clear secrets from memory even on error\n secretMap.clear();\n if (err.name === \"AbortError\") {\n return { success: false, error: `HTTP request timed out after ${timeout}ms` };\n }\n return { success: false, error: sanitizeError(err) };\n }\n}\n\nasync function executeSQLUserTool(\n supabase: SupabaseClient,\n sqlConfig: { template: string; allowed_tables: string[]; is_read_only: boolean },\n args: Record<string, unknown>,\n storeId: string,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n if (!sqlConfig.is_read_only) {\n return { success: false, error: \"Write SQL tools are not supported in server execution\" };\n }\n\n if (!sqlConfig.template) {\n return { success: false, error: \"No SQL template configured\" };\n }\n\n try {\n const { data, error } = await supabase.rpc(\"execute_safe_sql\", {\n p_sql: sqlConfig.template,\n p_params: args,\n p_store_id: storeId,\n p_allowed_tables: sqlConfig.allowed_tables || [],\n });\n\n if (error) return { success: false, error: error.message };\n\n if (data?.success) {\n return { success: true, data: data.data };\n }\n return { success: false, error: data?.error || \"SQL execution failed\" };\n } catch (err) {\n return { success: false, error: sanitizeError(err) };\n }\n}\n\n// ============================================================================\n// SUPPLY CHAIN — action aliasing (LLMs omit po_/transfer_ prefix)\n// ============================================================================\n\nasync function executeSupplyChain(\n supabase: SupabaseClient,\n args: Record<string, unknown>,\n storeId?: string,\n traceId?: string,\n userId?: string | null,\n userEmail?: string | null,\n source?: string,\n conversationId?: string,\n userToolRows?: UserToolRow[],\n agentId?: string,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n let scAction = args.action as string || \"\";\n const PO_ALIASES: Record<string, string> = {\n create: \"po_create\", list: \"po_list\", get: \"po_get\",\n add_items: \"po_add_items\", approve: \"po_approve\", mark_ordered: \"po_mark_ordered\",\n receive: \"po_receive\", cancel: \"po_cancel\",\n };\n if (PO_ALIASES[scAction]) scAction = PO_ALIASES[scAction];\n\n if (scAction === \"find_suppliers\") {\n return executeTool(supabase, \"suppliers\", { ...args, action: \"find_suppliers\" }, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n if (scAction.startsWith(\"po_\")) {\n return executeTool(supabase, \"purchase_orders\", { ...args, action: scAction.slice(3) }, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n if (scAction.startsWith(\"transfer_\")) {\n return executeTool(supabase, \"transfers\", { ...args, action: scAction.slice(9) }, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n return { success: false, error: `Unknown supply_chain action: ${scAction}. Use po_create, po_list, po_get, po_approve, po_receive, po_cancel, transfer_create, transfer_list, transfer_approve, transfer_ship, transfer_receive, transfer_cancel, find_suppliers.` };\n}\n\n// ============================================================================\n// TOOL EXECUTOR — dispatches via unified handler registry\n// ============================================================================\n\nexport async function executeTool(\n supabase: SupabaseClient,\n toolName: string,\n args: Record<string, unknown>,\n storeId?: string,\n traceId?: string,\n userId?: string | null,\n userEmail?: string | null,\n source?: string,\n conversationId?: string,\n userToolRows?: UserToolRow[],\n agentId?: string,\n onToolProgress?: ToolProgressCallback,\n /** Skip per-tool audit when called within a conversation — persistAgentTurn handles it */\n skipAudit?: boolean,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const startTime = Date.now();\n const action = args.action as string | undefined;\n let result: { success: boolean; data?: unknown; error?: string };\n\n // Handle supply_chain aliases (LLMs often omit po_/transfer_ prefix)\n if (toolName === \"supply_chain\") {\n return executeSupplyChain(supabase, args, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n\n // Look up handler from unified registry\n const entry = TOOL_HANDLERS[toolName];\n\n // Check store requirement from registry (not hardcoded)\n const requiresStore = entry ? entry.requiresStore : true;\n if (requiresStore && (!storeId || !/^[0-9a-fA-F]{8}-/.test(storeId))) {\n return { success: false, error: `store_id is required for ${toolName}. Ensure a store is selected.` };\n }\n\n // Permission enforcement — check agent flags before tool execution\n if (agentId) {\n const { data: agentFlags } = await supabase.from(\"ai_agent_config\")\n .select(\"can_query, can_modify\")\n .eq(\"id\", agentId).single();\n if (agentFlags) {\n // Read-only agent check — block ALL tool calls if can_query is false\n if (!agentFlags.can_query) {\n const readActions = [\"list\", \"get\", \"search\", \"query\", \"summary\", \"stats\", \"count\", \"by_location\", \"in_stock\", \"out_of_stock\", \"velocity\"];\n const action = args.action as string | undefined;\n if (action && readActions.includes(action)) {\n return { success: false, error: `Agent does not have query permission (can_query=false). Contact an admin.` };\n }\n }\n // Mutation check — already in system prompt but enforce at execution level\n if (!agentFlags.can_modify) {\n const writeActions = [\"create\", \"update\", \"delete\", \"upsert\", \"send\", \"approve\", \"cancel\", \"add\", \"remove\", \"set\", \"adjust\", \"transfer\"];\n const action = args.action as string | undefined;\n if (action && writeActions.some(wa => action.startsWith(wa))) {\n return { success: false, error: `Agent has read-only access (can_modify=false). Cannot perform \"${action}\".` };\n }\n }\n }\n }\n\n // User tool approval check — requires_approval enforced at execution level\n if (toolName.startsWith(\"user_tool__\") && userToolRows?.length) {\n const userTool = getUserToolByPrefixedName(userToolRows, toolName);\n if (userTool?.requires_approval) {\n return { success: false, error: `Tool \"${userTool.display_name}\" requires approval before execution. Use the workflow approval system to request permission.` };\n }\n }\n\n // Validate mutation args before dispatch — read-only actions pass through\n const validation = validateToolArgs(toolName, args);\n if (!validation.valid) {\n return { success: false, error: validation.error };\n }\n args = validation.data;\n\n const execStartMs = Date.now();\n try {\n let toolPromise: Promise<{ success: boolean; data?: unknown; error?: string }>;\n\n if (entry) {\n // Dispatch via unified handler registry — pass progress callback to handlers that support it\n const progressCb = entry.supportsProgress && onToolProgress\n ? (progress: unknown) => onToolProgress(toolName, progress)\n : undefined;\n toolPromise = entry.handler(supabase, args, storeId, progressCb);\n } else if (toolName.startsWith(\"user_tool__\") && userToolRows && storeId) {\n // Custom user tools\n const userTool = getUserToolByPrefixedName(userToolRows, toolName);\n if (userTool) {\n toolPromise = executeUserTool(supabase, userTool, args, storeId, agentId, conversationId);\n } else {\n toolPromise = Promise.resolve({ success: false, error: `Unknown user tool: ${toolName}` });\n }\n } else {\n toolPromise = Promise.resolve({ success: false, error: `Unknown tool: ${toolName}. Use the discover_tools action to see available tools.` });\n }\n\n const timeoutMs = entry?.timeout || DEFAULT_TIMEOUT;\n\n // FIX 7: Timeout cascade validation — warn if step timeout < tool timeout\n const stepTimeout = args._step_timeout_seconds as number | undefined;\n if (stepTimeout && stepTimeout * 1000 < timeoutMs) {\n console.warn(`[timeout-cascade] Step timeout (${stepTimeout}s) < tool timeout (${timeoutMs / 1000}s) for ${toolName}. Tool may outlive step.`);\n }\n\n result = await withTimeout(toolPromise, timeoutMs, toolName);\n } catch (err) {\n result = { success: false, error: sanitizeError(err) };\n }\n\n // Record execution metrics\n recordToolMetric(toolName, Date.now() - execStartMs, result.success);\n\n // Audit log — enriched with OTEL fields for distributed tracing\n // Skipped when tool is called within a conversation (SSE chat, channel agent, workflow)\n // because persistAgentTurn already logs the full conversation with tool details\n if (skipAudit) return result;\n try {\n const endTime = Date.now();\n // Compute payload sizes for observability\n const inputJson = JSON.stringify(args);\n const outputJson = result.data ? JSON.stringify(result.data) : \"\";\n const inputBytes = inputJson.length;\n const outputBytes = outputJson.length;\n\n const details: Record<string, unknown> = {\n source: source || \"fly_container\",\n args,\n // Keys that SwiftUI telemetry panel reads for rich display\n tool_input: args,\n input_bytes: inputBytes,\n output_bytes: outputBytes,\n };\n if (result.success && result.data) {\n details.result_summary = summarizeResult(toolName, action, result.data);\n // Store full result for rich telemetry display (capped at 50KB to prevent JSONB bloat)\n if (outputBytes <= 50_000) {\n details.tool_result = result.data;\n } else {\n details.tool_result = {\n _truncated: true,\n _type: Array.isArray(result.data) ? \"array\" : \"object\",\n _size: outputBytes,\n _count: Array.isArray(result.data) ? result.data.length : Object.keys(result.data as object).length,\n };\n }\n }\n if (result.error) {\n details.tool_error = result.error;\n const errorType = classifyErrorType(result.error);\n if (errorType) details.error_type = errorType;\n }\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n const spanId = Array.from(bytes).map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n const auditRow: Record<string, unknown> = {\n action: `tool.${toolName}${action ? `.${action}` : \"\"}`,\n severity: result.success ? \"info\" : \"error\",\n store_id: storeId || null,\n resource_type: \"mcp_tool\",\n resource_id: toolName,\n request_id: traceId || null,\n conversation_id: conversationId || null,\n source: source || \"fly_container\",\n details,\n error_message: result.error || null,\n error_type: classifyErrorType(result.error) || undefined,\n duration_ms: endTime - startTime,\n user_id: userId || null,\n user_email: userEmail || null,\n input_bytes: inputBytes,\n output_bytes: outputBytes,\n // OTEL fields\n trace_id: traceId || null,\n span_id: spanId,\n span_kind: \"INTERNAL\",\n service_name: \"agent-server\",\n status_code: result.success ? \"OK\" : \"ERROR\",\n start_time: new Date(startTime).toISOString(),\n end_time: new Date(endTime).toISOString(),\n };\n queueSpan(auditRowToSpan(auditRow));\n } catch (err) {\n console.error(\"[audit] exception:\", err);\n }\n\n return result;\n}\n\n// ============================================================================\n// AGENT LOADER\n// ============================================================================\n\nexport async function loadAgentConfig(supabase: SupabaseClient, agentId: string, storeId?: string): Promise<AgentConfig | null> {\n // storeId is required for tenant isolation — only omit for internal/migration callers\n let query = supabase\n .from(\"ai_agent_config\")\n .select(\"*\")\n .eq(\"id\", agentId);\n\n // Filter by store_id for tenant isolation, but also allow platform agents (store_id IS NULL)\n if (storeId) {\n query = query.or(`store_id.eq.${storeId},store_id.is.null`);\n }\n\n const { data, error } = await query.single();\n\n if (error || !data) return null;\n return data as AgentConfig;\n}\n"],"mappings":"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","ignoreList":[]}
|