yamchart 0.10.2 → 0.10.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/{advisor-5F73GF54.js → advisor-XTJQU7E4.js} +12 -12
  2. package/dist/{chunk-5CRXV5PQ.js → chunk-2XJZJ6IA.js} +2 -2
  3. package/dist/{chunk-X3UG6T3Q.js → chunk-6ELSQNIH.js} +2 -2
  4. package/dist/{chunk-UOSOZT47.js → chunk-KDDO4UII.js} +57 -5
  5. package/dist/chunk-KDDO4UII.js.map +1 -0
  6. package/dist/{chunk-25ES7MGF.js → chunk-ODSPBOJW.js} +4 -4
  7. package/dist/{chunk-7HWFVUGP.js → chunk-OYBI433Z.js} +59 -2
  8. package/dist/chunk-OYBI433Z.js.map +1 -0
  9. package/dist/{chunk-WVSDQNAN.js → chunk-PXFTWXSV.js} +2 -2
  10. package/dist/{chunk-PYVROL7Z.js → chunk-XNMB25GT.js} +4 -4
  11. package/dist/{connection-utils-HNX3473B.js → connection-utils-S7EFPTLY.js} +5 -5
  12. package/dist/{describe-KDGXFPDQ.js → describe-TA2CTODC.js} +6 -6
  13. package/dist/{dev-KOWFGDOP.js → dev-PHFYLJPJ.js} +1336 -796
  14. package/dist/dev-PHFYLJPJ.js.map +1 -0
  15. package/dist/{dist-WMP7BFKP.js → dist-F6TVLP6C.js} +12 -4
  16. package/dist/{dist-YB5RBWCC.js → dist-Q5ETETUU.js} +4 -4
  17. package/dist/{dist-LK3ZG74Q.js → dist-YJOOH65Y.js} +9 -5
  18. package/dist/index.js +26 -26
  19. package/dist/public/assets/DataView-V-E6oxy6.js +9 -0
  20. package/dist/public/assets/{EventManagement-BIkVUSCe.js → EventManagement-Do2xU5lV.js} +1 -1
  21. package/dist/public/assets/{ExplorePage-CeaAulqT.js → ExplorePage-Dg50mvGB.js} +1 -1
  22. package/dist/public/assets/{LoginPage-4WeNcdRi.js → LoginPage-DmYGIXcu.js} +1 -1
  23. package/dist/public/assets/{PublicViewer-CkW-G56D.js → PublicViewer-CJTgc9OF.js} +1 -1
  24. package/dist/public/assets/{SetupWizard-CwTr3PCy.js → SetupWizard-Bo-zmh43.js} +1 -1
  25. package/dist/public/assets/{ShareManagement-DSon6CoC.js → ShareManagement-6Wp6b2Gp.js} +1 -1
  26. package/dist/public/assets/{SourceDetailView-BA4XVKqV.js → SourceDetailView-CTzSXhZc.js} +1 -1
  27. package/dist/public/assets/{UserManagement-BWD2Ugkv.js → UserManagement-DQhB13T0.js} +1 -1
  28. package/dist/public/assets/{index-iR9gLdl9.js → index-CY8xsfQH.js} +31 -31
  29. package/dist/public/assets/{index-Cb4omrVn.css → index-Dkn-tJCT.css} +1 -1
  30. package/dist/public/assets/{index.es-BuEtjxhO.js → index.es-Bc3yys5L.js} +1 -1
  31. package/dist/public/assets/{jspdf.es.min-CScx2_oK.js → jspdf.es.min-D94JEH-J.js} +3 -3
  32. package/dist/public/index.html +2 -2
  33. package/dist/{query-7XHKSZ5H.js → query-AX4BOPMH.js} +5 -5
  34. package/dist/{sample-YNSJ3I3T.js → sample-4NUBJGIL.js} +5 -5
  35. package/dist/{search-NKRXXLRS.js → search-IBVVYN4I.js} +6 -6
  36. package/dist/{semantic-NBAX4WU4.js → semantic-33YIUMUV.js} +3 -3
  37. package/dist/{semantic-DD7P4634.js → semantic-5WGVZ7HY.js} +3 -3
  38. package/dist/{source-resolver-7NY3KEZ2.js → source-resolver-GYXIRIVK.js} +6 -6
  39. package/dist/{sync-warehouse-PK7HXW7U.js → sync-warehouse-5NKENCOZ.js} +5 -5
  40. package/dist/{tables-WQTRZSXR.js → tables-QMZMYYV5.js} +6 -6
  41. package/dist/{test-MKNKUR3N.js → test-6MCPGXJP.js} +5 -5
  42. package/package.json +5 -5
  43. package/dist/chunk-7HWFVUGP.js.map +0 -1
  44. package/dist/chunk-UOSOZT47.js.map +0 -1
  45. package/dist/dev-KOWFGDOP.js.map +0 -1
  46. package/dist/public/assets/DataView-BfwnWnLH.js +0 -9
  47. /package/dist/{advisor-5F73GF54.js.map → advisor-XTJQU7E4.js.map} +0 -0
  48. /package/dist/{chunk-5CRXV5PQ.js.map → chunk-2XJZJ6IA.js.map} +0 -0
  49. /package/dist/{chunk-X3UG6T3Q.js.map → chunk-6ELSQNIH.js.map} +0 -0
  50. /package/dist/{chunk-25ES7MGF.js.map → chunk-ODSPBOJW.js.map} +0 -0
  51. /package/dist/{chunk-WVSDQNAN.js.map → chunk-PXFTWXSV.js.map} +0 -0
  52. /package/dist/{chunk-PYVROL7Z.js.map → chunk-XNMB25GT.js.map} +0 -0
  53. /package/dist/{connection-utils-HNX3473B.js.map → connection-utils-S7EFPTLY.js.map} +0 -0
  54. /package/dist/{describe-KDGXFPDQ.js.map → describe-TA2CTODC.js.map} +0 -0
  55. /package/dist/{dist-LK3ZG74Q.js.map → dist-F6TVLP6C.js.map} +0 -0
  56. /package/dist/{dist-WMP7BFKP.js.map → dist-Q5ETETUU.js.map} +0 -0
  57. /package/dist/{dist-YB5RBWCC.js.map → dist-YJOOH65Y.js.map} +0 -0
  58. /package/dist/{query-7XHKSZ5H.js.map → query-AX4BOPMH.js.map} +0 -0
  59. /package/dist/{sample-YNSJ3I3T.js.map → sample-4NUBJGIL.js.map} +0 -0
  60. /package/dist/{search-NKRXXLRS.js.map → search-IBVVYN4I.js.map} +0 -0
  61. /package/dist/{semantic-NBAX4WU4.js.map → semantic-33YIUMUV.js.map} +0 -0
  62. /package/dist/{semantic-DD7P4634.js.map → semantic-5WGVZ7HY.js.map} +0 -0
  63. /package/dist/{source-resolver-7NY3KEZ2.js.map → source-resolver-GYXIRIVK.js.map} +0 -0
  64. /package/dist/{sync-warehouse-PK7HXW7U.js.map → sync-warehouse-5NKENCOZ.js.map} +0 -0
  65. /package/dist/{tables-WQTRZSXR.js.map → tables-QMZMYYV5.js.map} +0 -0
  66. /package/dist/{test-MKNKUR3N.js.map → test-6MCPGXJP.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../packages/schema/src/connection.ts","../../../packages/schema/src/runtime-config.ts","../../../packages/schema/src/project.ts","../../../packages/schema/src/semantic.ts","../../../packages/schema/src/chart.ts","../../../packages/schema/src/model.ts","../../../packages/schema/src/dashboard.ts","../../../packages/schema/src/schedule.ts","../../../packages/schema/src/events.ts","../../../packages/schema/src/semantic-curated.ts","../../../packages/schema/src/agent.ts","../../../packages/schema/src/hunch.ts","../../../packages/schema/src/blindspot.ts","../../../packages/schema/src/knowledge-doc.ts","../../../packages/schema/src/index.ts"],"sourcesContent":["import { z } from 'zod';\n\n// Auth configuration for connections\nconst EnvAuthSchema = z.object({\n type: z.literal('env'),\n user_var: z.string(),\n password_var: z.string(),\n});\n\nconst KeyPairAuthSchema = z.object({\n type: z.literal('key_pair'),\n user_var: z.string(),\n private_key_path: z.string(),\n});\n\nconst SecretManagerAuthSchema = z.object({\n type: z.literal('secret_manager'),\n provider: z.enum(['aws_secrets_manager', 'gcp_secret_manager', 'vault']),\n secret_id: z.string(),\n});\n\nconst ExternalBrowserAuthSchema = z.object({\n type: z.literal('externalbrowser'),\n user_var: z.string(),\n cache_token: z.boolean().optional(),\n});\n\nconst ServiceAccountAuthSchema = z.object({\n type: z.literal('service_account'),\n credentials_var: z.string().optional(), // env var NAME holding the SA JSON contents\n key_file: z.string().optional(), // path to a SA .json key file\n});\n\nconst AuthSchema = z.discriminatedUnion('type', [\n EnvAuthSchema,\n KeyPairAuthSchema,\n SecretManagerAuthSchema,\n ExternalBrowserAuthSchema,\n ServiceAccountAuthSchema,\n]);\n\n// Connection pool configuration\nexport const PoolConfigSchema = z.object({\n min_connections: z.number().int().positive().optional(),\n max_connections: z.number().int().positive().optional(),\n idle_timeout: z.number().int().positive().optional(),\n});\n\n// Query settings\nexport const QueryConfigSchema = z.object({\n timeout: z.number().int().positive().optional(),\n max_rows: z.number().int().positive().optional(),\n});\n\n// DuckDB-specific config\nexport const DuckDBConfigSchema = z.object({\n path: z.string(), // file path or :memory:\n});\n\n// Postgres-specific config\nexport const PostgresConfigSchema = z.object({\n host: z.string(),\n port: z.number().int().positive().default(5432),\n database: z.string(),\n schema: z.string().optional(),\n ssl: z.boolean().optional(),\n});\n\n// Snowflake-specific config\nexport const SnowflakeConfigSchema = z.object({\n account: z.string(),\n warehouse: z.string(),\n database: z.string(),\n schema: z.string().optional(),\n role: z.string().optional(),\n});\n\n// MySQL-specific config\nexport const MySQLConfigSchema = z.object({\n host: z.string(),\n port: z.number().int().positive().default(3306),\n database: z.string(),\n ssl: z.boolean().optional(),\n});\n\n// SQLite-specific config\nexport const SQLiteConfigSchema = z.object({\n path: z.string(), // file path or :memory:\n});\n\n// BigQuery-specific config\nexport const BigQueryConfigSchema = z.object({\n project_id: z.string(),\n dataset: z.string().optional(),\n location: z.string().optional(),\n max_bytes_billed: z.number().optional(),\n});\n\n// Base connection schema\nconst BaseConnectionSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n pool: PoolConfigSchema.optional(),\n query: QueryConfigSchema.optional(),\n hunch_confidence_threshold: z.number().min(0).max(1).optional(),\n});\n\n// Type-specific connection schemas\nconst DuckDBConnectionSchema = BaseConnectionSchema.extend({\n type: z.literal('duckdb'),\n config: DuckDBConfigSchema,\n auth: z.undefined().optional(),\n});\n\nconst PostgresConnectionSchema = BaseConnectionSchema.extend({\n type: z.literal('postgres'),\n config: PostgresConfigSchema,\n auth: AuthSchema.optional(),\n});\n\nconst SnowflakeConnectionSchema = BaseConnectionSchema.extend({\n type: z.literal('snowflake'),\n config: SnowflakeConfigSchema,\n auth: AuthSchema,\n});\n\nconst MySQLConnectionSchema = BaseConnectionSchema.extend({\n type: z.literal('mysql'),\n config: MySQLConfigSchema,\n auth: AuthSchema.optional(),\n});\n\nconst SQLiteConnectionSchema = BaseConnectionSchema.extend({\n type: z.literal('sqlite'),\n config: SQLiteConfigSchema,\n auth: z.undefined().optional(),\n});\n\nconst BigQueryConnectionSchema = BaseConnectionSchema.extend({\n type: z.literal('bigquery'),\n config: BigQueryConfigSchema,\n auth: AuthSchema,\n});\n\n// Union of all connection types\nexport const ConnectionSchema = z.discriminatedUnion('type', [\n DuckDBConnectionSchema,\n PostgresConnectionSchema,\n SnowflakeConnectionSchema,\n MySQLConnectionSchema,\n SQLiteConnectionSchema,\n BigQueryConnectionSchema,\n]);\n\nexport type Connection = z.infer<typeof ConnectionSchema>;\nexport type DuckDBConnection = z.infer<typeof DuckDBConnectionSchema>;\nexport type PostgresConnection = z.infer<typeof PostgresConnectionSchema>;\nexport type SnowflakeConnection = z.infer<typeof SnowflakeConnectionSchema>;\nexport type MySQLConnection = z.infer<typeof MySQLConnectionSchema>;\nexport type SQLiteConnection = z.infer<typeof SQLiteConnectionSchema>;\nexport type BigQueryConnection = z.infer<typeof BigQueryConnectionSchema>;\n","import { z } from 'zod';\nimport {\n DuckDBConfigSchema,\n PostgresConfigSchema,\n MySQLConfigSchema,\n SQLiteConfigSchema,\n SnowflakeConfigSchema,\n BigQueryConfigSchema,\n PoolConfigSchema,\n QueryConfigSchema,\n} from './connection.js';\nimport { AiConfigSchema } from './project.js';\n\n/** Decrypted inline credential values for a runtime-defined connection. */\nexport const ConnectionSecretsSchema = z.object({\n user: z.string().optional(),\n password: z.string().optional(),\n private_key: z.string().optional(), // Snowflake key_pair PEM\n credentials_json: z.string().optional(), // BigQuery service-account JSON contents\n});\nexport type ConnectionSecrets = z.infer<typeof ConnectionSecretsSchema>;\n\nconst baseRuntime = {\n name: z.string().min(1),\n description: z.string().optional(),\n pool: PoolConfigSchema.optional(),\n query: QueryConfigSchema.optional(),\n secrets: ConnectionSecretsSchema.optional(),\n};\n\nexport const RuntimeConnectionSchema = z.discriminatedUnion('type', [\n z.object({ ...baseRuntime, type: z.literal('duckdb'), config: DuckDBConfigSchema }),\n z.object({ ...baseRuntime, type: z.literal('postgres'), config: PostgresConfigSchema }),\n z.object({ ...baseRuntime, type: z.literal('mysql'), config: MySQLConfigSchema }),\n z.object({ ...baseRuntime, type: z.literal('sqlite'), config: SQLiteConfigSchema }),\n z.object({ ...baseRuntime, type: z.literal('snowflake'), config: SnowflakeConfigSchema }),\n z.object({ ...baseRuntime, type: z.literal('bigquery'), config: BigQueryConfigSchema }),\n]);\nexport type RuntimeConnection = z.infer<typeof RuntimeConnectionSchema>;\n\nexport const RuntimeConfigSchema = z.object({\n version: z.literal(1).default(1),\n connections: z.array(RuntimeConnectionSchema).optional(),\n knowledge: z.object({ database_url: z.string().min(1).optional() }).optional(),\n ai: AiConfigSchema.optional(),\n});\nexport type RuntimeConfig = z.infer<typeof RuntimeConfigSchema>;\n","import { z } from 'zod';\nimport { SemanticConfigSchema } from './semantic.js';\n\n// Default settings\nconst DefaultsSchema = z.object({\n connection: z.string().optional(),\n theme: z.string().optional(),\n timezone: z.string().optional(),\n cache_ttl: z.string().optional(),\n base_url: z.string().url().optional(),\n week_start: z.enum(['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']).optional(),\n table: z.object({\n max_display_rows: z.number().int().positive().optional(),\n max_export_rows: z.number().int().positive().optional(),\n }).optional(),\n});\n\n// Git integration settings\nconst GitSchema = z.object({\n provider: z.enum(['github', 'gitlab', 'bitbucket']).optional(),\n repo: z.string().optional(),\n branch: z.string().optional(),\n preview_branches: z.boolean().optional(),\n});\n\n// SSO provider configuration\nconst SSOProviderSchema = z\n .object({\n client_id: z.string(),\n // Provide the secret directly, or name an env var that holds it (client_secret_var)\n // so the secret never lives in git.\n client_secret: z.string().optional(),\n client_secret_var: z.string().optional(),\n tenant: z.string().optional(),\n issuer: z.string().optional(),\n display_name: z.string().optional(),\n // Invite list: if non-empty, only these emails may sign in via this provider.\n // Anyone not listed is rejected instead of auto-provisioned.\n allowed_emails: z.array(z.string()).optional(),\n // Emails provisioned with the admin role (implicitly allowed even if not in allowed_emails).\n admin_emails: z.array(z.string()).optional(),\n })\n .refine((c) => !!c.client_secret || !!c.client_secret_var, {\n message: 'SSO provider requires either client_secret or client_secret_var',\n });\n\n// Authentication settings (built-in local auth)\nconst AuthSchema = z.object({\n enabled: z.boolean(),\n db_path: z.string().optional(),\n session_ttl: z.string().optional(),\n providers: z.object({\n google: SSOProviderSchema.optional(),\n microsoft: SSOProviderSchema.optional(),\n oidc: SSOProviderSchema.optional(),\n }).optional(),\n});\n\n// Feature flags\nconst FeaturesSchema = z.object({\n enable_sql_editor: z.boolean().optional(),\n enable_csv_export: z.boolean().optional(),\n enable_scheduling: z.boolean().optional(),\n chat: z.boolean().optional(),\n});\n\n// Sidebar link for external navigation\nconst SidebarLinkSchema = z.object({\n label: z.string(),\n url: z.string(),\n icon: z.string().optional(),\n});\n\n// Sidebar configuration\nconst SidebarConfigSchema = z.object({\n show: z.boolean().optional(),\n collapsed: z.boolean().optional(),\n links: z.array(SidebarLinkSchema).optional(),\n sections: z.object({\n dashboards: z.boolean().optional(),\n charts: z.boolean().optional(),\n }).optional(),\n});\n\n// Color configuration\nconst ColorsSchema = z.object({\n primary: z.string().optional(),\n background: z.string().optional(),\n surface: z.string().optional(),\n sidebar: z.string().optional(),\n text: z.string().optional(),\n});\n\n// Font configuration\nconst FontsSchema = z.object({\n heading: z.string().optional(),\n body: z.string().optional(),\n mono: z.string().optional(),\n size: z.enum(['compact', 'default', 'comfortable']).optional(),\n});\n\n// Logo can be a string path or light/dark object\nconst LogoSchema = z.union([\n z.string(),\n z.object({\n light: z.string(),\n dark: z.string(),\n }),\n]);\n\n// Theme configuration\nconst ThemeSchema = z.object({\n mode: z.enum(['light', 'dark', 'auto']).optional(),\n base: z.enum(['modern', 'executive', 'minimal']).optional(),\n logo: LogoSchema.optional(),\n favicon: z.string().optional(),\n title: z.string().optional(),\n colors: ColorsSchema.optional(),\n palette: z.array(z.string()).optional(),\n gradient: z.boolean().default(false),\n opacity: z.number().min(0).max(1).default(1.0),\n fonts: FontsSchema.optional(),\n sidebar: SidebarConfigSchema.optional(),\n customCss: z.string().optional(),\n});\n\n// Environment-specific overrides — same shape as ProjectSchema minus identity fields\nconst EnvironmentOverrideSchema = z.object({\n defaults: DefaultsSchema.optional(),\n git: GitSchema.optional(),\n auth: AuthSchema.optional(),\n features: FeaturesSchema.optional(),\n theme: ThemeSchema.optional(),\n semantic: SemanticConfigSchema.optional(),\n}).passthrough();\n\n/**\n * Deep-merge two plain objects. Objects merge recursively;\n * arrays and scalars in override replace the base value entirely.\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n base: T,\n override: Record<string, unknown> | undefined,\n): T {\n if (!override) return { ...base };\n\n const result = { ...base } as Record<string, unknown>;\n for (const [key, value] of Object.entries(override)) {\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n typeof result[key] === 'object' &&\n result[key] !== null &&\n !Array.isArray(result[key])\n ) {\n result[key] = deepMerge(\n result[key] as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else {\n result[key] = value;\n }\n }\n return result as T;\n}\n\n/**\n * Resolve a raw yamchart.yaml object for a given environment.\n * Extracts and merges the matching environments block, then strips\n * the environments key. Does NOT validate — caller runs Zod after\n * optionally merging yamchart.local.yaml on top.\n */\nexport function resolveProjectConfig(\n raw: Record<string, unknown>,\n env?: string,\n): Record<string, unknown> {\n const { environments, ...base } = raw;\n const envBlocks = environments as Record<string, Record<string, unknown>> | undefined;\n const envOverride = env ? envBlocks?.[env] : undefined;\n return deepMerge(base as Record<string, unknown>, envOverride);\n}\n\n// Catalog filter configuration\nconst CatalogIncludeSchema = z.object({\n schemas: z.array(z.string()).optional(),\n tags: z.array(z.string()).optional(),\n});\n\nconst CatalogConfigSchema = z.object({\n include: CatalogIncludeSchema.optional(),\n});\n\nexport type CatalogConfig = z.infer<typeof CatalogConfigSchema>;\n\n// Knowledge store configuration (learned Hunches / source profiles, Postgres-backed)\nconst KnowledgeConfigSchema = z.object({\n database_url_var: z.string().default('KNOWLEDGE_DATABASE_URL'),\n});\n\nexport type KnowledgeConfig = z.infer<typeof KnowledgeConfigSchema>;\n\n// AI provider configuration\nexport const ProviderConfigSchema = z.object({\n provider: z.enum(['anthropic', 'openai', 'gemini', 'ollama', 'ollama_cloud', 'openai_compatible']),\n model: z.string().optional(),\n base_url: z.string().optional(),\n api_key_var: z.string().optional(),\n api_key: z.string().optional(),\n});\n\nexport const AiConfigSchema = z.object({\n default: z.string().optional(),\n providers: z.record(ProviderConfigSchema).optional(),\n tasks: z.record(z.string()).optional(),\n embedding: ProviderConfigSchema.optional(),\n}).refine(\n (c) => !c.default || !c.providers || c.default in c.providers,\n { message: 'ai.default must name a provider in ai.providers' },\n).refine(\n (c) => !c.tasks || !c.providers || Object.values(c.tasks).every((n) => c.providers![n] !== undefined),\n { message: 'every ai.tasks value must name a provider in ai.providers' },\n);\n\nexport type ProviderConfig = z.infer<typeof ProviderConfigSchema>;\nexport type AiConfig = z.infer<typeof AiConfigSchema>;\n\n// Main project schema\nexport const ProjectSchema = z.object({\n version: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n\n defaults: DefaultsSchema.optional(),\n\n environments: z.record(z.string(), EnvironmentOverrideSchema).optional(),\n\n git: GitSchema.optional(),\n auth: AuthSchema.optional(),\n features: FeaturesSchema.optional(),\n theme: ThemeSchema.optional(),\n semantic: SemanticConfigSchema,\n catalog: CatalogConfigSchema.optional(),\n knowledge: KnowledgeConfigSchema.optional(),\n ai: AiConfigSchema.optional(),\n});\n\nexport type Project = z.infer<typeof ProjectSchema>;\nexport type Auth = z.infer<typeof AuthSchema>;\nexport type Defaults = z.infer<typeof DefaultsSchema>;\nexport type EnvironmentOverride = z.infer<typeof EnvironmentOverrideSchema>;\nexport type Theme = z.infer<typeof ThemeSchema>;\nexport type SidebarConfig = z.infer<typeof SidebarConfigSchema>;\nexport type FontsConfig = z.infer<typeof FontsSchema>;\nexport type ColorsConfig = z.infer<typeof ColorsSchema>;\n","import { z } from 'zod';\n\n// --- Semantic Model ---\n\nexport const MeasureTypeSchema = z.enum(['sum', 'count', 'avg', 'min', 'max', 'count_distinct']);\n\nexport const DimensionTypeSchema = z.enum(['string', 'number', 'time', 'boolean']);\n\nexport const MeasureSchema = z.object({\n name: z.string(),\n type: MeasureTypeSchema,\n description: z.string().optional(),\n format: z.string().optional(),\n});\n\nexport const DimensionSchema = z.object({\n name: z.string(),\n type: DimensionTypeSchema,\n description: z.string().optional(),\n});\n\nexport const SemanticEntitySchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n source: z.enum(['catalog', 'model']),\n source_table: z.string(),\n measures: z.array(MeasureSchema),\n dimensions: z.array(DimensionSchema),\n parameters: z.array(z.object({\n name: z.string(),\n type: z.string(),\n default: z.union([z.string(), z.number()]).optional(),\n options: z.array(z.string()).optional(),\n })).optional(),\n});\n\nexport const RelationshipSchema = z.object({\n from: z.object({ entity: z.string(), field: z.string() }),\n to: z.object({ entity: z.string(), field: z.string() }),\n type: z.enum(['many_to_one', 'one_to_many', 'one_to_one']),\n});\n\nexport const SemanticModelSchema = z.object({\n entities: z.array(SemanticEntitySchema),\n relationships: z.array(RelationshipSchema),\n generated_at: z.string(),\n});\n\n// --- Structured Query ---\n\nexport const SemanticFilterOperatorSchema = z.enum([\n 'equals', 'not_equals', 'contains', 'gt', 'gte', 'lt', 'lte', 'in', 'not_in',\n]);\n\nexport const SemanticFilterSchema = z.object({\n dimension: z.string(),\n operator: SemanticFilterOperatorSchema,\n value: z.union([z.string(), z.number(), z.boolean(), z.array(z.union([z.string(), z.number()]))]),\n});\n\nexport const SemanticQuerySchema = z.object({\n model: z.string(),\n measures: z.array(z.string()).min(1),\n dimensions: z.array(z.string()).optional().default([]),\n parameters: z.record(z.union([z.string(), z.number()])).optional(),\n filters: z.array(SemanticFilterSchema).optional().default([]),\n order_by: z.object({\n field: z.string(),\n direction: z.enum(['asc', 'desc']).default('asc'),\n }).optional(),\n limit: z.number().int().positive().max(10000).optional().default(1000),\n});\n\n// --- Semantic Config (for yamchart.yaml) ---\n\nexport const SemanticConfigSchema = z.object({\n include: z.object({\n paths: z.array(z.string()).default(['gold/', 'marts/', 'core/']),\n prefixes: z.array(z.string()).default(['dim_', 'fct_', 'fact_']),\n }).optional().default({\n paths: ['gold/', 'marts/', 'core/'],\n prefixes: ['dim_', 'fct_', 'fact_'],\n }),\n}).optional();\n\n// --- Inferred types ---\n\nexport type Measure = z.infer<typeof MeasureSchema>;\nexport type MeasureType = z.infer<typeof MeasureTypeSchema>;\nexport type Dimension = z.infer<typeof DimensionSchema>;\nexport type DimensionType = z.infer<typeof DimensionTypeSchema>;\nexport type SemanticEntity = z.infer<typeof SemanticEntitySchema>;\nexport type Relationship = z.infer<typeof RelationshipSchema>;\nexport type SemanticModel = z.infer<typeof SemanticModelSchema>;\nexport type SemanticFilter = z.infer<typeof SemanticFilterSchema>;\nexport type SemanticQuery = z.infer<typeof SemanticQuerySchema>;\nexport type SemanticConfig = z.infer<typeof SemanticConfigSchema>;\n","import { z } from 'zod';\n\n// Axis types\nconst AxisTypeSchema = z.enum(['temporal', 'quantitative', 'ordinal', 'nominal']);\n\n// Axis configuration\nconst AxisSchema = z.object({\n field: z.string().min(1),\n type: AxisTypeSchema,\n format: z.string().optional(),\n label: z.string().optional(),\n scale: z.enum(['linear', 'log']).optional(),\n});\n\n// Chart types supported (scatter has its own dedicated schema)\nconst ChartTypeSchema = z.enum([\n 'line',\n 'bar',\n 'area',\n 'pie',\n 'donut',\n 'table',\n 'metric',\n 'map',\n 'heatmap',\n 'funnel',\n 'sankey',\n 'treemap',\n 'waterfall',\n 'gauge',\n]);\n\n// Gradient configuration - boolean shorthand or explicit from/to\nconst GradientSchema = z.union([\n z.boolean(),\n z.object({\n from: z.string(),\n to: z.string(),\n }),\n]);\n\n// Long format series: group by a field in the data (one row per series value)\nconst LongFormatSeriesSchema = z.object({\n field: z.string().min(1),\n colors: z.record(z.string(), z.string()).optional(),\n});\n\n// Series transform: compute derived values client-side\nconst SeriesTransformSchema = z.object({\n type: z.enum(['rolling_average']),\n window: z.number().int().positive(),\n});\n\n// Wide format column: each column becomes a separate series\nconst WideFormatColumnSchema = z.object({\n field: z.string().min(1),\n name: z.string().optional(),\n type: z.enum(['line', 'bar', 'area']).optional(),\n axis: z.enum(['left', 'right']).optional(),\n color: z.string().optional(),\n style: z.enum(['solid', 'dashed', 'dotted']).optional(),\n opacity: z.number().min(0).max(1).optional(),\n gradient: GradientSchema.optional(),\n transform: SeriesTransformSchema.optional(),\n band: z.string().optional(), // Pair with another column to render as shaded range band\n});\n\n// Wide format series: explicit list of columns\nconst WideFormatSeriesSchema = z.object({\n columns: z.array(WideFormatColumnSchema).min(1),\n});\n\n// Series config is either long format (group by field) or wide format (explicit columns)\nconst SeriesConfigSchema = z.union([\n LongFormatSeriesSchema,\n WideFormatSeriesSchema,\n]);\n\n// Color condition for conditional coloring\nconst ColorConditionSchema = z.object({\n when: z.string(),\n color: z.string(),\n});\n\n// Conditional color configuration\nconst ConditionalColorSchema = z.object({\n conditions: z.array(ColorConditionSchema).min(1),\n default: z.string().optional(),\n});\n\n// Color - either a simple string or conditional config\nconst ColorSchema = z.union([\n z.string(),\n ConditionalColorSchema,\n]);\n\n// Legend configuration\nconst LegendSchema = z.object({\n show: z.boolean().optional(),\n position: z.enum(['top', 'bottom', 'left', 'right']).optional(),\n});\n\n// Annotation configuration\nconst LineAnnotationSchema = z.object({\n type: z.literal('line'),\n value: z.number(),\n label: z.string().optional(),\n color: z.string().optional(),\n style: z.enum(['solid', 'dashed', 'dotted']).optional(),\n});\n\nconst BandAnnotationSchema = z.object({\n type: z.literal('band'),\n from: z.number(),\n to: z.number(),\n label: z.string().optional(),\n color: z.string().optional(),\n});\n\nconst XLineAnnotationSchema = z.object({\n type: z.literal('x_line'),\n x: z.string(), // x-axis value (date string or category)\n label: z.string().optional(),\n color: z.string().optional(),\n style: z.enum(['solid', 'dashed', 'dotted']).optional(),\n});\n\nconst AnnotationSchema = z.discriminatedUnion('type', [\n LineAnnotationSchema,\n BandAnnotationSchema,\n XLineAnnotationSchema,\n]);\n\n// Goal zone configuration (tolerance band around target)\nconst GoalZoneSchema = z.object({\n tolerance: z.number().min(0).max(1),\n});\n\n// Goal line style\nconst GoalStyleSchema = z.enum(['solid', 'dashed', 'dotted']);\n\n// Fixed goal — constant horizontal target line\nconst FixedGoalSchema = z.object({\n type: z.literal('fixed'),\n value: z.number(),\n label: z.string().optional(),\n color: z.string().optional(),\n style: GoalStyleSchema.optional(),\n zone: GoalZoneSchema.optional(),\n});\n\n// Cumulative goal — target value to reach by a deadline\nconst CumulativeGoalSchema = z.object({\n type: z.literal('cumulative'),\n value: z.number(),\n by: z.string().min(1),\n from: z.string().optional(),\n label: z.string().optional(),\n color: z.string().optional(),\n style: GoalStyleSchema.optional(),\n zone: GoalZoneSchema.optional(),\n});\n\n// Source for model-driven goals\nconst GoalSourceSchema = z.object({\n model: z.string().min(1),\n value_field: z.string().min(1),\n date_field: z.string().optional(),\n});\n\n// Model-driven goal — target values from a SQL model\nconst ModelGoalSchema = z.object({\n type: z.literal('model'),\n source: GoalSourceSchema,\n label: z.string().optional(),\n color: z.string().optional(),\n style: GoalStyleSchema.optional(),\n zone: GoalZoneSchema.optional(),\n});\n\n// Goal discriminated union (for line/bar/area/combo charts)\nconst GoalSchema = z.discriminatedUnion('type', [\n FixedGoalSchema,\n CumulativeGoalSchema,\n ModelGoalSchema,\n]);\n\n// KPI/Gauge goal — simple target value with optional progress display\nconst KpiGoalSchema = z.object({\n value: z.number(),\n label: z.string().optional(),\n show_progress: z.boolean().optional(),\n color: z.string().optional(),\n});\n\n// Interactivity options\nconst InteractionsSchema = z.object({\n tooltip: z.boolean().default(true),\n zoom: z.boolean().default(false),\n brush: z.boolean().default(false),\n});\n\n// KPI format types\nconst KpiFormatSchema = z.object({\n type: z.enum(['number', 'currency', 'percent']),\n currency: z.string().optional(), // e.g., 'USD', 'EUR'\n decimals: z.number().optional(),\n});\n\n// KPI comparison configuration\nconst KpiComparisonSchema = z.object({\n enabled: z.boolean(),\n field: z.string().min(1).optional(),\n period: z.enum(['previous']).optional(),\n label: z.string().optional(),\n type: z.enum(['percent_change', 'absolute']),\n}).refine(\n (data) => !(data.field && data.period),\n { message: 'Cannot set both field and period — use one or the other' }\n).refine(\n (data) => data.field || data.period,\n { message: 'Must set either field or period for comparison' }\n);\n\n// KPI value configuration\nconst KpiValueSchema = z.object({\n field: z.string().min(1),\n});\n\n// KPI-specific config\nconst KpiConfigSchema = z.object({\n type: z.literal('kpi'),\n value: KpiValueSchema,\n format: KpiFormatSchema,\n comparison: KpiComparisonSchema.optional(),\n unit: z.string().optional(), // e.g., 'min', 'sessions', 'users'\n goal: KpiGoalSchema.optional(),\n});\n\n// Center value for donut charts\nconst CenterValueSchema = z.object({\n field: z.string().optional(), // 'total' for sum, or specific field\n label: z.string().optional(),\n format: z.string().optional(),\n});\n\n// Period comparison overlay\nconst CompareSchema = z.object({\n period: z.string(), // previous_week, previous_month, previous_year, or a preset name\n label: z.string().optional(),\n style: z.enum(['solid', 'dashed', 'dotted']).optional(),\n opacity: z.number().min(0).max(1).optional(),\n color: z.string().optional(),\n});\n\n// Standard chart config (existing)\nconst StandardChartConfigSchema = z.object({\n type: ChartTypeSchema,\n x: AxisSchema,\n y: AxisSchema.optional(),\n series: SeriesConfigSchema.optional(),\n stacking: z.enum(['stacked', 'percent']).optional(),\n orientation: z.enum(['vertical', 'horizontal']).optional(),\n color: ColorSchema.optional(),\n gradient: GradientSchema.optional(),\n legend: LegendSchema.optional(),\n annotations: z.array(AnnotationSchema).optional(),\n compare: z.array(CompareSchema).optional(),\n interactions: InteractionsSchema.optional(),\n centerValue: CenterValueSchema.optional(), // For donut charts\n goals: z.array(GoalSchema).optional(),\n});\n\n// Dual axis config for combo charts (label + format, not data field references)\nconst DualAxisConfigSchema = z.object({\n label: z.string().optional(),\n format: z.string().optional(),\n scale: z.enum(['linear', 'log']).optional(),\n});\n\nconst DualAxesSchema = z.object({\n left: DualAxisConfigSchema.optional(),\n right: DualAxisConfigSchema.optional(),\n});\n\n// Combo chart config - requires dual axes\nconst ComboChartConfigSchema = z.object({\n type: z.literal('combo'),\n x: AxisSchema,\n series: WideFormatSeriesSchema,\n stacking: z.enum(['stacked', 'percent']).optional(),\n axes: DualAxesSchema,\n legend: LegendSchema.optional(),\n interactions: InteractionsSchema.optional(),\n gradient: GradientSchema.optional(),\n goals: z.array(GoalSchema).optional(),\n});\n\n// Scatter chart size encoding\nconst ScatterSizeSchema = z.object({\n field: z.string().min(1),\n min: z.number().optional(),\n max: z.number().optional(),\n label: z.string().optional(),\n});\n\n// Scatter chart grouping\nconst ScatterGroupSchema = z.object({\n field: z.string().min(1),\n});\n\n// Regression line configuration\nconst RegressionSchema = z.object({\n type: z.literal('linear'),\n show_equation: z.boolean().optional(),\n show_r_squared: z.boolean().optional(),\n});\n\n// Scatter/bubble chart config\nconst ScatterChartConfigSchema = z.object({\n type: z.literal('scatter'),\n x: AxisSchema,\n y: AxisSchema,\n size: ScatterSizeSchema.optional(),\n group: ScatterGroupSchema.optional(),\n regression: RegressionSchema.optional(),\n color: ColorSchema.optional(),\n legend: LegendSchema.optional(),\n interactions: InteractionsSchema.optional(),\n});\n\n// Heatmap chart config\nconst HeatmapChartConfigSchema = z.object({\n type: z.literal('heatmap'),\n x: AxisSchema,\n y: AxisSchema,\n value: z.object({\n field: z.string().min(1),\n label: z.string().optional(),\n }),\n color_range: z.object({\n min: z.string().optional(),\n max: z.string().optional(),\n }).optional(),\n show_values: z.boolean().optional(),\n});\n\n// Funnel chart config\nconst FunnelChartConfigSchema = z.object({\n type: z.literal('funnel'),\n stage: z.object({ field: z.string().min(1) }),\n value: z.object({ field: z.string().min(1) }),\n show_conversion: z.boolean().optional(),\n color: ColorSchema.optional(),\n});\n\n// Waterfall chart config\nconst WaterfallChartConfigSchema = z.object({\n type: z.literal('waterfall'),\n category: z.object({ field: z.string().min(1) }),\n value: z.object({ field: z.string().min(1) }),\n total_field: z.string().optional(),\n series: LongFormatSeriesSchema.optional(), // Stacked breakdown within each waterfall step\n colors: z.object({\n increase: z.string().optional(),\n decrease: z.string().optional(),\n total: z.string().optional(),\n }).optional(),\n});\n\n// Sankey chart config\nconst SankeyChartConfigSchema = z.object({\n type: z.literal('sankey'),\n source: z.object({ field: z.string().min(1) }),\n target: z.object({ field: z.string().min(1) }),\n value: z.object({ field: z.string().min(1) }),\n levels: z.array(z.array(z.string())).optional(),\n orient: z.enum(['horizontal', 'vertical']).optional(),\n node_width: z.number().positive().optional(),\n node_gap: z.number().nonnegative().optional(),\n label_position: z.enum(['left', 'right', 'top', 'bottom', 'inside']).optional(),\n});\nexport type SankeyChartConfig = z.infer<typeof SankeyChartConfigSchema>;\n\n// Gauge chart config\nconst GaugeThresholdSchema = z.object({\n value: z.number(),\n color: z.string(),\n});\n\nconst GaugeChartConfigSchema = z.object({\n type: z.literal('gauge'),\n value: z.object({ field: z.string().min(1) }),\n min: z.number().optional(),\n max: z.number().optional(),\n unit: z.string().optional(),\n thresholds: z.array(GaugeThresholdSchema).optional(),\n format: z.string().optional(),\n goal: KpiGoalSchema.optional(),\n});\n\nconst TableColumnSummarySchema = z.enum(['sum', 'avg', 'min', 'max', 'count']);\n\nconst PivotAggregateSchema = z.enum(['sum', 'avg', 'min', 'max', 'count']);\n\nconst PivotValueSchema = z.object({\n field: z.string().min(1),\n aggregate: PivotAggregateSchema.default('sum'),\n format: z.string().optional(),\n heatmap: z.boolean().optional(),\n});\n\nconst PivotHeatmapSchema = z.object({\n color: z.string().optional(),\n scope: z.enum(['column', 'global']).optional(),\n});\n\nconst PivotConfigSchema = z.object({\n rows: z.array(z.string().min(1)).min(1),\n columns: z.string().min(1),\n values: z.array(PivotValueSchema).min(1),\n subtotals: z.boolean().optional(),\n grandTotals: z.boolean().optional(),\n heatmap: PivotHeatmapSchema.optional(),\n});\n\nconst TableChartConfigSchema = z.object({\n type: z.literal('table'),\n columns: z.array(z.object({\n field: z.string().min(1),\n label: z.string().optional(),\n format: z.string().optional(),\n sticky: z.boolean().optional(),\n summary: TableColumnSummarySchema.optional(),\n overflow: z.enum(['ellipsis', 'wrap', 'hidden']).optional(),\n font: z.enum(['mono']).optional(),\n })).optional(),\n summary: z.object({\n label: z.string().optional(),\n }).optional(),\n sort: z.object({\n field: z.string().min(1),\n direction: z.enum(['asc', 'desc']).optional(),\n }).optional(),\n pagination: z.object({\n enabled: z.boolean().optional(),\n page_size: z.number().int().positive().optional(),\n mode: z.enum(['paginated', 'infinite_scroll']).optional(),\n server_side: z.boolean().optional(),\n }).optional(),\n max_rows: z.number().int().positive().optional(),\n export: z.object({\n enabled: z.boolean().optional(),\n max_rows: z.number().int().positive().optional(),\n }).optional(),\n pivot: PivotConfigSchema.optional(),\n});\n\n// Chart visualization config - standard, KPI, combo, scatter, heatmap, funnel, waterfall, gauge, or table\nconst ChartConfigSchema = z.union([\n ScatterChartConfigSchema,\n ComboChartConfigSchema,\n HeatmapChartConfigSchema,\n FunnelChartConfigSchema,\n WaterfallChartConfigSchema,\n GaugeChartConfigSchema,\n SankeyChartConfigSchema,\n TableChartConfigSchema,\n StandardChartConfigSchema,\n KpiConfigSchema,\n]);\n\n// Parameter types\nconst ParameterTypeSchema = z.enum([\n 'date_range',\n 'select',\n 'multi_select',\n 'dynamic_select',\n 'text',\n 'number',\n 'boolean',\n]);\n\n// Parameter option\nconst ParameterOptionSchema = z.union([\n z.string(),\n z.object({\n value: z.string(),\n label: z.string(),\n }),\n]);\n\n// Parameter source (for dynamic options)\nconst ParameterSourceSchema = z.object({\n model: z.string(),\n value_field: z.string(),\n label_field: z.string(),\n});\n\n// Parameter definition\nconst ParameterSchema = z.object({\n name: z.string().min(1),\n type: ParameterTypeSchema,\n label: z.string().optional(),\n description: z.string().optional(),\n default: z.union([z.string(), z.number(), z.array(z.string())]).optional(),\n options: z.array(ParameterOptionSchema).optional(),\n source: ParameterSourceSchema.optional(),\n});\n\n// Data source - either model reference or inline SQL\nconst SourceSchema = z.object({\n model: z.string().optional(),\n sql: z.string().optional(),\n connection: z.string().optional(), // optional per-chart connection override (default: project default)\n}).refine(\n (data) => data.model !== undefined || data.sql !== undefined,\n { message: 'Source must specify either model or sql' }\n).refine(\n (data) => !(data.model !== undefined && data.sql !== undefined),\n { message: 'Source cannot specify both model and sql' }\n);\n\n// Refresh/cache configuration\nconst RefreshSchema = z.object({\n schedule: z.string().optional(), // cron expression\n timezone: z.string().optional(),\n cache_ttl: z.string().optional(), // e.g., \"1h\", \"30m\"\n});\n\n// Drill-down column config for data table display\nconst DrillDownColumnSchema = z.object({\n field: z.string().min(1),\n label: z.string().optional(),\n format: z.string().optional(),\n});\n\n// Drill-down configuration\nconst DrillDownConfigSchema = z.object({\n chart: z.string().optional(), // target chart name (source side)\n model: z.string().optional(), // model name for row-level detail data\n field: z.string().optional(), // field to pass as filter, defaults to x-axis field (backward compat)\n fields: z.union([z.string(), z.array(z.string())]).optional(), // dimension field(s) for filtering\n columns: z.array(DrillDownColumnSchema).optional(), // data table columns (target side)\n}).refine(data => data.chart || data.model || data.columns, {\n message: \"drillDown requires 'chart', 'model', or 'columns'\",\n});\n\n// Main chart schema\nexport const ChartSchema = z.object({\n // Identity\n name: z.string().min(1),\n title: z.string().min(1),\n description: z.string().optional(),\n\n // Metadata\n owner: z.string().optional(),\n tags: z.array(z.string()).optional(),\n created: z.string().optional(),\n updated: z.string().optional(),\n\n // Data\n source: SourceSchema,\n parameters: z.array(ParameterSchema).optional(),\n\n // Visualization\n chart: ChartConfigSchema,\n\n // Caching\n refresh: RefreshSchema.optional(),\n\n // Drill-down navigation\n drillDown: DrillDownConfigSchema.optional(),\n});\n\nexport type Chart = z.infer<typeof ChartSchema>;\nexport type ChartConfig = z.infer<typeof ChartConfigSchema>;\nexport type ChartType = z.infer<typeof ChartTypeSchema>;\nexport type Parameter = z.infer<typeof ParameterSchema>;\nexport type Axis = z.infer<typeof AxisSchema>;\nexport type SeriesConfig = z.infer<typeof SeriesConfigSchema>;\nexport type LongFormatSeries = z.infer<typeof LongFormatSeriesSchema>;\nexport type WideFormatSeries = z.infer<typeof WideFormatSeriesSchema>;\nexport type WideFormatColumn = z.infer<typeof WideFormatColumnSchema>;\nexport type ColorConfig = z.infer<typeof ColorSchema>;\nexport type ConditionalColor = z.infer<typeof ConditionalColorSchema>;\nexport type ColorCondition = z.infer<typeof ColorConditionSchema>;\nexport type GradientConfig = z.infer<typeof GradientSchema>;\nexport type LegendConfig = z.infer<typeof LegendSchema>;\nexport type ComboChartConfig = z.infer<typeof ComboChartConfigSchema>;\nexport type DualAxes = z.infer<typeof DualAxesSchema>;\nexport type ScatterChartConfig = z.infer<typeof ScatterChartConfigSchema>;\nexport type ScatterSize = z.infer<typeof ScatterSizeSchema>;\nexport type ScatterGroup = z.infer<typeof ScatterGroupSchema>;\nexport type RegressionConfig = z.infer<typeof RegressionSchema>;\nexport type DrillDownConfig = z.infer<typeof DrillDownConfigSchema>;\nexport type DrillDownColumn = z.infer<typeof DrillDownColumnSchema>;\nexport type HeatmapChartConfig = z.infer<typeof HeatmapChartConfigSchema>;\nexport type FunnelChartConfig = z.infer<typeof FunnelChartConfigSchema>;\nexport type WaterfallChartConfig = z.infer<typeof WaterfallChartConfigSchema>;\nexport type GaugeChartConfig = z.infer<typeof GaugeChartConfigSchema>;\nexport type TableChartConfig = z.infer<typeof TableChartConfigSchema>;\nexport type PivotConfig = z.infer<typeof PivotConfigSchema>;\nexport type PivotValueConfig = z.infer<typeof PivotValueSchema>;\nexport type PivotHeatmapConfig = z.infer<typeof PivotHeatmapSchema>;\nexport type GoalConfig = z.infer<typeof GoalSchema>;\nexport type FixedGoal = z.infer<typeof FixedGoalSchema>;\nexport type CumulativeGoal = z.infer<typeof CumulativeGoalSchema>;\nexport type ModelGoal = z.infer<typeof ModelGoalSchema>;\nexport type KpiGoal = z.infer<typeof KpiGoalSchema>;\nexport type GoalZone = z.infer<typeof GoalZoneSchema>;\n\nexport { ParameterSchema };\n","import { z } from 'zod';\n\n// Parameter type\nconst ParamTypeSchema = z.enum(['string', 'number', 'date', 'boolean', 'string[]', 'number[]']);\n\n// Model parameter\nconst ModelParamSchema = z.object({\n name: z.string().min(1),\n type: ParamTypeSchema,\n default: z.string().optional(),\n options: z.array(z.string()).optional(), // For enum-like params\n description: z.string().optional(),\n});\n\n// Return column definition\nconst ReturnColumnSchema = z.object({\n name: z.string().min(1),\n type: z.string(),\n description: z.string().optional(),\n});\n\n// Model metadata (extracted from SQL comments)\nexport const ModelMetadataSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n owner: z.string().optional(),\n tags: z.array(z.string()).optional(),\n\n params: z.array(ModelParamSchema).optional(),\n returns: z.array(ReturnColumnSchema).optional(),\n tests: z.array(z.string()).optional(), // SQL assertions\n});\n\n// Full model (metadata + SQL)\nexport const ModelSchema = z.object({\n metadata: ModelMetadataSchema,\n sql: z.string().min(1),\n filePath: z.string().optional(),\n});\n\nexport type ModelMetadata = z.infer<typeof ModelMetadataSchema>;\nexport type ModelParam = z.infer<typeof ModelParamSchema>;\nexport type ReturnColumn = z.infer<typeof ReturnColumnSchema>;\nexport type Model = z.infer<typeof ModelSchema>;\n","import { z } from 'zod';\nimport { ParameterSchema } from './chart.js';\n\n// Widget types\nconst ChartWidgetSchema = z.object({\n type: z.literal('chart'),\n ref: z.string().min(1),\n cols: z.number().min(1).max(12),\n height: z.number().min(38).optional(),\n x: z.number().min(0).max(11).optional(),\n y: z.number().min(0).optional(),\n});\n\nconst TextWidgetSchema = z.object({\n type: z.literal('text'),\n content: z.string(),\n cols: z.number().min(1).max(12),\n height: z.number().min(38).optional(),\n x: z.number().min(0).max(11).optional(),\n y: z.number().min(0).optional(),\n});\n\nconst WidgetSchema = z.discriminatedUnion('type', [\n ChartWidgetSchema,\n TextWidgetSchema,\n]);\n\n// Row configuration\nconst RowSchema = z.object({\n height: z.number().min(38),\n widgets: z.array(WidgetSchema).min(1),\n});\n\n// Layout configuration\nconst LayoutSchema = z.object({\n gap: z.number().min(0).default(16),\n rows: z.array(RowSchema).min(1),\n});\n\n// Tab configuration\nconst TabSchema = z.object({\n name: z.string().min(1),\n label: z.string().min(1),\n filters: z.array(ParameterSchema).optional(),\n layout: LayoutSchema,\n});\n\n// Main dashboard schema\nexport const DashboardSchema = z.object({\n // Identity\n name: z.string().min(1),\n title: z.string().min(1),\n description: z.string().optional(),\n\n // Filters inherited by all widgets (shared across tabs)\n filters: z.array(ParameterSchema).optional(),\n\n // Layout definition (mutually exclusive with tabs)\n layout: LayoutSchema.optional(),\n\n // Tabbed layout\n tabs: z.array(TabSchema).min(1).optional(),\n}).superRefine((data, ctx) => {\n if (data.layout && data.tabs) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Dashboard must have either \"layout\" or \"tabs\", not both',\n path: ['tabs'],\n });\n }\n if (!data.layout && !data.tabs) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Dashboard must have either \"layout\" or \"tabs\"',\n path: [],\n });\n }\n});\n\nexport type Dashboard = z.infer<typeof DashboardSchema>;\nexport type DashboardTab = z.infer<typeof TabSchema>;\nexport type DashboardLayout = z.infer<typeof LayoutSchema>;\nexport type DashboardRow = z.infer<typeof RowSchema>;\nexport type DashboardWidget = z.infer<typeof WidgetSchema>;\nexport type ChartWidget = z.infer<typeof ChartWidgetSchema>;\nexport type TextWidget = z.infer<typeof TextWidgetSchema>;\n","import { z } from 'zod';\n\nconst SlackChannelSchema = z.object({\n webhook_url: z.string().min(1),\n channel: z.string().optional(),\n});\n\nconst ChannelSchema = z.object({\n slack: SlackChannelSchema,\n});\n\nconst ConditionOperatorSchema = z.enum(['lt', 'gt', 'lte', 'gte', 'eq']);\n\nconst ConditionSchema = z.object({\n field: z.string().min(1),\n operator: ConditionOperatorSchema,\n value: z.number(),\n});\n\nconst ReportScheduleSchema = z.object({\n name: z.string().min(1),\n type: z.literal('report'),\n schedule: z.string().min(1),\n timezone: z.string().optional(),\n channel: ChannelSchema,\n charts: z.array(z.string().min(1)).min(1),\n params: z.record(z.unknown()).optional(),\n message: z.string().optional(),\n notify_on_error: z.boolean().optional(),\n});\n\nconst AlertScheduleSchema = z.object({\n name: z.string().min(1),\n type: z.literal('alert'),\n schedule: z.string().min(1),\n timezone: z.string().optional(),\n channel: ChannelSchema,\n chart: z.string().min(1),\n params: z.record(z.unknown()).optional(),\n condition: ConditionSchema,\n cooldown: z.string().optional(),\n message: z.string().optional(),\n notify_on_error: z.boolean().optional(),\n});\n\nexport const ScheduleSchema = z.discriminatedUnion('type', [\n ReportScheduleSchema,\n AlertScheduleSchema,\n]);\n\nexport type Schedule = z.infer<typeof ScheduleSchema>;\nexport type ReportSchedule = z.infer<typeof ReportScheduleSchema>;\nexport type AlertSchedule = z.infer<typeof AlertScheduleSchema>;\nexport type Condition = z.infer<typeof ConditionSchema>;\nexport type ConditionOperator = z.infer<typeof ConditionOperatorSchema>;\n","import { z } from 'zod';\n\nexport const EventSchema = z.object({\n date: z.string(),\n endDate: z.string().optional(),\n label: z.string(),\n description: z.string().optional(),\n color: z.string().optional(),\n charts: z.array(z.string()).optional(),\n});\n\nexport const EventsFileSchema = z.object({\n events: z.array(EventSchema).default([]),\n});\n\nexport type ChartEvent = z.infer<typeof EventSchema>;\nexport type EventsFile = z.infer<typeof EventsFileSchema>;\n","// packages/schema/src/semantic-curated.ts\nimport { z } from 'zod';\nimport { MeasureTypeSchema, DimensionTypeSchema } from './semantic.js';\n\nexport const CuratedMetricSchema = z\n .object({\n name: z.string().min(1),\n label: z.string().optional(),\n description: z.string().optional(),\n agg: MeasureTypeSchema, // sum|count|avg|min|max|count_distinct\n field: z.string().optional(), // column to aggregate\n sql: z.string().optional(), // raw aggregate expression (derived metric)\n filter: z.string().optional(), // references a named filter on the entity\n synonyms: z.array(z.string()).optional(),\n format: z.string().optional(),\n default_time_grain: z.enum(['day', 'week', 'month', 'quarter', 'year']).optional(),\n })\n .refine((m) => Boolean(m.field) !== Boolean(m.sql), {\n message: 'metric must specify exactly one of `field` or `sql`',\n })\n .refine((m) => !(m.sql && m.filter), {\n message: 'a metric with raw `sql` cannot also set `filter` (embed the condition in the sql expression instead)',\n });\n\nexport const CuratedDimensionSchema = z.object({\n name: z.string().min(1),\n type: DimensionTypeSchema, // string|number|time|boolean\n description: z.string().optional(),\n synonyms: z.array(z.string()).optional(),\n});\n\nexport const NamedFilterSchema = z.object({\n description: z.string().optional(),\n sql: z.string().min(1),\n synonyms: z.array(z.string()).optional(),\n});\n\nexport const CuratedSourceSchema = z\n .object({ table: z.string().optional(), model: z.string().optional() })\n .refine((s) => Boolean(s.table) !== Boolean(s.model), {\n message: 'source must specify exactly one of `table` or `model`',\n });\n\nexport const SemanticDefinitionSchema = z.object({\n entity: z.string().min(1),\n description: z.string().optional(),\n source: CuratedSourceSchema,\n primary_key: z.string().optional(),\n time_dimension: z.string().optional(),\n dimensions: z.array(CuratedDimensionSchema).default([]),\n filters: z.record(NamedFilterSchema).optional().default({}),\n metrics: z.array(CuratedMetricSchema).min(1),\n});\n\nexport type CuratedMetric = z.infer<typeof CuratedMetricSchema>;\nexport type CuratedDimension = z.infer<typeof CuratedDimensionSchema>;\nexport type NamedFilter = z.infer<typeof NamedFilterSchema>;\nexport type SemanticDefinition = z.infer<typeof SemanticDefinitionSchema>;\n","import { z } from 'zod';\n\n/**\n * Zod schema for validating agent YAML files (agents/*.yaml).\n * system_prompt is treated as a plain string — Jinja rendering happens at load time in packages/chat.\n */\nexport const AgentDefinitionSchema = z.object({\n name: z.string(),\n title: z.string().optional(),\n description: z.string(),\n system_prompt: z.string(),\n tools: z.array(z.string()).default([]),\n model: z.string().optional(),\n models: z.array(z.string()).optional(),\n});\n\nexport type AgentDefinition = z.infer<typeof AgentDefinitionSchema>;\n","// packages/schema/src/hunch.ts\nimport { z } from 'zod';\n\nexport const HunchStatusSchema = z.enum(['pending', 'confirmed', 'rejected']);\n\nexport const HunchSampleSchema = z.object({\n columns: z.array(z.object({ name: z.string() })),\n rows: z.array(z.record(z.unknown())),\n ranAt: z.string(),\n});\n\nexport const NewHunchSchema = z.object({\n connection: z.string(),\n question: z.string().min(1),\n sql: z.string().min(1),\n generatedSql: z.string().min(1),\n tablesUsed: z.array(z.string()).default([]),\n rationale: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n});\n\nexport const HunchSchema = NewHunchSchema.extend({\n id: z.string(),\n status: HunchStatusSchema,\n lastRunSample: HunchSampleSchema.optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport const ColumnProfileSchema = z.object({\n name: z.string(),\n type: z.string(),\n nullRate: z.number().optional(),\n distinctCount: z.number().optional(),\n min: z.unknown().optional(),\n max: z.unknown().optional(),\n topValues: z.array(z.object({ value: z.unknown(), count: z.number() })).optional(),\n});\n\nexport const TableProfileSchema = z.object({\n table: z.string(),\n rowCount: z.number().optional(),\n columns: z.array(ColumnProfileSchema),\n sampleRows: z.array(z.record(z.unknown())),\n});\n\nexport const SourceProfileSchema = z.object({\n connection: z.string(),\n profiledAt: z.string(),\n tables: z.array(TableProfileSchema),\n});\n\nexport type HunchStatus = z.infer<typeof HunchStatusSchema>;\nexport type NewHunch = z.infer<typeof NewHunchSchema>;\nexport type Hunch = z.infer<typeof HunchSchema>;\nexport type ColumnProfile = z.infer<typeof ColumnProfileSchema>;\nexport type TableProfile = z.infer<typeof TableProfileSchema>;\nexport type SourceProfile = z.infer<typeof SourceProfileSchema>;\n","// packages/schema/src/blindspot.ts\nimport { z } from 'zod';\n\nexport const BlindspotKindSchema = z.enum(['context', 'opportunity']);\nexport const BlindspotStatusSchema = z.enum(['open', 'answered', 'dismissed']);\n\nexport const SuggestedModelSchema = z.object({\n name: z.string().min(1),\n description: z.string(),\n rationale: z.string(),\n columns: z.array(z.object({ name: z.string(), description: z.string().optional() })),\n});\n\nexport const NewBlindspotSchema = z.object({\n connection: z.string(),\n kind: BlindspotKindSchema,\n title: z.string().min(1),\n detail: z.string().min(1),\n subject: z.string().optional(),\n suggestedModel: SuggestedModelSchema.optional(),\n confidence: z.number().min(0).max(1).optional(),\n}).refine((b) => b.kind !== 'opportunity' || b.suggestedModel !== undefined, {\n message: 'opportunity blindspots must include a suggestedModel',\n});\n\nexport const BlindspotSchema = z.object({\n id: z.string(),\n connection: z.string(),\n kind: BlindspotKindSchema,\n title: z.string(),\n detail: z.string(),\n subject: z.string().optional(),\n suggestedModel: SuggestedModelSchema.optional(),\n confidence: z.number().optional(),\n status: BlindspotStatusSchema,\n answer: z.string().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport type BlindspotKind = z.infer<typeof BlindspotKindSchema>;\nexport type BlindspotStatus = z.infer<typeof BlindspotStatusSchema>;\nexport type SuggestedModel = z.infer<typeof SuggestedModelSchema>;\nexport type NewBlindspot = z.infer<typeof NewBlindspotSchema>;\nexport type Blindspot = z.infer<typeof BlindspotSchema>;\n","import { z } from 'zod';\nexport const NewKnowledgeDocSchema = z.object({\n connection: z.string(),\n title: z.string().min(1),\n content: z.string().min(1),\n source: z.enum(['ui', 'file']).default('ui'),\n});\nexport const KnowledgeDocSchema = NewKnowledgeDocSchema.extend({\n id: z.string(), createdAt: z.string(), updatedAt: z.string(),\n});\nexport type NewKnowledgeDoc = z.infer<typeof NewKnowledgeDocSchema>;\nexport type KnowledgeDoc = z.infer<typeof KnowledgeDocSchema>;\n","// Yamchart Schema - Zod schemas and TypeScript types\nexport const VERSION = '0.1.0';\n\nexport * from './connection.js';\nexport * from './runtime-config.js';\nexport * from './chart.js';\nexport * from './project.js';\nexport * from './model.js';\nexport * from './dashboard.js';\nexport * from './schedule.js';\nexport * from './events.js';\nexport * from './semantic.js';\nexport * from './semantic-curated.js';\nexport { AgentDefinitionSchema, type AgentDefinition } from './agent.js';\nexport * from './hunch.js';\nexport * from './blindspot.js';\nexport * from './knowledge-doc.js';\n"],"mappings":"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","names":["z","z","z","z","AuthSchema","z","z","z","z","z","z","z","z","z","z","z","z","z"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../packages/advisor/src/dbt/knowledge.ts","../../../packages/advisor/src/dbt/project.ts","../../../packages/advisor/src/tools.ts","../../../packages/advisor/src/agent.ts","../../../packages/advisor/src/providers/anthropic.ts","../../../packages/advisor/src/providers/openai-compatible.ts","../../../packages/advisor/src/providers/factory.ts","../../../packages/advisor/src/providers/embedder.ts","../../../packages/advisor/src/dbt/writer.ts"],"sourcesContent":["import { readFile } from 'fs/promises';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst KNOWLEDGE_DIR = join(__dirname, '..', 'knowledge');\n\nexport const KNOWLEDGE_TOPICS = [\n 'materializations',\n 'incremental',\n 'macros',\n 'testing',\n 'naming',\n 'performance',\n 'sources',\n] as const;\n\nexport type KnowledgeTopic = (typeof KNOWLEDGE_TOPICS)[number];\n\nexport async function loadKnowledge(topic: string): Promise<string> {\n if (!KNOWLEDGE_TOPICS.includes(topic as KnowledgeTopic)) {\n return `Unknown topic: \"${topic}\". Available topics: ${KNOWLEDGE_TOPICS.join(', ')}`;\n }\n\n const filePath = join(KNOWLEDGE_DIR, `${topic}.md`);\n return readFile(filePath, 'utf-8');\n}\n\nexport function getKnowledgeOverview(): string {\n return `You have access to a dbt knowledge base via the get_knowledge tool. Available topics:\n${KNOWLEDGE_TOPICS.map((t) => `- ${t}`).join('\\n')}\n\nUse get_knowledge when you need specifics on materializations, incremental strategies, Jinja macros, testing, naming conventions, or performance optimization.`;\n}\n","import { readFile } from 'fs/promises';\nimport { join, basename, relative, dirname } from 'path';\nimport fg from 'fast-glob';\nimport { parse as parseYaml } from 'yaml';\n\nexport interface DbtConventions {\n folderStructure: string[];\n namingPrefixes: Record<string, string>;\n commonMaterializations: Record<string, string>;\n schemaYmlPattern: 'per-folder' | 'per-model' | 'single-file';\n testPatterns: string[];\n}\n\nexport interface DbtModelInfo {\n name: string;\n path: string;\n layer: string;\n materialization: string;\n folder: string;\n}\n\ninterface DbtProjectYml {\n name: string;\n 'model-paths'?: string[];\n model_paths?: string[];\n}\n\nasync function getModelPaths(projectPath: string): Promise<string[]> {\n const content = await readFile(join(projectPath, 'dbt_project.yml'), 'utf-8');\n const parsed = parseYaml(content) as DbtProjectYml;\n return parsed['model-paths'] ?? parsed.model_paths ?? ['models'];\n}\n\nfunction extractMaterialization(sql: string): string {\n const match = sql.match(/materialized\\s*=\\s*['\"](\\w+)['\"]/);\n return match?.[1] ?? 'view';\n}\n\nfunction detectLayer(relativePath: string): string {\n const parts = relativePath.split('/');\n return parts[0] ?? 'unknown';\n}\n\nfunction detectPrefix(\n models: Array<{ name: string; layer: string }>\n): Record<string, string> {\n const prefixesByLayer = new Map<string, Map<string, number>>();\n\n for (const model of models) {\n const underscoreIdx = model.name.indexOf('_');\n if (underscoreIdx === -1) continue;\n const prefix = model.name.slice(0, underscoreIdx + 1);\n\n if (!prefixesByLayer.has(model.layer)) {\n prefixesByLayer.set(model.layer, new Map());\n }\n const counts = prefixesByLayer.get(model.layer)!;\n counts.set(prefix, (counts.get(prefix) ?? 0) + 1);\n }\n\n const result: Record<string, string> = {};\n for (const [layer, counts] of prefixesByLayer) {\n let maxCount = 0;\n let maxPrefix = '';\n for (const [prefix, count] of counts) {\n if (count > maxCount) {\n maxCount = count;\n maxPrefix = prefix;\n }\n }\n if (maxPrefix && maxCount >= 2) {\n result[layer] = maxPrefix;\n }\n }\n\n return result;\n}\n\nfunction detectMaterializations(\n models: Array<{ layer: string; materialization: string }>\n): Record<string, string> {\n const matByLayer = new Map<string, Map<string, number>>();\n\n for (const model of models) {\n if (!matByLayer.has(model.layer)) {\n matByLayer.set(model.layer, new Map());\n }\n const counts = matByLayer.get(model.layer)!;\n counts.set(model.materialization, (counts.get(model.materialization) ?? 0) + 1);\n }\n\n const result: Record<string, string> = {};\n for (const [layer, counts] of matByLayer) {\n let maxCount = 0;\n let maxMat = '';\n for (const [mat, count] of counts) {\n if (count > maxCount) {\n maxCount = count;\n maxMat = mat;\n }\n }\n if (maxMat) result[layer] = maxMat;\n }\n\n return result;\n}\n\nasync function detectSchemaYmlPattern(\n projectPath: string,\n modelPaths: string[]\n): Promise<'per-folder' | 'per-model' | 'single-file'> {\n const ymlFiles: string[] = [];\n for (const mp of modelPaths) {\n const pattern = join(projectPath, mp, '**/*.yml');\n const files = await fg(pattern, { ignore: ['**/node_modules/**'] });\n ymlFiles.push(...files);\n }\n\n if (ymlFiles.length === 0) return 'per-folder';\n if (ymlFiles.length === 1) return 'single-file';\n\n const dirs = new Set(ymlFiles.map((f) => dirname(f)));\n return dirs.size > 1 ? 'per-folder' : 'single-file';\n}\n\nexport async function detectConventions(projectPath: string): Promise<DbtConventions> {\n const modelPaths = await getModelPaths(projectPath);\n const models = await listDbtModels(projectPath);\n\n const folders = [...new Set(models.map((m) => m.layer))].filter((l) => l !== 'unknown');\n\n return {\n folderStructure: folders,\n namingPrefixes: detectPrefix(models),\n commonMaterializations: detectMaterializations(models),\n schemaYmlPattern: await detectSchemaYmlPattern(projectPath, modelPaths),\n testPatterns: [],\n };\n}\n\nexport async function listDbtModels(projectPath: string): Promise<DbtModelInfo[]> {\n const modelPaths = await getModelPaths(projectPath);\n const models: DbtModelInfo[] = [];\n\n for (const mp of modelPaths) {\n const pattern = join(projectPath, mp, '**/*.sql');\n const files = await fg(pattern, { ignore: ['**/node_modules/**'] });\n\n for (const file of files) {\n const relPath = relative(join(projectPath, mp), file);\n const name = basename(file, '.sql');\n const sql = await readFile(file, 'utf-8');\n const materialization = extractMaterialization(sql);\n const layer = detectLayer(relPath);\n const folder = dirname(relPath);\n\n models.push({ name, path: relPath, layer, materialization, folder });\n }\n }\n\n return models;\n}\n\nexport async function readDbtModel(\n projectPath: string,\n modelName: string\n): Promise<string | null> {\n const models = await listDbtModels(projectPath);\n const model = models.find((m) => m.name === modelName);\n if (!model) return null;\n\n const modelPaths = await getModelPaths(projectPath);\n for (const mp of modelPaths) {\n const fullPath = join(projectPath, mp, model.path);\n try {\n return await readFile(fullPath, 'utf-8');\n } catch {\n continue;\n }\n }\n return null;\n}\n","import type { ToolDefinition } from './providers/types.js';\nimport type { AdvisorContext } from './context.js';\nimport { loadKnowledge } from './dbt/knowledge.js';\nimport { readDbtModel } from './dbt/project.js';\nimport { SemanticModelBuilder, SemanticQueryCompiler } from '@yamchart/query';\nimport type { SemanticFilter } from '@yamchart/schema';\n\nexport type { AdvisorContext } from './context.js';\n\nexport const TOOL_DEFINITIONS: ToolDefinition[] = [\n // Read-only tools\n {\n name: 'list_yamchart_models',\n description: 'List all yamchart SQL models with names, descriptions, parameters, and return columns',\n parameters: { type: 'object', properties: {}, required: [] },\n },\n {\n name: 'list_charts',\n description: 'List all yamchart charts showing which models they reference and their chart type',\n parameters: { type: 'object', properties: {}, required: [] },\n },\n {\n name: 'get_catalog',\n description: 'Get the dbt catalog (.yamchart/catalog.md) with upstream table schemas and column metadata',\n parameters: { type: 'object', properties: {}, required: [] },\n },\n {\n name: 'get_warehouse_table',\n description: 'Get detailed column metadata and sample rows for a specific warehouse table from the cached catalog. Instant — reads from local catalog, no live query. Use the fully-qualified name (e.g. RAW.PAYMENTS).',\n parameters: {\n type: 'object',\n properties: {\n table: { type: 'string', description: 'Fully-qualified table name (e.g. RAW.PAYMENTS, STAGING.CUSTOMERS)' },\n },\n required: ['table'],\n },\n },\n {\n name: 'get_warehouse_tables',\n description: 'Get detailed metadata for multiple warehouse tables at once from the cached catalog.',\n parameters: {\n type: 'object',\n properties: {\n tables: { type: 'array', items: { type: 'string' }, description: 'List of fully-qualified table names' },\n },\n required: ['tables'],\n },\n },\n {\n name: 'introspect_warehouse',\n description: 'Query the live warehouse. Use for discovering raw tables not yet modeled in dbt.',\n parameters: {\n type: 'object',\n properties: {\n sql: { type: 'string', description: 'SQL query to execute (e.g. SHOW TABLES, SELECT * FROM information_schema.columns)' },\n },\n required: ['sql'],\n },\n },\n {\n name: 'sample_data',\n description: 'Preview rows from a table in the warehouse',\n parameters: {\n type: 'object',\n properties: {\n table: { type: 'string', description: 'Table name (can be schema-qualified)' },\n limit: { type: 'number', description: 'Number of rows to return (default: 5)' },\n },\n required: ['table'],\n },\n },\n {\n name: 'read_dbt_model',\n description: 'Read the full SQL source of an existing dbt model',\n parameters: {\n type: 'object',\n properties: {\n model_name: { type: 'string', description: 'Name of the dbt model to read' },\n },\n required: ['model_name'],\n },\n },\n {\n name: 'list_dbt_models',\n description: 'List all dbt models with their layer (staging/intermediate/marts), materialization, and folder',\n parameters: { type: 'object', properties: {}, required: [] },\n },\n {\n name: 'get_knowledge',\n description: 'Look up dbt reference documentation on a topic: materializations, incremental, macros, testing, naming, performance',\n parameters: {\n type: 'object',\n properties: {\n topic: { type: 'string', description: 'Topic name: materializations, incremental, macros, testing, naming, performance' },\n },\n required: ['topic'],\n },\n },\n {\n name: 'list_semantic_entities',\n description: 'List all semantic entities (auto-generated from the catalog) with their measures and dimensions. Use this to understand what data is available for structured queries without writing SQL.',\n parameters: { type: 'object', properties: {}, required: [] },\n },\n {\n name: 'semantic_query',\n description: 'Run a structured query against the semantic layer. Specify an entity, measures to aggregate, and optional dimensions to group by. Returns the compiled SQL.',\n parameters: {\n type: 'object',\n properties: {\n entity: { type: 'string', description: 'Entity name (e.g. fct_revenue)' },\n measures: { type: 'array', items: { type: 'string' }, description: 'Measure names to aggregate' },\n dimensions: { type: 'array', items: { type: 'string' }, description: 'Dimension names to group by (optional)' },\n filters: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n dimension: { type: 'string' },\n operator: { type: 'string', description: 'equals, not_equals, contains, gt, gte, lt, lte, in, not_in' },\n value: { description: 'Filter value (string, number, or array for in/not_in)' },\n },\n required: ['dimension', 'operator', 'value'],\n },\n description: 'Optional filters',\n },\n limit: { type: 'number', description: 'Row limit (default: 100)' },\n },\n required: ['entity', 'measures'],\n },\n },\n\n // Action tools\n {\n name: 'propose_model',\n description: 'Propose a new dbt model. Call this when you have a suggestion to present to the user.',\n parameters: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Model name (snake_case)' },\n description: { type: 'string', description: 'One-line description of what this model does' },\n sql: { type: 'string', description: 'Full SQL for the model (may include Jinja)' },\n layer: { type: 'string', description: 'dbt layer: staging, intermediate, or marts' },\n materialization: { type: 'string', description: 'Materialization: view, table, or incremental' },\n explanation: { type: 'string', description: 'Why this model is useful (2-3 sentences)' },\n subfolder: { type: 'string', description: 'Optional subfolder within the layer (e.g. \"stripe\", \"core\")' },\n columns: {\n type: 'array',\n description: 'Column definitions for schema.yml',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n description: { type: 'string' },\n tests: { type: 'array', items: { type: 'string' } },\n },\n required: ['name'],\n },\n },\n },\n required: ['name', 'description', 'sql', 'layer', 'materialization', 'explanation'],\n },\n },\n {\n name: 'write_dbt_model',\n description: 'Write a proposed dbt model SQL file to the dbt project. Only call after proposing and user confirmation.',\n parameters: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Model name (must match a previous proposal)' },\n },\n required: ['name'],\n },\n },\n {\n name: 'update_schema_yml',\n description: 'Add or update the model entry in the appropriate schema.yml file. Only call after writing the model.',\n parameters: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Model name (must match a written model)' },\n },\n required: ['name'],\n },\n },\n];\n\nexport async function executeToolCall(\n context: AdvisorContext,\n toolName: string,\n input: Record<string, unknown>\n): Promise<string> {\n switch (toolName) {\n case 'list_yamchart_models':\n return JSON.stringify(\n context.yamchart.models.map((m) => ({\n name: m.name,\n description: m.description,\n params: m.params,\n returns: m.returns,\n }))\n );\n\n case 'list_charts':\n return JSON.stringify(\n context.yamchart.charts.map((c) => ({\n name: c.name,\n title: c.title,\n model: c.model,\n type: c.type,\n }))\n );\n\n case 'get_catalog':\n return context.yamchart.catalog ?? 'No dbt catalog found. Run `yamchart sync-dbt` to create one.';\n\n case 'get_warehouse_table': {\n if (!context.yamchart.catalogJson) {\n return 'Warehouse catalog not available. Run `yamchart sync-warehouse` to populate it.';\n }\n const tableName = (input.table as string).toUpperCase();\n const match = context.yamchart.catalogJson.models.find(\n (m) => (m.table || '').toUpperCase() === tableName || m.name.toUpperCase() === tableName\n );\n if (!match) {\n return JSON.stringify({ error: `Table not found in catalog: ${input.table}. Use get_catalog to see available tables.` });\n }\n return JSON.stringify({\n name: match.name,\n table: match.table,\n tableType: match.tableType,\n source: match.source,\n columns: match.columns,\n sampleRows: match.sampleRows || [],\n });\n }\n\n case 'get_warehouse_tables': {\n if (!context.yamchart.catalogJson) {\n return 'Warehouse catalog not available. Run `yamchart sync-warehouse` to populate it.';\n }\n const tableNames = (input.tables as string[]).map((t) => t.toUpperCase());\n const results = tableNames.map((name) => {\n const match = context.yamchart.catalogJson!.models.find(\n (m) => (m.table || '').toUpperCase() === name || m.name.toUpperCase() === name\n );\n if (!match) {\n return { error: `Not found: ${name}` };\n }\n return {\n name: match.name,\n table: match.table,\n tableType: match.tableType,\n source: match.source,\n columns: match.columns,\n sampleRows: match.sampleRows || [],\n };\n });\n return JSON.stringify(results);\n }\n\n case 'introspect_warehouse': {\n if (!context.warehouse) {\n return 'Warehouse introspection not available. No database connection configured.';\n }\n const sql = input.sql as string;\n try {\n const result = await context.warehouse.executeSql(sql);\n return JSON.stringify(result);\n } catch (err) {\n return JSON.stringify({ error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n case 'sample_data': {\n if (!context.warehouse) {\n return 'Warehouse not available. No database connection configured.';\n }\n const table = input.table as string;\n const limit = (input.limit as number) ?? 5;\n try {\n const result = await context.warehouse.executeSql(\n `SELECT * FROM ${table} LIMIT ${limit}`\n );\n return JSON.stringify(result);\n } catch (err) {\n return JSON.stringify({ error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n case 'read_dbt_model': {\n const modelName = input.model_name as string;\n const sql = await readDbtModel(context.dbt.projectPath, modelName);\n if (!sql) {\n return JSON.stringify({ error: `Model not found: ${modelName}` });\n }\n return JSON.stringify({ name: modelName, sql });\n }\n\n case 'list_dbt_models':\n return JSON.stringify(\n context.dbt.models.map((m) => ({\n name: m.name,\n path: m.path,\n layer: m.layer,\n materialization: m.materialization,\n folder: m.folder,\n }))\n );\n\n case 'get_knowledge': {\n const topic = input.topic as string;\n return loadKnowledge(topic);\n }\n\n case 'list_semantic_entities': {\n if (!context.yamchart.catalogJson) {\n return 'No catalog available. Run `yamchart sync-warehouse` or `yamchart sync-dbt` to populate it.';\n }\n const builder = new SemanticModelBuilder();\n const model = builder.build({ catalog: { models: context.yamchart.catalogJson.models } });\n return JSON.stringify(\n model.entities.map((e) => ({\n name: e.name,\n source_table: e.source_table,\n description: e.description,\n measures: e.measures.map((m) => ({ name: m.name, type: m.type })),\n dimensions: e.dimensions.map((d) => ({ name: d.name, type: d.type })),\n }))\n );\n }\n\n case 'semantic_query': {\n if (!context.yamchart.catalogJson) {\n return JSON.stringify({ error: 'No catalog available. Run `yamchart sync-warehouse` or `yamchart sync-dbt` to populate it.' });\n }\n try {\n const builder = new SemanticModelBuilder();\n const model = builder.build({ catalog: { models: context.yamchart.catalogJson.models } });\n const compiler = new SemanticQueryCompiler();\n const sql = compiler.compile(model, {\n model: input.entity as string,\n measures: (input.measures as string[]) || [],\n dimensions: (input.dimensions as string[]) || [],\n filters: (input.filters as SemanticFilter[]) || [],\n limit: (input.limit as number) || 100,\n });\n return JSON.stringify({ sql, entity: input.entity });\n } catch (err) {\n return JSON.stringify({ error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n case 'propose_model':\n return JSON.stringify({\n status: 'proposed',\n name: input.name,\n description: input.description,\n sql: input.sql,\n layer: input.layer,\n materialization: input.materialization,\n explanation: input.explanation,\n subfolder: input.subfolder,\n columns: input.columns,\n });\n\n case 'write_dbt_model':\n // Actual writing happens in the CLI command, not here.\n // The agent tool just signals intent — the CLI confirms with the user.\n return JSON.stringify({\n status: 'pending_confirmation',\n name: input.name,\n message: 'Model write requested. Waiting for user confirmation.',\n });\n\n case 'update_schema_yml':\n return JSON.stringify({\n status: 'pending_confirmation',\n name: input.name,\n message: 'Schema.yml update requested. Waiting for user confirmation.',\n });\n\n default:\n return JSON.stringify({ error: `Unknown tool: ${toolName}` });\n }\n}\n","import type {\n LLMProvider,\n Message,\n ContentBlock,\n TextBlock,\n ToolUseBlock,\n ToolResultBlock,\n} from './providers/types.js';\nimport type { AdvisorContext } from './context.js';\nimport { TOOL_DEFINITIONS, executeToolCall } from './tools.js';\nimport { getKnowledgeOverview } from './dbt/knowledge.js';\n\nexport interface Proposal {\n name: string;\n description: string;\n sql: string;\n layer: string;\n materialization: string;\n explanation: string;\n subfolder?: string;\n columns?: Array<{ name: string; description?: string; tests?: string[] }>;\n}\n\nexport interface AgentResult {\n response: string;\n proposals: Proposal[];\n messages: Message[];\n}\n\nexport const SYSTEM_PROMPT = `You are a dbt advisor for yamchart projects. You analyze the BI layer (yamchart models, charts, dashboards) and the data engineering layer (dbt models, warehouse tables) to suggest improvements to dbt models.\n\nThink like a senior data engineer. Your goals:\n- Understand what the BI layer needs (charts, filters, drill-downs, date ranges)\n- Identify gaps in the dbt project (missing models, incomplete staging, opportunities for pre-aggregation)\n- Suggest new dbt models that serve the BI layer better\n- Follow the project's existing conventions (folder structure, naming, materializations)\n\nWhen proposing models:\n- Match the project's naming conventions (detect and follow existing prefixes like stg_, fct_, dim_)\n- Place models in the correct layer and folder\n- Choose appropriate materializations\n- Include column descriptions and tests in proposals\n- Explain WHY the model helps, not just WHAT it does\n- Use ref() and source() macros correctly\n\nWhen working with cross-database tables:\n- If a table lives outside the primary analytics database, recommend creating a dbt source definition in sources.yml\n- Follow the pattern: source → staging model → downstream refs\n- Use get_knowledge('sources') for detailed source patterns\n- Check the warehouse catalog (get_warehouse_tables) to identify tables in other databases\n\nWhen in audit mode:\n- Evaluate: coverage gaps, convention violations, materialization mismatches, missing tests\n- Rank suggestions by impact\n- Be concise — focus on actionable improvements\n\n${getKnowledgeOverview()}\n\nWhen you have a suggestion, call propose_model with the full SQL and metadata. Do NOT call write_dbt_model or update_schema_yml directly — the user will be prompted to confirm before writing.`;\n\nconst MAX_TOOL_ROUNDS = 15;\n\nexport class AdvisorAgent {\n private provider: LLMProvider;\n\n constructor(provider: LLMProvider) {\n this.provider = provider;\n }\n\n async run(\n context: AdvisorContext,\n userMessages: Message[]\n ): Promise<AgentResult> {\n const proposals: Proposal[] = [];\n const messages: Message[] = [...userMessages];\n\n // Build context-specific system prompt\n const systemPrompt = this.buildSystemPrompt(context);\n\n for (let round = 0; round < MAX_TOOL_ROUNDS; round++) {\n const response = await this.provider.chat({\n system: systemPrompt,\n messages,\n tools: TOOL_DEFINITIONS,\n });\n\n const textBlocks = response.content.filter(\n (b): b is TextBlock => b.type === 'text'\n );\n const toolUseBlocks = response.content.filter(\n (b): b is ToolUseBlock => b.type === 'tool_use'\n );\n\n // No tool calls — return final text response\n if (toolUseBlocks.length === 0) {\n const responseText = textBlocks.map((b) => b.text).join('\\n');\n return { response: responseText, proposals, messages };\n }\n\n // Add assistant message with tool calls\n messages.push({ role: 'assistant', content: response.content });\n\n // Execute each tool call\n const toolResults: ContentBlock[] = [];\n for (const toolUse of toolUseBlocks) {\n const result = await executeToolCall(context, toolUse.name, toolUse.input);\n\n // Collect proposals\n if (toolUse.name === 'propose_model') {\n const parsed = JSON.parse(result) as Record<string, unknown>;\n proposals.push({\n name: parsed.name as string,\n description: parsed.description as string,\n sql: toolUse.input.sql as string,\n layer: toolUse.input.layer as string,\n materialization: toolUse.input.materialization as string,\n explanation: toolUse.input.explanation as string,\n subfolder: toolUse.input.subfolder as string | undefined,\n columns: toolUse.input.columns as Proposal['columns'],\n });\n }\n\n toolResults.push({\n type: 'tool_result',\n tool_use_id: toolUse.id,\n content: result,\n } as ToolResultBlock);\n }\n\n // Add tool results as user message\n messages.push({ role: 'user', content: toolResults });\n }\n\n // Hit max rounds — return what we have\n return {\n response: 'Reached maximum tool call rounds. Here are the suggestions gathered so far.',\n proposals,\n messages,\n };\n }\n\n private buildSystemPrompt(context: AdvisorContext): string {\n const parts = [SYSTEM_PROMPT];\n\n // Add project summary\n parts.push(`\\n## Current Project Summary`);\n parts.push(`- Yamchart: ${context.yamchart.models.length} SQL models, ${context.yamchart.charts.length} charts, ${context.yamchart.dashboards.length} dashboards`);\n parts.push(`- dbt project: \"${context.dbt.projectName}\" at ${context.dbt.projectPath}`);\n parts.push(`- dbt models: ${context.dbt.models.length} (layers: ${context.dbt.conventions.folderStructure.join(', ') || 'none detected'})`);\n\n if (Object.keys(context.dbt.conventions.namingPrefixes).length > 0) {\n const prefixes = Object.entries(context.dbt.conventions.namingPrefixes)\n .map(([layer, prefix]) => `${layer}: ${prefix}`)\n .join(', ');\n parts.push(`- Naming prefixes: ${prefixes}`);\n }\n\n if (Object.keys(context.dbt.conventions.commonMaterializations).length > 0) {\n const mats = Object.entries(context.dbt.conventions.commonMaterializations)\n .map(([layer, mat]) => `${layer}: ${mat}`)\n .join(', ');\n parts.push(`- Materializations: ${mats}`);\n }\n\n parts.push(`- Schema.yml pattern: ${context.dbt.conventions.schemaYmlPattern}`);\n parts.push(`- Catalog: ${context.yamchart.catalog ? 'available' : 'not synced'}`);\n parts.push(`- Warehouse: ${context.warehouse ? `connected (${context.warehouse.connectionType})` : 'not connected'}`);\n\n return parts.join('\\n');\n }\n}\n","import Anthropic from '@anthropic-ai/sdk';\nimport type {\n LLMProvider,\n LLMResponse,\n Message,\n ToolDefinition,\n ContentBlock,\n TextBlock,\n ToolUseBlock,\n} from './types.js';\n\nexport class AnthropicProvider implements LLMProvider {\n private client: Anthropic;\n private model: string;\n\n constructor(apiKey: string, model: string = 'claude-sonnet-4-5-20250929') {\n this.client = new Anthropic({ apiKey });\n this.model = model;\n }\n\n async chat(options: {\n system: string;\n messages: Message[];\n tools: ToolDefinition[];\n maxTokens?: number;\n }): Promise<LLMResponse> {\n const tools: Anthropic.Tool[] = options.tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: {\n type: 'object' as const,\n properties: t.parameters.properties,\n required: t.parameters.required ?? [],\n },\n }));\n\n const messages: Anthropic.MessageParam[] = options.messages.map((m) => {\n if (typeof m.content === 'string') {\n return { role: m.role, content: m.content };\n }\n const blocks: Anthropic.ContentBlockParam[] = m.content.map((block) => {\n if (block.type === 'text') {\n return { type: 'text' as const, text: (block as TextBlock).text };\n }\n if (block.type === 'tool_use') {\n const tu = block as ToolUseBlock;\n return { type: 'tool_use' as const, id: tu.id, name: tu.name, input: tu.input };\n }\n if (block.type === 'tool_result') {\n const tr = block as { type: 'tool_result'; tool_use_id: string; content: string };\n return { type: 'tool_result' as const, tool_use_id: tr.tool_use_id, content: tr.content };\n }\n throw new Error(`Unknown block type: ${block.type}`);\n });\n return { role: m.role, content: blocks };\n });\n\n const response = await this.client.messages.create({\n model: this.model,\n max_tokens: options.maxTokens ?? 4096,\n system: options.system,\n tools,\n messages,\n });\n\n const content: ContentBlock[] = response.content.map((block) => {\n if (block.type === 'text') {\n return { type: 'text', text: block.text } as TextBlock;\n }\n if (block.type === 'tool_use') {\n return {\n type: 'tool_use',\n id: block.id,\n name: block.name,\n input: block.input as Record<string, unknown>,\n } as ToolUseBlock;\n }\n throw new Error(`Unexpected block type: ${block.type}`);\n });\n\n return {\n content,\n stopReason: response.stop_reason === 'tool_use' ? 'tool_use' : 'end',\n };\n }\n}\n","// packages/advisor/src/providers/openai-compatible.ts\nimport OpenAI from 'openai';\nimport type {\n LLMProvider,\n LLMResponse,\n Message,\n ToolDefinition,\n ContentBlock,\n TextBlock,\n ToolUseBlock,\n} from './types.js';\n\nexport interface OpenAICompatibleOptions {\n baseURL: string;\n apiKey?: string;\n model: string;\n}\n\nexport class OpenAICompatibleProvider implements LLMProvider {\n private client: OpenAI;\n private model: string;\n\n constructor(opts: OpenAICompatibleOptions) {\n this.client = new OpenAI({ baseURL: opts.baseURL, apiKey: opts.apiKey ?? 'not-needed' });\n this.model = opts.model;\n }\n\n async chat(options: {\n system: string;\n messages: Message[];\n tools: ToolDefinition[];\n maxTokens?: number;\n }): Promise<LLMResponse> {\n const tools = options.tools.map((t) => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: {\n type: 'object',\n properties: t.parameters.properties,\n required: t.parameters.required ?? [],\n },\n },\n }));\n\n const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [\n { role: 'system', content: options.system },\n ];\n\n for (const m of options.messages) {\n if (typeof m.content === 'string') {\n messages.push({ role: m.role, content: m.content });\n continue;\n }\n // Anthropic-style content blocks → OpenAI shape.\n const text = m.content\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('\\n');\n const toolUses = m.content.filter((b): b is ToolUseBlock => b.type === 'tool_use');\n const toolResults = m.content.filter(\n (b): b is { type: 'tool_result'; tool_use_id: string; content: string } =>\n b.type === 'tool_result',\n );\n\n if (m.role === 'assistant' && toolUses.length) {\n messages.push({\n role: 'assistant',\n content: text || null,\n tool_calls: toolUses.map((tu) => ({\n id: tu.id,\n type: 'function',\n function: { name: tu.name, arguments: JSON.stringify(tu.input) },\n })),\n });\n } else if (toolResults.length) {\n // tool results become separate `tool` messages\n for (const tr of toolResults) {\n messages.push({ role: 'tool', tool_call_id: tr.tool_use_id, content: tr.content });\n }\n if (text) messages.push({ role: m.role, content: text });\n } else {\n messages.push({ role: m.role, content: text });\n }\n }\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n max_tokens: options.maxTokens ?? 4096,\n messages,\n ...(tools.length ? { tools } : {}),\n });\n\n const choice = response.choices[0];\n const msg = choice?.message;\n const content: ContentBlock[] = [];\n\n if (msg?.content) {\n content.push({ type: 'text', text: msg.content } as TextBlock);\n }\n\n for (const tc of msg?.tool_calls ?? []) {\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(tc.function.arguments || '{}');\n } catch {\n input = {};\n }\n content.push({ type: 'tool_use', id: tc.id, name: tc.function.name, input } as ToolUseBlock);\n }\n\n return {\n content,\n stopReason: choice?.finish_reason === 'tool_calls' ? 'tool_use' : 'end',\n };\n }\n}\n","// packages/advisor/src/providers/factory.ts\nimport type { LLMProvider } from './types.js';\nimport { AnthropicProvider } from './anthropic.js';\nimport { OpenAICompatibleProvider } from './openai-compatible.js';\n\nexport type ProviderKind = 'anthropic' | 'openai' | 'gemini' | 'ollama' | 'ollama_cloud' | 'openai_compatible';\nexport interface ProviderConfig { provider: ProviderKind; model?: string; base_url?: string; api_key_var?: string; api_key?: string; }\nexport interface AiConfig { default?: string; providers?: Record<string, ProviderConfig>; tasks?: Record<string, string>; }\nexport type AiTask = 'hunch_generation' | 'advisor' | 'blindspot_scan' | 'answer' | 'text_generation';\n\nfunction requireKey(env: NodeJS.ProcessEnv, name: string): string {\n const v = env[name];\n if (!v) throw new Error(`Missing ${name} for the configured LLM provider.`);\n return v;\n}\nfunction requireModel(cfg: ProviderConfig): string {\n if (!cfg.model) throw new Error(`The \"${cfg.provider}\" provider requires a model.`);\n return cfg.model;\n}\nfunction resolveProviderKey(cfg: ProviderConfig, env: NodeJS.ProcessEnv, defaultVar: string): string {\n if (cfg.api_key) return cfg.api_key;\n return requireKey(env, cfg.api_key_var ?? defaultVar);\n}\n\nexport function buildProvider(cfg: ProviderConfig, env: NodeJS.ProcessEnv): LLMProvider {\n switch (cfg.provider) {\n case 'anthropic':\n return new AnthropicProvider(resolveProviderKey(cfg, env, 'ANTHROPIC_API_KEY'), cfg.model);\n case 'openai':\n return new OpenAICompatibleProvider({ baseURL: cfg.base_url ?? 'https://api.openai.com/v1', apiKey: resolveProviderKey(cfg, env, 'OPENAI_API_KEY'), model: requireModel(cfg) });\n case 'gemini':\n return new OpenAICompatibleProvider({ baseURL: cfg.base_url ?? 'https://generativelanguage.googleapis.com/v1beta/openai/', apiKey: resolveProviderKey(cfg, env, env.GEMINI_API_KEY ? 'GEMINI_API_KEY' : 'GOOGLE_API_KEY'), model: requireModel(cfg) });\n case 'ollama':\n return new OpenAICompatibleProvider({ baseURL: cfg.base_url ?? 'http://localhost:11434/v1', apiKey: cfg.api_key ?? 'ollama', model: requireModel(cfg) });\n case 'ollama_cloud':\n return new OpenAICompatibleProvider({ baseURL: cfg.base_url ?? 'https://ollama.com/v1', apiKey: resolveProviderKey(cfg, env, 'OLLAMA_API_KEY'), model: requireModel(cfg) });\n case 'openai_compatible':\n if (!cfg.base_url) throw new Error('openai_compatible requires base_url.');\n return new OpenAICompatibleProvider({ baseURL: cfg.base_url, apiKey: cfg.api_key ?? (cfg.api_key_var ? requireKey(env, cfg.api_key_var) : 'not-needed'), model: requireModel(cfg) });\n }\n}\n\nexport function createProviderForTask(config: AiConfig | undefined, task: AiTask, env: NodeJS.ProcessEnv): LLMProvider {\n if (!config) return new AnthropicProvider(requireKey(env, 'ANTHROPIC_API_KEY'));\n const name = config.tasks?.[task] ?? config.default;\n const cfg = name ? config.providers?.[name] : undefined;\n if (!cfg) return new AnthropicProvider(requireKey(env, 'ANTHROPIC_API_KEY'));\n return buildProvider(cfg, env);\n}\n","import OpenAI from 'openai';\nimport type { ProviderConfig } from './factory.js';\n\nexport interface Embedder { model: string; baseURL: string; embed(texts: string[]): Promise<number[][]>; }\n\nconst PRESET_BASE: Record<string, string> = {\n ollama: 'http://localhost:11434/v1',\n ollama_cloud: 'https://ollama.com/v1',\n openai: 'https://api.openai.com/v1',\n gemini: 'https://generativelanguage.googleapis.com/v1beta/openai/',\n};\n\n// Resolve the API key per provider, mirroring buildProvider's preset logic so\n// e.g. Gemini reads GEMINI_API_KEY (not OPENAI_API_KEY). Ollama (local) needs no key.\nfunction resolveKey(c: ProviderConfig, env: NodeJS.ProcessEnv): string {\n if (c.api_key) return c.api_key;\n if (c.api_key_var) return env[c.api_key_var] ?? 'not-needed';\n switch (c.provider) {\n case 'ollama': return 'ollama';\n case 'gemini': return env.GEMINI_API_KEY ?? env.GOOGLE_API_KEY ?? 'not-needed';\n case 'ollama_cloud': return env.OLLAMA_API_KEY ?? 'not-needed';\n case 'openai': return env.OPENAI_API_KEY ?? 'not-needed';\n default: return env.OPENAI_API_KEY ?? 'not-needed';\n }\n}\n\nexport function createEmbedder(cfg: ProviderConfig | undefined, env: NodeJS.ProcessEnv): Embedder | undefined {\n const c = cfg ?? { provider: 'ollama' as const, model: 'nomic-embed-text' };\n const model = c.model ?? 'nomic-embed-text';\n const baseURL = c.base_url ?? PRESET_BASE[c.provider] ?? 'http://localhost:11434/v1';\n const apiKey = resolveKey(c, env);\n const client = new OpenAI({ baseURL, apiKey });\n return {\n model, baseURL, client, // `client` is internal; cast in tests\n async embed(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n const res = await (this as unknown as { client: OpenAI }).client.embeddings.create({ model, input: texts });\n return res.data.map((d) => d.embedding as number[]);\n },\n } as Embedder & { client: OpenAI };\n}\n","import { readFile, writeFile, mkdir, access } from 'fs/promises';\nimport { join, dirname } from 'path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { DbtConventions } from './project.js';\n\nexport function buildModelPath(\n modelName: string,\n layer: string | undefined,\n conventions: DbtConventions,\n subfolder?: string\n): string {\n const effectiveLayer = layer ?? (conventions.folderStructure.includes('marts') ? 'marts' : conventions.folderStructure[0] ?? 'models');\n const parts = ['models', effectiveLayer];\n if (subfolder) parts.push(subfolder);\n parts.push(`${modelName}.sql`);\n return parts.join('/');\n}\n\nexport function formatModelSql(options: {\n materialization: string;\n tags?: string[];\n sql: string;\n description?: string;\n}): string {\n const lines: string[] = [];\n\n // Only add config block for non-default materializations\n if (options.materialization !== 'view') {\n const configParts: string[] = [`materialized='${options.materialization}'`];\n if (options.tags && options.tags.length > 0) {\n configParts.push(`tags=[${options.tags.map((t) => `'${t}'`).join(', ')}]`);\n }\n lines.push(`{{\\n config(\\n ${configParts.join(',\\n ')}\\n )\\n}}\\n`);\n }\n\n lines.push(options.sql);\n return lines.join('\\n');\n}\n\nexport interface SchemaColumn {\n name: string;\n description?: string;\n tests?: string[];\n}\n\nexport function buildSchemaYmlEntry(options: {\n name: string;\n description: string;\n columns?: SchemaColumn[];\n}): string {\n const model: Record<string, unknown> = {\n name: options.name,\n description: options.description,\n };\n\n if (options.columns && options.columns.length > 0) {\n model.columns = options.columns.map((col) => {\n const entry: Record<string, unknown> = { name: col.name };\n if (col.description) entry.description = col.description;\n if (col.tests && col.tests.length > 0) entry.tests = col.tests;\n return entry;\n });\n }\n\n return stringifyYaml({ models: [model] }, { indent: 2 });\n}\n\nexport async function writeDbtModel(\n projectPath: string,\n modelPath: string,\n sql: string\n): Promise<string> {\n const fullPath = join(projectPath, modelPath);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, sql + '\\n', 'utf-8');\n return fullPath;\n}\n\nexport async function updateSchemaYml(\n projectPath: string,\n schemaPath: string,\n entry: { name: string; description: string; columns?: SchemaColumn[] }\n): Promise<string> {\n const fullPath = join(projectPath, schemaPath);\n\n let existing: { version?: number; models?: Array<Record<string, unknown>> } = {\n version: 2,\n models: [],\n };\n\n try {\n await access(fullPath);\n const content = await readFile(fullPath, 'utf-8');\n existing = parseYaml(content) as typeof existing;\n if (!existing.models) existing.models = [];\n } catch {\n // File doesn't exist, start fresh\n await mkdir(dirname(fullPath), { recursive: true });\n }\n\n // Check if model already exists\n const idx = existing.models!.findIndex(\n (m) => m.name === entry.name\n );\n\n const modelEntry: Record<string, unknown> = {\n name: entry.name,\n description: entry.description,\n };\n if (entry.columns && entry.columns.length > 0) {\n modelEntry.columns = entry.columns.map((col) => {\n const c: Record<string, unknown> = { name: col.name };\n if (col.description) c.description = col.description;\n if (col.tests && col.tests.length > 0) c.tests = col.tests;\n return c;\n });\n }\n\n if (idx >= 0) {\n existing.models![idx] = modelEntry;\n } else {\n existing.models!.push(modelEntry);\n }\n\n await writeFile(fullPath, stringifyYaml(existing, { indent: 2 }), 'utf-8');\n return fullPath;\n}\n"],"mappings":"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","names":["readFile","join","dirname","OpenAI","readFile","join","dirname","parseYaml"]}