@happyvertical/smrt-subscriptions 0.57.4 → 0.57.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +1 -1
- package/dist/smrt-knowledge.json +3 -3
- package/package.json +6 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["adapterType","plan","evaluations"],"sources":["../src/__smrt-register__.ts","../src/utils.ts","../src/models/SubscriptionPlan.ts","../src/collections/SubscriptionPlanCollection.ts","../src/models/TenantSubscription.ts","../src/collections/TenantSubscriptionCollection.ts","../src/models/TenantUsageMetric.ts","../src/collections/TenantUsageMetricCollection.ts","../src/migrations/moneyMinorUnits.ts","../src/models/commercial.ts","../src/models/reseller.ts","../src/services/reseller-errors.ts","../src/services/commercial.ts","../src/services/reseller.ts","../src/services/threshold-evaluator.ts","../src/services/usage-meter.ts","../src/services/subscription-resolver.ts"],"sourcesContent":["// Generated by @happyvertical/smrt-core smrtPlugin at library build time.\n// The package manifest is inlined so self-registration cannot miss when a\n// downstream bundler relocates this module away from dist/manifest.json\n// (https://github.com/happyvertical/smrt/issues/1506,\n// https://github.com/happyvertical/smrt/issues/1507).\nimport { ObjectRegistry } from '@happyvertical/smrt-core';\n\nObjectRegistry.registerPackageManifest(JSON.parse(\"{\\\"version\\\":\\\"1.0.0\\\",\\\"timestamp\\\":0,\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"packageVersion\\\":\\\"0.57.4\\\",\\\"objects\\\":{\\\"@happyvertical/smrt-subscriptions:SubscriptionPlanCollection\\\":{\\\"name\\\":\\\"subscriptionplancollection\\\",\\\"className\\\":\\\"SubscriptionPlanCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:SubscriptionPlanCollection\\\",\\\"collection\\\":\\\"subscriptionplans\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/collections/SubscriptionPlanCollection.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{\\\"findByPlanKey\\\":{\\\"name\\\":\\\"findByPlanKey\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"tenantId\\\",\\\"type\\\":\\\"string | null\\\",\\\"optional\\\":false,\\\"unionBranches\\\":[{\\\"type\\\":\\\"string\\\"},{\\\"type\\\":\\\"null\\\"}]},{\\\"name\\\":\\\"planKey\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<SubscriptionPlan | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findActive\\\":{\\\"name\\\":\\\"findActive\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<SubscriptionPlan[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findByProviderPriceId\\\":{\\\"name\\\":\\\"findByProviderPriceId\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"providerPriceId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<SubscriptionPlan | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findByStripePriceId\\\":{\\\"name\\\":\\\"findByStripePriceId\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"stripePriceId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<SubscriptionPlan | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_subscription_plans\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"SubscriptionPlan\\\",\\\"exportName\\\":\\\"SubscriptionPlanCollection\\\",\\\"collectionExportName\\\":\\\"SubscriptionPlanCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_subscription_plans\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_subscription_plans\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"plan_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"description\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'active',\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"price_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"billing_interval\\\\\\\" TEXT DEFAULT 'month',\\\\n \\\\\\\"pricing_mode\\\\\\\" TEXT DEFAULT 'fixed',\\\\n \\\\\\\"minimum_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"suggested_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"external_provider\\\\\\\" TEXT,\\\\n \\\\\\\"provider_product_id\\\\\\\" TEXT,\\\\n \\\\\\\"provider_price_id\\\\\\\" TEXT,\\\\n \\\\\\\"stripe_product_id\\\\\\\" TEXT,\\\\n \\\\\\\"stripe_price_id\\\\\\\" TEXT,\\\\n \\\\\\\"features\\\\\\\" TEXT DEFAULT '[]',\\\\n \\\\\\\"thresholds\\\\\\\" TEXT DEFAULT '[]',\\\\n \\\\\\\"metadata\\\\\\\" TEXT DEFAULT '{}'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"plan_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"active\\\"},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"price_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"billing_interval\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"month\\\"},\\\"pricing_mode\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"fixed\\\"},\\\"minimum_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"suggested_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"external_provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"provider_product_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"provider_price_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"stripe_product_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"stripe_price_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"features\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"[]\\\"},\\\"thresholds\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"[]\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_subscription_plans_tenant_id_plan_key_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"plan_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_subscription_plans_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_subscription_plans_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"02602c74\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:TenantSubscriptionCollection\\\":{\\\"name\\\":\\\"tenantsubscriptioncollection\\\",\\\"className\\\":\\\"TenantSubscriptionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:TenantSubscriptionCollection\\\",\\\"collection\\\":\\\"tenantsubscriptions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/collections/TenantSubscriptionCollection.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{\\\"findByTenant\\\":{\\\"name\\\":\\\"findByTenant\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"tenantId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<TenantSubscription[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findCurrentForTenant\\\":{\\\"name\\\":\\\"findCurrentForTenant\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"tenantId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"now\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TenantSubscription | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findCurrentForSubscriber\\\":{\\\"name\\\":\\\"findCurrentForSubscriber\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"subscriber\\\",\\\"type\\\":\\\"Subscriber\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"now\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TenantSubscription | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findByStripeSubscriptionId\\\":{\\\"name\\\":\\\"findByStripeSubscriptionId\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"stripeSubscriptionId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<TenantSubscription | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_tenant_subscriptions\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"TenantSubscription\\\",\\\"exportName\\\":\\\"TenantSubscriptionCollection\\\",\\\"collectionExportName\\\":\\\"TenantSubscriptionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_tenant_subscriptions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_tenant_subscriptions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"plan_id\\\\\\\" UUID,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'incomplete',\\\\n \\\\\\\"started_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"current_period_start\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"current_period_end\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"trial_ends_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"cancel_at_period_end\\\\\\\" BOOLEAN DEFAULT FALSE,\\\\n \\\\\\\"canceled_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"agreed_amount\\\\\\\" INTEGER,\\\\n \\\\\\\"external_provider\\\\\\\" TEXT,\\\\n \\\\\\\"stripe_customer_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"stripe_subscription_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"stripe_checkout_session_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metadata\\\\\\\" TEXT DEFAULT '{}'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"plan_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_subscription_plans\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"incomplete\\\"},\\\"started_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"current_period_start\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"current_period_end\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"trial_ends_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"cancel_at_period_end\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":false},\\\"canceled_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"agreed_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"external_provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"stripe_customer_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"stripe_subscription_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"stripe_checkout_session_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_tenant_subscriptions_tenant_id_subscriber_kind_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"subscriber_kind\\\",\\\"subscriber_external_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_tenant_subscriptions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_tenant_subscriptions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_tenant_subscriptions_plan_id_idx\\\",\\\"columns\\\":[\\\"plan_id\\\"]}],\\\"version\\\":\\\"2a04942c\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:TenantUsageMetricCollection\\\":{\\\"name\\\":\\\"tenantusagemetriccollection\\\",\\\"className\\\":\\\"TenantUsageMetricCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:TenantUsageMetricCollection\\\",\\\"collection\\\":\\\"tenantusagemetrics\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/collections/TenantUsageMetricCollection.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{\\\"recordUsage\\\":{\\\"name\\\":\\\"recordUsage\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"RecordUsageOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<TenantUsageMetric>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findByTenantAndMetric\\\":{\\\"name\\\":\\\"findByTenantAndMetric\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"tenantId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"metricKey\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<TenantUsageMetric[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"summarizeUsage\\\":{\\\"name\\\":\\\"summarizeUsage\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"SummarizeUsageOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<UsageSummary>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"summarizeUsageBatch\\\":{\\\"name\\\":\\\"summarizeUsageBatch\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"SummarizeUsageBatchOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<UsageSummary[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"summarizeTenantAiUsage\\\":{\\\"name\\\":\\\"summarizeTenantAiUsage\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"SummarizeAiUsageOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<AiUsageSummary>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"TenantUsageMetric\\\",\\\"exportName\\\":\\\"TenantUsageMetricCollection\\\",\\\"collectionExportName\\\":\\\"TenantUsageMetricCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_tenant_usage_metrics\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"quantity\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"window_start\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"window_end\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"source\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provider\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"dimensions\\\\\\\" TEXT DEFAULT '{}'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"window_start\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"window_end\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"source\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"dimensions\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_tenant_usage_metrics_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_tenant_usage_metrics_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"b799c746\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:SubscriptionPlan\\\":{\\\"name\\\":\\\"subscriptionplan\\\",\\\"className\\\":\\\"SubscriptionPlan\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:SubscriptionPlan\\\",\\\"collection\\\":\\\"subscriptionplans\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/SubscriptionPlan.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"planKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"description\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"active\\\",\\\"enum\\\":[\\\"active\\\",\\\"archived\\\",\\\"draft\\\"]},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"priceAmount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"billingInterval\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"month\\\",\\\"enum\\\":[\\\"day\\\",\\\"week\\\",\\\"month\\\",\\\"year\\\"]},\\\"pricingMode\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"fixed\\\",\\\"enum\\\":[\\\"free\\\",\\\"fixed\\\",\\\"pay_what_you_can\\\"]},\\\"minimumAmount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"suggestedAmount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"externalProvider\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"providerProductId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"providerPriceId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"stripeProductId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"stripePriceId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"features\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"[]\\\"},\\\"thresholds\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"[]\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"methods\\\":{\\\"isActive\\\":{\\\"name\\\":\\\"isActive\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"boolean\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getFeatureGrants\\\":{\\\"name\\\":\\\"getFeatureGrants\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"PlanFeatureGrant[]\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setFeatureGrants\\\":{\\\"name\\\":\\\"setFeatureGrants\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"grants\\\",\\\"type\\\":\\\"Array<string | PlanFeatureGrant>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getFeatureKeys\\\":{\\\"name\\\":\\\"getFeatureKeys\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"string[]\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getThresholds\\\":{\\\"name\\\":\\\"getThresholds\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"PlanThreshold[]\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setThresholds\\\":{\\\"name\\\":\\\"setThresholds\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"thresholds\\\",\\\"type\\\":\\\"PlanThreshold[]\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getMetadata\\\":{\\\"name\\\":\\\"getMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"JsonObject\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setMetadata\\\":{\\\"name\\\":\\\"setMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"metadata\\\",\\\"type\\\":\\\"JsonObject\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_subscription_plans\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\"]},\\\"cli\\\":{\\\"skipApiCheck\\\":true},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"plan_key\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"SubscriptionPlan\\\",\\\"collectionExportName\\\":\\\"SubscriptionPlanCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_subscription_plans\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_subscription_plans\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"plan_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"description\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'active',\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"price_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"billing_interval\\\\\\\" TEXT DEFAULT 'month',\\\\n \\\\\\\"pricing_mode\\\\\\\" TEXT DEFAULT 'fixed',\\\\n \\\\\\\"minimum_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"suggested_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"external_provider\\\\\\\" TEXT,\\\\n \\\\\\\"provider_product_id\\\\\\\" TEXT,\\\\n \\\\\\\"provider_price_id\\\\\\\" TEXT,\\\\n \\\\\\\"stripe_product_id\\\\\\\" TEXT,\\\\n \\\\\\\"stripe_price_id\\\\\\\" TEXT,\\\\n \\\\\\\"features\\\\\\\" TEXT DEFAULT '[]',\\\\n \\\\\\\"thresholds\\\\\\\" TEXT DEFAULT '[]',\\\\n \\\\\\\"metadata\\\\\\\" TEXT DEFAULT '{}'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"plan_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"active\\\"},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"price_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"billing_interval\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"month\\\"},\\\"pricing_mode\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"fixed\\\"},\\\"minimum_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"suggested_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"external_provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"provider_product_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"provider_price_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"stripe_product_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"stripe_price_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"features\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"[]\\\"},\\\"thresholds\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"[]\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_subscription_plans_tenant_id_plan_key_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"plan_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_subscription_plans_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_subscription_plans_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"02602c74\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:TenantSubscription\\\":{\\\"name\\\":\\\"tenantsubscription\\\",\\\"className\\\":\\\"TenantSubscription\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:TenantSubscription\\\",\\\"collection\\\":\\\"tenantsubscriptions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/TenantSubscription.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"subscriberKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"tenant\\\",\\\"enum\\\":[\\\"tenant\\\",\\\"external\\\"]},\\\"subscriberExternalId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"planId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"SubscriptionPlan\\\"},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"incomplete\\\",\\\"enum\\\":[\\\"active\\\",\\\"canceled\\\",\\\"incomplete\\\",\\\"past_due\\\",\\\"trialing\\\",\\\"unpaid\\\"]},\\\"startedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"currentPeriodStart\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"currentPeriodEnd\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"trialEndsAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"cancelAtPeriodEnd\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"default\\\":false},\\\"canceledAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"agreedAmount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false},\\\"externalProvider\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"stripeCustomerId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"stripeSubscriptionId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"stripeCheckoutSessionId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"methods\\\":{\\\"isEntitled\\\":{\\\"name\\\":\\\"isEntitled\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"now\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"boolean\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getSubscriber\\\":{\\\"name\\\":\\\"getSubscriber\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Subscriber | null\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getMetadata\\\":{\\\"name\\\":\\\"getMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"JsonObject\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setMetadata\\\":{\\\"name\\\":\\\"setMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"metadata\\\",\\\"type\\\":\\\"JsonObject\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_tenant_subscriptions\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\"]},\\\"cli\\\":{\\\"skipApiCheck\\\":true},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"subscriber_kind\\\",\\\"subscriber_external_id\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"TenantSubscription\\\",\\\"collectionExportName\\\":\\\"TenantSubscriptionCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_tenant_subscriptions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_tenant_subscriptions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"plan_id\\\\\\\" UUID,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'incomplete',\\\\n \\\\\\\"started_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"current_period_start\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"current_period_end\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"trial_ends_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"cancel_at_period_end\\\\\\\" BOOLEAN DEFAULT FALSE,\\\\n \\\\\\\"canceled_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"agreed_amount\\\\\\\" INTEGER,\\\\n \\\\\\\"external_provider\\\\\\\" TEXT,\\\\n \\\\\\\"stripe_customer_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"stripe_subscription_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"stripe_checkout_session_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metadata\\\\\\\" TEXT DEFAULT '{}'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"plan_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_subscription_plans\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"incomplete\\\"},\\\"started_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"current_period_start\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"current_period_end\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"trial_ends_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"cancel_at_period_end\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":false},\\\"canceled_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"agreed_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"external_provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"stripe_customer_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"stripe_subscription_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"stripe_checkout_session_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_tenant_subscriptions_tenant_id_subscriber_kind_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"subscriber_kind\\\",\\\"subscriber_external_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_tenant_subscriptions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_tenant_subscriptions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_tenant_subscriptions_plan_id_idx\\\",\\\"columns\\\":[\\\"plan_id\\\"]}],\\\"version\\\":\\\"2a04942c\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:TenantUsageMetric\\\":{\\\"name\\\":\\\"tenantusagemetric\\\",\\\"className\\\":\\\"TenantUsageMetric\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:TenantUsageMetric\\\",\\\"collection\\\":\\\"tenantusagemetrics\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/TenantUsageMetric.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"subscriberKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"tenant\\\",\\\"enum\\\":[\\\"tenant\\\",\\\"external\\\"]},\\\"subscriberExternalId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"metricKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"windowStart\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"windowEnd\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"source\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"sourceId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"projectId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"workRefType\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"workRefId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"dimensions\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"methods\\\":{\\\"getSubscriber\\\":{\\\"name\\\":\\\"getSubscriber\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Subscriber | null\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getDimensions\\\":{\\\"name\\\":\\\"getDimensions\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"JsonObject\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setDimensions\\\":{\\\"name\\\":\\\"setDimensions\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"dimensions\\\",\\\"type\\\":\\\"JsonObject\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"TenantUsageMetric\\\",\\\"collectionExportName\\\":\\\"TenantUsageMetricCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_tenant_usage_metrics\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"quantity\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"window_start\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"window_end\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"source\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provider\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"dimensions\\\\\\\" TEXT DEFAULT '{}'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"window_start\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"window_end\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"source\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"dimensions\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_tenant_usage_metrics_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_tenant_usage_metrics_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"b799c746\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:PricingRule\\\":{\\\"name\\\":\\\"pricingrule\\\",\\\"className\\\":\\\"PricingRule\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:PricingRule\\\",\\\"collection\\\":\\\"pricingrules\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"ruleKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"metricKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"serviceKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"strategy\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"fixed_unit\\\",\\\"enum\\\":[\\\"fixed_unit\\\",\\\"cost_plus\\\",\\\"multiplier\\\",\\\"tiered\\\",\\\"included_overage\\\",\\\"flat\\\",\\\"custom\\\"]},\\\"currency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"effectiveFrom\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"effectiveTo\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"priority\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"terms\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"active\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"default\\\":true},\\\"priceBookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"PriceBook\\\"}},\\\"methods\\\":{\\\"getTerms\\\":{\\\"name\\\":\\\"getTerms\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setTerms\\\":{\\\"name\\\":\\\"setTerms\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"value\\\",\\\"type\\\":\\\"Record<string, unknown>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_pricing_rules\\\",\\\"api\\\":true,\\\"cli\\\":true,\\\"mcp\\\":true,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"PricingRule\\\",\\\"collectionExportName\\\":\\\"PricingRuleCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_pricing_rules\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_pricing_rules\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"rule_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"strategy\\\\\\\" TEXT DEFAULT 'fixed_unit',\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"effective_from\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"effective_to\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"priority\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"terms\\\\\\\" TEXT DEFAULT '{}',\\\\n \\\\\\\"active\\\\\\\" BOOLEAN DEFAULT TRUE,\\\\n \\\\\\\"price_book_id\\\\\\\" UUID\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"rule_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"strategy\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"fixed_unit\\\"},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"effective_from\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"effective_to\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"priority\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"terms\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true},\\\"price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_pricing_rules_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_pricing_rules_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_pricing_rules_price_book_id_idx\\\",\\\"columns\\\":[\\\"price_book_id\\\"]}],\\\"version\\\":\\\"65ce9b3f\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:ClientCharge\\\":{\\\"name\\\":\\\"clientcharge\\\",\\\"className\\\":\\\"ClientCharge\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:ClientCharge\\\",\\\"collection\\\":\\\"clientcharges\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"usageEventId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"TenantUsageMetric\\\"},\\\"usageTenantId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-users:Tenant\\\"},\\\"subscriberKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriberExternalId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"projectId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"workRefType\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"workRefId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"serviceKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"metricKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"amount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"pricingRuleId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"PricingRule\\\"},\\\"priceBookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"PriceBook\\\"},\\\"pricingSnapshot\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"draft\\\",\\\"enum\\\":[\\\"draft\\\",\\\"approved\\\",\\\"adjusted\\\"]},\\\"approvedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"getPricingSnapshot\\\":{\\\"name\\\":\\\"getPricingSnapshot\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_client_charges\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"conflictColumns\\\":[\\\"usage_event_id\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"ClientCharge\\\",\\\"collectionExportName\\\":\\\"ClientChargeCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_client_charges\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_client_charges\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"usage_event_id\\\\\\\" UUID,\\\\n \\\\\\\"usage_tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provider\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"quantity\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"pricing_rule_id\\\\\\\" UUID,\\\\n \\\\\\\"price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"pricing_snapshot\\\\\\\" TEXT DEFAULT '{}',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft',\\\\n \\\\\\\"approved_at\\\\\\\" TIMESTAMP\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"usage_event_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"usage_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"pricing_rule_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_pricing_rules\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"pricing_snapshot\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"draft\\\"},\\\"approved_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_client_charges_usage_event_id_idx\\\",\\\"columns\\\":[\\\"usage_event_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_client_charges_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_usage_tenant_id_idx\\\",\\\"columns\\\":[\\\"usage_tenant_id\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_pricing_rule_id_idx\\\",\\\"columns\\\":[\\\"pricing_rule_id\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_price_book_id_idx\\\",\\\"columns\\\":[\\\"price_book_id\\\"]}],\\\"version\\\":\\\"e542be95\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:BillingAdjustment\\\":{\\\"name\\\":\\\"billingadjustment\\\",\\\"className\\\":\\\"BillingAdjustment\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:BillingAdjustment\\\",\\\"collection\\\":\\\"billingadjustments\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"clientChargeId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"ClientCharge\\\"},\\\"amount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"reason\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"source\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"sourceId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"createdBy\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_billing_adjustments\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"BillingAdjustment\\\",\\\"collectionExportName\\\":\\\"BillingAdjustmentCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_billing_adjustments\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_billing_adjustments\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"client_charge_id\\\\\\\" UUID,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"reason\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"created_by\\\\\\\" TEXT DEFAULT ''\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"client_charge_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_client_charges\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"created_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_billing_adjustments_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_billing_adjustments_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_billing_adjustments_client_charge_id_idx\\\",\\\"columns\\\":[\\\"client_charge_id\\\"]}],\\\"version\\\":\\\"cded0b52\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:SpendingPolicy\\\":{\\\"name\\\":\\\"spendingpolicy\\\",\\\"className\\\":\\\"SpendingPolicy\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:SpendingPolicy\\\",\\\"collection\\\":\\\"spendingpolicies\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"subscriberKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"subscriberExternalId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"projectId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"serviceKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"metricKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"period\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"month\\\",\\\"enum\\\":[\\\"day\\\",\\\"week\\\",\\\"month\\\",\\\"year\\\",\\\"rolling\\\",\\\"balance\\\"]},\\\"rollingSeconds\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"limitAmount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"behavior\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"observe\\\",\\\"enum\\\":[\\\"observe\\\",\\\"warn\\\",\\\"block\\\",\\\"approval_required\\\"]},\\\"priority\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"active\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"default\\\":true},\\\"basis\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"billed\\\",\\\"enum\\\":[\\\"billed\\\",\\\"retail\\\",\\\"wholesale\\\"]},\\\"setByTenantId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-users:Tenant\\\"},\\\"balanceFrom\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_spending_policies\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"subscriber_kind\\\",\\\"subscriber_external_id\\\",\\\"project_id\\\",\\\"service_key\\\",\\\"metric_key\\\",\\\"period\\\",\\\"name\\\"],\\\"api\\\":true,\\\"cli\\\":true,\\\"mcp\\\":true,\\\"hooks\\\":{\\\"beforeDelete\\\":\\\"assertDelegationAuthority\\\"},\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"SpendingPolicy\\\",\\\"collectionExportName\\\":\\\"SpendingPolicyCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_spending_policies\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_spending_policies\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"period\\\\\\\" TEXT DEFAULT 'month',\\\\n \\\\\\\"rolling_seconds\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"limit_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"behavior\\\\\\\" TEXT DEFAULT 'observe',\\\\n \\\\\\\"priority\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"active\\\\\\\" BOOLEAN DEFAULT TRUE,\\\\n \\\\\\\"basis\\\\\\\" TEXT DEFAULT 'billed',\\\\n \\\\\\\"set_by_tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"balance_from\\\\\\\" TIMESTAMP\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"period\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"month\\\"},\\\"rolling_seconds\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"limit_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"behavior\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"observe\\\"},\\\"priority\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true},\\\"basis\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"billed\\\"},\\\"set_by_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"balance_from\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_spending_policies_tenant_id_subscriber_kind_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"subscriber_kind\\\",\\\"subscriber_external_id\\\",\\\"project_id\\\",\\\"service_key\\\",\\\"metric_key\\\",\\\"period\\\",\\\"name\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_spending_policies_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_spending_policies_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_spending_policies_set_by_tenant_id_idx\\\",\\\"columns\\\":[\\\"set_by_tenant_id\\\"]}],\\\"version\\\":\\\"c4ac2f49\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:PricingRuleCollection\\\":{\\\"name\\\":\\\"pricingrulecollection\\\",\\\"className\\\":\\\"PricingRuleCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:PricingRuleCollection\\\",\\\"collection\\\":\\\"pricingrules\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_pricing_rules\\\"},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"PricingRule\\\",\\\"exportName\\\":\\\"PricingRuleCollection\\\",\\\"collectionExportName\\\":\\\"PricingRuleCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_pricing_rules\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_pricing_rules\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"rule_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"strategy\\\\\\\" TEXT DEFAULT 'fixed_unit',\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"effective_from\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"effective_to\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"priority\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"terms\\\\\\\" TEXT DEFAULT '{}',\\\\n \\\\\\\"active\\\\\\\" BOOLEAN DEFAULT TRUE,\\\\n \\\\\\\"price_book_id\\\\\\\" UUID\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"rule_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"strategy\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"fixed_unit\\\"},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"effective_from\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"effective_to\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"priority\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"terms\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true},\\\"price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_pricing_rules_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_pricing_rules_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_pricing_rules_price_book_id_idx\\\",\\\"columns\\\":[\\\"price_book_id\\\"]}],\\\"version\\\":\\\"65ce9b3f\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:ClientChargeCollection\\\":{\\\"name\\\":\\\"clientchargecollection\\\",\\\"className\\\":\\\"ClientChargeCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:ClientChargeCollection\\\",\\\"collection\\\":\\\"clientcharges\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_client_charges\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"ClientCharge\\\",\\\"exportName\\\":\\\"ClientChargeCollection\\\",\\\"collectionExportName\\\":\\\"ClientChargeCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_client_charges\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_client_charges\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"usage_event_id\\\\\\\" UUID,\\\\n \\\\\\\"usage_tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provider\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"quantity\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"pricing_rule_id\\\\\\\" UUID,\\\\n \\\\\\\"price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"pricing_snapshot\\\\\\\" TEXT DEFAULT '{}',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft',\\\\n \\\\\\\"approved_at\\\\\\\" TIMESTAMP\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"usage_event_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"usage_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"pricing_rule_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_pricing_rules\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"pricing_snapshot\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"draft\\\"},\\\"approved_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_client_charges_usage_event_id_idx\\\",\\\"columns\\\":[\\\"usage_event_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_client_charges_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_usage_tenant_id_idx\\\",\\\"columns\\\":[\\\"usage_tenant_id\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_pricing_rule_id_idx\\\",\\\"columns\\\":[\\\"pricing_rule_id\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_price_book_id_idx\\\",\\\"columns\\\":[\\\"price_book_id\\\"]}],\\\"version\\\":\\\"e542be95\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:BillingAdjustmentCollection\\\":{\\\"name\\\":\\\"billingadjustmentcollection\\\",\\\"className\\\":\\\"BillingAdjustmentCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:BillingAdjustmentCollection\\\",\\\"collection\\\":\\\"billingadjustments\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_billing_adjustments\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"BillingAdjustment\\\",\\\"exportName\\\":\\\"BillingAdjustmentCollection\\\",\\\"collectionExportName\\\":\\\"BillingAdjustmentCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_billing_adjustments\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_billing_adjustments\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"client_charge_id\\\\\\\" UUID,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"reason\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"created_by\\\\\\\" TEXT DEFAULT ''\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"client_charge_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_client_charges\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"created_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_billing_adjustments_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_billing_adjustments_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_billing_adjustments_client_charge_id_idx\\\",\\\"columns\\\":[\\\"client_charge_id\\\"]}],\\\"version\\\":\\\"cded0b52\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:SpendingPolicyCollection\\\":{\\\"name\\\":\\\"spendingpolicycollection\\\",\\\"className\\\":\\\"SpendingPolicyCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:SpendingPolicyCollection\\\",\\\"collection\\\":\\\"spendingpolicies\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_spending_policies\\\"},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"SpendingPolicy\\\",\\\"exportName\\\":\\\"SpendingPolicyCollection\\\",\\\"collectionExportName\\\":\\\"SpendingPolicyCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_spending_policies\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_spending_policies\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"period\\\\\\\" TEXT DEFAULT 'month',\\\\n \\\\\\\"rolling_seconds\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"limit_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"behavior\\\\\\\" TEXT DEFAULT 'observe',\\\\n \\\\\\\"priority\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"active\\\\\\\" BOOLEAN DEFAULT TRUE,\\\\n \\\\\\\"basis\\\\\\\" TEXT DEFAULT 'billed',\\\\n \\\\\\\"set_by_tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"balance_from\\\\\\\" TIMESTAMP\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"period\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"month\\\"},\\\"rolling_seconds\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"limit_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"behavior\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"observe\\\"},\\\"priority\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true},\\\"basis\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"billed\\\"},\\\"set_by_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"balance_from\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_spending_policies_tenant_id_subscriber_kind_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"subscriber_kind\\\",\\\"subscriber_external_id\\\",\\\"project_id\\\",\\\"service_key\\\",\\\"metric_key\\\",\\\"period\\\",\\\"name\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_spending_policies_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_spending_policies_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_spending_policies_set_by_tenant_id_idx\\\",\\\"columns\\\":[\\\"set_by_tenant_id\\\"]}],\\\"version\\\":\\\"c4ac2f49\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:PriceBook\\\":{\\\"name\\\":\\\"pricebook\\\",\\\"className\\\":\\\"PriceBook\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:PriceBook\\\",\\\"collection\\\":\\\"pricebooks\\\",\\\"description\\\":\\\"A named set of prices published by one seller tenant. Its prices are ordinary PricingRule rows that carry this book's id and the same tenant; one rule per currency gives a price in several currencies.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"bookKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"kind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"retail\\\",\\\"enum\\\":[\\\"wholesale\\\",\\\"retail\\\"]},\\\"active\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"default\\\":true}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_price_books\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"book_key\\\"],\\\"api\\\":false,\\\"cli\\\":false,\\\"mcp\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"PriceBook\\\",\\\"collectionExportName\\\":\\\"PriceBookCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_price_books\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_price_books\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"book_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'retail',\\\\n \\\\\\\"active\\\\\\\" BOOLEAN DEFAULT TRUE\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"book_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"retail\\\"},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_price_books_tenant_id_book_key_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"book_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_price_books_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_price_books_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"c7e5f5e0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:PriceBookAssignment\\\":{\\\"name\\\":\\\"pricebookassignment\\\",\\\"className\\\":\\\"PriceBookAssignment\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:PriceBookAssignment\\\",\\\"collection\\\":\\\"pricebookassignments\\\",\\\"description\\\":\\\"Which price books rate one child tenant's usage, keyed like the tenancy billing relationship it belongs to (one row per child).\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"childTenantId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":true,\\\"related\\\":\\\"@happyvertical/smrt-users:Tenant\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"resellerTenantId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":true,\\\"related\\\":\\\"@happyvertical/smrt-users:Tenant\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"wholesalePriceBookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"PriceBook\\\"},\\\"wholesaleCurrency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"retailPriceBookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"PriceBook\\\"},\\\"retailCurrency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_price_book_assignments\\\",\\\"conflictColumns\\\":[\\\"child_tenant_id\\\"],\\\"api\\\":false,\\\"cli\\\":false,\\\"mcp\\\":false},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"PriceBookAssignment\\\",\\\"collectionExportName\\\":\\\"PriceBookAssignmentCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"childTenantId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"crossPackageRef\\\"},{\\\"field\\\":\\\"resellerTenantId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"crossPackageRef\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_price_book_assignments\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_price_book_assignments\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"child_tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"reseller_tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"wholesale_price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"wholesale_currency\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"retail_price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"retail_currency\\\\\\\" TEXT DEFAULT ''\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"child_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"reseller_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"wholesale_price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"wholesale_currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"retail_price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"retail_currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_price_book_assignments_child_tenant_id_idx\\\",\\\"columns\\\":[\\\"child_tenant_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_price_book_assignments_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_reseller_tenant_id_idx\\\",\\\"columns\\\":[\\\"reseller_tenant_id\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_wholesale_price_book_id_idx\\\",\\\"columns\\\":[\\\"wholesale_price_book_id\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_retail_price_book_id_idx\\\",\\\"columns\\\":[\\\"retail_price_book_id\\\"]}],\\\"version\\\":\\\"f24f020e\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:RetailCharge\\\":{\\\"name\\\":\\\"retailcharge\\\",\\\"className\\\":\\\"RetailCharge\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:RetailCharge\\\",\\\"collection\\\":\\\"retailcharges\\\",\\\"description\\\":\\\"What a reseller charges one child for one usage event, priced from the reseller's retail book.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"resellerTenantId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-users:Tenant\\\"},\\\"usageEventId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"TenantUsageMetric\\\"},\\\"clientChargeId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"ClientCharge\\\"},\\\"subscriberKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriberExternalId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"projectId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"workRefType\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"workRefId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"serviceKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"metricKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"amount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"priceBookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"PriceBook\\\"},\\\"pricingRuleId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"PricingRule\\\"},\\\"pricingSnapshot\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"draft\\\",\\\"enum\\\":[\\\"draft\\\",\\\"approved\\\"]},\\\"approvedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"getPricingSnapshot\\\":{\\\"name\\\":\\\"getPricingSnapshot\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_retail_charges\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"conflictColumns\\\":[\\\"usage_event_id\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"RetailCharge\\\",\\\"collectionExportName\\\":\\\"RetailChargeCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_retail_charges\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_retail_charges\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"reseller_tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"usage_event_id\\\\\\\" UUID,\\\\n \\\\\\\"client_charge_id\\\\\\\" UUID,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provider\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"quantity\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"pricing_rule_id\\\\\\\" UUID,\\\\n \\\\\\\"pricing_snapshot\\\\\\\" TEXT DEFAULT '{}',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft',\\\\n \\\\\\\"approved_at\\\\\\\" TIMESTAMP\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"reseller_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"usage_event_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"client_charge_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_client_charges\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"pricing_rule_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_pricing_rules\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"pricing_snapshot\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"draft\\\"},\\\"approved_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_retail_charges_usage_event_id_idx\\\",\\\"columns\\\":[\\\"usage_event_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_retail_charges_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_reseller_tenant_id_idx\\\",\\\"columns\\\":[\\\"reseller_tenant_id\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_client_charge_id_idx\\\",\\\"columns\\\":[\\\"client_charge_id\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_price_book_id_idx\\\",\\\"columns\\\":[\\\"price_book_id\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_pricing_rule_id_idx\\\",\\\"columns\\\":[\\\"pricing_rule_id\\\"]}],\\\"version\\\":\\\"1c1ae3c8\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:CreditGrant\\\":{\\\"name\\\":\\\"creditgrant\\\",\\\"className\\\":\\\"CreditGrant\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:CreditGrant\\\",\\\"collection\\\":\\\"creditgrants\\\",\\\"description\\\":\\\"An append-only credit on a prepaid (period: 'balance') spending policy. Positive amounts add credit; a negative amount reverses an earlier grant.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"spendingPolicyId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"SpendingPolicy\\\"},\\\"amount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"reason\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"source\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"sourceId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"grantedByTenantId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-users:Tenant\\\"}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_credit_grants\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"hooks\\\":{\\\"beforeDelete\\\":\\\"refuseDelete\\\"},\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CreditGrant\\\",\\\"collectionExportName\\\":\\\"CreditGrantCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_credit_grants\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_credit_grants\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"spending_policy_id\\\\\\\" UUID,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"reason\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"granted_by_tenant_id\\\\\\\" UUID\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"spending_policy_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_spending_policies\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"granted_by_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_credit_grants_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_credit_grants_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_credit_grants_spending_policy_id_idx\\\",\\\"columns\\\":[\\\"spending_policy_id\\\"]},{\\\"name\\\":\\\"_smrt_credit_grants_granted_by_tenant_id_idx\\\",\\\"columns\\\":[\\\"granted_by_tenant_id\\\"]}],\\\"version\\\":\\\"602c4e02\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:PriceBookCollection\\\":{\\\"name\\\":\\\"pricebookcollection\\\",\\\"className\\\":\\\"PriceBookCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:PriceBookCollection\\\",\\\"collection\\\":\\\"pricebooks\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_price_books\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"PriceBook\\\",\\\"exportName\\\":\\\"PriceBookCollection\\\",\\\"collectionExportName\\\":\\\"PriceBookCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_price_books\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_price_books\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"book_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'retail',\\\\n \\\\\\\"active\\\\\\\" BOOLEAN DEFAULT TRUE\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"book_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"retail\\\"},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_price_books_tenant_id_book_key_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"book_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_price_books_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_price_books_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"c7e5f5e0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:PriceBookAssignmentCollection\\\":{\\\"name\\\":\\\"pricebookassignmentcollection\\\",\\\"className\\\":\\\"PriceBookAssignmentCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:PriceBookAssignmentCollection\\\",\\\"collection\\\":\\\"pricebookassignments\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_price_book_assignments\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"PriceBookAssignment\\\",\\\"exportName\\\":\\\"PriceBookAssignmentCollection\\\",\\\"collectionExportName\\\":\\\"PriceBookAssignmentCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_price_book_assignments\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_price_book_assignments\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"child_tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"reseller_tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"wholesale_price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"wholesale_currency\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"retail_price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"retail_currency\\\\\\\" TEXT DEFAULT ''\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"child_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"reseller_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"wholesale_price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"wholesale_currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"retail_price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"retail_currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_price_book_assignments_child_tenant_id_idx\\\",\\\"columns\\\":[\\\"child_tenant_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_price_book_assignments_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_reseller_tenant_id_idx\\\",\\\"columns\\\":[\\\"reseller_tenant_id\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_wholesale_price_book_id_idx\\\",\\\"columns\\\":[\\\"wholesale_price_book_id\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_retail_price_book_id_idx\\\",\\\"columns\\\":[\\\"retail_price_book_id\\\"]}],\\\"version\\\":\\\"f24f020e\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:RetailChargeCollection\\\":{\\\"name\\\":\\\"retailchargecollection\\\",\\\"className\\\":\\\"RetailChargeCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:RetailChargeCollection\\\",\\\"collection\\\":\\\"retailcharges\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_retail_charges\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"RetailCharge\\\",\\\"exportName\\\":\\\"RetailChargeCollection\\\",\\\"collectionExportName\\\":\\\"RetailChargeCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_retail_charges\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_retail_charges\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"reseller_tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"usage_event_id\\\\\\\" UUID,\\\\n \\\\\\\"client_charge_id\\\\\\\" UUID,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provider\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"quantity\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"pricing_rule_id\\\\\\\" UUID,\\\\n \\\\\\\"pricing_snapshot\\\\\\\" TEXT DEFAULT '{}',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft',\\\\n \\\\\\\"approved_at\\\\\\\" TIMESTAMP\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"reseller_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"usage_event_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"client_charge_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_client_charges\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"pricing_rule_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_pricing_rules\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"pricing_snapshot\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"draft\\\"},\\\"approved_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_retail_charges_usage_event_id_idx\\\",\\\"columns\\\":[\\\"usage_event_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_retail_charges_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_reseller_tenant_id_idx\\\",\\\"columns\\\":[\\\"reseller_tenant_id\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_client_charge_id_idx\\\",\\\"columns\\\":[\\\"client_charge_id\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_price_book_id_idx\\\",\\\"columns\\\":[\\\"price_book_id\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_pricing_rule_id_idx\\\",\\\"columns\\\":[\\\"pricing_rule_id\\\"]}],\\\"version\\\":\\\"1c1ae3c8\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:CreditGrantCollection\\\":{\\\"name\\\":\\\"creditgrantcollection\\\",\\\"className\\\":\\\"CreditGrantCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:CreditGrantCollection\\\",\\\"collection\\\":\\\"creditgrants\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_credit_grants\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CreditGrant\\\",\\\"exportName\\\":\\\"CreditGrantCollection\\\",\\\"collectionExportName\\\":\\\"CreditGrantCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_credit_grants\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_credit_grants\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"spending_policy_id\\\\\\\" UUID,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"reason\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"granted_by_tenant_id\\\\\\\" UUID\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"spending_policy_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_spending_policies\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"granted_by_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_credit_grants_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_credit_grants_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_credit_grants_spending_policy_id_idx\\\",\\\"columns\\\":[\\\"spending_policy_id\\\"]},{\\\"name\\\":\\\"_smrt_credit_grants_granted_by_tenant_id_idx\\\",\\\"columns\\\":[\\\"granted_by_tenant_id\\\"]}],\\\"version\\\":\\\"602c4e02\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"}},\\\"moduleType\\\":\\\"smrt\\\",\\\"smrtDependencies\\\":[\\\"@happyvertical/smrt-core\\\",\\\"@happyvertical/smrt-tenancy\\\"],\\\"browser\\\":{\\\"status\\\":\\\"server-only\\\",\\\"issues\\\":[\\\"#3624\\\",\\\"#3626\\\"],\\\"reason\\\":\\\"core migrations (node:crypto, node:os)\\\",\\\"via\\\":[\\\"@happyvertical/smrt-tenancy\\\"]},\\\"stampsConstructors\\\":true}\"));\n","import type {\n JsonObject,\n PlanFeatureGrant,\n PlanThreshold,\n Subscriber,\n SubscriberKind,\n ThresholdEnforcement,\n ThresholdWindow,\n UsageWindow,\n} from './types.js';\n\nconst THRESHOLD_WINDOWS: ThresholdWindow[] = [\n 'day',\n 'week',\n 'month',\n 'year',\n 'rolling',\n];\nconst THRESHOLD_ENFORCEMENTS: ThresholdEnforcement[] = [\n 'observe',\n 'warn',\n 'block',\n];\n\nexport async function deterministicUuid(parts: string[]): Promise<string> {\n const bytes = new TextEncoder().encode(JSON.stringify(parts));\n const digest = new Uint8Array(await crypto.subtle.digest('SHA-256', bytes));\n const uuid = digest.slice(0, 16);\n uuid[6] = (uuid[6] & 0x0f) | 0x50;\n uuid[8] = (uuid[8] & 0x3f) | 0x80;\n const hex = Array.from(uuid, (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20),\n ].join('-');\n}\n\nexport function parseJsonArray<T>(value: string, fallback: T[] = []): T[] {\n if (!value) {\n return fallback;\n }\n\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed) ? (parsed as T[]) : fallback;\n } catch {\n return fallback;\n }\n}\n\nexport function parseJsonObject<T extends JsonObject>(\n value: string,\n fallback: T,\n): T {\n if (!value) {\n return fallback;\n }\n\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as T)\n : fallback;\n } catch {\n return fallback;\n }\n}\n\nexport function stringifyJson(value: unknown): string {\n return JSON.stringify(value ?? null);\n}\n\nexport function normalizeFeatureGrants(\n grants: Array<string | PlanFeatureGrant>,\n): PlanFeatureGrant[] {\n return grants.map((grant) =>\n typeof grant === 'string' ? { featureKey: grant, enabled: true } : grant,\n );\n}\n\n/**\n * Coerce inputs from the legacy tenant-only API into a {@link Subscriber}.\n *\n * Existing callers that pass only `tenantId` (with optional `subscriberKind` /\n * `subscriberExternalId` fields, e.g. on `RecordUsageOptions`) get normalized\n * into the discriminated union exactly once at the boundary. This is the only\n * place that contains \"if kind is omitted, default to tenant\" logic — every\n * other site works with a typed `Subscriber`.\n *\n * Throws when:\n * - `subscriberKind === 'external'` is requested without a non-empty\n * `subscriberExternalId` (the XOR invariant is the whole point), or\n * - the input carries a non-empty `subscriberExternalId` but the kind resolves\n * to `'tenant'` (silent re-scoping would write buyer-scoped usage as tenant\n * usage, which then disappears from external summaries).\n */\nexport function normalizeSubscriber(input: {\n tenantId: string;\n subscriberKind?: SubscriberKind | null;\n subscriberExternalId?: string | null;\n}): Subscriber {\n // Treat null/undefined external ids as \"absent\" — but only after the\n // discriminator-derived branch decides what to do. We never coerce null\n // into the persisted column because the invariant on the model is\n // re-checked at save time via assertSubscriberInvariant.\n const rawExternalId = input.subscriberExternalId;\n const externalIdAbsent =\n rawExternalId === null || rawExternalId === undefined;\n const externalId = externalIdAbsent ? '' : String(rawExternalId);\n\n const rawKind = input.subscriberKind;\n const kind: SubscriberKind =\n rawKind === null || rawKind === undefined ? 'tenant' : rawKind;\n\n if (kind !== 'tenant' && kind !== 'external') {\n throw new Error(\n `subscriberKind must be \"tenant\" or \"external\" (got ${JSON.stringify(rawKind)})`,\n );\n }\n\n if (kind === 'tenant') {\n if (externalId !== '') {\n throw new Error(\n 'subscriberExternalId is set but subscriberKind is \"tenant\"; ' +\n 'set subscriberKind=\"external\" explicitly or omit subscriberExternalId',\n );\n }\n return { kind: 'tenant', tenantId: input.tenantId };\n }\n if (externalId === '') {\n throw new Error(\n 'subscriberKind=\"external\" requires a non-empty subscriberExternalId',\n );\n }\n return {\n kind: 'external',\n tenantId: input.tenantId,\n externalId,\n };\n}\n\n/**\n * Project a {@link Subscriber} back onto column values for persistence or query\n * filters. Counterpart to {@link normalizeSubscriber}.\n */\nexport function subscriberToColumns(subscriber: Subscriber): {\n tenantId: string;\n subscriberKind: SubscriberKind;\n subscriberExternalId: string;\n} {\n if (subscriber.kind === 'tenant') {\n return {\n tenantId: subscriber.tenantId,\n subscriberKind: 'tenant',\n subscriberExternalId: '',\n };\n }\n return {\n tenantId: subscriber.tenantId,\n subscriberKind: 'external',\n subscriberExternalId: subscriber.externalId,\n };\n}\n\n/**\n * Enforce the subscriber XOR invariant on a row's columns. Used by both the\n * model constructors (catches construction-time mistakes) and the\n * `validateBeforeSave` override (catches mutations applied via the\n * generated PUT/PATCH update path that bypass the constructor).\n *\n * Defensive about types because both call sites can receive JSON or untyped\n * fixture data via the generated REST/CLI surface — `null` arriving in place\n * of `''` would otherwise slip past an `=== ''` check, land in the\n * `(tenant_id, subscriber_kind, subscriber_external_id)` conflict key, and\n * (on Postgres) not collide with other NULLs while `findCurrentForSubscriber`\n * keeps querying by a string external id.\n *\n * @param modelName - Prepended to error messages so callers can tell whether\n * the failure originated in `TenantSubscription` or `TenantUsageMetric`.\n */\nexport function assertSubscriberInvariant(\n modelName: string,\n fields: {\n subscriberKind: unknown;\n subscriberExternalId: unknown;\n },\n): void {\n if (\n fields.subscriberKind !== 'tenant' &&\n fields.subscriberKind !== 'external'\n ) {\n throw new Error(\n `${modelName}: subscriberKind must be \"tenant\" or \"external\" (got ${describe(\n fields.subscriberKind,\n )})`,\n );\n }\n if (typeof fields.subscriberExternalId !== 'string') {\n throw new Error(\n `${modelName}: subscriberExternalId must be a string (got ${describe(\n fields.subscriberExternalId,\n )})`,\n );\n }\n\n if (\n fields.subscriberKind === 'tenant' &&\n fields.subscriberExternalId !== ''\n ) {\n throw new Error(\n `${modelName}: subscriberExternalId must be empty when subscriberKind is \"tenant\"`,\n );\n }\n if (\n fields.subscriberKind === 'external' &&\n fields.subscriberExternalId === ''\n ) {\n throw new Error(\n `${modelName}: subscriberKind=\"external\" requires a non-empty subscriberExternalId`,\n );\n }\n}\n\nfunction describe(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'string') return `\"${value}\"`;\n return String(value);\n}\n\nexport function getWindowForThreshold(\n thresholdWindow: ThresholdWindow,\n now = new Date(),\n): UsageWindow {\n switch (thresholdWindow) {\n case 'day':\n return utcWindow(now, 'day');\n case 'week':\n return utcWindow(now, 'week');\n case 'month':\n return utcWindow(now, 'month');\n case 'year':\n return utcWindow(now, 'year');\n case 'rolling':\n return {\n start: new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000),\n end: now,\n };\n }\n}\n\nexport function getWindowKey(window: UsageWindow): string {\n return `${window.start.toISOString()}..${window.end.toISOString()}`;\n}\n\nexport function isValidThreshold(threshold: PlanThreshold): boolean {\n return (\n typeof threshold.metricKey === 'string' &&\n threshold.metricKey.length > 0 &&\n Number.isFinite(threshold.limit) &&\n threshold.limit >= 0 &&\n isThresholdWindow(threshold.window) &&\n isThresholdEnforcement(threshold.enforcement) &&\n (threshold.warningRatio === undefined ||\n (Number.isFinite(threshold.warningRatio) &&\n threshold.warningRatio >= 0 &&\n threshold.warningRatio <= 1))\n );\n}\n\nfunction isThresholdWindow(value: unknown): value is ThresholdWindow {\n return (\n typeof value === 'string' &&\n THRESHOLD_WINDOWS.includes(value as ThresholdWindow)\n );\n}\n\nfunction isThresholdEnforcement(value: unknown): value is ThresholdEnforcement {\n return (\n typeof value === 'string' &&\n THRESHOLD_ENFORCEMENTS.includes(value as ThresholdEnforcement)\n );\n}\n\nfunction utcWindow(now: Date, unit: 'day' | 'week' | 'month' | 'year') {\n const start = new Date(\n Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()),\n );\n\n if (unit === 'week') {\n const day = start.getUTCDay();\n const mondayOffset = day === 0 ? -6 : 1 - day;\n start.setUTCDate(start.getUTCDate() + mondayOffset);\n }\n\n if (unit === 'month') {\n start.setUTCDate(1);\n }\n\n if (unit === 'year') {\n start.setUTCMonth(0, 1);\n }\n\n const end = new Date(start);\n switch (unit) {\n case 'day':\n end.setUTCDate(end.getUTCDate() + 1);\n break;\n case 'week':\n end.setUTCDate(end.getUTCDate() + 7);\n break;\n case 'month':\n end.setUTCMonth(end.getUTCMonth() + 1);\n break;\n case 'year':\n end.setUTCFullYear(end.getUTCFullYear() + 1);\n break;\n }\n\n return { start, end };\n}\n\n/** Canonical comparison key for a possibly-null hydrated tenant id. */\nexport function tenantKey(value: string | null | undefined): string {\n return String(value ?? '').toLowerCase();\n}\n","import { SmrtObject, smrt } from '@happyvertical/smrt-core';\nimport {\n getTenantId,\n TenantScoped,\n tenantId,\n} from '@happyvertical/smrt-tenancy';\nimport type {\n BillingInterval,\n JsonObject,\n PlanFeatureGrant,\n PlanThreshold,\n PricingMode,\n SubscriptionPlanOptions,\n SubscriptionPlanStatus,\n} from '../types.js';\nimport {\n normalizeFeatureGrants,\n parseJsonArray,\n parseJsonObject,\n stringifyJson,\n} from '../utils.js';\n\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableName: '_smrt_subscription_plans',\n api: { include: ['list', 'get', 'create', 'update'] },\n cli: { skipApiCheck: true },\n mcp: { include: ['list', 'get'] },\n conflictColumns: ['tenant_id', 'plan_key'],\n})\nexport class SubscriptionPlan extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @tenantId({ nullable: true })\n tenantId: string | null = null;\n\n planKey: string = '';\n name: string = '';\n description: string = '';\n status: SubscriptionPlanStatus = 'active';\n sortOrder: number = 0;\n /**\n * Plan price in **integer minor units** of {@link currency} — `$19.99` is\n * `1999`. The `= 0` initializer is load-bearing: SMRT maps an integer literal\n * to INTEGER and a decimal literal to DECIMAL, and money is exact (#2401).\n */\n priceAmount: number = 0;\n currency: string = 'USD';\n billingInterval: BillingInterval = 'month';\n pricingMode: PricingMode = 'fixed';\n minimumAmount: number = 0;\n suggestedAmount: number = 0;\n /** Optional provider binding; plan semantics never require a provider. */\n externalProvider: string | null = null;\n providerProductId: string | null = null;\n providerPriceId: string | null = null;\n /** @deprecated Use providerProductId. */\n stripeProductId: string | null = null;\n /** @deprecated Use providerPriceId. */\n stripePriceId: string | null = null;\n features: string = '[]';\n thresholds: string = '[]';\n metadata: string = '{}';\n\n constructor(options: SubscriptionPlanOptions = {}) {\n super(options);\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.planKey !== undefined) this.planKey = options.planKey;\n if (options.name !== undefined) this.name = options.name;\n if (options.description !== undefined)\n this.description = options.description;\n if (options.status !== undefined) this.status = options.status;\n if (options.sortOrder !== undefined) this.sortOrder = options.sortOrder;\n if (options.priceAmount !== undefined)\n this.priceAmount = options.priceAmount;\n if (options.currency !== undefined) this.currency = options.currency;\n if (options.billingInterval !== undefined) {\n this.billingInterval = options.billingInterval;\n }\n if (options.externalProvider !== undefined) {\n this.externalProvider = options.externalProvider;\n }\n if (options.pricingMode !== undefined)\n this.pricingMode = options.pricingMode;\n if (options.minimumAmount !== undefined)\n this.minimumAmount = options.minimumAmount;\n if (options.suggestedAmount !== undefined)\n this.suggestedAmount = options.suggestedAmount;\n if (options.providerProductId !== undefined) {\n this.providerProductId = options.providerProductId;\n }\n if (options.providerPriceId !== undefined) {\n this.providerPriceId = options.providerPriceId;\n }\n if (options.stripeProductId !== undefined) {\n this.stripeProductId = options.stripeProductId;\n }\n if (options.stripePriceId !== undefined) {\n this.stripePriceId = options.stripePriceId;\n }\n if (options.features !== undefined) this.features = options.features;\n if (options.thresholds !== undefined) this.thresholds = options.thresholds;\n if (options.metadata !== undefined) this.metadata = options.metadata;\n }\n\n isActive(): boolean {\n return this.status === 'active';\n }\n\n getFeatureGrants(): PlanFeatureGrant[] {\n return normalizeFeatureGrants(\n parseJsonArray<string | PlanFeatureGrant>(this.features),\n );\n }\n\n setFeatureGrants(grants: Array<string | PlanFeatureGrant>): void {\n this.features = stringifyJson(normalizeFeatureGrants(grants));\n }\n\n getFeatureKeys(): string[] {\n return this.getFeatureGrants()\n .filter((grant) => grant.enabled !== false)\n .map((grant) => grant.featureKey);\n }\n\n getThresholds(): PlanThreshold[] {\n return parseJsonArray<PlanThreshold>(this.thresholds).filter(\n (threshold) => threshold.metricKey,\n );\n }\n\n setThresholds(thresholds: PlanThreshold[]): void {\n this.thresholds = stringifyJson(thresholds);\n }\n\n getMetadata(): JsonObject {\n return parseJsonObject(this.metadata, {});\n }\n\n setMetadata(metadata: JsonObject): void {\n this.metadata = stringifyJson(metadata);\n }\n\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n const { SubscriptionPlanCollection } = await import(\n '../collections/SubscriptionPlanCollection.js'\n );\n const plans = await SubscriptionPlanCollection.create({ db: this.db });\n const persisted =\n (this.id\n ? await plans.get({ id: String(this.id) }, { cache: false })\n : null) ??\n (await plans.findByPlanKey(\n this.tenantId ?? getTenantId() ?? null,\n this.planKey,\n ));\n // A concurrently created natural-key row must never be adopted after this\n // validation: its pricing terms may differ from the terms checked here.\n if (!persisted) this.requireInsertOnSave();\n if (\n persisted &&\n (persisted.pricingMode !== this.pricingMode ||\n persisted.minimumAmount !== this.minimumAmount)\n ) {\n throw new Error(\n 'Create a new plan to change pricing mode or minimum after persistence',\n );\n }\n if (!['free', 'fixed', 'pay_what_you_can'].includes(this.pricingMode)) {\n throw new Error('Invalid pricingMode');\n }\n if (this.pricingMode !== 'fixed' && this.priceAmount !== 0) {\n throw new Error(\n 'priceAmount must be zero for free and pay_what_you_can plans',\n );\n }\n for (const [name, value] of [\n ['priceAmount', this.priceAmount],\n ['minimumAmount', this.minimumAmount],\n ['suggestedAmount', this.suggestedAmount],\n ] as const) {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(\n `${name} must be a non-negative integer minor-unit amount`,\n );\n }\n }\n if (\n this.pricingMode === 'pay_what_you_can' &&\n this.suggestedAmount > 0 &&\n this.suggestedAmount < this.minimumAmount\n ) {\n throw new Error('suggestedAmount must be at least minimumAmount');\n }\n }\n}\n\nexport default SubscriptionPlan;\n","import { SmrtCollection } from '@happyvertical/smrt-core';\nimport { SubscriptionPlan } from '../models/SubscriptionPlan.js';\n\nexport class SubscriptionPlanCollection extends SmrtCollection<SubscriptionPlan> {\n static readonly _itemClass = SubscriptionPlan;\n\n async findByPlanKey(\n tenantId: string | null,\n planKey: string,\n ): Promise<SubscriptionPlan | null> {\n const plans = await this.list({ where: { tenantId, planKey }, limit: 1 });\n return plans[0] ?? null;\n }\n\n async findActive(): Promise<SubscriptionPlan[]> {\n return this.list({\n where: { status: 'active' },\n orderBy: 'sortOrder ASC',\n });\n }\n\n async findByProviderPriceId(\n providerPriceId: string,\n ): Promise<SubscriptionPlan | null> {\n const plans = await this.list({ where: { providerPriceId }, limit: 1 });\n if (plans[0]) return plans[0];\n const legacy = await this.list({\n where: { stripePriceId: providerPriceId },\n });\n return (\n legacy.find(\n (plan) => !plan.externalProvider || plan.externalProvider === 'stripe',\n ) ?? null\n );\n }\n\n /** @deprecated Provider-neutral integrations should use findByProviderPriceId. */\n async findByStripePriceId(\n stripePriceId: string,\n ): Promise<SubscriptionPlan | null> {\n const plans = await this.list({ where: { stripePriceId }, limit: 1 });\n return plans[0] ?? null;\n }\n}\n","import { foreignKey, SmrtObject, smrt } from '@happyvertical/smrt-core';\nimport {\n getTenantId,\n isSystemContext,\n TenantScoped,\n tenantId,\n withSystemContext,\n} from '@happyvertical/smrt-tenancy';\nimport { SubscriptionPlanCollection } from '../collections/SubscriptionPlanCollection.js';\nimport type {\n JsonObject,\n Subscriber,\n SubscriberKind,\n SubscriptionStatus,\n TenantSubscriptionOptions,\n} from '../types.js';\nimport {\n assertSubscriberInvariant,\n parseJsonObject,\n stringifyJson,\n} from '../utils.js';\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_tenant_subscriptions',\n api: { include: ['list', 'get', 'create', 'update'] },\n cli: { skipApiCheck: true },\n mcp: { include: ['list', 'get'] },\n // The conflict key includes the subscriber discriminator so an issuing tenant\n // can host many distinct external subscribers without collisions on the\n // unique index:\n // - tenant-kind rows always have subscriber_external_id = '' → uniqueness\n // reduces to (tenant_id, 'tenant', '') = at most one tenant-kind row per\n // tenant (preserves the pre-polymorphic invariant).\n // - external-kind rows are unique on (tenant_id, 'external', externalId) =\n // at most one active subscription per (issuer, external subscriber).\n //\n // UPGRADE NOTE: databases created against the pre-#1454 conflict key\n // ['tenant_id'] still carry the legacy `_smrt_tenant_subscriptions_tenant_id_idx`.\n // `smrt db:migrate` does not sweep orphan indexes by default, so the legacy\n // index persists and continues to reject external subscriptions until it's\n // dropped. Run scripts/migrate-1454-drop-legacy-conflict-index.ts once on\n // upgrade, or pass `--drop-indexes` to `db:migrate`. Fresh databases need\n // neither — the generated schema already reflects the new key.\n conflictColumns: ['tenant_id', 'subscriber_kind', 'subscriber_external_id'],\n})\nexport class TenantSubscription extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @tenantId()\n tenantId?: string;\n\n /**\n * Discriminator for the subscriber identity.\n *\n * - `'tenant'` (default): the subscriber IS the owning `tenantId` — the\n * pre-polymorphic shape. All existing rows continue to behave this way.\n * - `'external'`: the subscriber is `subscriberExternalId`, scoped under the\n * issuing `tenantId`. Used for B2C buyers, anonymous-email subscribers,\n * agent identities, and any other caller-defined identity.\n */\n subscriberKind: SubscriberKind = 'tenant';\n\n /**\n * Caller-namespaced opaque identifier for the subscriber when\n * `subscriberKind === 'external'`. Empty string when kind is `'tenant'`.\n *\n * The package treats this as opaque — no FK, no inferred semantics. Callers\n * are expected to namespace (e.g. `buyer-contact:abc123`,\n * `agent:hermes-7`, `email:foo@example.com`).\n */\n subscriberExternalId: string = '';\n\n @foreignKey('SubscriptionPlan')\n planId: string = '';\n\n status: SubscriptionStatus = 'incomplete';\n startedAt: Date = new Date();\n currentPeriodStart: Date | null = null;\n currentPeriodEnd: Date | null = null;\n trialEndsAt: Date | null = null;\n cancelAtPeriodEnd: boolean = false;\n canceledAt: Date | null = null;\n /** Amount selected for this subscription, in integer minor units. */\n agreedAmount: number | null = null;\n externalProvider: string | null = null;\n stripeCustomerId: string = '';\n stripeSubscriptionId: string = '';\n stripeCheckoutSessionId: string = '';\n metadata: string = '{}';\n\n constructor(options: TenantSubscriptionOptions = {}) {\n super(options);\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.subscriberKind !== undefined)\n this.subscriberKind = options.subscriberKind;\n if (options.subscriberExternalId !== undefined)\n this.subscriberExternalId = options.subscriberExternalId;\n // Enforce the subscriber XOR invariant at construction time so callers\n // catch mistakes early. The same check also runs in `validateBeforeSave`\n // below so the generated PUT/PATCH update path — which mutates an existing\n // instance via `Object.assign()` and bypasses this constructor — can't\n // sneak a malformed row past us either.\n assertSubscriberInvariant('TenantSubscription', {\n subscriberKind: this.subscriberKind,\n subscriberExternalId: this.subscriberExternalId,\n });\n if (options.planId !== undefined) this.planId = options.planId;\n if (options.status !== undefined) this.status = options.status;\n if (options.startedAt !== undefined) this.startedAt = options.startedAt;\n if (options.currentPeriodStart !== undefined) {\n this.currentPeriodStart = options.currentPeriodStart;\n }\n if (options.currentPeriodEnd !== undefined) {\n this.currentPeriodEnd = options.currentPeriodEnd;\n }\n if (options.trialEndsAt !== undefined)\n this.trialEndsAt = options.trialEndsAt;\n if (options.cancelAtPeriodEnd !== undefined) {\n this.cancelAtPeriodEnd = options.cancelAtPeriodEnd;\n }\n if (options.canceledAt !== undefined) this.canceledAt = options.canceledAt;\n if (options.agreedAmount !== undefined)\n this.agreedAmount = options.agreedAmount;\n if (options.externalProvider !== undefined) {\n this.externalProvider = options.externalProvider;\n }\n if (options.stripeCustomerId !== undefined) {\n this.stripeCustomerId = options.stripeCustomerId;\n }\n if (options.stripeSubscriptionId !== undefined) {\n this.stripeSubscriptionId = options.stripeSubscriptionId;\n }\n if (options.stripeCheckoutSessionId !== undefined) {\n this.stripeCheckoutSessionId = options.stripeCheckoutSessionId;\n }\n if (options.metadata !== undefined) this.metadata = options.metadata;\n }\n\n /**\n * Validates the subscriber XOR invariant before every save. Critical for the\n * generated update path: `SmrtCollection.update()` mutates the existing\n * instance via `Object.assign()` and calls `save()` directly — the\n * constructor never re-runs, so without this hook a partial update like\n * `{ subscriberExternalId: 'buyer:alice' }` on a tenant-kind row would\n * persist a malformed conflict key and let two tenant-kind rows coexist\n * under the same tenant.\n */\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n assertSubscriberInvariant('TenantSubscription', {\n subscriberKind: this.subscriberKind,\n subscriberExternalId: this.subscriberExternalId,\n });\n if (\n this.agreedAmount !== null &&\n (!Number.isSafeInteger(this.agreedAmount) || this.agreedAmount < 0)\n ) {\n throw new Error(\n 'agreedAmount must be a non-negative integer minor-unit amount',\n );\n }\n const plans = await SubscriptionPlanCollection.create({ db: this.db });\n // Ordinary reads inherit the caller's tenancy. The bounded global fallback\n // permits legacy public plans without exposing any other tenant's plan.\n const scopedPlan = await plans.get({ id: this.planId }, { cache: false });\n const plan =\n scopedPlan ??\n (await withSystemContext(() =>\n plans.get({ id: this.planId, tenantId: null }, { cache: false }),\n ));\n if (\n !plan ||\n (!isSystemContext() &&\n plan.tenantId !== null &&\n plan.tenantId !== (this.tenantId ?? getTenantId() ?? null))\n ) {\n throw new Error('Subscription plan is unavailable');\n }\n if (plan.pricingMode === 'pay_what_you_can') {\n if (\n this.agreedAmount === null ||\n this.agreedAmount < plan.minimumAmount\n ) {\n throw new Error('agreedAmount must meet the plan minimumAmount');\n }\n } else if (this.agreedAmount !== null) {\n throw new Error('agreedAmount requires a pay_what_you_can plan');\n }\n }\n\n isEntitled(now = new Date()): boolean {\n if (this.status !== 'active' && this.status !== 'trialing') {\n return false;\n }\n if (\n this.currentPeriodEnd &&\n this.currentPeriodEnd.getTime() < now.getTime()\n ) {\n return false;\n }\n return true;\n }\n\n /**\n * Project this row's polymorphic subscriber columns onto the\n * {@link Subscriber} discriminated union. Returns `null` when the owning\n * tenant is absent — that's an invalid row that should not be acted on.\n */\n getSubscriber(): Subscriber | null {\n if (!this.tenantId) {\n return null;\n }\n if (this.subscriberKind === 'external') {\n if (!this.subscriberExternalId) {\n return null;\n }\n return {\n kind: 'external',\n tenantId: this.tenantId,\n externalId: this.subscriberExternalId,\n };\n }\n return { kind: 'tenant', tenantId: this.tenantId };\n }\n\n getMetadata(): JsonObject {\n return parseJsonObject(this.metadata, {});\n }\n\n setMetadata(metadata: JsonObject): void {\n this.metadata = stringifyJson(metadata);\n }\n}\n\nexport default TenantSubscription;\n","import { SmrtCollection } from '@happyvertical/smrt-core';\nimport { TenantSubscription } from '../models/TenantSubscription.js';\nimport type { Subscriber } from '../types.js';\n\nexport class TenantSubscriptionCollection extends SmrtCollection<TenantSubscription> {\n static readonly _itemClass = TenantSubscription;\n\n /**\n * List subscriptions whose owning tenant scope is `tenantId`. Includes both\n * `'tenant'`-kind (subscriber == owner) and `'external'`-kind (subscriber is\n * an external identity scoped under this tenant) rows.\n */\n async findByTenant(tenantId: string): Promise<TenantSubscription[]> {\n return this.list({\n where: { tenantId },\n orderBy: 'created_at DESC',\n });\n }\n\n /**\n * Legacy single-tenant accessor: returns the current subscription where the\n * tenant IS the subscriber (`subscriberKind = 'tenant'`). External-kind rows\n * scoped under this tenant are intentionally excluded so existing callers\n * are not surprised by buyer/agent subscriptions.\n */\n async findCurrentForTenant(\n tenantId: string,\n now = new Date(),\n ): Promise<TenantSubscription | null> {\n return this.findCurrentForSubscriber({ kind: 'tenant', tenantId }, now);\n }\n\n /**\n * Polymorphic current-subscription accessor.\n *\n * For `'tenant'` subscribers we match rows with `subscriberKind = 'tenant'`\n * under the same `tenantId`. For `'external'` subscribers we match by\n * `(tenantId, subscriberExternalId)` with `subscriberKind = 'external'`.\n */\n async findCurrentForSubscriber(\n subscriber: Subscriber,\n now = new Date(),\n ): Promise<TenantSubscription | null> {\n const where: Record<string, unknown> = {\n tenantId: subscriber.tenantId,\n subscriberKind: subscriber.kind,\n };\n if (subscriber.kind === 'external') {\n where.subscriberExternalId = subscriber.externalId;\n }\n\n const subscriptions = await this.list({\n where,\n orderBy: 'created_at DESC',\n });\n return (\n subscriptions.find((subscription) => subscription.isEntitled(now)) ??\n subscriptions[0] ??\n null\n );\n }\n\n async findByStripeSubscriptionId(\n stripeSubscriptionId: string,\n ): Promise<TenantSubscription | null> {\n const subscriptions = await this.list({\n where: { stripeSubscriptionId },\n limit: 1,\n });\n return subscriptions[0] ?? null;\n }\n}\n","import { SmrtObject, smrt } from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type {\n JsonObject,\n Subscriber,\n SubscriberKind,\n TenantUsageMetricOptions,\n} from '../types.js';\nimport {\n assertSubscriberInvariant,\n parseJsonObject,\n stringifyJson,\n} from '../utils.js';\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_tenant_usage_metrics',\n api: { include: ['list', 'get', 'create'] },\n cli: { include: ['list', 'get', 'create'] },\n mcp: { include: ['list', 'get'] },\n})\nexport class TenantUsageMetric extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @tenantId()\n tenantId?: string;\n\n /**\n * Discriminator for which subscriber identity recorded this usage.\n * `'tenant'` (default) preserves the legacy shape; `'external'` indicates\n * the subscriber is `subscriberExternalId` under the issuing `tenantId`.\n */\n subscriberKind: SubscriberKind = 'tenant';\n\n /**\n * Opaque caller-namespaced subscriber id when `subscriberKind === 'external'`.\n * Empty string when kind is `'tenant'`.\n */\n subscriberExternalId: string = '';\n\n metricKey: string = '';\n quantity: number = 0.0;\n windowStart: Date = new Date();\n windowEnd: Date = new Date();\n source: string = '';\n sourceId: string = '';\n projectId: string = '';\n workRefType: string = '';\n workRefId: string = '';\n provider: string = '';\n dimensions: string = '{}';\n\n constructor(options: TenantUsageMetricOptions = {}) {\n super(options);\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.subscriberKind !== undefined)\n this.subscriberKind = options.subscriberKind;\n if (options.subscriberExternalId !== undefined)\n this.subscriberExternalId = options.subscriberExternalId;\n // Construction-time guard; the same invariant is re-checked in\n // `validateBeforeSave` so the generated update path can't bypass it.\n assertSubscriberInvariant('TenantUsageMetric', {\n subscriberKind: this.subscriberKind,\n subscriberExternalId: this.subscriberExternalId,\n });\n if (options.metricKey !== undefined) this.metricKey = options.metricKey;\n if (options.quantity !== undefined) this.quantity = options.quantity;\n if (options.windowStart !== undefined)\n this.windowStart = options.windowStart;\n if (options.windowEnd !== undefined) this.windowEnd = options.windowEnd;\n if (options.source !== undefined) this.source = options.source;\n if (options.sourceId !== undefined) this.sourceId = options.sourceId;\n if (options.projectId !== undefined) this.projectId = options.projectId;\n if (options.workRefType !== undefined)\n this.workRefType = options.workRefType;\n if (options.workRefId !== undefined) this.workRefId = options.workRefId;\n if (options.provider !== undefined) this.provider = options.provider;\n if (options.dimensions !== undefined) this.dimensions = options.dimensions;\n }\n\n /** See `TenantSubscription.validateBeforeSave` for the rationale. */\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n assertSubscriberInvariant('TenantUsageMetric', {\n subscriberKind: this.subscriberKind,\n subscriberExternalId: this.subscriberExternalId,\n });\n if (this.id) {\n const row = await this.db.get(this.tableName, { id: this.id });\n if (row) {\n const persisted = [\n row.tenant_id,\n row.subscriber_kind,\n row.subscriber_external_id,\n row.metric_key,\n row.quantity,\n row.window_start,\n row.window_end,\n row.source,\n row.source_id,\n row.project_id,\n row.work_ref_type,\n row.work_ref_id,\n row.provider,\n row.dimensions,\n ];\n const current = [\n this.tenantId,\n this.subscriberKind,\n this.subscriberExternalId,\n this.metricKey,\n this.quantity,\n this.windowStart,\n this.windowEnd,\n this.source,\n this.sourceId,\n this.projectId,\n this.workRefType,\n this.workRefId,\n this.provider,\n this.dimensions,\n ];\n if (\n persisted.some(\n (value, index) =>\n normalizeEvidence(value) !== normalizeEvidence(current[index]),\n )\n ) {\n throw new Error(\n 'Usage events are immutable; record a new event instead.',\n );\n }\n }\n }\n }\n\n /**\n * Project this row's polymorphic subscriber columns onto the\n * {@link Subscriber} discriminated union.\n */\n getSubscriber(): Subscriber | null {\n if (!this.tenantId) {\n return null;\n }\n if (this.subscriberKind === 'external') {\n if (!this.subscriberExternalId) {\n return null;\n }\n return {\n kind: 'external',\n tenantId: this.tenantId,\n externalId: this.subscriberExternalId,\n };\n }\n return { kind: 'tenant', tenantId: this.tenantId };\n }\n\n getDimensions(): JsonObject {\n return parseJsonObject(this.dimensions, {});\n }\n\n setDimensions(dimensions: JsonObject): void {\n this.dimensions = stringifyJson(dimensions);\n }\n}\n\nexport default TenantUsageMetric;\n\nfunction normalizeEvidence(value: unknown): string {\n if (value instanceof Date) return value.toISOString();\n if (typeof value === 'string') {\n const timestamp = Date.parse(value);\n if (/^\\d{4}-\\d{2}-\\d{2}[T ]/.test(value) && Number.isFinite(timestamp)) {\n return new Date(timestamp).toISOString();\n }\n }\n return String(value ?? '');\n}\n","import { SmrtCollection } from '@happyvertical/smrt-core';\nimport { TenantUsageMetric } from '../models/TenantUsageMetric.js';\nimport type {\n AiUsageSummary,\n RecordUsageOptions,\n SummarizeAiUsageOptions,\n SummarizeUsageBatchOptions,\n SummarizeUsageOptions,\n UsageSummary,\n} from '../types.js';\nimport {\n deterministicUuid,\n normalizeSubscriber,\n stringifyJson,\n subscriberToColumns,\n} from '../utils.js';\n\nexport class TenantUsageMetricCollection extends SmrtCollection<TenantUsageMetric> {\n static readonly _itemClass = TenantUsageMetric;\n\n async recordUsage(options: RecordUsageOptions): Promise<TenantUsageMetric> {\n const subscriber = normalizeSubscriber({\n tenantId: options.tenantId,\n subscriberKind: options.subscriberKind,\n subscriberExternalId: options.subscriberExternalId,\n });\n const columns = subscriberToColumns(subscriber);\n const sourcedId =\n options.source && options.sourceId\n ? await deterministicUuid([\n 'tenant-usage',\n columns.tenantId,\n columns.subscriberKind,\n columns.subscriberExternalId,\n options.metricKey,\n options.source,\n options.sourceId,\n ])\n : null;\n if (options.source && options.sourceId) {\n const existing = await this.get(sourcedId as string);\n if (existing) return existing;\n }\n try {\n return await this.create({\n ...(sourcedId ? { id: sourcedId } : {}),\n tenantId: columns.tenantId,\n subscriberKind: columns.subscriberKind,\n subscriberExternalId: columns.subscriberExternalId,\n metricKey: options.metricKey,\n quantity: options.quantity,\n windowStart: options.windowStart,\n windowEnd: options.windowEnd,\n source: options.source ?? '',\n sourceId: options.sourceId ?? '',\n projectId: options.projectId ?? '',\n workRefType: options.workRefType ?? '',\n workRefId: options.workRefId ?? '',\n provider: options.provider ?? '',\n dimensions: stringifyJson(options.dimensions ?? {}),\n _insertOnly: Boolean(sourcedId),\n });\n } catch (error) {\n if (sourcedId) {\n const existing = await this.get(sourcedId);\n if (existing) return existing;\n }\n throw error;\n }\n }\n\n /**\n * Legacy accessor — finds metrics for `subscriberKind = 'tenant'` under the\n * given tenant. External-kind rows scoped to the same tenant are excluded.\n */\n async findByTenantAndMetric(\n tenantId: string,\n metricKey: string,\n ): Promise<TenantUsageMetric[]> {\n return this.list({\n where: { tenantId, metricKey, subscriberKind: 'tenant' },\n orderBy: 'windowStart DESC',\n });\n }\n\n async summarizeUsage(options: SummarizeUsageOptions): Promise<UsageSummary> {\n const subscriber = normalizeSubscriber({\n tenantId: options.tenantId,\n subscriberKind: options.subscriberKind,\n subscriberExternalId: options.subscriberExternalId,\n });\n const columns = subscriberToColumns(subscriber);\n\n const where: Record<string, unknown> = {\n tenantId: columns.tenantId,\n subscriberKind: columns.subscriberKind,\n metricKey: options.metricKey,\n 'windowStart <': options.window.end.toISOString(),\n 'windowEnd >': options.window.start.toISOString(),\n };\n if (subscriber.kind === 'external') {\n where.subscriberExternalId = columns.subscriberExternalId;\n }\n\n const metrics = await this.list({ where });\n\n const baseSummary: UsageSummary = {\n tenantId: columns.tenantId,\n metricKey: options.metricKey,\n quantity: metrics.reduce((sum, metric) => sum + metric.quantity, 0),\n windowStart: options.window.start,\n windowEnd: options.window.end,\n };\n if (subscriber.kind === 'external') {\n return {\n ...baseSummary,\n subscriberKind: 'external',\n subscriberExternalId: subscriber.externalId,\n };\n }\n return baseSummary;\n }\n\n async summarizeUsageBatch(\n options: SummarizeUsageBatchOptions,\n ): Promise<UsageSummary[]> {\n const metricKeys = Array.from(new Set(options.metricKeys));\n if (metricKeys.length === 0) {\n return [];\n }\n\n const subscriber = normalizeSubscriber({\n tenantId: options.tenantId,\n subscriberKind: options.subscriberKind,\n subscriberExternalId: options.subscriberExternalId,\n });\n const columns = subscriberToColumns(subscriber);\n\n const metricPlaceholders = metricKeys.map(() => '?').join(', ');\n const params: unknown[] = [\n columns.tenantId,\n columns.subscriberKind,\n ...metricKeys,\n options.window.end.toISOString(),\n options.window.start.toISOString(),\n ];\n let subscriberSql = '';\n if (subscriber.kind === 'external') {\n subscriberSql = 'AND subscriber_external_id = ?';\n params.splice(2, 0, columns.subscriberExternalId);\n }\n\n const result = await this.db.query(\n `SELECT\n metric_key,\n COALESCE(SUM(quantity), 0) AS quantity\n FROM _smrt_tenant_usage_metrics\n WHERE tenant_id = ?\n AND subscriber_kind = ?\n ${subscriberSql}\n AND metric_key IN (${metricPlaceholders})\n AND window_start < ?\n AND window_end > ?\n GROUP BY metric_key`,\n ...params,\n );\n\n const quantityByMetric = new Map<string, number>();\n for (const row of resultRows(result)) {\n const metricKey = String(row.metric_key ?? row.metricKey ?? '');\n if (metricKey) {\n quantityByMetric.set(metricKey, numberFromRow(row, 'quantity'));\n }\n }\n\n return metricKeys.map((metricKey) => {\n const baseSummary: UsageSummary = {\n tenantId: columns.tenantId,\n metricKey,\n quantity: quantityByMetric.get(metricKey) ?? 0,\n windowStart: options.window.start,\n windowEnd: options.window.end,\n };\n if (subscriber.kind === 'external') {\n return {\n ...baseSummary,\n subscriberKind: 'external',\n subscriberExternalId: subscriber.externalId,\n };\n }\n return baseSummary;\n });\n }\n\n /**\n * Summarize persisted AI usage for a tenant within a window.\n *\n * Reads the framework `_smrt_ai_usage` system table via a raw aggregate\n * query. This deliberately uses `this.db.query` rather than the inherited\n * `query()`: those rows are framework usage records, not `TenantUsageMetric`\n * instances, so model hydration would discard the aggregate columns. Tenant\n * scoping is applied explicitly through the `tenant_id` filter.\n *\n * Named distinctly from the inherited `SmrtClass.summarizeAiUsage` (which\n * returns grouped stats across all tenants) to avoid overriding it.\n */\n async summarizeTenantAiUsage(\n options: SummarizeAiUsageOptions,\n ): Promise<AiUsageSummary> {\n const result = await this.db.query(\n `SELECT\n COALESCE(SUM(prompt_tokens), 0) AS prompt_tokens,\n COALESCE(SUM(completion_tokens), 0) AS completion_tokens,\n COALESCE(SUM(total_tokens), 0) AS total_tokens,\n COALESCE(SUM(estimated_cost), 0) AS estimated_cost,\n COUNT(*) AS request_count\n FROM _smrt_ai_usage\n WHERE tenant_id = ?\n AND created_at >= ?\n AND created_at < ?`,\n options.tenantId,\n options.window.start.toISOString(),\n options.window.end.toISOString(),\n );\n const row = firstRow(result);\n\n return {\n tenantId: options.tenantId,\n promptTokens: numberFromRow(row, 'prompt_tokens'),\n completionTokens: numberFromRow(row, 'completion_tokens'),\n totalTokens: numberFromRow(row, 'total_tokens'),\n estimatedCost: numberFromRow(row, 'estimated_cost'),\n requestCount: numberFromRow(row, 'request_count'),\n windowStart: options.window.start,\n windowEnd: options.window.end,\n };\n }\n}\n\nfunction firstRow(result: unknown): Record<string, unknown> {\n const rows = resultRows(result);\n return (rows[0] ?? {}) as Record<string, unknown>;\n}\n\nfunction resultRows(result: unknown): Record<string, unknown>[] {\n return Array.isArray(result)\n ? (result as Record<string, unknown>[])\n : ((result as { rows?: Record<string, unknown>[] })?.rows ?? []);\n}\n\nfunction numberFromRow(row: Record<string, unknown>, key: string): number {\n const value = row[key];\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'bigint') {\n return Number(value);\n }\n if (typeof value === 'string') {\n return Number.parseFloat(value) || 0;\n }\n return 0;\n}\n","/**\n * Subscriptions money columns: floating-point major units → integer minor units.\n *\n * Ships as an explicit, opt-in migration rather than a schema-differ upgrade\n * because REAL→INTEGER is not information-preserving: an automatic\n * `ALTER … TYPE integer` would truncate `19.99` to `19`. The values have to be\n * rescaled by the currency's minor-unit factor during the type change (#2401).\n *\n * ```ts\n * console.log((await preflightSubscriptionsMoneyMinorUnits(db)).summary);\n * await migrateSubscriptionsMoneyToMinorUnits(db);\n * ```\n *\n * On SQLite the values are rescaled but the declared type cannot change in\n * place; those columns come back in `declaredTypeChangePending` and need the\n * table-rebuild path (#2370).\n *\n * **Pricing rules are not migrated.** `PricingRule.terms` is a JSON blob whose\n * `unitPrice` / `overageUnitPrice` / `amount` / tier prices are now read as\n * *minor units per unit of usage*. They are deliberately left fractional (a\n * per-token rate is routinely a fraction of a cent), so there is no type to\n * change — but every existing rule's terms are in major units and must be\n * rescaled by the operator, who alone knows which keys in a given rule are\n * prices and which are quantities or ratios.\n */\n\nimport {\n type DatabaseInterface,\n type MinorUnitsPreflightResult,\n type MinorUnitsRescaleResult,\n type MoneyColumnTarget,\n preflightMinorUnitsRescale,\n rescaleMoneyColumnsToMinorUnits,\n} from '@happyvertical/smrt-core/migrations';\n\n/** Marker recorded in `_smrt_backfills` once the rescale has run. */\nexport const SUBSCRIPTIONS_MONEY_MINOR_UNITS_BACKFILL =\n '@happyvertical/smrt-subscriptions:money-minor-units:v1';\n\n/**\n * Every subscriptions money column that held major units before #2401.\n *\n * `quantity` columns are absent on purpose: metered quantities are genuinely\n * fractional and stay DECIMAL.\n */\nexport const SUBSCRIPTIONS_MONEY_COLUMNS: MoneyColumnTarget[] = [\n { table: '_smrt_subscription_plans', columns: ['price_amount'] },\n { table: '_smrt_client_charges', columns: ['amount'] },\n { table: '_smrt_billing_adjustments', columns: ['amount'] },\n { table: '_smrt_spending_policies', columns: ['limit_amount'] },\n];\n\n/**\n * Report what {@link migrateSubscriptionsMoneyToMinorUnits} would do, without\n * writing anything.\n */\nexport function preflightSubscriptionsMoneyMinorUnits(\n db: DatabaseInterface,\n options: { scale?: number; engineHint?: string } = {},\n): Promise<MinorUnitsPreflightResult> {\n return preflightMinorUnitsRescale(db, SUBSCRIPTIONS_MONEY_COLUMNS, options);\n}\n\n/**\n * Convert every subscriptions money column from floating-point major units to\n * integer minor units. Idempotent via a `_smrt_backfills` marker.\n *\n * @throws `MinorUnitsPreflightError` when a row would be rounded or would\n * overflow `int4` and `force` was not set.\n */\nexport function migrateSubscriptionsMoneyToMinorUnits(\n db: DatabaseInterface,\n options: { scale?: number; engineHint?: string; force?: boolean } = {},\n): Promise<MinorUnitsRescaleResult> {\n return rescaleMoneyColumnsToMinorUnits(db, SUBSCRIPTIONS_MONEY_COLUMNS, {\n ...options,\n backfillName: SUBSCRIPTIONS_MONEY_MINOR_UNITS_BACKFILL,\n packageName: '@happyvertical/smrt-subscriptions',\n });\n}\n","import {\n crossPackageRef,\n foreignKey,\n SmrtCollection,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport {\n getTenantId,\n isSuperAdminBypass,\n isSystemContext,\n TenantIsolationError,\n TenantScoped,\n tenantId,\n} from '@happyvertical/smrt-tenancy';\n\nexport type PricingStrategy =\n | 'fixed_unit'\n | 'cost_plus'\n | 'multiplier'\n | 'tiered'\n | 'included_overage'\n | 'flat'\n | 'custom';\nexport type SpendingPolicyBehavior =\n | 'observe'\n | 'warn'\n | 'block'\n | 'approval_required';\n/**\n * `balance` is a prepaid credit balance: the policy's limit is the sum of its\n * {@link CreditGrant}s and spend accumulates from `balanceFrom` onward.\n */\nexport type SpendingPeriod =\n | 'day'\n | 'week'\n | 'month'\n | 'year'\n | 'rolling'\n | 'balance';\n/**\n * Which charges a spending policy counts (#3059).\n *\n * - `billed`: provider charges payable by the policy tenant (`ClientCharge`\n * rows whose `tenantId` is the tenant) — the pre-#3059 behavior.\n * - `retail`: what the tenant owes its reseller (`RetailCharge` rows).\n * - `wholesale`: what the policy's parent (`setByTenantId`) pays the provider\n * for this tenant's usage (`ClientCharge` rows billed to the parent with\n * `usageTenantId` = the tenant). Requires a delegated policy.\n */\nexport type SpendingBasis = 'billed' | 'retail' | 'wholesale';\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_pricing_rules',\n api: true,\n cli: true,\n mcp: true,\n})\nexport class PricingRule extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @tenantId() tenantId?: string;\n ruleKey: string = '';\n metricKey: string = '';\n serviceKey: string = '';\n strategy: PricingStrategy = 'fixed_unit';\n currency: string = 'USD';\n effectiveFrom: Date = new Date();\n effectiveTo: Date | null = null;\n priority: number = 0;\n terms: string = '{}';\n active: boolean = true;\n /**\n * The price book this rule belongs to (#3059), or empty for a tenant's\n * direct pricing. Book rules are priced only through\n * `CommercialUsageService.rateUsage()`; `price()` ignores them.\n */\n @foreignKey('PriceBook')\n priceBookId: string = '';\n\n getTerms(): Record<string, unknown> {\n try {\n return JSON.parse(this.terms) as Record<string, unknown>;\n } catch {\n return {};\n }\n }\n setTerms(value: Record<string, unknown>): void {\n this.terms = JSON.stringify(value);\n }\n}\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_client_charges',\n api: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n conflictColumns: ['usage_event_id'],\n})\nexport class ClientCharge extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n /** The payer: the usage tenant, or its billing owner when parent-billed. */\n @tenantId() tenantId?: string;\n @foreignKey('TenantUsageMetric')\n usageEventId: string = '';\n /** The tenant whose usage was charged; differs from `tenantId` for wholesale. */\n @crossPackageRef('@happyvertical/smrt-users:Tenant')\n usageTenantId: string = '';\n subscriberKind: string = 'tenant';\n subscriberExternalId: string = '';\n projectId: string = '';\n workRefType: string = '';\n workRefId: string = '';\n provider: string = '';\n serviceKey: string = '';\n metricKey: string = '';\n /**\n * Metered quantity — genuinely fractional (`duration.seconds`, token counts\n * scaled by a rate), so it stays DECIMAL.\n */\n quantity: number = 0.0;\n /**\n * Charge in **integer minor units** of {@link currency} (#2401).\n *\n * Summed against {@link BillingAdjustment.amount} and compared against\n * {@link SpendingPolicy.limitAmount}, so all three carry the same unit —\n * `CommercialService.calculateAmount()` rounds to a whole minor unit at the\n * one boundary where the fractional pricing terms meet money.\n */\n amount: number = 0;\n currency: string = 'USD';\n @foreignKey('PricingRule')\n pricingRuleId: string = '';\n /** Wholesale book that priced this charge, or empty for direct pricing. */\n @foreignKey('PriceBook')\n priceBookId: string = '';\n pricingSnapshot: string = '{}';\n status: 'draft' | 'approved' | 'adjusted' = 'draft';\n approvedAt: Date | null = null;\n\n getPricingSnapshot(): Record<string, unknown> {\n try {\n return JSON.parse(this.pricingSnapshot) as Record<string, unknown>;\n } catch {\n return {};\n }\n }\n\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n if (!this.id) return;\n const row = await this.getCanonicalPersistedRow({ id: this.id });\n if (!row || (row.status !== 'approved' && row.status !== 'adjusted'))\n return;\n if (\n (row.status === 'approved' &&\n this.status !== 'approved' &&\n this.status !== 'adjusted') ||\n (row.status === 'adjusted' && this.status !== 'adjusted')\n ) {\n throw new Error(\n 'Approved client charges cannot be reverted to an editable status.',\n );\n }\n const persisted = [\n row.tenant_id,\n row.usage_event_id,\n row.subscriber_kind,\n row.subscriber_external_id,\n row.project_id,\n row.work_ref_type,\n row.work_ref_id,\n row.provider,\n row.service_key,\n row.metric_key,\n row.quantity,\n row.amount,\n row.currency,\n row.pricing_rule_id,\n row.pricing_snapshot,\n row.approved_at,\n row.usage_tenant_id,\n row.price_book_id,\n ];\n const current = [\n this.tenantId,\n this.usageEventId,\n this.subscriberKind,\n this.subscriberExternalId,\n this.projectId,\n this.workRefType,\n this.workRefId,\n this.provider,\n this.serviceKey,\n this.metricKey,\n this.quantity,\n this.amount,\n this.currency,\n this.pricingRuleId,\n this.pricingSnapshot,\n this.approvedAt,\n this.usageTenantId,\n this.priceBookId,\n ];\n if (\n persisted.some(\n (value, index) =>\n normalizeSnapshot(value) !== normalizeSnapshot(current[index]),\n )\n ) {\n throw new Error(\n 'Approved client charges are immutable; append a BillingAdjustment instead.',\n );\n }\n }\n}\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_billing_adjustments',\n api: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n})\nexport class BillingAdjustment extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @tenantId() tenantId?: string;\n @foreignKey('ClientCharge')\n clientChargeId: string = '';\n /**\n * Signed correction in **integer minor units**, same unit as\n * {@link ClientCharge.amount} it adjusts. Negative values are legitimate\n * (a credit) — that is why the non-negative guard in\n * `CommercialService.calculateAmount()` does not apply here (#2401).\n */\n amount: number = 0;\n currency: string = 'USD';\n reason: string = '';\n source: string = '';\n sourceId: string = '';\n createdBy: string = '';\n\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n if (!this.id) return;\n const row = await this.db.get(this.tableName, { id: this.id });\n if (row) {\n throw new Error(\n 'Billing adjustments are append-only; create a new adjustment instead.',\n );\n }\n }\n}\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_spending_policies',\n conflictColumns: [\n 'tenant_id',\n 'subscriber_kind',\n 'subscriber_external_id',\n 'project_id',\n 'service_key',\n 'metric_key',\n 'period',\n 'name',\n ],\n api: true,\n cli: true,\n mcp: true,\n hooks: { beforeDelete: 'assertDelegationAuthority' },\n})\nexport class SpendingPolicy extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @tenantId() tenantId?: string;\n name: string = '';\n subscriberKind: string = '';\n subscriberExternalId: string = '';\n projectId: string = '';\n serviceKey: string = '';\n metricKey: string = '';\n period: SpendingPeriod = 'month';\n rollingSeconds: number = 0;\n /**\n * Spending cap in **integer minor units** of {@link currency}. Compared\n * directly against the sum of `ClientCharge.amount` + `BillingAdjustment`s\n * plus the caller's estimate, so it must carry the same unit (#2401).\n * Must be zero for a `balance` policy, whose limit is its credit grants.\n */\n limitAmount: number = 0;\n currency: string = 'USD';\n behavior: SpendingPolicyBehavior = 'observe';\n priority: number = 0;\n active: boolean = true;\n /** Which charges count toward the policy; see {@link SpendingBasis}. */\n basis: SpendingBasis = 'billed';\n /**\n * The parent tenant that set this policy on its child (#3059), or empty for\n * a tenant's own policy. A delegated policy can be changed or deleted only\n * by that parent, a system context, or a super-admin bypass.\n */\n @crossPackageRef('@happyvertical/smrt-users:Tenant')\n setByTenantId: string = '';\n /** Start of the spend window for a `balance` policy; defaults to creation. */\n balanceFrom: Date | null = null;\n\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n if (this.subscriberExternalId && !this.subscriberKind) {\n throw new Error(\n 'Spending policies with subscriberExternalId require subscriberKind.',\n );\n }\n if (\n this.period === 'rolling' &&\n (!Number.isFinite(this.rollingSeconds) || this.rollingSeconds <= 0)\n ) {\n throw new Error(\n 'Rolling spending policies require rollingSeconds greater than zero.',\n );\n }\n if (\n this.basis !== 'billed' &&\n this.basis !== 'retail' &&\n this.basis !== 'wholesale'\n ) {\n throw new Error(\n 'Spending policy basis must be billed, retail, or wholesale.',\n );\n }\n if (this.basis === 'wholesale' && !this.setByTenantId) {\n throw new Error(\n 'Wholesale spending policies must be delegated by a parent (setByTenantId).',\n );\n }\n if (this.period === 'balance') {\n if (this.limitAmount !== 0) {\n throw new Error(\n 'Balance spending policies take their limit from credit grants; limitAmount must be 0.',\n );\n }\n if (!this.balanceFrom) this.balanceFrom = new Date();\n }\n const targets = await this.persistedTargets();\n await this.assertBalanceLedgerStable(targets);\n await this.assertDelegationAuthority(targets);\n }\n\n /**\n * A balance policy's credit grants are scoped to its currency and period;\n * changing either would silently detach the ledger, so create a new\n * balance instead.\n */\n protected async assertBalanceLedgerStable(\n rows: Array<Record<string, unknown> | null>,\n ): Promise<void> {\n for (const row of rows) {\n if (row?.period !== 'balance') continue;\n if (this.period !== 'balance' || row.currency !== this.currency) {\n throw new Error(\n 'A balance policy cannot change currency or period; create a new balance policy.',\n );\n }\n }\n }\n\n /**\n * The rows this save can overwrite: by id and, because a new object may\n * already carry a generated id, by conflict key (an upsert target).\n */\n protected async persistedTargets(): Promise<\n Array<Record<string, unknown> | null>\n > {\n const byId = this.id\n ? await this.getCanonicalPersistedRow({ id: this.id })\n : null;\n const byKey = this.tenantId\n ? await this.getCanonicalPersistedRow({\n tenant_id: this.tenantId,\n subscriber_kind: this.subscriberKind,\n subscriber_external_id: this.subscriberExternalId,\n project_id: this.projectId,\n service_key: this.serviceKey,\n metric_key: this.metricKey,\n period: this.period,\n name: this.name,\n })\n : null;\n return [byId, byKey];\n }\n\n /**\n * A delegated policy belongs to the parent that set it: the constrained\n * child cannot create one in a parent's name, loosen it, or delete it.\n * The parent's-own-context allowance applies only where no tenancy\n * interceptor is registered; with one, the interceptor refuses a parent\n * writing the child's row, so parents change delegated policies through\n * `ResellerBillingService.setDelegatedSpendingPolicy()` (set\n * `active: false` to retire one).\n * Checks both the persisted row (by id, or by conflict key for an upsert)\n * and the incoming value.\n */\n protected async assertDelegationAuthority(\n targets?: Array<Record<string, unknown> | null>,\n ): Promise<void> {\n const [byId, byKey] = targets ?? (await this.persistedTargets());\n const owners = new Set(\n [byId?.set_by_tenant_id, byKey?.set_by_tenant_id, this.setByTenantId]\n .filter((value): value is string => Boolean(value))\n .map((value) => String(value).toLowerCase()),\n );\n if (owners.size === 0) return;\n if (isSystemContext() || isSuperAdminBypass()) return;\n const current = getTenantId()?.toLowerCase();\n if (owners.size === 1 && current && owners.has(current)) return;\n throw new TenantIsolationError(\n 'Delegated spending policies can be changed only by the parent that set them.',\n );\n }\n}\n\nexport class PricingRuleCollection extends SmrtCollection<PricingRule> {\n static readonly _itemClass = PricingRule;\n}\nexport class ClientChargeCollection extends SmrtCollection<ClientCharge> {\n static readonly _itemClass = ClientCharge;\n}\nexport class BillingAdjustmentCollection extends SmrtCollection<BillingAdjustment> {\n static readonly _itemClass = BillingAdjustment;\n}\nexport class SpendingPolicyCollection extends SmrtCollection<SpendingPolicy> {\n static readonly _itemClass = SpendingPolicy;\n}\n\nfunction normalizeSnapshot(value: unknown): string {\n if (value instanceof Date) return value.toISOString();\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}[T ]/.test(value)) {\n const timestamp = Date.parse(value);\n if (Number.isFinite(timestamp)) return new Date(timestamp).toISOString();\n }\n return String(value ?? '');\n}\n","/**\n * Reseller billing records (#3059): price books, their per-relationship\n * assignment, the reseller's retail ledger, and prepaid credit grants.\n *\n * Money is integer minor units throughout, exactly as in `commercial.ts`.\n */\nimport {\n crossPackageRef,\n field,\n foreignKey,\n SmrtCollection,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport {\n getTenantId,\n isSuperAdminBypass,\n isSystemContext,\n TenantIsolationError,\n TenantScoped,\n tenantId,\n} from '@happyvertical/smrt-tenancy';\nimport { tenantKey } from '../utils.js';\n\n/**\n * `wholesale` books price what a service provider charges a reseller for its\n * children's usage; `retail` books price what a reseller charges its children.\n */\nexport type PriceBookKind = 'wholesale' | 'retail';\n\nconst PRICE_BOOK_KINDS: readonly PriceBookKind[] = ['wholesale', 'retail'];\nconst CURRENCY_PATTERN = /^[A-Z]{3}$/;\n\nexport function isPriceBookKind(value: unknown): value is PriceBookKind {\n return PRICE_BOOK_KINDS.includes(value as PriceBookKind);\n}\n\n/** ISO 4217-shaped (three upper-case letters) currency code check. */\nexport function isCurrencyCode(value: unknown): value is string {\n return typeof value === 'string' && CURRENCY_PATTERN.test(value);\n}\n\n/**\n * A named set of prices published by one seller tenant. Its prices are\n * ordinary {@link PricingRule} rows that carry this book's id and the same\n * tenant; one rule per currency gives a price in several currencies.\n */\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_price_books',\n conflictColumns: ['tenant_id', 'book_key'],\n api: false,\n cli: false,\n mcp: false,\n})\nexport class PriceBook extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n /** The seller that publishes and owns the book. */\n @tenantId() tenantId?: string;\n bookKey: string = '';\n name: string = '';\n kind: PriceBookKind = 'retail';\n active: boolean = true;\n\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n if (!this.bookKey.trim()) {\n throw new Error('Price books require a bookKey.');\n }\n if (!isPriceBookKind(this.kind)) {\n throw new Error('Price book kind must be wholesale or retail.');\n }\n }\n}\n\n/**\n * Which price books rate one child tenant's usage, keyed like the tenancy\n * billing relationship it belongs to (one row per child). The reseller is\n * recorded so an assignment made under one relationship never prices usage\n * after the child moves to a different reseller.\n *\n * A system table managed through `ResellerBillingService`, like\n * `_smrt_billing_relationships`; it has no generated API surface.\n */\n@smrt({\n tableName: '_smrt_price_book_assignments',\n conflictColumns: ['child_tenant_id'],\n api: false,\n cli: false,\n mcp: false,\n})\nexport class PriceBookAssignment extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @crossPackageRef('@happyvertical/smrt-users:Tenant')\n @field({ required: true })\n childTenantId: string = '';\n @crossPackageRef('@happyvertical/smrt-users:Tenant')\n @field({ required: true })\n resellerTenantId: string = '';\n @foreignKey('PriceBook')\n wholesalePriceBookId: string = '';\n wholesaleCurrency: string = '';\n @foreignKey('PriceBook')\n retailPriceBookId: string = '';\n retailCurrency: string = '';\n}\n\n/**\n * What a reseller charges one child for one usage event, priced from the\n * reseller's retail book. The provider's charge for the same event is the\n * {@link ClientCharge} in `clientChargeId`, payable by the billing owner.\n *\n * `tenantId` is always the payer (the child), so tenant-scoped reads and the\n * child's `retail`-basis spending policies see exactly what it owes.\n */\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_retail_charges',\n api: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n conflictColumns: ['usage_event_id'],\n})\nexport class RetailCharge extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @tenantId() tenantId?: string;\n @crossPackageRef('@happyvertical/smrt-users:Tenant')\n resellerTenantId: string = '';\n @foreignKey('TenantUsageMetric')\n usageEventId: string = '';\n @foreignKey('ClientCharge')\n clientChargeId: string = '';\n subscriberKind: string = 'tenant';\n subscriberExternalId: string = '';\n projectId: string = '';\n workRefType: string = '';\n workRefId: string = '';\n provider: string = '';\n serviceKey: string = '';\n metricKey: string = '';\n /** Metered quantity; fractional, like `ClientCharge.quantity`. */\n quantity: number = 0.0;\n /** Charge in integer minor units of {@link currency}. */\n amount: number = 0;\n currency: string = 'USD';\n @foreignKey('PriceBook')\n priceBookId: string = '';\n @foreignKey('PricingRule')\n pricingRuleId: string = '';\n pricingSnapshot: string = '{}';\n status: 'draft' | 'approved' = 'draft';\n approvedAt: Date | null = null;\n\n getPricingSnapshot(): Record<string, unknown> {\n try {\n return JSON.parse(this.pricingSnapshot) as Record<string, unknown>;\n } catch {\n return {};\n }\n }\n\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n if (!this.id) return;\n const row = await this.getCanonicalPersistedRow({ id: this.id });\n if (row?.status !== 'approved') return;\n const persisted = [\n row.tenant_id,\n row.reseller_tenant_id,\n row.usage_event_id,\n row.client_charge_id,\n row.subscriber_kind,\n row.subscriber_external_id,\n row.project_id,\n row.work_ref_type,\n row.work_ref_id,\n row.provider,\n row.service_key,\n row.metric_key,\n row.quantity,\n row.amount,\n row.currency,\n row.price_book_id,\n row.pricing_rule_id,\n row.pricing_snapshot,\n row.status,\n row.approved_at,\n ];\n const current = [\n this.tenantId,\n this.resellerTenantId,\n this.usageEventId,\n this.clientChargeId,\n this.subscriberKind,\n this.subscriberExternalId,\n this.projectId,\n this.workRefType,\n this.workRefId,\n this.provider,\n this.serviceKey,\n this.metricKey,\n this.quantity,\n this.amount,\n this.currency,\n this.priceBookId,\n this.pricingRuleId,\n this.pricingSnapshot,\n this.status,\n this.approvedAt,\n ];\n if (\n persisted.some(\n (value, index) =>\n normalizeLedgerValue(value) !== normalizeLedgerValue(current[index]),\n )\n ) {\n throw new Error('Approved retail charges are immutable.');\n }\n }\n}\n\n/**\n * An append-only credit on a prepaid (`period: 'balance'`) spending policy.\n * Positive amounts add credit; a negative amount reverses an earlier grant.\n */\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_credit_grants',\n api: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n hooks: { beforeDelete: 'refuseDelete' },\n})\nexport class CreditGrant extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n /** The tenant whose balance is credited (the policy's tenant). */\n @tenantId() tenantId?: string;\n @foreignKey('SpendingPolicy')\n spendingPolicyId: string = '';\n /** Signed credit in integer minor units of {@link currency}. */\n amount: number = 0;\n currency: string = 'USD';\n reason: string = '';\n source: string = '';\n sourceId: string = '';\n /** A parent tenant that granted the credit, or empty when self-granted. */\n @crossPackageRef('@happyvertical/smrt-users:Tenant')\n grantedByTenantId: string = '';\n\n /** Append-only: history is corrected by a reversing grant, never removed. */\n protected refuseDelete(): void {\n throw new Error(\n 'Credit grants are append-only; record a reversing grant instead of deleting.',\n );\n }\n\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n if (!Number.isSafeInteger(this.amount) || this.amount === 0) {\n throw new Error(\n 'Credit grant amounts must be nonzero integer minor units (cents).',\n );\n }\n if (this.id) {\n const row = await this.db.get(this.tableName, { id: this.id });\n if (row) {\n throw new Error(\n 'Credit grants are append-only; record a reversing grant instead.',\n );\n }\n }\n const policy = this.spendingPolicyId\n ? ((await this.db.get('_smrt_spending_policies', {\n id: this.spendingPolicyId,\n })) as Record<string, unknown> | null)\n : null;\n if (\n policy?.period !== 'balance' ||\n tenantKey(policy.tenant_id as string) !== tenantKey(this.tenantId) ||\n policy.currency !== this.currency\n ) {\n throw new Error(\n 'Credit grants must credit a balance policy of the same tenant and currency.',\n );\n }\n // A parent's delegated balance is funded only by that parent.\n const setBy = tenantKey(policy.set_by_tenant_id as string);\n if (!setBy) return;\n if (tenantKey(this.grantedByTenantId) !== setBy) {\n throw new TenantIsolationError(\n 'Delegated balance credit must be granted by the parent that set it.',\n );\n }\n if (\n !isSystemContext() &&\n !isSuperAdminBypass() &&\n tenantKey(getTenantId()) !== setBy\n ) {\n throw new TenantIsolationError(\n 'Only the parent that set a delegated policy can grant it credit.',\n );\n }\n }\n}\n\nexport class PriceBookCollection extends SmrtCollection<PriceBook> {\n static readonly _itemClass = PriceBook;\n}\nexport class PriceBookAssignmentCollection extends SmrtCollection<PriceBookAssignment> {\n static readonly _itemClass = PriceBookAssignment;\n}\nexport class RetailChargeCollection extends SmrtCollection<RetailCharge> {\n static readonly _itemClass = RetailCharge;\n}\nexport class CreditGrantCollection extends SmrtCollection<CreditGrant> {\n static readonly _itemClass = CreditGrant;\n}\n\nfunction normalizeLedgerValue(value: unknown): string {\n if (value instanceof Date) return value.toISOString();\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}[T ]/.test(value)) {\n const timestamp = Date.parse(value);\n if (Number.isFinite(timestamp)) return new Date(timestamp).toISOString();\n }\n if (typeof value === 'boolean') return value ? '1' : '0';\n return String(value ?? '');\n}\n","export type ResellerBillingErrorCode =\n | 'INVALID_TENANT'\n | 'INVALID_CURRENCY'\n | 'INVALID_AMOUNT'\n | 'PRICE_BOOK_NOT_FOUND'\n | 'PRICE_BOOK_INACTIVE'\n | 'PRICE_BOOK_KIND_MISMATCH'\n | 'PRICE_BOOK_OWNER_MISMATCH'\n | 'PRICE_BOOK_NOT_ASSIGNED'\n | 'NO_EFFECTIVE_PRICE'\n | 'RELATIONSHIP_REQUIRED'\n | 'POLICY_NOT_FOUND'\n | 'POLICY_NOT_BALANCE'\n | 'POLICY_CONFLICT'\n | 'ASSIGNMENT_CONFLICT';\n\n/** A reseller price book, rating, or delegated-spending rule was violated. */\nexport class ResellerBillingError extends Error {\n constructor(\n message: string,\n public readonly code: ResellerBillingErrorCode,\n ) {\n super(message);\n this.name = 'ResellerBillingError';\n }\n}\n","import {\n type DatabaseConfig,\n isDatabaseInterface,\n isEmbeddedDatabase,\n type SmrtClassOptions,\n withEmbeddedWriteTransaction,\n} from '@happyvertical/smrt-core';\nimport {\n type BillingRelationshipService,\n type BillingRelationshipView,\n getTenantId,\n isSuperAdminBypass,\n isSystemContext,\n TenantIsolationError,\n withSystemContext,\n} from '@happyvertical/smrt-tenancy';\nimport type { SqlAdapterType } from '@happyvertical/sql';\nimport { TenantUsageMetricCollection } from '../collections/TenantUsageMetricCollection.js';\nimport {\n BillingAdjustmentCollection,\n type ClientCharge,\n ClientChargeCollection,\n type PricingRule,\n PricingRuleCollection,\n type PricingStrategy,\n type SpendingBasis,\n type SpendingPolicy,\n SpendingPolicyCollection,\n} from '../models/commercial.js';\nimport {\n type CreditGrant,\n CreditGrantCollection,\n type PriceBook,\n PriceBookAssignmentCollection,\n PriceBookCollection,\n type PriceBookKind,\n type RetailCharge,\n RetailChargeCollection,\n} from '../models/reseller.js';\nimport type { TenantUsageMetric } from '../models/TenantUsageMetric.js';\nimport type { RecordUsageOptions, SubscriberKind } from '../types.js';\nimport {\n deterministicUuid,\n normalizeSubscriber,\n subscriberToColumns,\n tenantKey,\n} from '../utils.js';\nimport { ResellerBillingError } from './reseller-errors.js';\n\nexport interface PriceUsageOptions {\n usageEventId: string;\n approved?: boolean;\n at?: Date;\n}\n\n/** The released smrt-tenancy billing-owner read this package depends on. */\nexport type BillingRelationshipReader = Pick<\n BillingRelationshipService,\n 'getRelationship'\n>;\n\nexport interface RateUsageOptions extends PriceUsageOptions {\n /** Resolves the usage tenant's reseller relationship and billing owner. */\n billingRelationships: BillingRelationshipReader;\n}\n\n/**\n * The outcome of rating one usage event (#3059). A usage event is rated\n * exactly once: the first rating fixes the payer and price books, and later\n * calls return the same records even if the billing owner has since changed.\n */\nexport interface UsageRating {\n /** The tenant that produced the usage. */\n usageTenantId: string;\n /** Who pays the provider: the usage tenant, or its reseller. */\n billingOwnerTenantId: string;\n /** `direct` for self-billed usage, `wholesale` for reseller-billed usage. */\n mode: 'direct' | 'wholesale';\n /** The provider's charge, payable by {@link billingOwnerTenantId}. */\n charge: ClientCharge;\n /** The reseller's retail charge to the child, when a retail book applies. */\n retailCharge: RetailCharge | null;\n}\nexport interface CustomPricingContext {\n usage: { quantity: number; dimensions: Record<string, unknown> };\n rule: PricingRule;\n terms: Record<string, unknown>;\n}\nexport type CustomPricingStrategy = (\n context: CustomPricingContext,\n) => number | Promise<number>;\n\nexport interface CommercialBillingStorage {\n adapterType: SqlAdapterType;\n writeStrategy?: 'immediate' | 'manual' | 'none';\n}\n\nexport interface CommercialUsageServiceOptions extends SmrtClassOptions {\n /**\n * Required when `db` is an already-resolved database handle, whose public\n * interface does not expose its adapter/write-back configuration.\n */\n billingStorage?: CommercialBillingStorage;\n}\n\nconst embeddedAdjustmentLocks = new Map<string | object, Promise<void>>();\n\nasync function withEmbeddedSourcedAdjustmentLock<T>(\n db: { url?: string },\n storage: CommercialBillingStorage,\n sourced: boolean,\n operation: () => Promise<T>,\n): Promise<T> {\n if (!sourced || storage.adapterType === 'postgres') return operation();\n\n const key = db.url ? `${storage.adapterType}:${db.url}` : (db as object);\n const previous = embeddedAdjustmentLocks.get(key) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const queued = previous.then(() => current);\n embeddedAdjustmentLocks.set(key, queued);\n await previous;\n try {\n return await operation();\n } finally {\n release();\n if (embeddedAdjustmentLocks.get(key) === queued) {\n embeddedAdjustmentLocks.delete(key);\n }\n }\n}\n\nexport class UnsupportedCommercialBillingStorageError extends Error {\n readonly code = 'UNSUPPORTED_COMMERCIAL_BILLING_STORAGE';\n\n constructor(storage: CommercialBillingStorage) {\n super(\n `Commercial billing does not support ${storage.adapterType} ` +\n `with immediate JSON write-back because exported files are not ` +\n `transactionally rolled back. Use PostgreSQL, SQLite, ordinary ` +\n `DuckDB, or a non-immediate write strategy.`,\n );\n this.name = 'UnsupportedCommercialBillingStorageError';\n }\n}\n\nexport class CommercialBillingStorageConfigurationError extends Error {\n readonly code = 'COMMERCIAL_BILLING_STORAGE_CONFIGURATION_REQUIRED';\n\n constructor(message?: string) {\n super(\n message ??\n 'Commercial billing requires billingStorage when db is an already-resolved handle because adapter write-back capabilities are not public on that interface.',\n );\n this.name = 'CommercialBillingStorageConfigurationError';\n }\n}\n\nfunction assertValidCommercialBillingWriteStrategy(\n writeStrategy: unknown,\n): asserts writeStrategy is CommercialBillingStorage['writeStrategy'] {\n if (\n writeStrategy !== undefined &&\n writeStrategy !== 'immediate' &&\n writeStrategy !== 'manual' &&\n writeStrategy !== 'none'\n ) {\n throw new CommercialBillingStorageConfigurationError(\n 'Commercial billing database writeStrategy must be immediate, manual, or none.',\n );\n }\n}\n\nfunction snapshotCommercialBillingStorage(\n storage: CommercialBillingStorage,\n): CommercialBillingStorage {\n const adapterType: unknown = storage.adapterType;\n if (\n adapterType !== 'sqlite' &&\n adapterType !== 'postgres' &&\n adapterType !== 'duckdb' &&\n adapterType !== 'json'\n ) {\n throw new CommercialBillingStorageConfigurationError(\n 'Commercial billing storage adapterType must be sqlite, postgres, duckdb, or json.',\n );\n }\n const writeStrategy: unknown = storage.writeStrategy;\n assertValidCommercialBillingWriteStrategy(writeStrategy);\n return { adapterType, writeStrategy };\n}\n\nfunction snapshotCommercialUsageServiceOptions(\n options: CommercialUsageServiceOptions,\n): CommercialUsageServiceOptions {\n const snapshot = { ...options };\n if (snapshot.billingStorage) {\n snapshot.billingStorage = snapshotCommercialBillingStorage(\n snapshot.billingStorage,\n );\n }\n for (const key of ['db', 'persistence'] as const) {\n const database = snapshot[key];\n if (\n database &&\n typeof database !== 'string' &&\n !isDatabaseInterface(database)\n ) {\n snapshot[key] = { ...database };\n }\n }\n return snapshot;\n}\n\nexport function assertCommercialBillingStorageSupported(\n storage: CommercialBillingStorage,\n): void {\n const snapshot = snapshotCommercialBillingStorage(storage);\n const writeStrategy =\n snapshot.adapterType === 'json'\n ? (snapshot.writeStrategy ?? 'immediate')\n : snapshot.writeStrategy;\n if (\n (snapshot.adapterType === 'json' || snapshot.adapterType === 'duckdb') &&\n writeStrategy === 'immediate'\n ) {\n throw new UnsupportedCommercialBillingStorageError({\n ...snapshot,\n writeStrategy,\n });\n }\n}\n\nfunction inferAdapterType(url: string): SqlAdapterType | undefined {\n if (/^postgres(?:ql)?:/iu.test(url)) return 'postgres';\n if (/^(?:https?|libsql):\\/\\//iu.test(url)) return 'sqlite';\n if (/\\.duckdb(?:$|\\?)/iu.test(url)) return 'duckdb';\n if (url === ':memory:' || url.startsWith('file:')) return 'sqlite';\n return undefined;\n}\n\nfunction environmentAdapterType(): SqlAdapterType | undefined {\n const type = process.env.HAVE_SQL_TYPE;\n if (type === undefined || type === '') return undefined;\n if (\n type === 'sqlite' ||\n type === 'postgres' ||\n type === 'duckdb' ||\n type === 'json'\n ) {\n return type;\n }\n throw new CommercialBillingStorageConfigurationError(\n 'Commercial billing HAVE_SQL_TYPE must be sqlite, postgres, duckdb, or json.',\n );\n}\n\nfunction environmentWriteStrategy(): CommercialBillingStorage['writeStrategy'] {\n const strategy = process.env.HAVE_SQL_WRITE_STRATEGY;\n if (strategy === undefined || strategy === '') return undefined;\n if (\n strategy === 'immediate' ||\n strategy === 'manual' ||\n strategy === 'none'\n ) {\n return strategy;\n }\n throw new CommercialBillingStorageConfigurationError(\n 'Commercial billing HAVE_SQL_WRITE_STRATEGY must be immediate, manual, or none.',\n );\n}\n\nfunction billingStorageFromConfig(\n config: DatabaseConfig | undefined,\n declared?: CommercialBillingStorage,\n): CommercialBillingStorage {\n // Validate a configured environment value even when an explicit config type\n // wins adapter precedence. Otherwise normalization below could hide an SDK\n // configuration error by replacing the invalid environment value.\n const environmentType = environmentAdapterType();\n if (config === undefined) {\n if (environmentType)\n return {\n adapterType: environmentType,\n writeStrategy: environmentWriteStrategy(),\n };\n return { adapterType: 'sqlite' };\n }\n if (isDatabaseInterface(config)) {\n throw new CommercialBillingStorageConfigurationError();\n }\n if (typeof config === 'string') {\n const adapterType =\n environmentType ?? inferAdapterType(config) ?? declared?.adapterType;\n if (adapterType)\n return {\n adapterType,\n writeStrategy: environmentWriteStrategy() ?? declared?.writeStrategy,\n };\n throw new Error(\n 'Commercial billing requires an explicit billingStorage adapter contract for ambiguous database URLs.',\n );\n }\n const adapterType =\n config.type ??\n environmentType ??\n inferAdapterType(String(config.url ?? '')) ??\n declared?.adapterType;\n if (!adapterType) {\n throw new Error(\n 'Commercial billing requires an explicit database type or billingStorage adapter contract.',\n );\n }\n const configuredWriteStrategy = config.writeStrategy;\n assertValidCommercialBillingWriteStrategy(configuredWriteStrategy);\n const writeStrategy =\n configuredWriteStrategy === 'immediate' ||\n configuredWriteStrategy === 'manual' ||\n configuredWriteStrategy === 'none'\n ? configuredWriteStrategy\n : (environmentWriteStrategy() ?? declared?.writeStrategy);\n return { adapterType, writeStrategy };\n}\n\nfunction effectiveWriteStrategy(\n storage: CommercialBillingStorage,\n): CommercialBillingStorage['writeStrategy'] {\n if (storage.writeStrategy) return storage.writeStrategy;\n if (storage.adapterType === 'json') return 'immediate';\n if (storage.adapterType === 'duckdb') return 'none';\n return undefined;\n}\n\nfunction resolveCommercialBillingStorage(\n options: CommercialUsageServiceOptions,\n): CommercialBillingStorage {\n // Environment declarations are configuration contracts, even when explicit\n // options win precedence. Reject invalid nonempty values before setup.\n environmentAdapterType();\n environmentWriteStrategy();\n const configuredDatabase = options.db ?? options.persistence;\n if (isDatabaseInterface(configuredDatabase)) {\n if (!options.billingStorage) {\n throw new CommercialBillingStorageConfigurationError();\n }\n return options.billingStorage;\n }\n const configured = billingStorageFromConfig(\n configuredDatabase,\n options.billingStorage,\n );\n if (\n options.billingStorage &&\n (options.billingStorage.adapterType !== configured.adapterType ||\n effectiveWriteStrategy(options.billingStorage) !==\n effectiveWriteStrategy(configured))\n ) {\n throw new CommercialBillingStorageConfigurationError(\n 'Commercial billingStorage must match the configured database adapter and write strategy.',\n );\n }\n return configured;\n}\n\nfunction normalizedCommercialClassOptions(\n options: CommercialUsageServiceOptions,\n billingStorage: CommercialBillingStorage,\n): SmrtClassOptions {\n const { billingStorage: _billingStorage, ...classOptions } = options;\n const configuredDatabase = options.db ?? options.persistence;\n if (configuredDatabase && !isDatabaseInterface(configuredDatabase)) {\n const normalizedDatabase =\n typeof configuredDatabase === 'string'\n ? {\n type: billingStorage.adapterType,\n url: configuredDatabase,\n writeStrategy: billingStorage.writeStrategy,\n }\n : {\n ...configuredDatabase,\n type: billingStorage.adapterType,\n writeStrategy: billingStorage.writeStrategy,\n };\n if (options.db !== undefined) classOptions.db = normalizedDatabase;\n else classOptions.persistence = normalizedDatabase;\n }\n return classOptions;\n}\n\ninterface ResellerCollections {\n books: PriceBookCollection;\n assignments: PriceBookAssignmentCollection;\n retailCharges: RetailChargeCollection;\n}\n\nexport class CommercialUsageService {\n private readonly customStrategies = new Map<string, CustomPricingStrategy>();\n private resellerCollections?: Promise<ResellerCollections>;\n constructor(\n private readonly usage: TenantUsageMetricCollection,\n private readonly rules: PricingRuleCollection,\n private readonly charges: ClientChargeCollection,\n private readonly adjustments: BillingAdjustmentCollection,\n private readonly billingStorage: CommercialBillingStorage,\n ) {\n if (!billingStorage) {\n throw new CommercialBillingStorageConfigurationError();\n }\n assertCommercialBillingStorageSupported(billingStorage);\n }\n\n static async create(\n options: CommercialUsageServiceOptions = {},\n ): Promise<CommercialUsageService> {\n const optionSnapshot = snapshotCommercialUsageServiceOptions(options);\n const billingStorage = resolveCommercialBillingStorage(optionSnapshot);\n assertCommercialBillingStorageSupported(billingStorage);\n const classOptions = normalizedCommercialClassOptions(\n optionSnapshot,\n billingStorage,\n );\n const usage = await TenantUsageMetricCollection.create(classOptions);\n const sharedOptions = { ...classOptions, db: usage.db };\n return new CommercialUsageService(\n usage,\n await PricingRuleCollection.create(sharedOptions),\n await ClientChargeCollection.create(sharedOptions),\n await BillingAdjustmentCollection.create(sharedOptions),\n billingStorage,\n );\n }\n\n registerCustomStrategy(key: string, strategy: CustomPricingStrategy): void {\n this.customStrategies.set(key, strategy);\n }\n\n async record(options: RecordUsageOptions) {\n return this.usage.recordUsage(options);\n }\n\n async price(options: PriceUsageOptions): Promise<ClientCharge> {\n const existing = await this.charges.list({\n where: { usageEventId: options.usageEventId },\n limit: 1,\n });\n if (existing[0]) {\n return this.approveCharge(existing[0], options.approved);\n }\n const usage = await this.usage.get(options.usageEventId);\n if (!usage)\n throw new Error(`Usage event ${options.usageEventId} was not found.`);\n const at = options.at ?? usage.windowStart;\n const dimensions = usage.getDimensions();\n const rules = await this.rules.list({\n where: {\n tenantId: usage.tenantId,\n metricKey: usage.metricKey,\n active: true,\n },\n });\n // Price-book rules are published by a seller for rateUsage(); they are\n // never a tenant's own direct pricing.\n const rule = selectRule(\n rules.filter((candidate) => !candidate.priceBookId),\n at,\n String(dimensions.serviceKey ?? ''),\n );\n if (!rule)\n throw new Error(\n `No effective pricing rule for metric '${usage.metricKey}'.`,\n );\n if (!usage.id)\n throw new Error(\n `Usage event ${options.usageEventId} has no persisted id.`,\n );\n if (!rule.id)\n throw new Error(`Pricing rule '${rule.ruleKey}' has no persisted id.`);\n const amount = await this.calculateAmount(rule, usage.quantity, dimensions);\n const chargeId = await deterministicUuid([\n 'client-charge',\n String(usage.tenantId),\n String(usage.id),\n ]);\n try {\n return await this.charges.create({\n id: chargeId,\n tenantId: usage.tenantId,\n usageEventId: String(usage.id),\n usageTenantId: usage.tenantId,\n subscriberKind: usage.subscriberKind,\n subscriberExternalId: usage.subscriberExternalId,\n projectId: usage.projectId,\n workRefType: usage.workRefType,\n workRefId: usage.workRefId,\n provider: usage.provider,\n serviceKey: String(dimensions.serviceKey ?? ''),\n metricKey: usage.metricKey,\n quantity: usage.quantity,\n amount,\n currency: rule.currency,\n pricingRuleId: String(rule.id),\n pricingSnapshot: JSON.stringify({\n ruleKey: rule.ruleKey,\n strategy: rule.strategy,\n terms: rule.getTerms(),\n effectiveFrom: rule.effectiveFrom,\n }),\n status: options.approved ? 'approved' : 'draft',\n approvedAt: options.approved ? new Date() : null,\n _insertOnly: true,\n });\n } catch (error) {\n const concurrent = await this.charges.get(chargeId);\n if (!concurrent) throw error;\n return this.approveCharge(concurrent, options.approved);\n }\n }\n\n /**\n * Rate one usage event under its billing owner's price books (#3059).\n *\n * - No reseller relationship, or a `self`-billed one: the usage tenant pays\n * the provider directly, priced exactly as {@link price} prices it.\n * - `reseller`-billed: the reseller pays the provider from the child's\n * assigned wholesale book (a {@link ClientCharge} with `tenantId` = the\n * reseller and `usageTenantId` = the child) and, when the child has a\n * retail book assigned, the child owes the reseller a\n * {@link RetailCharge}. Both records commit in one transaction.\n *\n * Rating is idempotent per usage event and frozen at first rating: a later\n * billing-owner change never re-prices or double-charges an event that\n * already has a provider charge, because `ClientCharge` holds exactly one\n * row per usage event.\n *\n * Rating reads the seller's books across tenants; run it where the host's\n * tenancy rules allow that (typically a system context).\n */\n async rateUsage(options: RateUsageOptions): Promise<UsageRating> {\n const { retailCharges } = await this.getResellerCollections();\n const existing = await this.charges.list({\n where: { usageEventId: options.usageEventId },\n limit: 1,\n });\n if (existing[0]) {\n return this.frozenRating(existing[0], retailCharges, options.approved);\n }\n const usage = await this.usage.get(options.usageEventId);\n if (!usage)\n throw new Error(`Usage event ${options.usageEventId} was not found.`);\n if (!usage.id || !usage.tenantId)\n throw new Error(\n `Usage event ${options.usageEventId} has no persisted tenant id.`,\n );\n const relationship = await options.billingRelationships.getRelationship(\n usage.tenantId,\n );\n if (relationship?.billingOwnerMode !== 'reseller') {\n const charge = await this.price(options);\n return this.frozenRating(charge, retailCharges, options.approved);\n }\n let failure: unknown;\n try {\n await this.rateResellerBilled(usage, relationship, options);\n } catch (error) {\n failure = error;\n }\n // Return root-bound records (never the committed transaction's handles).\n // After a failure, a concurrent rating of the same event may have won the\n // one-row-per-event insert; its transaction wrote the complete rating.\n const rated = await this.charges.list({\n where: { usageEventId: String(usage.id) },\n limit: 1,\n });\n if (!rated[0]) throw failure ?? new Error('Rating was not persisted.');\n return this.frozenRating(rated[0], retailCharges, options.approved);\n }\n\n private async rateResellerBilled(\n usage: TenantUsageMetric,\n relationship: BillingRelationshipView,\n options: RateUsageOptions,\n ): Promise<UsageRating> {\n const { books, assignments } = await this.getResellerCollections();\n const childTenantId = relationship.childTenantId;\n const resellerTenantId = relationship.resellerTenantId;\n const assignment = await assignments.get({ childTenantId });\n if (\n !assignment?.wholesalePriceBookId ||\n tenantKey(assignment.resellerTenantId) !== resellerTenantId\n ) {\n throw new ResellerBillingError(\n `No wholesale price book is assigned to tenant ${childTenantId} under reseller ${resellerTenantId}.`,\n 'PRICE_BOOK_NOT_ASSIGNED',\n );\n }\n const at = options.at ?? usage.windowStart;\n const dimensions = usage.getDimensions();\n const serviceKey = String(dimensions.serviceKey ?? '');\n const wholesaleBook = await loadBook(\n books,\n assignment.wholesalePriceBookId,\n 'wholesale',\n );\n assertWholesalePublisher(wholesaleBook, resellerTenantId, childTenantId);\n const wholesaleRule = await this.selectBookRule(\n wholesaleBook,\n usage.metricKey,\n serviceKey,\n assignment.wholesaleCurrency,\n at,\n );\n let retail: { book: PriceBook; rule: PricingRule } | null = null;\n if (assignment.retailPriceBookId) {\n const retailBook = await loadBook(\n books,\n assignment.retailPriceBookId,\n 'retail',\n );\n if (tenantKey(retailBook.tenantId) !== resellerTenantId) {\n throw new ResellerBillingError(\n `Retail price book '${retailBook.bookKey}' is not published by reseller ${resellerTenantId}.`,\n 'PRICE_BOOK_OWNER_MISMATCH',\n );\n }\n retail = {\n book: retailBook,\n rule: await this.selectBookRule(\n retailBook,\n usage.metricKey,\n serviceKey,\n assignment.retailCurrency,\n at,\n ),\n };\n }\n const wholesaleAmount = await this.calculateAmount(\n wholesaleRule,\n usage.quantity,\n dimensions,\n );\n const retailAmount = retail\n ? await this.calculateAmount(retail.rule, usage.quantity, dimensions)\n : 0;\n const usageEventId = String(usage.id);\n const chargeId = await deterministicUuid([\n 'client-charge',\n String(usage.tenantId),\n usageEventId,\n ]);\n const retailChargeId = await deterministicUuid([\n 'retail-charge',\n String(usage.tenantId),\n usageEventId,\n ]);\n const approvedAt = options.approved ? new Date() : null;\n const status = options.approved ? 'approved' : 'draft';\n const usageColumns = {\n usageEventId,\n subscriberKind: usage.subscriberKind,\n subscriberExternalId: usage.subscriberExternalId,\n projectId: usage.projectId,\n workRefType: usage.workRefType,\n workRefId: usage.workRefId,\n provider: usage.provider,\n serviceKey,\n metricKey: usage.metricKey,\n quantity: usage.quantity,\n };\n const snapshot = (book: PriceBook, rule: PricingRule) =>\n JSON.stringify({\n ruleKey: rule.ruleKey,\n strategy: rule.strategy,\n terms: rule.getTerms(),\n effectiveFrom: rule.effectiveFrom,\n priceBookKey: book.bookKey,\n priceBookKind: book.kind,\n usageTenantId: childTenantId,\n billingOwnerTenantId: resellerTenantId,\n });\n const db = this.charges.db;\n return withEmbeddedWriteTransaction(\n db,\n isEmbeddedDatabase(db),\n async (transaction) => {\n const charges = await ClientChargeCollection.create({\n db: transaction,\n });\n const retailCharges = await RetailChargeCollection.create({\n db: transaction,\n });\n const charge = await charges.create({\n id: chargeId,\n tenantId: resellerTenantId,\n usageTenantId: childTenantId,\n ...usageColumns,\n amount: wholesaleAmount,\n currency: wholesaleRule.currency,\n pricingRuleId: String(wholesaleRule.id),\n priceBookId: String(wholesaleBook.id),\n pricingSnapshot: snapshot(wholesaleBook, wholesaleRule),\n status,\n approvedAt,\n _insertOnly: true,\n });\n const retailCharge = retail\n ? await retailCharges.create({\n id: retailChargeId,\n tenantId: childTenantId,\n resellerTenantId,\n clientChargeId: chargeId,\n ...usageColumns,\n amount: retailAmount,\n currency: retail.rule.currency,\n priceBookId: String(retail.book.id),\n pricingRuleId: String(retail.rule.id),\n pricingSnapshot: snapshot(retail.book, retail.rule),\n status,\n approvedAt,\n _insertOnly: true,\n })\n : null;\n return {\n usageTenantId: childTenantId,\n billingOwnerTenantId: resellerTenantId,\n mode: 'wholesale' as const,\n charge,\n retailCharge,\n };\n },\n );\n }\n\n private async selectBookRule(\n book: PriceBook,\n metricKey: string,\n serviceKey: string,\n currency: string,\n at: Date,\n ): Promise<PricingRule> {\n const rules = await this.rules.list({\n where: {\n tenantId: book.tenantId,\n priceBookId: book.id,\n metricKey,\n currency,\n active: true,\n },\n });\n const rule = selectRule(\n // The owner check keeps a rule filed under someone else's book (the\n // rules API is tenant-writable) from pricing that book.\n rules.filter(\n (candidate) =>\n candidate.priceBookId === book.id &&\n candidate.tenantId === book.tenantId &&\n candidate.currency === currency,\n ),\n at,\n serviceKey,\n );\n if (!rule?.id) {\n throw new ResellerBillingError(\n `Price book '${book.bookKey}' has no effective ${currency} price for metric '${metricKey}'.`,\n 'NO_EFFECTIVE_PRICE',\n );\n }\n return rule;\n }\n\n private async frozenRating(\n charge: ClientCharge,\n retailCharges: RetailChargeCollection,\n approved = false,\n ): Promise<UsageRating> {\n const retail = await retailCharges.list({\n where: { usageEventId: charge.usageEventId },\n limit: 1,\n });\n let providerCharge = charge;\n let retailCharge: RetailCharge | null = retail[0] ?? null;\n if (\n approved &&\n (providerCharge.status === 'draft' || retailCharge?.status === 'draft')\n ) {\n // Approve both legs in one transaction so they never disagree.\n const db = this.charges.db;\n [providerCharge, retailCharge] = await withEmbeddedWriteTransaction(\n db,\n isEmbeddedDatabase(db),\n async (transaction) => {\n const charges = await ClientChargeCollection.create({\n db: transaction,\n });\n const retails = await RetailChargeCollection.create({\n db: transaction,\n });\n const provider = await charges.get(String(charge.id));\n if (!provider) {\n throw new Error(`Client charge ${charge.id} was not found.`);\n }\n const leg = retailCharge\n ? await retails.get(String(retailCharge.id))\n : null;\n const approvedAt = new Date();\n if (provider.status === 'draft') {\n provider.status = 'approved';\n provider.approvedAt = approvedAt;\n await provider.save();\n }\n if (leg?.status === 'draft') {\n leg.status = 'approved';\n leg.approvedAt = approvedAt;\n await leg.save();\n }\n return [provider, leg ?? null] as const;\n },\n );\n // Hand back root-bound records, not the committed transaction's.\n providerCharge = (await this.charges.get(String(charge.id))) ?? charge;\n retailCharge = retailCharge?.id\n ? ((await retailCharges.get(String(retailCharge.id))) ?? null)\n : null;\n }\n return {\n usageTenantId:\n tenantKey(providerCharge.usageTenantId) ||\n tenantKey(providerCharge.tenantId),\n billingOwnerTenantId: tenantKey(providerCharge.tenantId),\n mode: providerCharge.priceBookId ? 'wholesale' : 'direct',\n charge: providerCharge,\n retailCharge,\n };\n }\n\n private getResellerCollections(): Promise<ResellerCollections> {\n this.resellerCollections ??= (async () => {\n const options = { db: this.charges.db };\n return {\n books: await PriceBookCollection.create(options),\n assignments: await PriceBookAssignmentCollection.create(options),\n retailCharges: await RetailChargeCollection.create(options),\n };\n })();\n this.resellerCollections.catch(() => {\n this.resellerCollections = undefined;\n });\n return this.resellerCollections;\n }\n\n private async approveCharge(\n charge: ClientCharge,\n approved = false,\n ): Promise<ClientCharge> {\n if (approved && charge.status === 'draft') {\n charge.status = 'approved';\n charge.approvedAt = new Date();\n await charge.save();\n }\n return charge;\n }\n\n /**\n * Append a signed correction to an approved charge.\n *\n * @param amount - Signed correction in **integer minor units**, same unit as\n * the charge (#2401). Negative is legitimate — that is a credit. A\n * fractional value is rejected rather than silently rounded, because it\n * almost always means the caller passed major units.\n */\n async adjust(\n chargeId: string,\n amount: number,\n reason: string,\n source = '',\n sourceId = '',\n ) {\n if (!Number.isInteger(amount)) {\n throw new Error(\n `Billing adjustment amount must be an integer number of minor units ` +\n `(cents) — got ${amount}. Money is exact: -$0.25 is -25, not -0.25.`,\n );\n }\n const sourced = Boolean(source && sourceId);\n return withEmbeddedSourcedAdjustmentLock(\n this.charges.db,\n this.billingStorage,\n sourced,\n () => this.adjustWithinLock(chargeId, amount, reason, source, sourceId),\n );\n }\n\n private async adjustWithinLock(\n chargeId: string,\n amount: number,\n reason: string,\n source: string,\n sourceId: string,\n ) {\n const initialCharge = await this.charges.get(chargeId);\n if (!initialCharge)\n throw new Error(`Client charge ${chargeId} was not found.`);\n if (\n initialCharge.status !== 'approved' &&\n initialCharge.status !== 'adjusted'\n ) {\n throw new Error(\n `Client charge ${chargeId} must be approved before it can be adjusted.`,\n );\n }\n const sourcedId =\n source && sourceId\n ? await deterministicUuid([\n 'billing-adjustment',\n String(initialCharge.tenantId),\n chargeId,\n source,\n sourceId,\n ])\n : null;\n const db = this.charges.db;\n if (!db.transaction) {\n throw new Error('Atomic billing adjustment requires transaction support');\n }\n try {\n return await withEmbeddedWriteTransaction(\n db,\n isEmbeddedDatabase(db),\n async (transaction) => {\n const options = { db: transaction };\n const charges = await ClientChargeCollection.create(options);\n const adjustments = await BillingAdjustmentCollection.create(options);\n const charge = await charges.get(chargeId);\n if (!charge)\n throw new Error(`Client charge ${chargeId} was not found.`);\n if (charge.status !== 'approved' && charge.status !== 'adjusted') {\n throw new Error(\n `Client charge ${chargeId} must be approved before it can be adjusted.`,\n );\n }\n let adjustment = sourcedId\n ? await adjustments.get(sourcedId)\n : undefined;\n if (!adjustment) {\n adjustment = await adjustments.create({\n ...(sourcedId ? { id: sourcedId } : {}),\n tenantId: charge.tenantId,\n clientChargeId: chargeId,\n amount,\n currency: charge.currency,\n reason,\n source,\n sourceId,\n _insertOnly: Boolean(sourcedId),\n });\n }\n if (charge.status === 'approved') {\n charge.status = 'adjusted';\n await charge.save();\n }\n return adjustment;\n },\n );\n } catch (error) {\n // A concurrent sourced adjustment may win the deterministic insert. Its\n // transaction also owns the charge-state transition, so it is safe to\n // return only after both durable records are visible.\n if (sourcedId) {\n // Embedded adapters multiplex one native handle. Keep recovery reads\n // sequential just like the transaction flow protected above.\n const adjustment = await this.adjustments.get(sourcedId);\n const charge = await this.charges.get(chargeId);\n if (adjustment && charge?.status === 'adjusted') return adjustment;\n }\n throw error;\n }\n }\n\n /**\n * Price one usage event, in **integer minor units** (#2401).\n *\n * The pricing terms stay fractional on purpose — a per-token rate is\n * routinely a fraction of a cent, and an integer `unitPrice` would truncate\n * it to zero — so terms are read as *minor units per unit of usage* and only\n * the result is rounded. This is the single boundary in the package where a\n * rate meets money, which is what lets `evaluateSpending()` compare sums\n * against `SpendingPolicy.limitAmount` exactly.\n *\n * Replaces the old micro-unit rounding (`Math.round(amount * 1e6) / 1e6`),\n * which kept six sub-cent digits in a column that is now integral.\n */\n async calculateAmount(\n rule: PricingRule,\n quantity: number,\n dimensions: Record<string, unknown> = {},\n ): Promise<number> {\n const terms = rule.getTerms();\n const number = (key: string, fallback = 0) =>\n Number(terms[key] ?? fallback);\n let amount: number;\n switch (rule.strategy as PricingStrategy) {\n case 'fixed_unit':\n amount = quantity * number('unitPrice');\n break;\n case 'cost_plus':\n amount =\n Number(dimensions.providerCost ?? 0) +\n number('fixedMarkup') +\n Number(dimensions.providerCost ?? 0) * number('markupRatio');\n break;\n case 'multiplier':\n amount =\n Number(dimensions.providerCost ?? quantity) * number('multiplier', 1);\n break;\n case 'flat':\n amount = number('amount');\n break;\n case 'included_overage':\n amount =\n Math.max(0, quantity - number('includedQuantity')) *\n number('overageUnitPrice');\n break;\n case 'tiered':\n amount = priceTiers(\n quantity,\n Array.isArray(terms.tiers) ? terms.tiers : [],\n );\n break;\n case 'custom': {\n const custom = this.customStrategies.get(\n String(terms.strategyKey ?? ''),\n );\n if (!custom)\n throw new Error(\n `Custom pricing strategy '${String(terms.strategyKey ?? '')}' is not registered.`,\n );\n amount = await custom({ usage: { quantity, dimensions }, rule, terms });\n break;\n }\n }\n if (!Number.isFinite(amount) || amount < 0)\n throw new Error('Pricing produced an invalid amount.');\n return Math.round(amount);\n }\n}\n\nexport interface SpendingDecision {\n allowed: boolean;\n approvalRequired: boolean;\n state: 'ok' | 'observed' | 'warned' | 'blocked' | 'approval_required';\n /**\n * Already-spent plus estimated, in **integer minor units** — the same unit as\n * `SpendingPolicy.limitAmount` it is compared against (#2401).\n */\n projectedAmount: number;\n matchedPolicyId: string | null;\n /**\n * For a prepaid `balance` policy: credit remaining before this estimate\n * (grants minus spend), in integer minor units. Absent for other periods.\n */\n balanceAmount?: number;\n}\n\nexport interface SpendingEvaluationInput {\n tenantId: string;\n subscriberKind?: SubscriberKind;\n subscriberExternalId?: string;\n projectId?: string;\n serviceKey?: string;\n metricKey: string;\n /** Estimated cost of the pending call, in integer minor units (#2401). */\n estimatedAmount: number;\n /**\n * Per-basis estimates, in integer minor units, for policies whose basis\n * prices the call differently (a retail estimate for `retail` policies, a\n * wholesale estimate for `wholesale` ones). Falls back to\n * {@link estimatedAmount}.\n */\n estimatedAmounts?: Partial<Record<SpendingBasis, number>>;\n currency: string;\n at?: Date;\n}\n\n/** Context handed to an {@link AutoTopUpHook} when a balance would run out. */\nexport interface AutoTopUpRequest {\n policyId: string;\n tenantId: string;\n /** The parent that set the policy, or empty for the tenant's own policy. */\n setByTenantId: string;\n currency: string;\n /** Credit remaining before the estimate, in integer minor units. */\n balanceAmount: number;\n estimatedAmount: number;\n /** How far the estimate overshoots the balance, in integer minor units. */\n shortfall: number;\n /**\n * Recompute the shortfall against the credit and spend recorded now. A\n * hook that secures funds asynchronously calls it before charging: a\n * concurrent evaluation may have topped the balance up since this one read\n * it, and the evaluator re-reads the credit after the hook returns.\n */\n currentShortfall?: () => Promise<number>;\n}\n\n/**\n * A top-up the hook has secured. `sourceId` makes it idempotent: the same\n * `source`/`sourceId` pair is credited once however often it is returned.\n */\nexport interface AutoTopUpGrant {\n amount: number;\n sourceId: string;\n source?: string;\n reason?: string;\n}\n\n/**\n * Host hook for prepaid balances. Called when a pending charge would exhaust a\n * `balance` policy; return a grant to credit it (after the host has secured\n * the funds) or nothing to let the policy's behavior apply. The evaluator\n * never calls a payment provider itself, and re-reads the balance after the\n * hook returns either way, so credit granted meanwhile by another path counts.\n */\nexport type AutoTopUpHook = (\n request: AutoTopUpRequest,\n) =>\n | AutoTopUpGrant\n | null\n | undefined\n | Promise<AutoTopUpGrant | null | undefined>;\n\nexport interface SpendingPolicyEvaluatorOptions extends SmrtClassOptions {\n autoTopUp?: AutoTopUpHook;\n /**\n * The smrt-tenancy relationship reader. When supplied, a delegated policy\n * applies only while its `setByTenantId` is the tenant's current reseller;\n * without it every delegated policy applies (fail closed).\n */\n billingRelationships?: BillingRelationshipReader;\n}\n\nexport interface GrantCreditInput {\n spendingPolicyId: string;\n /** Signed, nonzero credit in integer minor units of the policy currency. */\n amount: number;\n reason?: string;\n /** With `sourceId`, makes the grant idempotent (a payment or order id). */\n source?: string;\n sourceId?: string;\n /** The parent granting credit on its child's delegated policy. */\n grantedByTenantId?: string;\n}\n\nexport interface SpendingPolicyEvaluatorExtensions {\n retailCharges?: RetailChargeCollection;\n credits?: CreditGrantCollection;\n autoTopUp?: AutoTopUpHook;\n billingRelationships?: BillingRelationshipReader;\n}\n\ninterface LedgerRow {\n id?: string | null;\n amount: number;\n status: string;\n projectId: string;\n serviceKey: string;\n metricKey: string;\n subscriberKind: string;\n subscriberExternalId: string;\n}\n\nexport class SpendingPolicyEvaluator {\n private ledgers?: Promise<{\n retailCharges: RetailChargeCollection;\n credits: CreditGrantCollection;\n }>;\n constructor(\n private readonly policies: SpendingPolicyCollection,\n private readonly charges: ClientChargeCollection,\n private readonly adjustments: BillingAdjustmentCollection,\n private readonly extensions: SpendingPolicyEvaluatorExtensions = {},\n ) {}\n static async create(options: SpendingPolicyEvaluatorOptions = {}) {\n const { autoTopUp, billingRelationships, ...classOptions } = options;\n const policies = await SpendingPolicyCollection.create(classOptions);\n const sharedOptions = { ...classOptions, db: policies.db };\n return new SpendingPolicyEvaluator(\n policies,\n await ClientChargeCollection.create(sharedOptions),\n await BillingAdjustmentCollection.create(sharedOptions),\n {\n retailCharges: await RetailChargeCollection.create(sharedOptions),\n credits: await CreditGrantCollection.create(sharedOptions),\n autoTopUp,\n billingRelationships,\n },\n );\n }\n\n async evaluate(input: SpendingEvaluationInput): Promise<SpendingDecision> {\n const at = input.at ?? new Date();\n const normalizedInput = {\n ...input,\n ...subscriberToColumns(\n normalizeSubscriber({\n tenantId: input.tenantId,\n subscriberKind: input.subscriberKind,\n subscriberExternalId: input.subscriberExternalId,\n }),\n ),\n };\n const candidates = await this.policies.list({\n where: {\n tenantId: input.tenantId,\n currency: input.currency,\n active: true,\n },\n });\n const matchingPolicies = await this.withoutStaleDelegations(\n input.tenantId,\n selectPolicies(candidates, normalizedInput),\n );\n if (matchingPolicies.length === 0)\n return {\n allowed: true,\n approvalRequired: false,\n state: 'ok',\n projectedAmount: input.estimatedAmount,\n matchedPolicyId: null,\n };\n const decisions = await Promise.all(\n matchingPolicies.map((policy) =>\n this.evaluatePolicy(policy, normalizedInput, at),\n ),\n );\n return decisions.reduce((mostRestrictive, decision) =>\n decisionRank(decision) > decisionRank(mostRestrictive)\n ? decision\n : mostRestrictive,\n );\n }\n\n /**\n * Drop delegated policies whose parent is no longer the tenant's reseller,\n * when a relationship reader is configured.\n */\n private async withoutStaleDelegations(\n tenantId: string,\n policies: SpendingPolicy[],\n ): Promise<SpendingPolicy[]> {\n const reader = this.extensions.billingRelationships;\n if (!reader || !policies.some((policy) => tenantKey(policy.setByTenantId)))\n return policies;\n const relationship = await reader.getRelationship(tenantId);\n const currentParent = tenantKey(relationship?.resellerTenantId);\n return policies.filter((policy) => {\n const setBy = tenantKey(policy.setByTenantId);\n return !setBy || setBy === currentParent;\n });\n }\n\n /**\n * Credit a prepaid `balance` policy. A delegated policy accepts grants only\n * from the parent that set it (or a system context / super-admin bypass).\n */\n async grantCredit(input: GrantCreditInput): Promise<CreditGrant> {\n const policy = await this.policies.get(input.spendingPolicyId);\n if (!policy?.id) {\n throw new ResellerBillingError(\n `Spending policy ${input.spendingPolicyId} was not found.`,\n 'POLICY_NOT_FOUND',\n );\n }\n const setBy = tenantKey(policy.setByTenantId);\n if (\n setBy &&\n !isSystemContext() &&\n !isSuperAdminBypass() &&\n getTenantId()?.toLowerCase() !== setBy\n ) {\n throw new TenantIsolationError(\n 'Only the parent that set a delegated policy can grant it credit.',\n );\n }\n if (\n input.grantedByTenantId &&\n setBy &&\n tenantKey(input.grantedByTenantId) !== setBy\n ) {\n throw new TenantIsolationError(\n 'Delegated policy credit must be granted by the parent that set it.',\n );\n }\n return this.recordGrant(policy, {\n ...input,\n grantedByTenantId: input.grantedByTenantId || setBy,\n });\n }\n\n private async recordGrant(\n policy: SpendingPolicy,\n input: GrantCreditInput,\n ): Promise<CreditGrant> {\n if (policy.period !== 'balance') {\n throw new ResellerBillingError(\n `Spending policy '${policy.name}' is not a balance policy.`,\n 'POLICY_NOT_BALANCE',\n );\n }\n if (!Number.isSafeInteger(input.amount) || input.amount === 0) {\n throw new ResellerBillingError(\n `Credit amount must be a nonzero integer number of minor units — got ${input.amount}.`,\n 'INVALID_AMOUNT',\n );\n }\n const { credits } = await this.getLedgers();\n const source = input.source ?? '';\n const sourceId = input.sourceId ?? '';\n const id =\n source && sourceId\n ? await deterministicUuid([\n 'credit-grant',\n String(policy.tenantId),\n String(policy.id),\n source,\n sourceId,\n ])\n : undefined;\n if (id) {\n const existing = await credits.get(id);\n if (existing) return existing;\n }\n try {\n return await credits.create({\n ...(id ? { id } : {}),\n tenantId: policy.tenantId,\n spendingPolicyId: String(policy.id),\n amount: input.amount,\n currency: policy.currency,\n reason: input.reason ?? '',\n source,\n sourceId,\n grantedByTenantId: input.grantedByTenantId ?? '',\n _insertOnly: Boolean(id),\n });\n } catch (error) {\n const concurrent = id ? await credits.get(id) : undefined;\n if (concurrent) return concurrent;\n throw error;\n }\n }\n\n private async evaluatePolicy(\n policy: SpendingPolicy,\n input: SpendingEvaluationInput,\n at: Date,\n ): Promise<SpendingDecision> {\n const estimatedAmount =\n input.estimatedAmounts?.[policy.basis] ?? input.estimatedAmount;\n const [start, end] = policyWindow(policy, at);\n const spent = await this.spentFor(policy, input.tenantId, start, end);\n if (policy.period !== 'balance') {\n return decide(policy, spent + estimatedAmount, policy.limitAmount);\n }\n let credit = await this.creditFor(policy);\n const projectedAmount = spent + estimatedAmount;\n const policyId = policy.id;\n if (projectedAmount > credit && this.extensions.autoTopUp && policyId) {\n const grant = await this.extensions.autoTopUp({\n policyId,\n tenantId: String(policy.tenantId),\n setByTenantId: tenantKey(policy.setByTenantId),\n currency: policy.currency,\n balanceAmount: credit - spent,\n estimatedAmount,\n shortfall: projectedAmount - credit,\n currentShortfall: async () =>\n (await this.spentFor(policy, input.tenantId, start, end)) +\n estimatedAmount -\n (await this.creditFor(policy)),\n });\n if (grant) {\n // The hook is host code configured on this evaluator; its grant is\n // recorded with the policy's own grantor even when evaluation runs in\n // the constrained child's tenant context.\n await withSystemContext(() =>\n this.recordGrant(policy, {\n spendingPolicyId: policyId,\n amount: grant.amount,\n reason: grant.reason ?? 'auto top-up',\n source: grant.source ?? 'auto_top_up',\n sourceId: grant.sourceId,\n grantedByTenantId: tenantKey(policy.setByTenantId),\n }),\n );\n }\n // Re-read either way: a concurrent top-up may have landed.\n credit = await this.creditFor(policy);\n }\n return {\n ...decide(policy, projectedAmount, credit),\n balanceAmount: credit - spent,\n };\n }\n\n /** Approved spend in the policy's window, currency, scope, and basis. */\n private async spentFor(\n policy: SpendingPolicy,\n tenantId: string,\n start: Date,\n end: Date,\n ): Promise<number> {\n const scope: Record<string, unknown> = {\n currency: policy.currency,\n 'approvedAt >=': start.toISOString(),\n 'approvedAt <': end.toISOString(),\n };\n if (policy.metricKey) scope.metricKey = policy.metricKey;\n if (policy.projectId) scope.projectId = policy.projectId;\n if (policy.serviceKey) scope.serviceKey = policy.serviceKey;\n if (policy.subscriberKind) scope.subscriberKind = policy.subscriberKind;\n if (policy.subscriberExternalId)\n scope.subscriberExternalId = policy.subscriberExternalId;\n\n const setBy = tenantKey(policy.setByTenantId);\n if (policy.basis === 'retail') {\n const { retailCharges } = await this.getLedgers();\n const where: Record<string, unknown> = {\n ...scope,\n tenantId,\n status: 'approved',\n };\n // A parent's cap counts only what the child owes that parent.\n if (setBy) where.resellerTenantId = setBy;\n const rows = await retailCharges.list({ where });\n return sumScoped(\n policy,\n rows.filter(\n (row) => !setBy || tenantKey(row.resellerTenantId) === setBy,\n ),\n ['approved'],\n );\n }\n\n if (policy.basis === 'wholesale') {\n if (!setBy) return 0;\n // Reviewed cross-tenant read: the parent's provider charges for this\n // child's usage, bounded to (payer = setBy, usageTenantId = tenant) and\n // reduced to a sum, so a child-context evaluation can enforce its\n // parent's wholesale cap without reading the parent's other rows.\n return withSystemContext(() =>\n this.sumProviderCharges(policy, scope, setBy, tenantId),\n );\n }\n return this.sumProviderCharges(policy, scope, tenantId);\n }\n\n private async sumProviderCharges(\n policy: SpendingPolicy,\n scope: Record<string, unknown>,\n payer: string,\n usageTenantId?: string,\n ): Promise<number> {\n const where: Record<string, unknown> = {\n ...scope,\n tenantId: payer,\n status: ['approved', 'adjusted'],\n };\n if (usageTenantId) where.usageTenantId = usageTenantId;\n const rows = await this.charges.list({ where });\n const scopedCharges = rows.filter(\n (charge) =>\n (!usageTenantId ||\n tenantKey(charge.usageTenantId) === tenantKey(usageTenantId)) &&\n (charge.status === 'approved' || charge.status === 'adjusted') &&\n matchesChargeScope(policy, charge),\n );\n const chargeIds = scopedCharges\n .map((charge) => charge.id)\n .filter((id): id is string => Boolean(id));\n const chargeIdSet = new Set(chargeIds);\n const adjustmentRows =\n chargeIds.length > 0\n ? await this.adjustments.list({\n where: {\n tenantId: payer,\n currency: policy.currency,\n clientChargeId: chargeIds,\n },\n })\n : [];\n const spent = scopedCharges.reduce((sum, charge) => sum + charge.amount, 0);\n return (\n spent +\n adjustmentRows\n .filter((adjustment) => chargeIdSet.has(adjustment.clientChargeId))\n .reduce((sum, adjustment) => sum + adjustment.amount, 0)\n );\n }\n\n private async creditFor(policy: SpendingPolicy): Promise<number> {\n const { credits } = await this.getLedgers();\n const grants = await credits.list({\n where: {\n tenantId: policy.tenantId,\n spendingPolicyId: policy.id,\n currency: policy.currency,\n },\n });\n // A delegated balance holds only credit its current parent granted: when\n // a new parent takes over the policy, a former parent's grants stay with\n // that former relationship instead of funding the new one.\n const setBy = tenantKey(policy.setByTenantId);\n return grants\n .filter(\n (grant) =>\n grant.spendingPolicyId === policy.id &&\n (!setBy || tenantKey(grant.grantedByTenantId) === setBy),\n )\n .reduce((sum, grant) => sum + grant.amount, 0);\n }\n\n private getLedgers(): Promise<{\n retailCharges: RetailChargeCollection;\n credits: CreditGrantCollection;\n }> {\n this.ledgers ??= (async () => {\n const options = { db: this.policies.db };\n return {\n retailCharges:\n this.extensions.retailCharges ??\n (await RetailChargeCollection.create(options)),\n credits:\n this.extensions.credits ??\n (await CreditGrantCollection.create(options)),\n };\n })();\n this.ledgers.catch(() => {\n this.ledgers = undefined;\n });\n return this.ledgers;\n }\n}\n\nfunction decide(\n policy: SpendingPolicy,\n projectedAmount: number,\n limitAmount: number,\n): SpendingDecision {\n const exceeded = projectedAmount > limitAmount;\n const matchedPolicyId = policy.id ?? null;\n if (!exceeded || policy.behavior === 'observe')\n return {\n allowed: true,\n approvalRequired: false,\n state: exceeded ? 'observed' : 'ok',\n projectedAmount,\n matchedPolicyId,\n };\n if (policy.behavior === 'warn')\n return {\n allowed: true,\n approvalRequired: false,\n state: 'warned',\n projectedAmount,\n matchedPolicyId,\n };\n if (policy.behavior === 'approval_required')\n return {\n allowed: false,\n approvalRequired: true,\n state: 'approval_required',\n projectedAmount,\n matchedPolicyId,\n };\n return {\n allowed: false,\n approvalRequired: false,\n state: 'blocked',\n projectedAmount,\n matchedPolicyId,\n };\n}\n\nfunction sumScoped(\n policy: SpendingPolicy,\n rows: LedgerRow[],\n statuses: string[],\n): number {\n return rows\n .filter(\n (row) => statuses.includes(row.status) && matchesChargeScope(policy, row),\n )\n .reduce((sum, row) => sum + row.amount, 0);\n}\n\n/**\n * The provider leg must be priced by someone other than the payer: a reseller\n * (or its child) never publishes the wholesale book it is charged from.\n */\nexport function assertWholesalePublisher(\n book: PriceBook,\n resellerTenantId: string,\n childTenantId: string,\n): void {\n const publisher = tenantKey(book.tenantId);\n if (publisher === resellerTenantId || publisher === childTenantId) {\n throw new ResellerBillingError(\n `Wholesale price book '${book.bookKey}' is published by the tenant it would charge.`,\n 'PRICE_BOOK_OWNER_MISMATCH',\n );\n }\n}\n\nasync function loadBook(\n books: PriceBookCollection,\n id: string,\n kind: PriceBookKind,\n): Promise<PriceBook> {\n const book = await books.get(id);\n if (!book?.id) {\n throw new ResellerBillingError(\n `Price book ${id} was not found.`,\n 'PRICE_BOOK_NOT_FOUND',\n );\n }\n if (book.kind !== kind) {\n throw new ResellerBillingError(\n `Price book '${book.bookKey}' is a ${book.kind} book, not ${kind}.`,\n 'PRICE_BOOK_KIND_MISMATCH',\n );\n }\n if (!book.active) {\n throw new ResellerBillingError(\n `Price book '${book.bookKey}' is inactive.`,\n 'PRICE_BOOK_INACTIVE',\n );\n }\n return book;\n}\n\nfunction selectRule(\n rules: PricingRule[],\n at: Date,\n serviceKey: string,\n): PricingRule | undefined {\n return rules\n .filter(\n (rule) =>\n rule.effectiveFrom <= at &&\n (!rule.effectiveTo || rule.effectiveTo > at) &&\n (!rule.serviceKey || rule.serviceKey === serviceKey),\n )\n .sort(\n (a, b) =>\n Number(Boolean(b.serviceKey)) - Number(Boolean(a.serviceKey)) ||\n b.priority - a.priority ||\n b.effectiveFrom.getTime() - a.effectiveFrom.getTime(),\n )[0];\n}\nfunction priceTiers(quantity: number, tiers: unknown[]): number {\n let remaining = quantity,\n prior = 0,\n amount = 0;\n for (const raw of tiers as Array<Record<string, unknown>>) {\n const upTo = raw.upTo == null ? Infinity : Number(raw.upTo);\n const units = Math.max(0, Math.min(remaining, upTo - prior));\n amount += units * Number(raw.unitPrice ?? 0);\n remaining -= units;\n prior = upTo;\n if (remaining <= 0) break;\n }\n return amount;\n}\nfunction selectPolicies(\n policies: SpendingPolicy[],\n input: Record<string, unknown>,\n): SpendingPolicy[] {\n return policies\n .filter(\n (p) =>\n hasValidSubscriberScope(p) &&\n (!p.metricKey || p.metricKey === input.metricKey) &&\n p.currency === input.currency &&\n (!p.projectId || p.projectId === input.projectId) &&\n (!p.serviceKey || p.serviceKey === input.serviceKey) &&\n (!p.subscriberKind ||\n (p.subscriberKind === (input.subscriberKind ?? 'tenant') &&\n (!p.subscriberExternalId ||\n p.subscriberExternalId === input.subscriberExternalId))),\n )\n .sort((a, b) => scopeScore(b) - scopeScore(a) || b.priority - a.priority);\n}\n\nfunction decisionRank(decision: SpendingDecision): number {\n return {\n ok: 0,\n observed: 1,\n warned: 2,\n approval_required: 3,\n blocked: 4,\n }[decision.state];\n}\nfunction scopeScore(p: SpendingPolicy): number {\n return (\n Number(Boolean(p.subscriberKind)) +\n Number(Boolean(p.subscriberExternalId)) +\n Number(Boolean(p.projectId)) +\n Number(Boolean(p.serviceKey)) +\n Number(Boolean(p.metricKey))\n );\n}\nfunction matchesChargeScope(p: SpendingPolicy, c: LedgerRow): boolean {\n return (\n hasValidSubscriberScope(p) &&\n (!p.projectId || p.projectId === c.projectId) &&\n (!p.serviceKey || p.serviceKey === c.serviceKey) &&\n (!p.metricKey || p.metricKey === c.metricKey) &&\n (!p.subscriberKind ||\n (p.subscriberKind === c.subscriberKind &&\n (!p.subscriberExternalId ||\n p.subscriberExternalId === c.subscriberExternalId)))\n );\n}\nfunction hasValidSubscriberScope(p: SpendingPolicy): boolean {\n return !p.subscriberExternalId || Boolean(p.subscriberKind);\n}\nfunction policyWindow(policy: SpendingPolicy, at: Date): [Date, Date] {\n const end = new Date(at);\n const start = new Date(at);\n if (policy.period === 'balance')\n start.setTime(\n new Date(policy.balanceFrom ?? policy.created_at ?? 0).getTime(),\n );\n else if (policy.period === 'rolling')\n start.setTime(at.getTime() - policy.rollingSeconds * 1000);\n else if (policy.period === 'day') start.setUTCHours(0, 0, 0, 0);\n else if (policy.period === 'week') {\n start.setUTCHours(0, 0, 0, 0);\n start.setUTCDate(start.getUTCDate() - ((start.getUTCDay() + 6) % 7));\n } else if (policy.period === 'month') {\n start.setUTCDate(1);\n start.setUTCHours(0, 0, 0, 0);\n } else {\n start.setUTCMonth(0, 1);\n start.setUTCHours(0, 0, 0, 0);\n }\n return [start, end];\n}\n","/**\n * Reseller price books and parent-delegated spending (#3059).\n *\n * Billing ownership comes from the released smrt-tenancy\n * `BillingRelationshipService`; this service never re-derives it. Rating lives\n * on `CommercialUsageService.rateUsage()`, enforcement on\n * `SpendingPolicyEvaluator` — this service manages the records they read.\n */\nimport {\n isEmbeddedDatabase,\n isPostgresDatabase,\n type SmrtClassOptions,\n withEmbeddedWriteTransaction,\n} from '@happyvertical/smrt-core';\nimport {\n type BillingRelationshipView,\n getTenantId,\n isSuperAdminBypass,\n isSystemContext,\n TenantIsolationError,\n withSystemContext,\n} from '@happyvertical/smrt-tenancy';\nimport {\n BillingAdjustmentCollection,\n ClientChargeCollection,\n type PricingRule,\n PricingRuleCollection,\n type PricingStrategy,\n type SpendingBasis,\n type SpendingPeriod,\n type SpendingPolicy,\n type SpendingPolicyBehavior,\n SpendingPolicyCollection,\n} from '../models/commercial.js';\nimport {\n type CreditGrant,\n CreditGrantCollection,\n isCurrencyCode,\n type PriceBook,\n type PriceBookAssignment,\n PriceBookAssignmentCollection,\n PriceBookCollection,\n type PriceBookKind,\n RetailChargeCollection,\n} from '../models/reseller.js';\nimport type { SubscriberKind } from '../types.js';\nimport { deterministicUuid, tenantKey } from '../utils.js';\nimport {\n assertWholesalePublisher,\n type BillingRelationshipReader,\n SpendingPolicyEvaluator,\n} from './commercial.js';\nimport { ResellerBillingError } from './reseller-errors.js';\n\nexport type ResellerBillingAction =\n | 'define_prices'\n | 'assign_wholesale_price_book'\n | 'assign_retail_price_book'\n | 'manage_child_spending';\n\nexport interface ResellerBillingServiceOptions extends SmrtClassOptions {\n /** The released smrt-tenancy billing relationship reader. */\n billingRelationships: BillingRelationshipReader;\n /**\n * Optional host permission check. Without it, only a system context or a\n * super-admin bypass may mutate reseller billing records, mirroring\n * `BillingRelationshipService`. Once it (or the context) authorizes a call,\n * the service performs that call's writes in a system context, because\n * they span tenants (a parent writes rows owned by its child).\n */\n authorize?: (request: {\n action: ResellerBillingAction;\n /**\n * The tenant whose authority the action exercises: the book's seller for\n * `define_prices` and `assign_wholesale_price_book`, the parent for\n * `assign_retail_price_book` and `manage_child_spending`.\n */\n tenantId: string;\n childTenantId?: string;\n /**\n * For price-book assignments and child spending: the child's current\n * reseller, which pays the wholesale leg. A host must confirm the caller\n * holds `tenantId`'s authority and, for `assign_wholesale_price_book`,\n * that the publisher is a legitimate provider for this reseller — the\n * package can refuse only a payer-published book.\n */\n resellerTenantId?: string;\n }) => Promise<boolean>;\n}\n\nexport interface DefinePriceBookPriceInput {\n priceBookId: string;\n ruleKey: string;\n metricKey: string;\n serviceKey?: string;\n strategy: PricingStrategy;\n effectiveFrom?: Date;\n effectiveTo?: Date | null;\n priority?: number;\n /**\n * One entry per currency. Terms use the same *minor units per unit of usage*\n * convention as any `PricingRule` (#2401).\n */\n prices: Array<{ currency: string; terms: Record<string, unknown> }>;\n}\n\nexport interface PriceBookLeg {\n priceBookId: string;\n /** Currency the leg is charged in; the book needs a price in it. */\n currency: string;\n}\n\nexport interface AssignPriceBooksInput {\n childTenantId: string;\n /** `undefined` keeps the current leg; `null` clears it. */\n wholesale?: PriceBookLeg | null;\n retail?: PriceBookLeg | null;\n}\n\nexport interface PriceBookAssignmentView {\n childTenantId: string;\n resellerTenantId: string;\n wholesale: PriceBookLeg | null;\n retail: PriceBookLeg | null;\n}\n\nexport interface DelegatedSpendingPolicyInput {\n parentTenantId: string;\n childTenantId: string;\n name: string;\n basis: SpendingBasis;\n currency: string;\n behavior: SpendingPolicyBehavior;\n period?: SpendingPeriod;\n rollingSeconds?: number;\n /** Integer minor units; must be 0 (the default) for a `balance` policy. */\n limitAmount?: number;\n metricKey?: string;\n serviceKey?: string;\n projectId?: string;\n subscriberKind?: SubscriberKind | '';\n subscriberExternalId?: string;\n priority?: number;\n active?: boolean;\n balanceFrom?: Date;\n}\n\nexport interface GrantChildCreditInput {\n parentTenantId: string;\n childTenantId: string;\n spendingPolicyId: string;\n /** Signed, nonzero integer minor units of the policy currency. */\n amount: number;\n reason?: string;\n source?: string;\n sourceId?: string;\n}\n\nconst UUID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction canonicalTenantId(id: string): string {\n if (typeof id !== 'string' || !UUID_PATTERN.test(id)) {\n throw new ResellerBillingError(\n 'Tenant IDs must be UUIDs.',\n 'INVALID_TENANT',\n );\n }\n return id.toLowerCase();\n}\n\nfunction assertCurrency(currency: string): void {\n if (!isCurrencyCode(currency)) {\n throw new ResellerBillingError(\n `Currency '${currency}' must be a three-letter upper-case code.`,\n 'INVALID_CURRENCY',\n );\n }\n}\n\nfunction legView(\n priceBookId: string | null | undefined,\n currency: string,\n): PriceBookLeg | null {\n return priceBookId ? { priceBookId: String(priceBookId), currency } : null;\n}\n\nfunction assignmentView(row: PriceBookAssignment): PriceBookAssignmentView {\n return {\n childTenantId: tenantKey(row.childTenantId),\n resellerTenantId: tenantKey(row.resellerTenantId),\n wholesale: legView(row.wholesalePriceBookId, row.wholesaleCurrency),\n retail: legView(row.retailPriceBookId, row.retailCurrency),\n };\n}\n\n/**\n * Run an already-authorized operation in a system context. Only called after\n * `assertManage()` (or for a book metadata read that precedes it).\n */\nfunction authorized<T>(operation: () => Promise<T>): Promise<T> {\n return withSystemContext(operation);\n}\n\n/**\n * Manages price books, their per-relationship assignment, and the spending\n * policies and credits a parent tenant sets on its children.\n */\nexport class ResellerBillingService {\n private constructor(\n private readonly options: ResellerBillingServiceOptions,\n private readonly books: PriceBookCollection,\n private readonly assignments: PriceBookAssignmentCollection,\n private readonly rules: PricingRuleCollection,\n private readonly policies: SpendingPolicyCollection,\n private readonly evaluator: SpendingPolicyEvaluator,\n ) {}\n\n static async create(\n options: ResellerBillingServiceOptions,\n ): Promise<ResellerBillingService> {\n if (typeof options.billingRelationships?.getRelationship !== 'function') {\n throw new Error(\n 'Reseller billing requires a billingRelationships reader from smrt-tenancy.',\n );\n }\n const {\n billingRelationships: _reader,\n authorize: _authorize,\n ...rest\n } = options;\n const books = await PriceBookCollection.create(rest);\n const shared = { ...rest, db: books.db };\n const policies = await SpendingPolicyCollection.create(shared);\n const evaluator = new SpendingPolicyEvaluator(\n policies,\n await ClientChargeCollection.create(shared),\n await BillingAdjustmentCollection.create(shared),\n {\n retailCharges: await RetailChargeCollection.create(shared),\n credits: await CreditGrantCollection.create(shared),\n },\n );\n return new ResellerBillingService(\n options,\n books,\n await PriceBookAssignmentCollection.create(shared),\n await PricingRuleCollection.create(shared),\n policies,\n evaluator,\n );\n }\n\n /**\n * Publish one price in a book, in one or more currencies. Each currency is\n * a `PricingRule` owned by the book's seller; re-defining the same rule key,\n * currency, and effective date replaces that rule's terms.\n */\n async definePrice(input: DefinePriceBookPriceInput): Promise<PricingRule[]> {\n const book = await this.readBook(input.priceBookId);\n const sellerTenantId = canonicalTenantId(String(book.tenantId));\n await this.assertManage('define_prices', sellerTenantId, undefined, true);\n if (!input.ruleKey.trim() || !input.metricKey.trim()) {\n throw new Error('Price book prices require a ruleKey and metricKey.');\n }\n if (input.prices.length === 0) {\n throw new ResellerBillingError(\n 'A price needs at least one currency.',\n 'INVALID_CURRENCY',\n );\n }\n const currencies = new Set<string>();\n for (const { currency } of input.prices) {\n assertCurrency(currency);\n if (currencies.has(currency)) {\n throw new ResellerBillingError(\n `Currency ${currency} is listed twice for one price.`,\n 'INVALID_CURRENCY',\n );\n }\n currencies.add(currency);\n }\n const effectiveFrom = input.effectiveFrom ?? new Date();\n return authorized(async () => {\n const saved: PricingRule[] = [];\n for (const { currency, terms } of input.prices) {\n const id = await deterministicUuid([\n 'price-book-rule',\n String(book.id),\n input.ruleKey,\n input.metricKey,\n input.serviceKey ?? '',\n currency,\n effectiveFrom.toISOString(),\n ]);\n const values = {\n tenantId: book.tenantId,\n priceBookId: String(book.id),\n ruleKey: input.ruleKey,\n metricKey: input.metricKey,\n serviceKey: input.serviceKey ?? '',\n strategy: input.strategy,\n currency,\n effectiveFrom,\n effectiveTo: input.effectiveTo ?? null,\n priority: input.priority ?? 0,\n terms: JSON.stringify(terms),\n active: true,\n };\n const existing = await this.rules.get(id);\n if (existing) {\n Object.assign(existing, values);\n await existing.save();\n saved.push(existing);\n } else {\n saved.push(await this.rules.create({ id, ...values }));\n }\n }\n return saved;\n });\n }\n\n /**\n * Select the wholesale and/or retail book that rates a child's usage under\n * its current reseller relationship. The retail book must be published by\n * that reseller; the wholesale book must be published by someone other\n * than the reseller or child it charges. Each leg is authorized separately:\n * the wholesale leg by its publisher (`assign_wholesale_price_book`), the\n * retail leg by the reseller (`assign_retail_price_book`).\n */\n async assignPriceBooks(\n input: AssignPriceBooksInput,\n ): Promise<PriceBookAssignmentView> {\n const relationship = await this.requireRelationship(input.childTenantId);\n const { childTenantId, resellerTenantId } = relationship;\n const existing = await authorized(() =>\n this.assignments.get({ childTenantId }),\n );\n // An assignment made under a previous reseller does not carry over.\n const current =\n existing && tenantKey(existing.resellerTenantId) === resellerTenantId\n ? assignmentView(existing)\n : null;\n\n if (input.wholesale !== undefined) {\n let publisher = resellerTenantId;\n if (input.wholesale) {\n const book = await this.requireLeg(input.wholesale, 'wholesale');\n assertWholesalePublisher(book, resellerTenantId, childTenantId);\n publisher = tenantKey(book.tenantId);\n } else if (current?.wholesale) {\n publisher = tenantKey(\n (await this.readBook(current.wholesale.priceBookId)).tenantId,\n );\n }\n await this.assertManage(\n 'assign_wholesale_price_book',\n publisher,\n childTenantId,\n false,\n resellerTenantId,\n );\n }\n if (input.retail) {\n const book = await this.requireLeg(input.retail, 'retail');\n if (tenantKey(book.tenantId) !== resellerTenantId) {\n throw new ResellerBillingError(\n `Retail price book '${book.bookKey}' is not published by the child's reseller.`,\n 'PRICE_BOOK_OWNER_MISMATCH',\n );\n }\n }\n if (input.retail !== undefined || input.wholesale === undefined) {\n await this.assertManage(\n 'assign_retail_price_book',\n resellerTenantId,\n childTenantId,\n false,\n resellerTenantId,\n );\n }\n\n // Read-merge-write under one lock so concurrent single-leg updates\n // cannot overwrite each other's leg.\n const db = this.assignments.db;\n return authorized(() =>\n withEmbeddedWriteTransaction(\n db,\n isEmbeddedDatabase(db),\n async (transaction) => {\n if (isPostgresDatabase(transaction)) {\n await transaction.query(\n \"SELECT pg_advisory_xact_lock(hashtext('smrt-price-book-assignments'))\",\n );\n }\n const assignments = await PriceBookAssignmentCollection.create({\n db: transaction,\n });\n const row = await assignments.get({ childTenantId });\n const fresh =\n row && tenantKey(row.resellerTenantId) === resellerTenantId\n ? assignmentView(row)\n : null;\n if (\n input.wholesale === null &&\n fresh?.wholesale?.priceBookId !== current?.wholesale?.priceBookId\n ) {\n // The clear was authorized against a different wholesale book.\n throw new ResellerBillingError(\n 'The wholesale assignment changed concurrently; retry.',\n 'ASSIGNMENT_CONFLICT',\n );\n }\n const wholesale =\n input.wholesale === undefined\n ? (fresh?.wholesale ?? null)\n : input.wholesale;\n const retail =\n input.retail === undefined ? (fresh?.retail ?? null) : input.retail;\n const values = {\n childTenantId,\n resellerTenantId,\n wholesalePriceBookId: wholesale?.priceBookId ?? '',\n wholesaleCurrency: wholesale?.currency ?? '',\n retailPriceBookId: retail?.priceBookId ?? '',\n retailCurrency: retail?.currency ?? '',\n };\n if (row) {\n Object.assign(row, values);\n await row.save();\n return assignmentView(row);\n }\n return assignmentView(await assignments.create(values));\n },\n ),\n );\n }\n\n /** The child's assignment under its current reseller, if any. */\n async getPriceBookAssignment(\n childTenantId: string,\n ): Promise<PriceBookAssignmentView | null> {\n const relationship =\n await this.options.billingRelationships.getRelationship(\n canonicalTenantId(childTenantId),\n );\n if (!relationship) return null;\n const row = await this.assignments.get({\n childTenantId: relationship.childTenantId,\n });\n if (\n !row ||\n tenantKey(row.resellerTenantId) !== relationship.resellerTenantId\n ) {\n return null;\n }\n return assignmentView(row);\n }\n\n /**\n * Create or replace a spending policy that a parent sets on its child. The\n * row belongs to the child (so the ordinary evaluator enforces it for the\n * child) and records the parent in `setByTenantId`, which locks it against\n * changes by the child. A delegated limit left by a former parent may be\n * replaced (not a former parent's prepaid balance, which keeps its credit\n * ledger); one the child set for itself may not. Use `period: 'balance'`\n * for a prepaid credit balance and fund it with {@link grantChildCredit}.\n */\n async setDelegatedSpendingPolicy(\n input: DelegatedSpendingPolicyInput,\n ): Promise<SpendingPolicy> {\n const parentTenantId = canonicalTenantId(input.parentTenantId);\n const relationship = await this.requireChildOf(\n input.childTenantId,\n parentTenantId,\n );\n await this.assertManage(\n 'manage_child_spending',\n parentTenantId,\n relationship.childTenantId,\n false,\n relationship.resellerTenantId,\n );\n assertCurrency(input.currency);\n if (\n input.limitAmount !== undefined &&\n !Number.isSafeInteger(input.limitAmount)\n ) {\n throw new ResellerBillingError(\n `Spending limits must be integer minor units — got ${input.limitAmount}.`,\n 'INVALID_AMOUNT',\n );\n }\n const values = {\n tenantId: relationship.childTenantId,\n name: input.name,\n subscriberKind: input.subscriberKind ?? '',\n subscriberExternalId: input.subscriberExternalId ?? '',\n projectId: input.projectId ?? '',\n serviceKey: input.serviceKey ?? '',\n metricKey: input.metricKey ?? '',\n period: input.period ?? 'month',\n rollingSeconds: input.rollingSeconds ?? 0,\n limitAmount: input.limitAmount ?? 0,\n currency: input.currency,\n behavior: input.behavior,\n priority: input.priority ?? 0,\n active: input.active ?? true,\n basis: input.basis,\n setByTenantId: parentTenantId,\n ...(input.balanceFrom ? { balanceFrom: input.balanceFrom } : {}),\n };\n // Authorized above; the row belongs to the child, so write it outside\n // the parent's own tenant scope.\n return authorized(async () => {\n const existing = (\n await this.policies.list({\n where: {\n tenantId: values.tenantId,\n subscriberKind: values.subscriberKind,\n subscriberExternalId: values.subscriberExternalId,\n projectId: values.projectId,\n serviceKey: values.serviceKey,\n metricKey: values.metricKey,\n period: values.period,\n name: values.name,\n },\n limit: 1,\n })\n )[0];\n if (existing) {\n const owner = tenantKey(existing.setByTenantId);\n if (!owner) {\n throw new ResellerBillingError(\n `Spending policy '${input.name}' already exists for this child and was set by the child.`,\n 'POLICY_CONFLICT',\n );\n }\n // A former parent's prepaid balance keeps its credit ledger: taking\n // it over would strand that credit (or revive it if the child\n // returns), so the new parent must use a different name.\n if (owner !== parentTenantId && existing.period === 'balance') {\n throw new ResellerBillingError(\n `Balance policy '${input.name}' belongs to a former parent; choose another name.`,\n 'POLICY_CONFLICT',\n );\n }\n Object.assign(existing, values);\n await existing.save();\n return existing;\n }\n return this.policies.create(values);\n });\n }\n\n /** Credit a prepaid balance policy the parent set on its child. */\n async grantChildCredit(input: GrantChildCreditInput): Promise<CreditGrant> {\n const parentTenantId = canonicalTenantId(input.parentTenantId);\n const relationship = await this.requireChildOf(\n input.childTenantId,\n parentTenantId,\n );\n await this.assertManage(\n 'manage_child_spending',\n parentTenantId,\n relationship.childTenantId,\n false,\n relationship.resellerTenantId,\n );\n return authorized(async () => {\n const policy = await this.policies.get(input.spendingPolicyId);\n if (\n !policy ||\n tenantKey(policy.tenantId) !== relationship.childTenantId ||\n tenantKey(policy.setByTenantId) !== parentTenantId\n ) {\n throw new ResellerBillingError(\n `Spending policy ${input.spendingPolicyId} is not a policy this parent set on the child.`,\n 'POLICY_NOT_FOUND',\n );\n }\n return this.evaluator.grantCredit({\n spendingPolicyId: input.spendingPolicyId,\n amount: input.amount,\n reason: input.reason,\n source: input.source,\n sourceId: input.sourceId,\n grantedByTenantId: parentTenantId,\n });\n });\n }\n\n private async requireRelationship(\n childTenantId: string,\n ): Promise<BillingRelationshipView> {\n const relationship =\n await this.options.billingRelationships.getRelationship(\n canonicalTenantId(childTenantId),\n );\n if (!relationship) {\n throw new ResellerBillingError(\n `Tenant ${childTenantId} has no reseller relationship.`,\n 'RELATIONSHIP_REQUIRED',\n );\n }\n return relationship;\n }\n\n private async requireChildOf(\n childTenantId: string,\n parentTenantId: string,\n ): Promise<BillingRelationshipView> {\n const relationship = await this.requireRelationship(childTenantId);\n if (relationship.resellerTenantId !== parentTenantId) {\n throw new ResellerBillingError(\n `Tenant ${childTenantId} is not a child of ${parentTenantId}.`,\n 'RELATIONSHIP_REQUIRED',\n );\n }\n return relationship;\n }\n\n /**\n * Read a book's metadata to learn its publisher and kind before deciding\n * authorization. Books belong to their seller, so the read is not scoped to\n * the caller; nothing beyond a validation error is returned on denial.\n */\n private async readBook(id: string): Promise<PriceBook> {\n const book = await authorized(() => this.books.get(id));\n if (!book?.id) {\n throw new ResellerBillingError(\n `Price book ${id} was not found.`,\n 'PRICE_BOOK_NOT_FOUND',\n );\n }\n return book;\n }\n\n private async requireLeg(\n leg: PriceBookLeg,\n kind: PriceBookKind,\n ): Promise<PriceBook> {\n assertCurrency(leg.currency);\n const book = await this.readBook(leg.priceBookId);\n if (book.kind !== kind) {\n throw new ResellerBillingError(\n `Price book '${book.bookKey}' is a ${book.kind} book, not ${kind}.`,\n 'PRICE_BOOK_KIND_MISMATCH',\n );\n }\n return book;\n }\n\n private async assertManage(\n action: ResellerBillingAction,\n tenantId: string,\n childTenantId?: string,\n allowOwnTenant = false,\n resellerTenantId?: string,\n ): Promise<void> {\n if (\n isSystemContext() ||\n isSuperAdminBypass() ||\n (allowOwnTenant && getTenantId()?.toLowerCase() === tenantId) ||\n (await this.options.authorize?.({\n action,\n tenantId,\n childTenantId,\n ...(resellerTenantId ? { resellerTenantId } : {}),\n }))\n ) {\n return;\n }\n throw new TenantIsolationError('Reseller billing mutation denied.');\n }\n}\n","import type {\n PlanThreshold,\n ThresholdEvaluation,\n UsageSummary,\n} from '../types.js';\n\nexport function evaluateThreshold(\n threshold: PlanThreshold,\n usage: UsageSummary,\n): ThresholdEvaluation {\n const ratio =\n threshold.limit === 0\n ? usage.quantity > 0\n ? Infinity\n : 0\n : usage.quantity / threshold.limit;\n const warningRatio = threshold.warningRatio ?? 0.8;\n const blocked =\n threshold.enforcement === 'block' &&\n (threshold.limit === 0\n ? usage.quantity > 0\n : usage.quantity >= threshold.limit);\n const warned = !blocked && ratio >= warningRatio;\n\n return {\n threshold,\n usage,\n ratio,\n state: blocked ? 'blocked' : warned ? 'warn' : 'ok',\n allowed: !blocked,\n remaining: Math.max(0, threshold.limit - usage.quantity),\n };\n}\n\nexport function evaluateThresholds(\n thresholds: PlanThreshold[],\n usage: UsageSummary[],\n): ThresholdEvaluation[] {\n const usageByMetric = new Map(\n usage.map((summary) => [summary.metricKey, summary]),\n );\n\n return thresholds.map((threshold) => {\n const summary =\n usageByMetric.get(threshold.metricKey) ??\n emptyUsageSummary(threshold.metricKey);\n return evaluateThreshold(threshold, summary);\n });\n}\n\nfunction emptyUsageSummary(metricKey: string): UsageSummary {\n const now = new Date();\n return {\n tenantId: '',\n metricKey,\n quantity: 0,\n windowStart: now,\n windowEnd: now,\n };\n}\n","import type { SmrtClassOptions } from '@happyvertical/smrt-core';\nimport { TenantUsageMetricCollection } from '../collections/TenantUsageMetricCollection.js';\nimport type {\n AiUsageSummary,\n RecordUsageOptions,\n SummarizeAiUsageOptions,\n SummarizeUsageBatchOptions,\n SummarizeUsageOptions,\n UsageSummary,\n} from '../types.js';\nimport { normalizeSubscriber } from '../utils.js';\n\nexport class TenantUsageMeter {\n constructor(\n private readonly metrics: TenantUsageMetricCollection,\n private readonly classOptions: SmrtClassOptions = {},\n ) {}\n\n static async create(\n classOptions: SmrtClassOptions = {},\n ): Promise<TenantUsageMeter> {\n const metrics = await TenantUsageMetricCollection.create(classOptions);\n return new TenantUsageMeter(metrics, classOptions);\n }\n\n /**\n * Record one usage row.\n *\n * Accepts the polymorphic subscriber fields directly on the options object\n * (`subscriberKind`/`subscriberExternalId`); when omitted defaults to a\n * `'tenant'`-kind row keyed off `tenantId`. The collection layer enforces\n * the XOR invariant — passing `subscriberKind: 'external'` without a\n * non-empty `subscriberExternalId` throws.\n */\n async record(options: RecordUsageOptions): Promise<void> {\n await this.metrics.recordUsage(options);\n }\n\n /**\n * Summarize usage over a window for a given subscriber.\n *\n * The `ai.*` short-circuit only fires for `'tenant'`-kind subscribers since\n * the `_smrt_ai_usage` system table is tenant-scoped; external subscribers\n * fall through to the normal `_smrt_tenant_usage_metrics` aggregation.\n */\n async summarize(options: SummarizeUsageOptions): Promise<UsageSummary> {\n // Normalize at the boundary so the `ai.*` short-circuit and the standard\n // `summarizeUsage` path both refuse the same XOR violations (e.g. caller\n // passes subscriberExternalId without subscriberKind: 'external'). Without\n // this, the AI short-circuit would silently re-scope to tenant-wide\n // _smrt_ai_usage totals.\n normalizeSubscriber({\n tenantId: options.tenantId,\n subscriberKind: options.subscriberKind,\n subscriberExternalId: options.subscriberExternalId,\n });\n\n const aiSummary = await this.trySummarizeAiMetric(options);\n if (aiSummary) {\n return aiSummary;\n }\n\n return this.metrics.summarizeUsage(options);\n }\n\n async summarizeBatch(\n options: SummarizeUsageBatchOptions,\n ): Promise<UsageSummary[]> {\n const subscriber = normalizeSubscriber({\n tenantId: options.tenantId,\n subscriberKind: options.subscriberKind,\n subscriberExternalId: options.subscriberExternalId,\n });\n const metricKeys = Array.from(new Set(options.metricKeys));\n if (metricKeys.length === 0) {\n return [];\n }\n\n const useTenantAiSummary = subscriber.kind === 'tenant';\n const aiMetricKeys = useTenantAiSummary\n ? metricKeys.filter((metricKey) => metricKey.startsWith('ai.'))\n : [];\n const persistedMetricKeys = useTenantAiSummary\n ? metricKeys.filter((metricKey) => !metricKey.startsWith('ai.'))\n : metricKeys;\n\n const summaries = new Map<string, UsageSummary>();\n let fallbackAiMetricKeys: string[] = [];\n if (aiMetricKeys.length > 0) {\n if (!(await this.hasAiUsageTable())) {\n fallbackAiMetricKeys = aiMetricKeys;\n } else {\n try {\n const aiSummary = await this.summarizeAiUsage({\n tenantId: options.tenantId,\n window: options.window,\n });\n const quantityByMetric = aiQuantityByMetric(aiSummary);\n for (const metricKey of aiMetricKeys) {\n summaries.set(metricKey, {\n tenantId: options.tenantId,\n metricKey,\n quantity: quantityByMetric[metricKey] ?? 0,\n windowStart: options.window.start,\n windowEnd: options.window.end,\n });\n }\n } catch (error) {\n if (!isMissingAiUsageTableError(error)) {\n throw error;\n }\n fallbackAiMetricKeys = aiMetricKeys;\n }\n }\n }\n\n const persistedSummaries = await this.metrics.summarizeUsageBatch({\n ...options,\n metricKeys: [...persistedMetricKeys, ...fallbackAiMetricKeys],\n });\n for (const summary of persistedSummaries) {\n summaries.set(summary.metricKey, summary);\n }\n\n return metricKeys.map(\n (metricKey) =>\n summaries.get(metricKey) ??\n emptyUsageSummary(subscriber, metricKey, options.window),\n );\n }\n\n async summarizeAiUsage(\n options: SummarizeAiUsageOptions,\n ): Promise<AiUsageSummary> {\n return this.metrics.summarizeTenantAiUsage(options);\n }\n\n getOptions(): SmrtClassOptions {\n return this.classOptions;\n }\n\n private async trySummarizeAiMetric(\n options: SummarizeUsageOptions,\n ): Promise<UsageSummary | null> {\n if (!options.metricKey.startsWith('ai.')) {\n return null;\n }\n // _smrt_ai_usage is tenant-scoped only; external subscribers must use the\n // standard usage path. Skip the short-circuit so the caller's recorded\n // usage rows are summed instead.\n const kind = options.subscriberKind ?? 'tenant';\n if (kind !== 'tenant') {\n return null;\n }\n if (!(await this.hasAiUsageTable())) {\n return null;\n }\n\n let summary: AiUsageSummary;\n try {\n summary = await this.summarizeAiUsage({\n tenantId: options.tenantId,\n window: options.window,\n });\n } catch (error) {\n if (isMissingAiUsageTableError(error)) {\n return null;\n }\n throw error;\n }\n\n const quantityByMetric: Record<string, number> = {\n ...aiQuantityByMetric(summary),\n };\n\n return {\n tenantId: options.tenantId,\n metricKey: options.metricKey,\n quantity: quantityByMetric[options.metricKey] ?? 0,\n windowStart: options.window.start,\n windowEnd: options.window.end,\n };\n }\n\n private async hasAiUsageTable(): Promise<boolean> {\n return this.metrics.db.tableExists('_smrt_ai_usage');\n }\n}\n\nfunction aiQuantityByMetric(summary: AiUsageSummary): Record<string, number> {\n return {\n 'ai.tokens.prompt': summary.promptTokens,\n 'ai.tokens.completion': summary.completionTokens,\n 'ai.tokens.total': summary.totalTokens,\n 'ai.cost.estimated': summary.estimatedCost,\n 'ai.requests': summary.requestCount,\n };\n}\n\nfunction isMissingAiUsageTableError(\n error: unknown,\n seen = new Set<unknown>(),\n): boolean {\n if (!error) {\n return false;\n }\n if (typeof error !== 'object') {\n return isMissingAiUsageTableMessage(String(error));\n }\n if (seen.has(error)) {\n return false;\n }\n seen.add(error);\n\n const err = error as {\n code?: unknown;\n message?: unknown;\n cause?: unknown;\n context?: Record<string, unknown>;\n };\n const codes = [err?.code, err?.context?.code, err?.context?.errorCode];\n if (codes.some((code) => code === '42P01')) {\n return true;\n }\n\n const messages = [\n err?.message,\n err?.context?.originalError,\n err?.context?.error,\n err?.context?.details,\n ];\n for (const candidate of messages) {\n if (\n candidate &&\n typeof candidate === 'object' &&\n isMissingAiUsageTableError(candidate, seen)\n ) {\n return true;\n }\n if (isMissingAiUsageTableMessage(String(candidate ?? ''))) {\n return true;\n }\n }\n\n return err?.cause ? isMissingAiUsageTableError(err.cause, seen) : false;\n}\n\nfunction isMissingAiUsageTableMessage(message: string): boolean {\n const normalized = message.toLowerCase();\n return (\n normalized.includes('_smrt_ai_usage') &&\n (normalized.includes('no such table') ||\n normalized.includes('does not exist') ||\n normalized.includes('undefined table'))\n );\n}\n\nfunction emptyUsageSummary(\n subscriber: ReturnType<typeof normalizeSubscriber>,\n metricKey: string,\n window: SummarizeUsageBatchOptions['window'],\n): UsageSummary {\n const summary: UsageSummary = {\n tenantId: subscriber.tenantId,\n metricKey,\n quantity: 0,\n windowStart: window.start,\n windowEnd: window.end,\n };\n if (subscriber.kind === 'external') {\n return {\n ...summary,\n subscriberKind: 'external',\n subscriberExternalId: subscriber.externalId,\n };\n }\n return summary;\n}\n","import { isSystemContext } from '@happyvertical/smrt-tenancy';\nimport { SubscriptionPlanCollection } from '../collections/SubscriptionPlanCollection.js';\nimport { TenantSubscriptionCollection } from '../collections/TenantSubscriptionCollection.js';\nimport type { SubscriptionPlan } from '../models/SubscriptionPlan.js';\nimport type { TenantSubscription } from '../models/TenantSubscription.js';\nimport type {\n EntitlementResolution,\n EntitlementResolutionContext,\n PlanThreshold,\n SmrtClassOptions,\n Subscriber,\n SubscriptionResolverOptions,\n ThresholdEvaluation,\n UsageSummary,\n UsageWindow,\n} from '../types.js';\nimport {\n getWindowForThreshold,\n getWindowKey,\n isValidThreshold,\n} from '../utils.js';\nimport { evaluateThreshold } from './threshold-evaluator.js';\nimport { TenantUsageMeter } from './usage-meter.js';\n\nexport interface SubscriptionPlanReader {\n get(criteria: { id: string }): Promise<SubscriptionPlan | null>;\n}\n\n/**\n * Reader contract for finding the current subscription for a subscriber.\n *\n * The legacy `findCurrentForTenant(tenantId)` signature stays for backward\n * compatibility with the original tenant-only resolver. New implementations\n * should provide `findCurrentForSubscriber(subscriber)` — it's preferred when\n * present and lets the resolver work with both `'tenant'` and `'external'`\n * subscribers without callers having to pre-narrow the discriminator.\n */\nexport interface TenantSubscriptionReader {\n findCurrentForTenant(\n tenantId: string,\n now?: Date,\n ): Promise<TenantSubscription | null>;\n findCurrentForSubscriber?(\n subscriber: Subscriber,\n now?: Date,\n ): Promise<TenantSubscription | null>;\n}\n\n/**\n * Reader contract for summarizing usage.\n *\n * `summarize(options)` already accepts the polymorphic\n * `subscriberKind`/`subscriberExternalId` fields. When omitted the reader\n * defaults to `'tenant'`, which is what existing callers got before this\n * change — no behavior shift for them. The discriminator type is derived\n * from `Subscriber['kind']` rather than inlined so any future additions to\n * the union stay consistent across the package.\n */\nexport interface UsageSummaryReader {\n summarize(options: {\n tenantId: string;\n subscriberKind?: Subscriber['kind'];\n subscriberExternalId?: string;\n metricKey: string;\n window: UsageWindow;\n }): Promise<UsageSummary>;\n summarizeBatch?(options: {\n tenantId: string;\n subscriberKind?: Subscriber['kind'];\n subscriberExternalId?: string;\n metricKeys: string[];\n window: UsageWindow;\n }): Promise<UsageSummary[]>;\n}\n\nexport interface SubscriptionResolverReaders {\n plans: SubscriptionPlanReader;\n subscriptions: TenantSubscriptionReader;\n usage: UsageSummaryReader;\n}\n\nexport class SubscriptionResolver {\n constructor(private readonly readers: SubscriptionResolverReaders) {}\n\n /**\n * Build the default resolver readers once for a request or app lifecycle and\n * reuse the returned resolver across entitlement checks.\n */\n static async create(\n classOptions: SmrtClassOptions = {},\n ): Promise<SubscriptionResolver> {\n const [plans, subscriptions, usage] = await Promise.all([\n SubscriptionPlanCollection.create(classOptions),\n TenantSubscriptionCollection.create(classOptions),\n TenantUsageMeter.create(classOptions),\n ]);\n return new SubscriptionResolver({ plans, subscriptions, usage });\n }\n\n /**\n * Load the subscription/plan pair used by entitlement resolution. Callers\n * that need both the entitlement snapshot and the backing records can load\n * this once, then pass it back via `options.context`.\n */\n async loadEntitlementContext(\n subscriberOrTenantId: Subscriber | string,\n options: SubscriptionResolverOptions = {},\n ): Promise<EntitlementResolutionContext> {\n const subscriber = toSubscriber(subscriberOrTenantId);\n const now = options.now ?? new Date();\n const subscription = await this.resolveSubscription(\n subscriber,\n now,\n options.context,\n );\n const plan = await this.resolvePlan(subscription, options.context);\n return { subscription, plan };\n }\n\n /**\n * Polymorphic entitlement resolution. Works for both `'tenant'`-kind and\n * `'external'`-kind subscribers and is the preferred surface — the\n * `resolveTenantEntitlements(tenantId)` method below is a thin wrapper.\n */\n async resolveEntitlements(\n subscriber: Subscriber,\n options: SubscriptionResolverOptions = {},\n ): Promise<EntitlementResolution> {\n const now = options.now ?? new Date();\n const { subscription, plan } = await this.loadEntitlementContext(\n subscriber,\n { ...options, now },\n );\n\n if (!subscription) {\n return emptyResolution(subscriber);\n }\n\n if (!plan?.isActive() || !subscription.isEntitled(now)) {\n return {\n ...emptyResolution(subscriber),\n planId: plan?.id ?? subscription.planId ?? null,\n planKey: plan?.planKey ?? null,\n subscriptionId: subscription.id ?? null,\n status: subscription.status,\n };\n }\n\n const thresholds = plan.getThresholds().filter(isValidThreshold);\n const thresholdEvaluations = await this.resolveThresholdEvaluations(\n subscriber,\n thresholds,\n now,\n options,\n );\n\n return {\n tenantId: subscriber.tenantId,\n subscriber,\n planId: plan.id ?? null,\n planKey: plan.planKey,\n subscriptionId: subscription.id ?? null,\n status: subscription.status,\n featureKeys: plan.getFeatureKeys(),\n thresholds,\n thresholdEvaluations,\n allowed: thresholdEvaluations.every((evaluation) => evaluation.allowed),\n };\n }\n\n /**\n * Legacy single-tenant wrapper around {@link resolveEntitlements}. Kept so\n * existing tenant-only callers don't need to update their call sites.\n */\n async resolveTenantEntitlements(\n tenantId: string,\n options: SubscriptionResolverOptions = {},\n ): Promise<EntitlementResolution> {\n return this.resolveEntitlements({ kind: 'tenant', tenantId }, options);\n }\n\n async isFeatureEnabled(\n subscriberOrTenantId: Subscriber | string,\n featureKey: string,\n options: SubscriptionResolverOptions = {},\n ): Promise<boolean> {\n const resolution = await this.resolveEntitlements(\n toSubscriber(subscriberOrTenantId),\n options,\n );\n return resolution.featureKeys.includes(featureKey);\n }\n\n async assertWithinThresholds(\n subscriberOrTenantId: Subscriber | string,\n options: SubscriptionResolverOptions = {},\n ): Promise<void> {\n const subscriber = toSubscriber(subscriberOrTenantId);\n const resolution = await this.resolveEntitlements(subscriber, options);\n const blocked = resolution.thresholdEvaluations.find(\n (evaluation) => !evaluation.allowed,\n );\n\n if (blocked) {\n const subject =\n subscriber.kind === 'external'\n ? `external:${subscriber.externalId}`\n : `Tenant ${subscriber.tenantId}`;\n throw new Error(\n `${subject} exceeded subscription threshold ${blocked.threshold.metricKey}`,\n );\n }\n }\n\n private async resolveSubscription(\n subscriber: Subscriber,\n now: Date,\n context?: EntitlementResolutionContext,\n ): Promise<TenantSubscription | null> {\n if (hasContextValue(context, 'subscription')) {\n const subscription = context?.subscription ?? null;\n assertSubscriptionMatchesSubscriber(subscription, subscriber);\n return subscription;\n }\n return this.findCurrentSubscription(subscriber, now);\n }\n\n private async resolvePlan(\n subscription: TenantSubscription | null,\n context?: EntitlementResolutionContext,\n ): Promise<SubscriptionPlan | null> {\n if (!subscription?.planId) {\n return null;\n }\n if (hasContextValue(context, 'plan')) {\n const plan = context?.plan ?? null;\n assertPlanMatchesSubscription(plan, subscription);\n return plan;\n }\n const plan = await this.readers.plans.get({ id: subscription.planId });\n assertPlanMatchesSubscription(plan, subscription);\n return plan;\n }\n\n /**\n * Bridge the legacy and polymorphic reader contracts.\n *\n * Prefers `findCurrentForSubscriber` when the reader provides it (the\n * preferred shape). For `'tenant'` subscribers we fall back to the legacy\n * `findCurrentForTenant`. For `'external'` subscribers the reader MUST\n * implement `findCurrentForSubscriber` — otherwise we have no way to scope\n * the lookup and we throw rather than silently returning the tenant's\n * primary subscription.\n */\n private async findCurrentSubscription(\n subscriber: Subscriber,\n now: Date,\n ): Promise<TenantSubscription | null> {\n if (this.readers.subscriptions.findCurrentForSubscriber) {\n return this.readers.subscriptions.findCurrentForSubscriber(\n subscriber,\n now,\n );\n }\n if (subscriber.kind === 'tenant') {\n return this.readers.subscriptions.findCurrentForTenant(\n subscriber.tenantId,\n now,\n );\n }\n throw new Error(\n 'External-subscriber resolution requires a TenantSubscriptionReader ' +\n 'that implements findCurrentForSubscriber()',\n );\n }\n\n private async resolveThresholdEvaluations(\n subscriber: Subscriber,\n thresholds: PlanThreshold[],\n now: Date,\n options: SubscriptionResolverOptions,\n ): Promise<ThresholdEvaluation[]> {\n if (thresholds.length === 0) {\n return [];\n }\n\n if (!this.readers.usage.summarizeBatch) {\n const evaluations: ThresholdEvaluation[] = [];\n for (const threshold of thresholds) {\n const window =\n options.usageWindows?.[threshold.window] ??\n getWindowForThreshold(threshold.window, now);\n const usage = await this.readers.usage.summarize({\n tenantId: subscriber.tenantId,\n subscriberKind: subscriber.kind,\n subscriberExternalId:\n subscriber.kind === 'external' ? subscriber.externalId : undefined,\n metricKey: threshold.metricKey,\n window,\n });\n evaluations.push(evaluateThreshold(threshold, usage));\n }\n return evaluations;\n }\n\n const groups = new Map<\n string,\n {\n window: UsageWindow;\n entries: Array<{ index: number; threshold: PlanThreshold }>;\n }\n >();\n\n thresholds.forEach((threshold, index) => {\n const window =\n options.usageWindows?.[threshold.window] ??\n getWindowForThreshold(threshold.window, now);\n const key = getWindowKey(window);\n const group = groups.get(key) ?? { window, entries: [] };\n group.entries.push({ index, threshold });\n groups.set(key, group);\n });\n\n const evaluations: ThresholdEvaluation[] = new Array(thresholds.length);\n await Promise.all(\n Array.from(groups.values()).map(async ({ window, entries }) => {\n const metricKeys = uniqueMetricKeys(\n entries.map((entry) => entry.threshold.metricKey),\n );\n const summaries = await this.readers.usage.summarizeBatch?.({\n tenantId: subscriber.tenantId,\n subscriberKind: subscriber.kind,\n subscriberExternalId:\n subscriber.kind === 'external' ? subscriber.externalId : undefined,\n metricKeys,\n window,\n });\n const summaryByMetric = new Map(\n (summaries ?? []).map((summary) => [summary.metricKey, summary]),\n );\n\n for (const { index, threshold } of entries) {\n const usage =\n summaryByMetric.get(threshold.metricKey) ??\n emptyUsageSummary(subscriber, threshold.metricKey, window);\n evaluations[index] = evaluateThreshold(threshold, usage);\n }\n }),\n );\n\n return evaluations;\n }\n}\n\nfunction toSubscriber(input: Subscriber | string): Subscriber {\n if (typeof input === 'string') {\n return { kind: 'tenant', tenantId: input };\n }\n return input;\n}\n\nfunction emptyResolution(subscriber: Subscriber): EntitlementResolution {\n return {\n tenantId: subscriber.tenantId,\n subscriber,\n planId: null,\n planKey: null,\n subscriptionId: null,\n status: 'none',\n featureKeys: [],\n thresholds: [],\n thresholdEvaluations: [],\n allowed: false,\n };\n}\n\nfunction hasContextValue<K extends keyof EntitlementResolutionContext>(\n context: EntitlementResolutionContext | undefined,\n key: K,\n): boolean {\n return context?.[key] !== undefined;\n}\n\nfunction assertSubscriptionMatchesSubscriber(\n subscription: TenantSubscription | null,\n subscriber: Subscriber,\n): void {\n if (!subscription) {\n return;\n }\n const subscriptionSubscriber = subscription.getSubscriber();\n if (\n !subscriptionSubscriber ||\n !sameSubscriber(subscriptionSubscriber, subscriber)\n ) {\n throw new Error(\n 'Provided entitlement context subscription does not match requested subscriber',\n );\n }\n}\n\nfunction assertPlanMatchesSubscription(\n plan: SubscriptionPlan | null,\n subscription: TenantSubscription,\n): void {\n if (!plan) {\n return;\n }\n if (\n !isSystemContext() &&\n plan.tenantId !== null &&\n plan.tenantId !== subscription.tenantId\n ) {\n throw new Error('Entitlement plan does not belong to subscription tenant');\n }\n if (!plan.id || plan.id !== subscription.planId) {\n throw new Error(\n 'Provided entitlement context plan does not match subscription.planId',\n );\n }\n}\n\nfunction sameSubscriber(left: Subscriber, right: Subscriber): boolean {\n if (left.kind !== right.kind || left.tenantId !== right.tenantId) {\n return false;\n }\n if (left.kind === 'tenant') {\n return true;\n }\n return right.kind === 'external' && left.externalId === right.externalId;\n}\n\nfunction uniqueMetricKeys(metricKeys: string[]): string[] {\n return Array.from(new Set(metricKeys));\n}\n\nfunction emptyUsageSummary(\n subscriber: Subscriber,\n metricKey: string,\n window: UsageWindow,\n): UsageSummary {\n const summary: UsageSummary = {\n tenantId: subscriber.tenantId,\n metricKey,\n quantity: 0,\n windowStart: window.start,\n windowEnd: window.end,\n };\n if (subscriber.kind === 'external') {\n return {\n ...summary,\n subscriberKind: 'external',\n subscriberExternalId: subscriber.externalId,\n };\n }\n return summary;\n}\n\nexport type { PlanThreshold };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["adapterType","plan","evaluations"],"sources":["../src/__smrt-register__.ts","../src/utils.ts","../src/models/SubscriptionPlan.ts","../src/collections/SubscriptionPlanCollection.ts","../src/models/TenantSubscription.ts","../src/collections/TenantSubscriptionCollection.ts","../src/models/TenantUsageMetric.ts","../src/collections/TenantUsageMetricCollection.ts","../src/migrations/moneyMinorUnits.ts","../src/models/commercial.ts","../src/models/reseller.ts","../src/services/reseller-errors.ts","../src/services/commercial.ts","../src/services/reseller.ts","../src/services/threshold-evaluator.ts","../src/services/usage-meter.ts","../src/services/subscription-resolver.ts"],"sourcesContent":["// Generated by @happyvertical/smrt-core smrtPlugin at library build time.\n// The package manifest is inlined so self-registration cannot miss when a\n// downstream bundler relocates this module away from dist/manifest.json\n// (https://github.com/happyvertical/smrt/issues/1506,\n// https://github.com/happyvertical/smrt/issues/1507).\nimport { ObjectRegistry } from '@happyvertical/smrt-core';\n\nObjectRegistry.registerPackageManifest(JSON.parse(\"{\\\"version\\\":\\\"1.0.0\\\",\\\"timestamp\\\":0,\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"packageVersion\\\":\\\"0.57.6\\\",\\\"objects\\\":{\\\"@happyvertical/smrt-subscriptions:SubscriptionPlanCollection\\\":{\\\"name\\\":\\\"subscriptionplancollection\\\",\\\"className\\\":\\\"SubscriptionPlanCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:SubscriptionPlanCollection\\\",\\\"collection\\\":\\\"subscriptionplans\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/collections/SubscriptionPlanCollection.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{\\\"findByPlanKey\\\":{\\\"name\\\":\\\"findByPlanKey\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"tenantId\\\",\\\"type\\\":\\\"string | null\\\",\\\"optional\\\":false,\\\"unionBranches\\\":[{\\\"type\\\":\\\"string\\\"},{\\\"type\\\":\\\"null\\\"}]},{\\\"name\\\":\\\"planKey\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<SubscriptionPlan | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findActive\\\":{\\\"name\\\":\\\"findActive\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<SubscriptionPlan[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findByProviderPriceId\\\":{\\\"name\\\":\\\"findByProviderPriceId\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"providerPriceId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<SubscriptionPlan | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findByStripePriceId\\\":{\\\"name\\\":\\\"findByStripePriceId\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"stripePriceId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<SubscriptionPlan | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_subscription_plans\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"SubscriptionPlan\\\",\\\"exportName\\\":\\\"SubscriptionPlanCollection\\\",\\\"collectionExportName\\\":\\\"SubscriptionPlanCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_subscription_plans\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_subscription_plans\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"plan_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"description\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'active',\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"price_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"billing_interval\\\\\\\" TEXT DEFAULT 'month',\\\\n \\\\\\\"pricing_mode\\\\\\\" TEXT DEFAULT 'fixed',\\\\n \\\\\\\"minimum_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"suggested_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"external_provider\\\\\\\" TEXT,\\\\n \\\\\\\"provider_product_id\\\\\\\" TEXT,\\\\n \\\\\\\"provider_price_id\\\\\\\" TEXT,\\\\n \\\\\\\"stripe_product_id\\\\\\\" TEXT,\\\\n \\\\\\\"stripe_price_id\\\\\\\" TEXT,\\\\n \\\\\\\"features\\\\\\\" TEXT DEFAULT '[]',\\\\n \\\\\\\"thresholds\\\\\\\" TEXT DEFAULT '[]',\\\\n \\\\\\\"metadata\\\\\\\" TEXT DEFAULT '{}'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"plan_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"active\\\"},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"price_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"billing_interval\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"month\\\"},\\\"pricing_mode\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"fixed\\\"},\\\"minimum_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"suggested_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"external_provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"provider_product_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"provider_price_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"stripe_product_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"stripe_price_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"features\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"[]\\\"},\\\"thresholds\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"[]\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_subscription_plans_tenant_id_plan_key_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"plan_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_subscription_plans_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_subscription_plans_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"02602c74\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:TenantSubscriptionCollection\\\":{\\\"name\\\":\\\"tenantsubscriptioncollection\\\",\\\"className\\\":\\\"TenantSubscriptionCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:TenantSubscriptionCollection\\\",\\\"collection\\\":\\\"tenantsubscriptions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/collections/TenantSubscriptionCollection.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{\\\"findByTenant\\\":{\\\"name\\\":\\\"findByTenant\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"tenantId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<TenantSubscription[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findCurrentForTenant\\\":{\\\"name\\\":\\\"findCurrentForTenant\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"tenantId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"now\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TenantSubscription | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findCurrentForSubscriber\\\":{\\\"name\\\":\\\"findCurrentForSubscriber\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"subscriber\\\",\\\"type\\\":\\\"Subscriber\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"now\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"Promise<TenantSubscription | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findByStripeSubscriptionId\\\":{\\\"name\\\":\\\"findByStripeSubscriptionId\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"stripeSubscriptionId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<TenantSubscription | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_tenant_subscriptions\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"TenantSubscription\\\",\\\"exportName\\\":\\\"TenantSubscriptionCollection\\\",\\\"collectionExportName\\\":\\\"TenantSubscriptionCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_tenant_subscriptions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_tenant_subscriptions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"plan_id\\\\\\\" UUID,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'incomplete',\\\\n \\\\\\\"started_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"current_period_start\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"current_period_end\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"trial_ends_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"cancel_at_period_end\\\\\\\" BOOLEAN DEFAULT FALSE,\\\\n \\\\\\\"canceled_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"agreed_amount\\\\\\\" INTEGER,\\\\n \\\\\\\"external_provider\\\\\\\" TEXT,\\\\n \\\\\\\"stripe_customer_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"stripe_subscription_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"stripe_checkout_session_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metadata\\\\\\\" TEXT DEFAULT '{}'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"plan_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_subscription_plans\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"incomplete\\\"},\\\"started_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"current_period_start\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"current_period_end\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"trial_ends_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"cancel_at_period_end\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":false},\\\"canceled_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"agreed_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"external_provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"stripe_customer_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"stripe_subscription_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"stripe_checkout_session_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_tenant_subscriptions_tenant_id_subscriber_kind_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"subscriber_kind\\\",\\\"subscriber_external_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_tenant_subscriptions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_tenant_subscriptions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_tenant_subscriptions_plan_id_idx\\\",\\\"columns\\\":[\\\"plan_id\\\"]}],\\\"version\\\":\\\"2a04942c\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:TenantUsageMetricCollection\\\":{\\\"name\\\":\\\"tenantusagemetriccollection\\\",\\\"className\\\":\\\"TenantUsageMetricCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:TenantUsageMetricCollection\\\",\\\"collection\\\":\\\"tenantusagemetrics\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/collections/TenantUsageMetricCollection.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{\\\"recordUsage\\\":{\\\"name\\\":\\\"recordUsage\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"RecordUsageOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<TenantUsageMetric>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findByTenantAndMetric\\\":{\\\"name\\\":\\\"findByTenantAndMetric\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"tenantId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"metricKey\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<TenantUsageMetric[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"summarizeUsage\\\":{\\\"name\\\":\\\"summarizeUsage\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"SummarizeUsageOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<UsageSummary>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"summarizeUsageBatch\\\":{\\\"name\\\":\\\"summarizeUsageBatch\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"SummarizeUsageBatchOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<UsageSummary[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"summarizeTenantAiUsage\\\":{\\\"name\\\":\\\"summarizeTenantAiUsage\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"options\\\",\\\"type\\\":\\\"SummarizeAiUsageOptions\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<AiUsageSummary>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"TenantUsageMetric\\\",\\\"exportName\\\":\\\"TenantUsageMetricCollection\\\",\\\"collectionExportName\\\":\\\"TenantUsageMetricCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_tenant_usage_metrics\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"quantity\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"window_start\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"window_end\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"source\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provider\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"dimensions\\\\\\\" TEXT DEFAULT '{}'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"window_start\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"window_end\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"source\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"dimensions\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_tenant_usage_metrics_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_tenant_usage_metrics_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"b799c746\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:SubscriptionPlan\\\":{\\\"name\\\":\\\"subscriptionplan\\\",\\\"className\\\":\\\"SubscriptionPlan\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:SubscriptionPlan\\\",\\\"collection\\\":\\\"subscriptionplans\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/SubscriptionPlan.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"nullable\\\":true,\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":false,\\\"autoPopulate\\\":true,\\\"nullable\\\":true,\\\"mode\\\":\\\"optional\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"planKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"description\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"active\\\",\\\"enum\\\":[\\\"active\\\",\\\"archived\\\",\\\"draft\\\"]},\\\"sortOrder\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"priceAmount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"billingInterval\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"month\\\",\\\"enum\\\":[\\\"day\\\",\\\"week\\\",\\\"month\\\",\\\"year\\\"]},\\\"pricingMode\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"fixed\\\",\\\"enum\\\":[\\\"free\\\",\\\"fixed\\\",\\\"pay_what_you_can\\\"]},\\\"minimumAmount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"suggestedAmount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"externalProvider\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"providerProductId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"providerPriceId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"stripeProductId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"stripePriceId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"features\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"[]\\\"},\\\"thresholds\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"[]\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"methods\\\":{\\\"isActive\\\":{\\\"name\\\":\\\"isActive\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"boolean\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getFeatureGrants\\\":{\\\"name\\\":\\\"getFeatureGrants\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"PlanFeatureGrant[]\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setFeatureGrants\\\":{\\\"name\\\":\\\"setFeatureGrants\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"grants\\\",\\\"type\\\":\\\"Array<string | PlanFeatureGrant>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getFeatureKeys\\\":{\\\"name\\\":\\\"getFeatureKeys\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"string[]\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getThresholds\\\":{\\\"name\\\":\\\"getThresholds\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"PlanThreshold[]\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setThresholds\\\":{\\\"name\\\":\\\"setThresholds\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"thresholds\\\",\\\"type\\\":\\\"PlanThreshold[]\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getMetadata\\\":{\\\"name\\\":\\\"getMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"JsonObject\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setMetadata\\\":{\\\"name\\\":\\\"setMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"metadata\\\",\\\"type\\\":\\\"JsonObject\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_subscription_plans\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\"]},\\\"cli\\\":{\\\"skipApiCheck\\\":true},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"plan_key\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"optional\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"SubscriptionPlan\\\",\\\"collectionExportName\\\":\\\"SubscriptionPlanCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_subscription_plans\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_subscription_plans\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"plan_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"description\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'active',\\\\n \\\\\\\"sort_order\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"price_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"billing_interval\\\\\\\" TEXT DEFAULT 'month',\\\\n \\\\\\\"pricing_mode\\\\\\\" TEXT DEFAULT 'fixed',\\\\n \\\\\\\"minimum_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"suggested_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"external_provider\\\\\\\" TEXT,\\\\n \\\\\\\"provider_product_id\\\\\\\" TEXT,\\\\n \\\\\\\"provider_price_id\\\\\\\" TEXT,\\\\n \\\\\\\"stripe_product_id\\\\\\\" TEXT,\\\\n \\\\\\\"stripe_price_id\\\\\\\" TEXT,\\\\n \\\\\\\"features\\\\\\\" TEXT DEFAULT '[]',\\\\n \\\\\\\"thresholds\\\\\\\" TEXT DEFAULT '[]',\\\\n \\\\\\\"metadata\\\\\\\" TEXT DEFAULT '{}'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"plan_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"description\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"active\\\"},\\\"sort_order\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"price_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"billing_interval\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"month\\\"},\\\"pricing_mode\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"fixed\\\"},\\\"minimum_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"suggested_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"external_provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"provider_product_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"provider_price_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"stripe_product_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"stripe_price_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"features\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"[]\\\"},\\\"thresholds\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"[]\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_subscription_plans_tenant_id_plan_key_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"plan_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_subscription_plans_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_subscription_plans_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"02602c74\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:TenantSubscription\\\":{\\\"name\\\":\\\"tenantsubscription\\\",\\\"className\\\":\\\"TenantSubscription\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:TenantSubscription\\\",\\\"collection\\\":\\\"tenantsubscriptions\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/TenantSubscription.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"subscriberKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"tenant\\\",\\\"enum\\\":[\\\"tenant\\\",\\\"external\\\"]},\\\"subscriberExternalId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"planId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"SubscriptionPlan\\\"},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"incomplete\\\",\\\"enum\\\":[\\\"active\\\",\\\"canceled\\\",\\\"incomplete\\\",\\\"past_due\\\",\\\"trialing\\\",\\\"unpaid\\\"]},\\\"startedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"currentPeriodStart\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"currentPeriodEnd\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"trialEndsAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"cancelAtPeriodEnd\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"default\\\":false},\\\"canceledAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"agreedAmount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false},\\\"externalProvider\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false},\\\"stripeCustomerId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"stripeSubscriptionId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"stripeCheckoutSessionId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"methods\\\":{\\\"isEntitled\\\":{\\\"name\\\":\\\"isEntitled\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"now\\\",\\\"type\\\":\\\"any\\\",\\\"optional\\\":true}],\\\"returnType\\\":\\\"boolean\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getSubscriber\\\":{\\\"name\\\":\\\"getSubscriber\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Subscriber | null\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getMetadata\\\":{\\\"name\\\":\\\"getMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"JsonObject\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setMetadata\\\":{\\\"name\\\":\\\"setMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"metadata\\\",\\\"type\\\":\\\"JsonObject\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_tenant_subscriptions\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\"]},\\\"cli\\\":{\\\"skipApiCheck\\\":true},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"subscriber_kind\\\",\\\"subscriber_external_id\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"TenantSubscription\\\",\\\"collectionExportName\\\":\\\"TenantSubscriptionCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_tenant_subscriptions\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_tenant_subscriptions\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"plan_id\\\\\\\" UUID,\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'incomplete',\\\\n \\\\\\\"started_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"current_period_start\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"current_period_end\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"trial_ends_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"cancel_at_period_end\\\\\\\" BOOLEAN DEFAULT FALSE,\\\\n \\\\\\\"canceled_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"agreed_amount\\\\\\\" INTEGER,\\\\n \\\\\\\"external_provider\\\\\\\" TEXT,\\\\n \\\\\\\"stripe_customer_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"stripe_subscription_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"stripe_checkout_session_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metadata\\\\\\\" TEXT DEFAULT '{}'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"plan_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_subscription_plans\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"incomplete\\\"},\\\"started_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"current_period_start\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"current_period_end\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"trial_ends_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"cancel_at_period_end\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":false},\\\"canceled_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"agreed_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"external_provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"stripe_customer_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"stripe_subscription_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"stripe_checkout_session_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_tenant_subscriptions_tenant_id_subscriber_kind_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"subscriber_kind\\\",\\\"subscriber_external_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_tenant_subscriptions_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_tenant_subscriptions_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_tenant_subscriptions_plan_id_idx\\\",\\\"columns\\\":[\\\"plan_id\\\"]}],\\\"version\\\":\\\"2a04942c\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:TenantUsageMetric\\\":{\\\"name\\\":\\\"tenantusagemetric\\\",\\\"className\\\":\\\"TenantUsageMetric\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:TenantUsageMetric\\\",\\\"collection\\\":\\\"tenantusagemetrics\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/TenantUsageMetric.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"subscriberKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"tenant\\\",\\\"enum\\\":[\\\"tenant\\\",\\\"external\\\"]},\\\"subscriberExternalId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"metricKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"windowStart\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"windowEnd\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"source\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"sourceId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"projectId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"workRefType\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"workRefId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"dimensions\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"methods\\\":{\\\"getSubscriber\\\":{\\\"name\\\":\\\"getSubscriber\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Subscriber | null\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getDimensions\\\":{\\\"name\\\":\\\"getDimensions\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"JsonObject\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setDimensions\\\":{\\\"name\\\":\\\"setDimensions\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"dimensions\\\",\\\"type\\\":\\\"JsonObject\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"TenantUsageMetric\\\",\\\"collectionExportName\\\":\\\"TenantUsageMetricCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_tenant_usage_metrics\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"quantity\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"window_start\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"window_end\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"source\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provider\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"dimensions\\\\\\\" TEXT DEFAULT '{}'\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"window_start\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"window_end\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"source\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"dimensions\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_tenant_usage_metrics_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_tenant_usage_metrics_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"b799c746\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:PricingRule\\\":{\\\"name\\\":\\\"pricingrule\\\",\\\"className\\\":\\\"PricingRule\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:PricingRule\\\",\\\"collection\\\":\\\"pricingrules\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"ruleKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"metricKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"serviceKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"strategy\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"fixed_unit\\\",\\\"enum\\\":[\\\"fixed_unit\\\",\\\"cost_plus\\\",\\\"multiplier\\\",\\\"tiered\\\",\\\"included_overage\\\",\\\"flat\\\",\\\"custom\\\"]},\\\"currency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"effectiveFrom\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"effectiveTo\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"priority\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"terms\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"active\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"default\\\":true},\\\"priceBookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"PriceBook\\\"}},\\\"methods\\\":{\\\"getTerms\\\":{\\\"name\\\":\\\"getTerms\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setTerms\\\":{\\\"name\\\":\\\"setTerms\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"value\\\",\\\"type\\\":\\\"Record<string, unknown>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_pricing_rules\\\",\\\"api\\\":true,\\\"cli\\\":true,\\\"mcp\\\":true,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"PricingRule\\\",\\\"collectionExportName\\\":\\\"PricingRuleCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_pricing_rules\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_pricing_rules\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"rule_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"strategy\\\\\\\" TEXT DEFAULT 'fixed_unit',\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"effective_from\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"effective_to\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"priority\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"terms\\\\\\\" TEXT DEFAULT '{}',\\\\n \\\\\\\"active\\\\\\\" BOOLEAN DEFAULT TRUE,\\\\n \\\\\\\"price_book_id\\\\\\\" UUID\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"rule_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"strategy\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"fixed_unit\\\"},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"effective_from\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"effective_to\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"priority\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"terms\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true},\\\"price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_pricing_rules_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_pricing_rules_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_pricing_rules_price_book_id_idx\\\",\\\"columns\\\":[\\\"price_book_id\\\"]}],\\\"version\\\":\\\"65ce9b3f\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:ClientCharge\\\":{\\\"name\\\":\\\"clientcharge\\\",\\\"className\\\":\\\"ClientCharge\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:ClientCharge\\\",\\\"collection\\\":\\\"clientcharges\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"usageEventId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"TenantUsageMetric\\\"},\\\"usageTenantId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-users:Tenant\\\"},\\\"subscriberKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriberExternalId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"projectId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"workRefType\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"workRefId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"serviceKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"metricKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"amount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"pricingRuleId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"PricingRule\\\"},\\\"priceBookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"PriceBook\\\"},\\\"pricingSnapshot\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"draft\\\",\\\"enum\\\":[\\\"draft\\\",\\\"approved\\\",\\\"adjusted\\\"]},\\\"approvedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"getPricingSnapshot\\\":{\\\"name\\\":\\\"getPricingSnapshot\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_client_charges\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"conflictColumns\\\":[\\\"usage_event_id\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"ClientCharge\\\",\\\"collectionExportName\\\":\\\"ClientChargeCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_client_charges\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_client_charges\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"usage_event_id\\\\\\\" UUID,\\\\n \\\\\\\"usage_tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provider\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"quantity\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"pricing_rule_id\\\\\\\" UUID,\\\\n \\\\\\\"price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"pricing_snapshot\\\\\\\" TEXT DEFAULT '{}',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft',\\\\n \\\\\\\"approved_at\\\\\\\" TIMESTAMP\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"usage_event_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"usage_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"pricing_rule_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_pricing_rules\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"pricing_snapshot\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"draft\\\"},\\\"approved_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_client_charges_usage_event_id_idx\\\",\\\"columns\\\":[\\\"usage_event_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_client_charges_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_usage_tenant_id_idx\\\",\\\"columns\\\":[\\\"usage_tenant_id\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_pricing_rule_id_idx\\\",\\\"columns\\\":[\\\"pricing_rule_id\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_price_book_id_idx\\\",\\\"columns\\\":[\\\"price_book_id\\\"]}],\\\"version\\\":\\\"e542be95\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:BillingAdjustment\\\":{\\\"name\\\":\\\"billingadjustment\\\",\\\"className\\\":\\\"BillingAdjustment\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:BillingAdjustment\\\",\\\"collection\\\":\\\"billingadjustments\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"clientChargeId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"ClientCharge\\\"},\\\"amount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"reason\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"source\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"sourceId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"createdBy\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_billing_adjustments\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"BillingAdjustment\\\",\\\"collectionExportName\\\":\\\"BillingAdjustmentCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_billing_adjustments\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_billing_adjustments\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"client_charge_id\\\\\\\" UUID,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"reason\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"created_by\\\\\\\" TEXT DEFAULT ''\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"client_charge_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_client_charges\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"created_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_billing_adjustments_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_billing_adjustments_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_billing_adjustments_client_charge_id_idx\\\",\\\"columns\\\":[\\\"client_charge_id\\\"]}],\\\"version\\\":\\\"cded0b52\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:SpendingPolicy\\\":{\\\"name\\\":\\\"spendingpolicy\\\",\\\"className\\\":\\\"SpendingPolicy\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:SpendingPolicy\\\",\\\"collection\\\":\\\"spendingpolicies\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"subscriberKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"subscriberExternalId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"projectId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"serviceKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"metricKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"period\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"month\\\",\\\"enum\\\":[\\\"day\\\",\\\"week\\\",\\\"month\\\",\\\"year\\\",\\\"rolling\\\",\\\"balance\\\"]},\\\"rollingSeconds\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"limitAmount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"behavior\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"observe\\\",\\\"enum\\\":[\\\"observe\\\",\\\"warn\\\",\\\"block\\\",\\\"approval_required\\\"]},\\\"priority\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"active\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"default\\\":true},\\\"basis\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"billed\\\",\\\"enum\\\":[\\\"billed\\\",\\\"retail\\\",\\\"wholesale\\\"]},\\\"setByTenantId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-users:Tenant\\\"},\\\"balanceFrom\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_spending_policies\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"subscriber_kind\\\",\\\"subscriber_external_id\\\",\\\"project_id\\\",\\\"service_key\\\",\\\"metric_key\\\",\\\"period\\\",\\\"name\\\"],\\\"api\\\":true,\\\"cli\\\":true,\\\"mcp\\\":true,\\\"hooks\\\":{\\\"beforeDelete\\\":\\\"assertDelegationAuthority\\\"},\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"SpendingPolicy\\\",\\\"collectionExportName\\\":\\\"SpendingPolicyCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_spending_policies\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_spending_policies\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"period\\\\\\\" TEXT DEFAULT 'month',\\\\n \\\\\\\"rolling_seconds\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"limit_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"behavior\\\\\\\" TEXT DEFAULT 'observe',\\\\n \\\\\\\"priority\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"active\\\\\\\" BOOLEAN DEFAULT TRUE,\\\\n \\\\\\\"basis\\\\\\\" TEXT DEFAULT 'billed',\\\\n \\\\\\\"set_by_tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"balance_from\\\\\\\" TIMESTAMP\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"period\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"month\\\"},\\\"rolling_seconds\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"limit_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"behavior\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"observe\\\"},\\\"priority\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true},\\\"basis\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"billed\\\"},\\\"set_by_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"balance_from\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_spending_policies_tenant_id_subscriber_kind_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"subscriber_kind\\\",\\\"subscriber_external_id\\\",\\\"project_id\\\",\\\"service_key\\\",\\\"metric_key\\\",\\\"period\\\",\\\"name\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_spending_policies_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_spending_policies_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_spending_policies_set_by_tenant_id_idx\\\",\\\"columns\\\":[\\\"set_by_tenant_id\\\"]}],\\\"version\\\":\\\"c4ac2f49\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:PricingRuleCollection\\\":{\\\"name\\\":\\\"pricingrulecollection\\\",\\\"className\\\":\\\"PricingRuleCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:PricingRuleCollection\\\",\\\"collection\\\":\\\"pricingrules\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_pricing_rules\\\"},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"PricingRule\\\",\\\"exportName\\\":\\\"PricingRuleCollection\\\",\\\"collectionExportName\\\":\\\"PricingRuleCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_pricing_rules\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_pricing_rules\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"rule_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"strategy\\\\\\\" TEXT DEFAULT 'fixed_unit',\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"effective_from\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"effective_to\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"priority\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"terms\\\\\\\" TEXT DEFAULT '{}',\\\\n \\\\\\\"active\\\\\\\" BOOLEAN DEFAULT TRUE,\\\\n \\\\\\\"price_book_id\\\\\\\" UUID\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"rule_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"strategy\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"fixed_unit\\\"},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"effective_from\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"effective_to\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"priority\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"terms\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true},\\\"price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_pricing_rules_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_pricing_rules_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_pricing_rules_price_book_id_idx\\\",\\\"columns\\\":[\\\"price_book_id\\\"]}],\\\"version\\\":\\\"65ce9b3f\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:ClientChargeCollection\\\":{\\\"name\\\":\\\"clientchargecollection\\\",\\\"className\\\":\\\"ClientChargeCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:ClientChargeCollection\\\",\\\"collection\\\":\\\"clientcharges\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_client_charges\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"ClientCharge\\\",\\\"exportName\\\":\\\"ClientChargeCollection\\\",\\\"collectionExportName\\\":\\\"ClientChargeCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_client_charges\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_client_charges\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"usage_event_id\\\\\\\" UUID,\\\\n \\\\\\\"usage_tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provider\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"quantity\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"pricing_rule_id\\\\\\\" UUID,\\\\n \\\\\\\"price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"pricing_snapshot\\\\\\\" TEXT DEFAULT '{}',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft',\\\\n \\\\\\\"approved_at\\\\\\\" TIMESTAMP\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"usage_event_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"usage_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"pricing_rule_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_pricing_rules\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"pricing_snapshot\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"draft\\\"},\\\"approved_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_client_charges_usage_event_id_idx\\\",\\\"columns\\\":[\\\"usage_event_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_client_charges_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_usage_tenant_id_idx\\\",\\\"columns\\\":[\\\"usage_tenant_id\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_pricing_rule_id_idx\\\",\\\"columns\\\":[\\\"pricing_rule_id\\\"]},{\\\"name\\\":\\\"_smrt_client_charges_price_book_id_idx\\\",\\\"columns\\\":[\\\"price_book_id\\\"]}],\\\"version\\\":\\\"e542be95\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:BillingAdjustmentCollection\\\":{\\\"name\\\":\\\"billingadjustmentcollection\\\",\\\"className\\\":\\\"BillingAdjustmentCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:BillingAdjustmentCollection\\\",\\\"collection\\\":\\\"billingadjustments\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_billing_adjustments\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"BillingAdjustment\\\",\\\"exportName\\\":\\\"BillingAdjustmentCollection\\\",\\\"collectionExportName\\\":\\\"BillingAdjustmentCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_billing_adjustments\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_billing_adjustments\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"client_charge_id\\\\\\\" UUID,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"reason\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"created_by\\\\\\\" TEXT DEFAULT ''\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"client_charge_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_client_charges\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"created_by\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_billing_adjustments_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_billing_adjustments_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_billing_adjustments_client_charge_id_idx\\\",\\\"columns\\\":[\\\"client_charge_id\\\"]}],\\\"version\\\":\\\"cded0b52\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:SpendingPolicyCollection\\\":{\\\"name\\\":\\\"spendingpolicycollection\\\",\\\"className\\\":\\\"SpendingPolicyCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:SpendingPolicyCollection\\\",\\\"collection\\\":\\\"spendingpolicies\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/commercial.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_spending_policies\\\"},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"SpendingPolicy\\\",\\\"exportName\\\":\\\"SpendingPolicyCollection\\\",\\\"collectionExportName\\\":\\\"SpendingPolicyCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_spending_policies\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_spending_policies\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"period\\\\\\\" TEXT DEFAULT 'month',\\\\n \\\\\\\"rolling_seconds\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"limit_amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"behavior\\\\\\\" TEXT DEFAULT 'observe',\\\\n \\\\\\\"priority\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"active\\\\\\\" BOOLEAN DEFAULT TRUE,\\\\n \\\\\\\"basis\\\\\\\" TEXT DEFAULT 'billed',\\\\n \\\\\\\"set_by_tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"balance_from\\\\\\\" TIMESTAMP\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"period\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"month\\\"},\\\"rolling_seconds\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"limit_amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"behavior\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"observe\\\"},\\\"priority\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true},\\\"basis\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"billed\\\"},\\\"set_by_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"balance_from\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_spending_policies_tenant_id_subscriber_kind_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"subscriber_kind\\\",\\\"subscriber_external_id\\\",\\\"project_id\\\",\\\"service_key\\\",\\\"metric_key\\\",\\\"period\\\",\\\"name\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_spending_policies_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_spending_policies_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_spending_policies_set_by_tenant_id_idx\\\",\\\"columns\\\":[\\\"set_by_tenant_id\\\"]}],\\\"version\\\":\\\"c4ac2f49\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:PriceBook\\\":{\\\"name\\\":\\\"pricebook\\\",\\\"className\\\":\\\"PriceBook\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:PriceBook\\\",\\\"collection\\\":\\\"pricebooks\\\",\\\"description\\\":\\\"A named set of prices published by one seller tenant. Its prices are ordinary PricingRule rows that carry this book's id and the same tenant; one rule per currency gives a price in several currencies.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"bookKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"name\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"kind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"retail\\\",\\\"enum\\\":[\\\"wholesale\\\",\\\"retail\\\"]},\\\"active\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"default\\\":true}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_price_books\\\",\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"book_key\\\"],\\\"api\\\":false,\\\"cli\\\":false,\\\"mcp\\\":false,\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"PriceBook\\\",\\\"collectionExportName\\\":\\\"PriceBookCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_price_books\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_price_books\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"book_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'retail',\\\\n \\\\\\\"active\\\\\\\" BOOLEAN DEFAULT TRUE\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"book_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"retail\\\"},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_price_books_tenant_id_book_key_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"book_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_price_books_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_price_books_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"c7e5f5e0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:PriceBookAssignment\\\":{\\\"name\\\":\\\"pricebookassignment\\\",\\\"className\\\":\\\"PriceBookAssignment\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:PriceBookAssignment\\\",\\\"collection\\\":\\\"pricebookassignments\\\",\\\"description\\\":\\\"Which price books rate one child tenant's usage, keyed like the tenancy billing relationship it belongs to (one row per child).\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"childTenantId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":true,\\\"related\\\":\\\"@happyvertical/smrt-users:Tenant\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"resellerTenantId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":true,\\\"related\\\":\\\"@happyvertical/smrt-users:Tenant\\\",\\\"_meta\\\":{\\\"required\\\":true}},\\\"wholesalePriceBookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"PriceBook\\\"},\\\"wholesaleCurrency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"retailPriceBookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"PriceBook\\\"},\\\"retailCurrency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_price_book_assignments\\\",\\\"conflictColumns\\\":[\\\"child_tenant_id\\\"],\\\"api\\\":false,\\\"cli\\\":false,\\\"mcp\\\":false},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"PriceBookAssignment\\\",\\\"collectionExportName\\\":\\\"PriceBookAssignmentCollection\\\",\\\"validationRules\\\":[{\\\"field\\\":\\\"childTenantId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"crossPackageRef\\\"},{\\\"field\\\":\\\"resellerTenantId\\\",\\\"rule\\\":\\\"required\\\",\\\"fieldType\\\":\\\"crossPackageRef\\\"}],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_price_book_assignments\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_price_book_assignments\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"child_tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"reseller_tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"wholesale_price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"wholesale_currency\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"retail_price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"retail_currency\\\\\\\" TEXT DEFAULT ''\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"child_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"reseller_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"wholesale_price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"wholesale_currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"retail_price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"retail_currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_price_book_assignments_child_tenant_id_idx\\\",\\\"columns\\\":[\\\"child_tenant_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_price_book_assignments_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_reseller_tenant_id_idx\\\",\\\"columns\\\":[\\\"reseller_tenant_id\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_wholesale_price_book_id_idx\\\",\\\"columns\\\":[\\\"wholesale_price_book_id\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_retail_price_book_id_idx\\\",\\\"columns\\\":[\\\"retail_price_book_id\\\"]}],\\\"version\\\":\\\"f24f020e\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:RetailCharge\\\":{\\\"name\\\":\\\"retailcharge\\\",\\\"className\\\":\\\"RetailCharge\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:RetailCharge\\\",\\\"collection\\\":\\\"retailcharges\\\",\\\"description\\\":\\\"What a reseller charges one child for one usage event, priced from the reseller's retail book.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"resellerTenantId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-users:Tenant\\\"},\\\"usageEventId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"TenantUsageMetric\\\"},\\\"clientChargeId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"ClientCharge\\\"},\\\"subscriberKind\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriberExternalId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"projectId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"workRefType\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"workRefId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"serviceKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"metricKey\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"decimal\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"amount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"priceBookId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"PriceBook\\\"},\\\"pricingRuleId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"PricingRule\\\"},\\\"pricingSnapshot\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"draft\\\",\\\"enum\\\":[\\\"draft\\\",\\\"approved\\\"]},\\\"approvedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"getPricingSnapshot\\\":{\\\"name\\\":\\\"getPricingSnapshot\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_retail_charges\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"conflictColumns\\\":[\\\"usage_event_id\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"RetailCharge\\\",\\\"collectionExportName\\\":\\\"RetailChargeCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_retail_charges\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_retail_charges\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"reseller_tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"usage_event_id\\\\\\\" UUID,\\\\n \\\\\\\"client_charge_id\\\\\\\" UUID,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provider\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"quantity\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"pricing_rule_id\\\\\\\" UUID,\\\\n \\\\\\\"pricing_snapshot\\\\\\\" TEXT DEFAULT '{}',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft',\\\\n \\\\\\\"approved_at\\\\\\\" TIMESTAMP\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"reseller_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"usage_event_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"client_charge_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_client_charges\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"pricing_rule_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_pricing_rules\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"pricing_snapshot\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"draft\\\"},\\\"approved_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_retail_charges_usage_event_id_idx\\\",\\\"columns\\\":[\\\"usage_event_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_retail_charges_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_reseller_tenant_id_idx\\\",\\\"columns\\\":[\\\"reseller_tenant_id\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_client_charge_id_idx\\\",\\\"columns\\\":[\\\"client_charge_id\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_price_book_id_idx\\\",\\\"columns\\\":[\\\"price_book_id\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_pricing_rule_id_idx\\\",\\\"columns\\\":[\\\"pricing_rule_id\\\"]}],\\\"version\\\":\\\"1c1ae3c8\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:CreditGrant\\\":{\\\"name\\\":\\\"creditgrant\\\",\\\"className\\\":\\\"CreditGrant\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:CreditGrant\\\",\\\"collection\\\":\\\"creditgrants\\\",\\\"description\\\":\\\"An append-only credit on a prepaid (period: 'balance') spending policy. Positive amounts add credit; a negative amount reverses an earlier grant.\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{\\\"tenantId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":true,\\\"_meta\\\":{\\\"sqlType\\\":\\\"UUID\\\",\\\"__tenancy\\\":{\\\"isTenantIdField\\\":true,\\\"autoFilter\\\":true,\\\"required\\\":true,\\\"autoPopulate\\\":true,\\\"nullable\\\":false,\\\"mode\\\":\\\"required\\\",\\\"field\\\":\\\"tenantId\\\",\\\"allowSuperAdminBypass\\\":false}}},\\\"spendingPolicyId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"SpendingPolicy\\\"},\\\"amount\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"reason\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"source\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"sourceId\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"grantedByTenantId\\\":{\\\"type\\\":\\\"crossPackageRef\\\",\\\"required\\\":false,\\\"related\\\":\\\"@happyvertical/smrt-users:Tenant\\\"}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_credit_grants\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"hooks\\\":{\\\"beforeDelete\\\":\\\"refuseDelete\\\"},\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"]},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"CreditGrant\\\",\\\"collectionExportName\\\":\\\"CreditGrantCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_credit_grants\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_credit_grants\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"spending_policy_id\\\\\\\" UUID,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"reason\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"granted_by_tenant_id\\\\\\\" UUID\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"spending_policy_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_spending_policies\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"granted_by_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_credit_grants_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_credit_grants_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_credit_grants_spending_policy_id_idx\\\",\\\"columns\\\":[\\\"spending_policy_id\\\"]},{\\\"name\\\":\\\"_smrt_credit_grants_granted_by_tenant_id_idx\\\",\\\"columns\\\":[\\\"granted_by_tenant_id\\\"]}],\\\"version\\\":\\\"602c4e02\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:PriceBookCollection\\\":{\\\"name\\\":\\\"pricebookcollection\\\",\\\"className\\\":\\\"PriceBookCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:PriceBookCollection\\\",\\\"collection\\\":\\\"pricebooks\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_price_books\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"PriceBook\\\",\\\"exportName\\\":\\\"PriceBookCollection\\\",\\\"collectionExportName\\\":\\\"PriceBookCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_price_books\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_price_books\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"book_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"kind\\\\\\\" TEXT DEFAULT 'retail',\\\\n \\\\\\\"active\\\\\\\" BOOLEAN DEFAULT TRUE\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"book_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"retail\\\"},\\\"active\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_price_books_tenant_id_book_key_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"book_key\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_price_books_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_price_books_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"c7e5f5e0\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:PriceBookAssignmentCollection\\\":{\\\"name\\\":\\\"pricebookassignmentcollection\\\",\\\"className\\\":\\\"PriceBookAssignmentCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:PriceBookAssignmentCollection\\\",\\\"collection\\\":\\\"pricebookassignments\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_price_book_assignments\\\",\\\"api\\\":false,\\\"mcp\\\":false,\\\"cli\\\":false},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"PriceBookAssignment\\\",\\\"exportName\\\":\\\"PriceBookAssignmentCollection\\\",\\\"collectionExportName\\\":\\\"PriceBookAssignmentCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_price_book_assignments\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_price_book_assignments\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"child_tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"reseller_tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"wholesale_price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"wholesale_currency\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"retail_price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"retail_currency\\\\\\\" TEXT DEFAULT ''\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"child_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"reseller_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"wholesale_price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"wholesale_currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"retail_price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"retail_currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_price_book_assignments_child_tenant_id_idx\\\",\\\"columns\\\":[\\\"child_tenant_id\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_price_book_assignments_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_created_at_idx\\\",\\\"columns\\\":[\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_reseller_tenant_id_idx\\\",\\\"columns\\\":[\\\"reseller_tenant_id\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_wholesale_price_book_id_idx\\\",\\\"columns\\\":[\\\"wholesale_price_book_id\\\"]},{\\\"name\\\":\\\"_smrt_price_book_assignments_retail_price_book_id_idx\\\",\\\"columns\\\":[\\\"retail_price_book_id\\\"]}],\\\"version\\\":\\\"f24f020e\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:RetailChargeCollection\\\":{\\\"name\\\":\\\"retailchargecollection\\\",\\\"className\\\":\\\"RetailChargeCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:RetailChargeCollection\\\",\\\"collection\\\":\\\"retailcharges\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_retail_charges\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"RetailCharge\\\",\\\"exportName\\\":\\\"RetailChargeCollection\\\",\\\"collectionExportName\\\":\\\"RetailChargeCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_retail_charges\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_retail_charges\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"reseller_tenant_id\\\\\\\" UUID,\\\\n \\\\\\\"usage_event_id\\\\\\\" UUID,\\\\n \\\\\\\"client_charge_id\\\\\\\" UUID,\\\\n \\\\\\\"subscriber_kind\\\\\\\" TEXT DEFAULT 'tenant',\\\\n \\\\\\\"subscriber_external_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"project_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"work_ref_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provider\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"service_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metric_key\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"quantity\\\\\\\" REAL DEFAULT 0,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"price_book_id\\\\\\\" UUID,\\\\n \\\\\\\"pricing_rule_id\\\\\\\" UUID,\\\\n \\\\\\\"pricing_snapshot\\\\\\\" TEXT DEFAULT '{}',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft',\\\\n \\\\\\\"approved_at\\\\\\\" TIMESTAMP\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"reseller_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"usage_event_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_tenant_usage_metrics\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"client_charge_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_client_charges\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"subscriber_kind\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"tenant\\\"},\\\"subscriber_external_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"project_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"work_ref_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provider\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"service_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metric_key\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"quantity\\\":{\\\"type\\\":\\\"REAL\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"price_book_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_price_books\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"pricing_rule_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_pricing_rules\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"pricing_snapshot\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"{}\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"draft\\\"},\\\"approved_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_retail_charges_usage_event_id_idx\\\",\\\"columns\\\":[\\\"usage_event_id\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"_smrt_retail_charges_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_reseller_tenant_id_idx\\\",\\\"columns\\\":[\\\"reseller_tenant_id\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_client_charge_id_idx\\\",\\\"columns\\\":[\\\"client_charge_id\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_price_book_id_idx\\\",\\\"columns\\\":[\\\"price_book_id\\\"]},{\\\"name\\\":\\\"_smrt_retail_charges_pricing_rule_id_idx\\\",\\\"columns\\\":[\\\"pricing_rule_id\\\"]}],\\\"version\\\":\\\"1c1ae3c8\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"},\\\"@happyvertical/smrt-subscriptions:CreditGrantCollection\\\":{\\\"name\\\":\\\"creditgrantcollection\\\",\\\"className\\\":\\\"CreditGrantCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-subscriptions:CreditGrantCollection\\\",\\\"collection\\\":\\\"creditgrants\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/subscriptions/src/models/reseller.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-subscriptions\\\",\\\"fields\\\":{},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"_smrt_credit_grants\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"CreditGrant\\\",\\\"exportName\\\":\\\"CreditGrantCollection\\\",\\\"collectionExportName\\\":\\\"CreditGrantCollectionCollection\\\",\\\"schema\\\":{\\\"tableName\\\":\\\"_smrt_credit_grants\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"_smrt_credit_grants\\\\\\\" (\\\\n \\\\\\\"id\\\\\\\" UUID PRIMARY KEY NOT NULL,\\\\n \\\\\\\"slug\\\\\\\" TEXT NOT NULL,\\\\n \\\\\\\"context\\\\\\\" TEXT NOT NULL DEFAULT '',\\\\n \\\\\\\"created_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"updated_at\\\\\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\\\n \\\\\\\"tenant_id\\\\\\\" UUID NOT NULL,\\\\n \\\\\\\"spending_policy_id\\\\\\\" UUID,\\\\n \\\\\\\"amount\\\\\\\" INTEGER DEFAULT 0,\\\\n \\\\\\\"currency\\\\\\\" TEXT DEFAULT 'USD',\\\\n \\\\\\\"reason\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"source_id\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"granted_by_tenant_id\\\\\\\" UUID\\\\n);\\\",\\\"columns\\\":{\\\"id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"primaryKey\\\":true,\\\"referenceKind\\\":\\\"id\\\",\\\"notNull\\\":true},\\\"slug\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true},\\\"context\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"\\\"},\\\"created_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"updated_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":true,\\\"default\\\":\\\"current_timestamp\\\"},\\\"tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"tenantId\\\",\\\"notNull\\\":true,\\\"unique\\\":false},\\\"spending_policy_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"_smrt_spending_policies\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"NO ACTION\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"amount\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0},\\\"currency\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"USD\\\"},\\\"reason\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"source_id\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"granted_by_tenant_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"crossPackageRef\\\",\\\"notNull\\\":false,\\\"unique\\\":false}},\\\"indexes\\\":[{\\\"name\\\":\\\"_smrt_credit_grants_slug_context_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"slug\\\",\\\"context\\\"],\\\"unique\\\":true},{\\\"name\\\":\\\"_smrt_credit_grants_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]},{\\\"name\\\":\\\"_smrt_credit_grants_spending_policy_id_idx\\\",\\\"columns\\\":[\\\"spending_policy_id\\\"]},{\\\"name\\\":\\\"_smrt_credit_grants_granted_by_tenant_id_idx\\\",\\\"columns\\\":[\\\"granted_by_tenant_id\\\"]}],\\\"version\\\":\\\"602c4e02\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-subscriptions\\\"}},\\\"moduleType\\\":\\\"smrt\\\",\\\"smrtDependencies\\\":[\\\"@happyvertical/smrt-core\\\",\\\"@happyvertical/smrt-tenancy\\\"],\\\"browser\\\":{\\\"status\\\":\\\"server-only\\\",\\\"issues\\\":[\\\"#3624\\\",\\\"#3626\\\"],\\\"reason\\\":\\\"core migrations (node:crypto, node:os)\\\",\\\"via\\\":[\\\"@happyvertical/smrt-tenancy\\\"]},\\\"stampsConstructors\\\":true}\"));\n","import type {\n JsonObject,\n PlanFeatureGrant,\n PlanThreshold,\n Subscriber,\n SubscriberKind,\n ThresholdEnforcement,\n ThresholdWindow,\n UsageWindow,\n} from './types.js';\n\nconst THRESHOLD_WINDOWS: ThresholdWindow[] = [\n 'day',\n 'week',\n 'month',\n 'year',\n 'rolling',\n];\nconst THRESHOLD_ENFORCEMENTS: ThresholdEnforcement[] = [\n 'observe',\n 'warn',\n 'block',\n];\n\nexport async function deterministicUuid(parts: string[]): Promise<string> {\n const bytes = new TextEncoder().encode(JSON.stringify(parts));\n const digest = new Uint8Array(await crypto.subtle.digest('SHA-256', bytes));\n const uuid = digest.slice(0, 16);\n uuid[6] = (uuid[6] & 0x0f) | 0x50;\n uuid[8] = (uuid[8] & 0x3f) | 0x80;\n const hex = Array.from(uuid, (byte) =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20),\n ].join('-');\n}\n\nexport function parseJsonArray<T>(value: string, fallback: T[] = []): T[] {\n if (!value) {\n return fallback;\n }\n\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed) ? (parsed as T[]) : fallback;\n } catch {\n return fallback;\n }\n}\n\nexport function parseJsonObject<T extends JsonObject>(\n value: string,\n fallback: T,\n): T {\n if (!value) {\n return fallback;\n }\n\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as T)\n : fallback;\n } catch {\n return fallback;\n }\n}\n\nexport function stringifyJson(value: unknown): string {\n return JSON.stringify(value ?? null);\n}\n\nexport function normalizeFeatureGrants(\n grants: Array<string | PlanFeatureGrant>,\n): PlanFeatureGrant[] {\n return grants.map((grant) =>\n typeof grant === 'string' ? { featureKey: grant, enabled: true } : grant,\n );\n}\n\n/**\n * Coerce inputs from the legacy tenant-only API into a {@link Subscriber}.\n *\n * Existing callers that pass only `tenantId` (with optional `subscriberKind` /\n * `subscriberExternalId` fields, e.g. on `RecordUsageOptions`) get normalized\n * into the discriminated union exactly once at the boundary. This is the only\n * place that contains \"if kind is omitted, default to tenant\" logic — every\n * other site works with a typed `Subscriber`.\n *\n * Throws when:\n * - `subscriberKind === 'external'` is requested without a non-empty\n * `subscriberExternalId` (the XOR invariant is the whole point), or\n * - the input carries a non-empty `subscriberExternalId` but the kind resolves\n * to `'tenant'` (silent re-scoping would write buyer-scoped usage as tenant\n * usage, which then disappears from external summaries).\n */\nexport function normalizeSubscriber(input: {\n tenantId: string;\n subscriberKind?: SubscriberKind | null;\n subscriberExternalId?: string | null;\n}): Subscriber {\n // Treat null/undefined external ids as \"absent\" — but only after the\n // discriminator-derived branch decides what to do. We never coerce null\n // into the persisted column because the invariant on the model is\n // re-checked at save time via assertSubscriberInvariant.\n const rawExternalId = input.subscriberExternalId;\n const externalIdAbsent =\n rawExternalId === null || rawExternalId === undefined;\n const externalId = externalIdAbsent ? '' : String(rawExternalId);\n\n const rawKind = input.subscriberKind;\n const kind: SubscriberKind =\n rawKind === null || rawKind === undefined ? 'tenant' : rawKind;\n\n if (kind !== 'tenant' && kind !== 'external') {\n throw new Error(\n `subscriberKind must be \"tenant\" or \"external\" (got ${JSON.stringify(rawKind)})`,\n );\n }\n\n if (kind === 'tenant') {\n if (externalId !== '') {\n throw new Error(\n 'subscriberExternalId is set but subscriberKind is \"tenant\"; ' +\n 'set subscriberKind=\"external\" explicitly or omit subscriberExternalId',\n );\n }\n return { kind: 'tenant', tenantId: input.tenantId };\n }\n if (externalId === '') {\n throw new Error(\n 'subscriberKind=\"external\" requires a non-empty subscriberExternalId',\n );\n }\n return {\n kind: 'external',\n tenantId: input.tenantId,\n externalId,\n };\n}\n\n/**\n * Project a {@link Subscriber} back onto column values for persistence or query\n * filters. Counterpart to {@link normalizeSubscriber}.\n */\nexport function subscriberToColumns(subscriber: Subscriber): {\n tenantId: string;\n subscriberKind: SubscriberKind;\n subscriberExternalId: string;\n} {\n if (subscriber.kind === 'tenant') {\n return {\n tenantId: subscriber.tenantId,\n subscriberKind: 'tenant',\n subscriberExternalId: '',\n };\n }\n return {\n tenantId: subscriber.tenantId,\n subscriberKind: 'external',\n subscriberExternalId: subscriber.externalId,\n };\n}\n\n/**\n * Enforce the subscriber XOR invariant on a row's columns. Used by both the\n * model constructors (catches construction-time mistakes) and the\n * `validateBeforeSave` override (catches mutations applied via the\n * generated PUT/PATCH update path that bypass the constructor).\n *\n * Defensive about types because both call sites can receive JSON or untyped\n * fixture data via the generated REST/CLI surface — `null` arriving in place\n * of `''` would otherwise slip past an `=== ''` check, land in the\n * `(tenant_id, subscriber_kind, subscriber_external_id)` conflict key, and\n * (on Postgres) not collide with other NULLs while `findCurrentForSubscriber`\n * keeps querying by a string external id.\n *\n * @param modelName - Prepended to error messages so callers can tell whether\n * the failure originated in `TenantSubscription` or `TenantUsageMetric`.\n */\nexport function assertSubscriberInvariant(\n modelName: string,\n fields: {\n subscriberKind: unknown;\n subscriberExternalId: unknown;\n },\n): void {\n if (\n fields.subscriberKind !== 'tenant' &&\n fields.subscriberKind !== 'external'\n ) {\n throw new Error(\n `${modelName}: subscriberKind must be \"tenant\" or \"external\" (got ${describe(\n fields.subscriberKind,\n )})`,\n );\n }\n if (typeof fields.subscriberExternalId !== 'string') {\n throw new Error(\n `${modelName}: subscriberExternalId must be a string (got ${describe(\n fields.subscriberExternalId,\n )})`,\n );\n }\n\n if (\n fields.subscriberKind === 'tenant' &&\n fields.subscriberExternalId !== ''\n ) {\n throw new Error(\n `${modelName}: subscriberExternalId must be empty when subscriberKind is \"tenant\"`,\n );\n }\n if (\n fields.subscriberKind === 'external' &&\n fields.subscriberExternalId === ''\n ) {\n throw new Error(\n `${modelName}: subscriberKind=\"external\" requires a non-empty subscriberExternalId`,\n );\n }\n}\n\nfunction describe(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'string') return `\"${value}\"`;\n return String(value);\n}\n\nexport function getWindowForThreshold(\n thresholdWindow: ThresholdWindow,\n now = new Date(),\n): UsageWindow {\n switch (thresholdWindow) {\n case 'day':\n return utcWindow(now, 'day');\n case 'week':\n return utcWindow(now, 'week');\n case 'month':\n return utcWindow(now, 'month');\n case 'year':\n return utcWindow(now, 'year');\n case 'rolling':\n return {\n start: new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000),\n end: now,\n };\n }\n}\n\nexport function getWindowKey(window: UsageWindow): string {\n return `${window.start.toISOString()}..${window.end.toISOString()}`;\n}\n\nexport function isValidThreshold(threshold: PlanThreshold): boolean {\n return (\n typeof threshold.metricKey === 'string' &&\n threshold.metricKey.length > 0 &&\n Number.isFinite(threshold.limit) &&\n threshold.limit >= 0 &&\n isThresholdWindow(threshold.window) &&\n isThresholdEnforcement(threshold.enforcement) &&\n (threshold.warningRatio === undefined ||\n (Number.isFinite(threshold.warningRatio) &&\n threshold.warningRatio >= 0 &&\n threshold.warningRatio <= 1))\n );\n}\n\nfunction isThresholdWindow(value: unknown): value is ThresholdWindow {\n return (\n typeof value === 'string' &&\n THRESHOLD_WINDOWS.includes(value as ThresholdWindow)\n );\n}\n\nfunction isThresholdEnforcement(value: unknown): value is ThresholdEnforcement {\n return (\n typeof value === 'string' &&\n THRESHOLD_ENFORCEMENTS.includes(value as ThresholdEnforcement)\n );\n}\n\nfunction utcWindow(now: Date, unit: 'day' | 'week' | 'month' | 'year') {\n const start = new Date(\n Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()),\n );\n\n if (unit === 'week') {\n const day = start.getUTCDay();\n const mondayOffset = day === 0 ? -6 : 1 - day;\n start.setUTCDate(start.getUTCDate() + mondayOffset);\n }\n\n if (unit === 'month') {\n start.setUTCDate(1);\n }\n\n if (unit === 'year') {\n start.setUTCMonth(0, 1);\n }\n\n const end = new Date(start);\n switch (unit) {\n case 'day':\n end.setUTCDate(end.getUTCDate() + 1);\n break;\n case 'week':\n end.setUTCDate(end.getUTCDate() + 7);\n break;\n case 'month':\n end.setUTCMonth(end.getUTCMonth() + 1);\n break;\n case 'year':\n end.setUTCFullYear(end.getUTCFullYear() + 1);\n break;\n }\n\n return { start, end };\n}\n\n/** Canonical comparison key for a possibly-null hydrated tenant id. */\nexport function tenantKey(value: string | null | undefined): string {\n return String(value ?? '').toLowerCase();\n}\n","import { SmrtObject, smrt } from '@happyvertical/smrt-core';\nimport {\n getTenantId,\n TenantScoped,\n tenantId,\n} from '@happyvertical/smrt-tenancy';\nimport type {\n BillingInterval,\n JsonObject,\n PlanFeatureGrant,\n PlanThreshold,\n PricingMode,\n SubscriptionPlanOptions,\n SubscriptionPlanStatus,\n} from '../types.js';\nimport {\n normalizeFeatureGrants,\n parseJsonArray,\n parseJsonObject,\n stringifyJson,\n} from '../utils.js';\n\n@TenantScoped({ mode: 'optional' })\n@smrt({\n tableName: '_smrt_subscription_plans',\n api: { include: ['list', 'get', 'create', 'update'] },\n cli: { skipApiCheck: true },\n mcp: { include: ['list', 'get'] },\n conflictColumns: ['tenant_id', 'plan_key'],\n})\nexport class SubscriptionPlan extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @tenantId({ nullable: true })\n tenantId: string | null = null;\n\n planKey: string = '';\n name: string = '';\n description: string = '';\n status: SubscriptionPlanStatus = 'active';\n sortOrder: number = 0;\n /**\n * Plan price in **integer minor units** of {@link currency} — `$19.99` is\n * `1999`. The `= 0` initializer is load-bearing: SMRT maps an integer literal\n * to INTEGER and a decimal literal to DECIMAL, and money is exact (#2401).\n */\n priceAmount: number = 0;\n currency: string = 'USD';\n billingInterval: BillingInterval = 'month';\n pricingMode: PricingMode = 'fixed';\n minimumAmount: number = 0;\n suggestedAmount: number = 0;\n /** Optional provider binding; plan semantics never require a provider. */\n externalProvider: string | null = null;\n providerProductId: string | null = null;\n providerPriceId: string | null = null;\n /** @deprecated Use providerProductId. */\n stripeProductId: string | null = null;\n /** @deprecated Use providerPriceId. */\n stripePriceId: string | null = null;\n features: string = '[]';\n thresholds: string = '[]';\n metadata: string = '{}';\n\n constructor(options: SubscriptionPlanOptions = {}) {\n super(options);\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.planKey !== undefined) this.planKey = options.planKey;\n if (options.name !== undefined) this.name = options.name;\n if (options.description !== undefined)\n this.description = options.description;\n if (options.status !== undefined) this.status = options.status;\n if (options.sortOrder !== undefined) this.sortOrder = options.sortOrder;\n if (options.priceAmount !== undefined)\n this.priceAmount = options.priceAmount;\n if (options.currency !== undefined) this.currency = options.currency;\n if (options.billingInterval !== undefined) {\n this.billingInterval = options.billingInterval;\n }\n if (options.externalProvider !== undefined) {\n this.externalProvider = options.externalProvider;\n }\n if (options.pricingMode !== undefined)\n this.pricingMode = options.pricingMode;\n if (options.minimumAmount !== undefined)\n this.minimumAmount = options.minimumAmount;\n if (options.suggestedAmount !== undefined)\n this.suggestedAmount = options.suggestedAmount;\n if (options.providerProductId !== undefined) {\n this.providerProductId = options.providerProductId;\n }\n if (options.providerPriceId !== undefined) {\n this.providerPriceId = options.providerPriceId;\n }\n if (options.stripeProductId !== undefined) {\n this.stripeProductId = options.stripeProductId;\n }\n if (options.stripePriceId !== undefined) {\n this.stripePriceId = options.stripePriceId;\n }\n if (options.features !== undefined) this.features = options.features;\n if (options.thresholds !== undefined) this.thresholds = options.thresholds;\n if (options.metadata !== undefined) this.metadata = options.metadata;\n }\n\n isActive(): boolean {\n return this.status === 'active';\n }\n\n getFeatureGrants(): PlanFeatureGrant[] {\n return normalizeFeatureGrants(\n parseJsonArray<string | PlanFeatureGrant>(this.features),\n );\n }\n\n setFeatureGrants(grants: Array<string | PlanFeatureGrant>): void {\n this.features = stringifyJson(normalizeFeatureGrants(grants));\n }\n\n getFeatureKeys(): string[] {\n return this.getFeatureGrants()\n .filter((grant) => grant.enabled !== false)\n .map((grant) => grant.featureKey);\n }\n\n getThresholds(): PlanThreshold[] {\n return parseJsonArray<PlanThreshold>(this.thresholds).filter(\n (threshold) => threshold.metricKey,\n );\n }\n\n setThresholds(thresholds: PlanThreshold[]): void {\n this.thresholds = stringifyJson(thresholds);\n }\n\n getMetadata(): JsonObject {\n return parseJsonObject(this.metadata, {});\n }\n\n setMetadata(metadata: JsonObject): void {\n this.metadata = stringifyJson(metadata);\n }\n\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n const { SubscriptionPlanCollection } = await import(\n '../collections/SubscriptionPlanCollection.js'\n );\n const plans = await SubscriptionPlanCollection.create({ db: this.db });\n const persisted =\n (this.id\n ? await plans.get({ id: String(this.id) }, { cache: false })\n : null) ??\n (await plans.findByPlanKey(\n this.tenantId ?? getTenantId() ?? null,\n this.planKey,\n ));\n // A concurrently created natural-key row must never be adopted after this\n // validation: its pricing terms may differ from the terms checked here.\n if (!persisted) this.requireInsertOnSave();\n if (\n persisted &&\n (persisted.pricingMode !== this.pricingMode ||\n persisted.minimumAmount !== this.minimumAmount)\n ) {\n throw new Error(\n 'Create a new plan to change pricing mode or minimum after persistence',\n );\n }\n if (!['free', 'fixed', 'pay_what_you_can'].includes(this.pricingMode)) {\n throw new Error('Invalid pricingMode');\n }\n if (this.pricingMode !== 'fixed' && this.priceAmount !== 0) {\n throw new Error(\n 'priceAmount must be zero for free and pay_what_you_can plans',\n );\n }\n for (const [name, value] of [\n ['priceAmount', this.priceAmount],\n ['minimumAmount', this.minimumAmount],\n ['suggestedAmount', this.suggestedAmount],\n ] as const) {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(\n `${name} must be a non-negative integer minor-unit amount`,\n );\n }\n }\n if (\n this.pricingMode === 'pay_what_you_can' &&\n this.suggestedAmount > 0 &&\n this.suggestedAmount < this.minimumAmount\n ) {\n throw new Error('suggestedAmount must be at least minimumAmount');\n }\n }\n}\n\nexport default SubscriptionPlan;\n","import { SmrtCollection } from '@happyvertical/smrt-core';\nimport { SubscriptionPlan } from '../models/SubscriptionPlan.js';\n\nexport class SubscriptionPlanCollection extends SmrtCollection<SubscriptionPlan> {\n static readonly _itemClass = SubscriptionPlan;\n\n async findByPlanKey(\n tenantId: string | null,\n planKey: string,\n ): Promise<SubscriptionPlan | null> {\n const plans = await this.list({ where: { tenantId, planKey }, limit: 1 });\n return plans[0] ?? null;\n }\n\n async findActive(): Promise<SubscriptionPlan[]> {\n return this.list({\n where: { status: 'active' },\n orderBy: 'sortOrder ASC',\n });\n }\n\n async findByProviderPriceId(\n providerPriceId: string,\n ): Promise<SubscriptionPlan | null> {\n const plans = await this.list({ where: { providerPriceId }, limit: 1 });\n if (plans[0]) return plans[0];\n const legacy = await this.list({\n where: { stripePriceId: providerPriceId },\n });\n return (\n legacy.find(\n (plan) => !plan.externalProvider || plan.externalProvider === 'stripe',\n ) ?? null\n );\n }\n\n /** @deprecated Provider-neutral integrations should use findByProviderPriceId. */\n async findByStripePriceId(\n stripePriceId: string,\n ): Promise<SubscriptionPlan | null> {\n const plans = await this.list({ where: { stripePriceId }, limit: 1 });\n return plans[0] ?? null;\n }\n}\n","import { foreignKey, SmrtObject, smrt } from '@happyvertical/smrt-core';\nimport {\n getTenantId,\n isSystemContext,\n TenantScoped,\n tenantId,\n withSystemContext,\n} from '@happyvertical/smrt-tenancy';\nimport { SubscriptionPlanCollection } from '../collections/SubscriptionPlanCollection.js';\nimport type {\n JsonObject,\n Subscriber,\n SubscriberKind,\n SubscriptionStatus,\n TenantSubscriptionOptions,\n} from '../types.js';\nimport {\n assertSubscriberInvariant,\n parseJsonObject,\n stringifyJson,\n} from '../utils.js';\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_tenant_subscriptions',\n api: { include: ['list', 'get', 'create', 'update'] },\n cli: { skipApiCheck: true },\n mcp: { include: ['list', 'get'] },\n // The conflict key includes the subscriber discriminator so an issuing tenant\n // can host many distinct external subscribers without collisions on the\n // unique index:\n // - tenant-kind rows always have subscriber_external_id = '' → uniqueness\n // reduces to (tenant_id, 'tenant', '') = at most one tenant-kind row per\n // tenant (preserves the pre-polymorphic invariant).\n // - external-kind rows are unique on (tenant_id, 'external', externalId) =\n // at most one active subscription per (issuer, external subscriber).\n //\n // UPGRADE NOTE: databases created against the pre-#1454 conflict key\n // ['tenant_id'] still carry the legacy `_smrt_tenant_subscriptions_tenant_id_idx`.\n // `smrt db:migrate` does not sweep orphan indexes by default, so the legacy\n // index persists and continues to reject external subscriptions until it's\n // dropped. Run scripts/migrate-1454-drop-legacy-conflict-index.ts once on\n // upgrade, or pass `--drop-indexes` to `db:migrate`. Fresh databases need\n // neither — the generated schema already reflects the new key.\n conflictColumns: ['tenant_id', 'subscriber_kind', 'subscriber_external_id'],\n})\nexport class TenantSubscription extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @tenantId()\n tenantId?: string;\n\n /**\n * Discriminator for the subscriber identity.\n *\n * - `'tenant'` (default): the subscriber IS the owning `tenantId` — the\n * pre-polymorphic shape. All existing rows continue to behave this way.\n * - `'external'`: the subscriber is `subscriberExternalId`, scoped under the\n * issuing `tenantId`. Used for B2C buyers, anonymous-email subscribers,\n * agent identities, and any other caller-defined identity.\n */\n subscriberKind: SubscriberKind = 'tenant';\n\n /**\n * Caller-namespaced opaque identifier for the subscriber when\n * `subscriberKind === 'external'`. Empty string when kind is `'tenant'`.\n *\n * The package treats this as opaque — no FK, no inferred semantics. Callers\n * are expected to namespace (e.g. `buyer-contact:abc123`,\n * `agent:hermes-7`, `email:foo@example.com`).\n */\n subscriberExternalId: string = '';\n\n @foreignKey('SubscriptionPlan')\n planId: string = '';\n\n status: SubscriptionStatus = 'incomplete';\n startedAt: Date = new Date();\n currentPeriodStart: Date | null = null;\n currentPeriodEnd: Date | null = null;\n trialEndsAt: Date | null = null;\n cancelAtPeriodEnd: boolean = false;\n canceledAt: Date | null = null;\n /** Amount selected for this subscription, in integer minor units. */\n agreedAmount: number | null = null;\n externalProvider: string | null = null;\n stripeCustomerId: string = '';\n stripeSubscriptionId: string = '';\n stripeCheckoutSessionId: string = '';\n metadata: string = '{}';\n\n constructor(options: TenantSubscriptionOptions = {}) {\n super(options);\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.subscriberKind !== undefined)\n this.subscriberKind = options.subscriberKind;\n if (options.subscriberExternalId !== undefined)\n this.subscriberExternalId = options.subscriberExternalId;\n // Enforce the subscriber XOR invariant at construction time so callers\n // catch mistakes early. The same check also runs in `validateBeforeSave`\n // below so the generated PUT/PATCH update path — which mutates an existing\n // instance via `Object.assign()` and bypasses this constructor — can't\n // sneak a malformed row past us either.\n assertSubscriberInvariant('TenantSubscription', {\n subscriberKind: this.subscriberKind,\n subscriberExternalId: this.subscriberExternalId,\n });\n if (options.planId !== undefined) this.planId = options.planId;\n if (options.status !== undefined) this.status = options.status;\n if (options.startedAt !== undefined) this.startedAt = options.startedAt;\n if (options.currentPeriodStart !== undefined) {\n this.currentPeriodStart = options.currentPeriodStart;\n }\n if (options.currentPeriodEnd !== undefined) {\n this.currentPeriodEnd = options.currentPeriodEnd;\n }\n if (options.trialEndsAt !== undefined)\n this.trialEndsAt = options.trialEndsAt;\n if (options.cancelAtPeriodEnd !== undefined) {\n this.cancelAtPeriodEnd = options.cancelAtPeriodEnd;\n }\n if (options.canceledAt !== undefined) this.canceledAt = options.canceledAt;\n if (options.agreedAmount !== undefined)\n this.agreedAmount = options.agreedAmount;\n if (options.externalProvider !== undefined) {\n this.externalProvider = options.externalProvider;\n }\n if (options.stripeCustomerId !== undefined) {\n this.stripeCustomerId = options.stripeCustomerId;\n }\n if (options.stripeSubscriptionId !== undefined) {\n this.stripeSubscriptionId = options.stripeSubscriptionId;\n }\n if (options.stripeCheckoutSessionId !== undefined) {\n this.stripeCheckoutSessionId = options.stripeCheckoutSessionId;\n }\n if (options.metadata !== undefined) this.metadata = options.metadata;\n }\n\n /**\n * Validates the subscriber XOR invariant before every save. Critical for the\n * generated update path: `SmrtCollection.update()` mutates the existing\n * instance via `Object.assign()` and calls `save()` directly — the\n * constructor never re-runs, so without this hook a partial update like\n * `{ subscriberExternalId: 'buyer:alice' }` on a tenant-kind row would\n * persist a malformed conflict key and let two tenant-kind rows coexist\n * under the same tenant.\n */\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n assertSubscriberInvariant('TenantSubscription', {\n subscriberKind: this.subscriberKind,\n subscriberExternalId: this.subscriberExternalId,\n });\n if (\n this.agreedAmount !== null &&\n (!Number.isSafeInteger(this.agreedAmount) || this.agreedAmount < 0)\n ) {\n throw new Error(\n 'agreedAmount must be a non-negative integer minor-unit amount',\n );\n }\n const plans = await SubscriptionPlanCollection.create({ db: this.db });\n // Ordinary reads inherit the caller's tenancy. The bounded global fallback\n // permits legacy public plans without exposing any other tenant's plan.\n const scopedPlan = await plans.get({ id: this.planId }, { cache: false });\n const plan =\n scopedPlan ??\n (await withSystemContext(() =>\n plans.get({ id: this.planId, tenantId: null }, { cache: false }),\n ));\n if (\n !plan ||\n (!isSystemContext() &&\n plan.tenantId !== null &&\n plan.tenantId !== (this.tenantId ?? getTenantId() ?? null))\n ) {\n throw new Error('Subscription plan is unavailable');\n }\n if (plan.pricingMode === 'pay_what_you_can') {\n if (\n this.agreedAmount === null ||\n this.agreedAmount < plan.minimumAmount\n ) {\n throw new Error('agreedAmount must meet the plan minimumAmount');\n }\n } else if (this.agreedAmount !== null) {\n throw new Error('agreedAmount requires a pay_what_you_can plan');\n }\n }\n\n isEntitled(now = new Date()): boolean {\n if (this.status !== 'active' && this.status !== 'trialing') {\n return false;\n }\n if (\n this.currentPeriodEnd &&\n this.currentPeriodEnd.getTime() < now.getTime()\n ) {\n return false;\n }\n return true;\n }\n\n /**\n * Project this row's polymorphic subscriber columns onto the\n * {@link Subscriber} discriminated union. Returns `null` when the owning\n * tenant is absent — that's an invalid row that should not be acted on.\n */\n getSubscriber(): Subscriber | null {\n if (!this.tenantId) {\n return null;\n }\n if (this.subscriberKind === 'external') {\n if (!this.subscriberExternalId) {\n return null;\n }\n return {\n kind: 'external',\n tenantId: this.tenantId,\n externalId: this.subscriberExternalId,\n };\n }\n return { kind: 'tenant', tenantId: this.tenantId };\n }\n\n getMetadata(): JsonObject {\n return parseJsonObject(this.metadata, {});\n }\n\n setMetadata(metadata: JsonObject): void {\n this.metadata = stringifyJson(metadata);\n }\n}\n\nexport default TenantSubscription;\n","import { SmrtCollection } from '@happyvertical/smrt-core';\nimport { TenantSubscription } from '../models/TenantSubscription.js';\nimport type { Subscriber } from '../types.js';\n\nexport class TenantSubscriptionCollection extends SmrtCollection<TenantSubscription> {\n static readonly _itemClass = TenantSubscription;\n\n /**\n * List subscriptions whose owning tenant scope is `tenantId`. Includes both\n * `'tenant'`-kind (subscriber == owner) and `'external'`-kind (subscriber is\n * an external identity scoped under this tenant) rows.\n */\n async findByTenant(tenantId: string): Promise<TenantSubscription[]> {\n return this.list({\n where: { tenantId },\n orderBy: 'created_at DESC',\n });\n }\n\n /**\n * Legacy single-tenant accessor: returns the current subscription where the\n * tenant IS the subscriber (`subscriberKind = 'tenant'`). External-kind rows\n * scoped under this tenant are intentionally excluded so existing callers\n * are not surprised by buyer/agent subscriptions.\n */\n async findCurrentForTenant(\n tenantId: string,\n now = new Date(),\n ): Promise<TenantSubscription | null> {\n return this.findCurrentForSubscriber({ kind: 'tenant', tenantId }, now);\n }\n\n /**\n * Polymorphic current-subscription accessor.\n *\n * For `'tenant'` subscribers we match rows with `subscriberKind = 'tenant'`\n * under the same `tenantId`. For `'external'` subscribers we match by\n * `(tenantId, subscriberExternalId)` with `subscriberKind = 'external'`.\n */\n async findCurrentForSubscriber(\n subscriber: Subscriber,\n now = new Date(),\n ): Promise<TenantSubscription | null> {\n const where: Record<string, unknown> = {\n tenantId: subscriber.tenantId,\n subscriberKind: subscriber.kind,\n };\n if (subscriber.kind === 'external') {\n where.subscriberExternalId = subscriber.externalId;\n }\n\n const subscriptions = await this.list({\n where,\n orderBy: 'created_at DESC',\n });\n return (\n subscriptions.find((subscription) => subscription.isEntitled(now)) ??\n subscriptions[0] ??\n null\n );\n }\n\n async findByStripeSubscriptionId(\n stripeSubscriptionId: string,\n ): Promise<TenantSubscription | null> {\n const subscriptions = await this.list({\n where: { stripeSubscriptionId },\n limit: 1,\n });\n return subscriptions[0] ?? null;\n }\n}\n","import { SmrtObject, smrt } from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type {\n JsonObject,\n Subscriber,\n SubscriberKind,\n TenantUsageMetricOptions,\n} from '../types.js';\nimport {\n assertSubscriberInvariant,\n parseJsonObject,\n stringifyJson,\n} from '../utils.js';\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_tenant_usage_metrics',\n api: { include: ['list', 'get', 'create'] },\n cli: { include: ['list', 'get', 'create'] },\n mcp: { include: ['list', 'get'] },\n})\nexport class TenantUsageMetric extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @tenantId()\n tenantId?: string;\n\n /**\n * Discriminator for which subscriber identity recorded this usage.\n * `'tenant'` (default) preserves the legacy shape; `'external'` indicates\n * the subscriber is `subscriberExternalId` under the issuing `tenantId`.\n */\n subscriberKind: SubscriberKind = 'tenant';\n\n /**\n * Opaque caller-namespaced subscriber id when `subscriberKind === 'external'`.\n * Empty string when kind is `'tenant'`.\n */\n subscriberExternalId: string = '';\n\n metricKey: string = '';\n quantity: number = 0.0;\n windowStart: Date = new Date();\n windowEnd: Date = new Date();\n source: string = '';\n sourceId: string = '';\n projectId: string = '';\n workRefType: string = '';\n workRefId: string = '';\n provider: string = '';\n dimensions: string = '{}';\n\n constructor(options: TenantUsageMetricOptions = {}) {\n super(options);\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.subscriberKind !== undefined)\n this.subscriberKind = options.subscriberKind;\n if (options.subscriberExternalId !== undefined)\n this.subscriberExternalId = options.subscriberExternalId;\n // Construction-time guard; the same invariant is re-checked in\n // `validateBeforeSave` so the generated update path can't bypass it.\n assertSubscriberInvariant('TenantUsageMetric', {\n subscriberKind: this.subscriberKind,\n subscriberExternalId: this.subscriberExternalId,\n });\n if (options.metricKey !== undefined) this.metricKey = options.metricKey;\n if (options.quantity !== undefined) this.quantity = options.quantity;\n if (options.windowStart !== undefined)\n this.windowStart = options.windowStart;\n if (options.windowEnd !== undefined) this.windowEnd = options.windowEnd;\n if (options.source !== undefined) this.source = options.source;\n if (options.sourceId !== undefined) this.sourceId = options.sourceId;\n if (options.projectId !== undefined) this.projectId = options.projectId;\n if (options.workRefType !== undefined)\n this.workRefType = options.workRefType;\n if (options.workRefId !== undefined) this.workRefId = options.workRefId;\n if (options.provider !== undefined) this.provider = options.provider;\n if (options.dimensions !== undefined) this.dimensions = options.dimensions;\n }\n\n /** See `TenantSubscription.validateBeforeSave` for the rationale. */\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n assertSubscriberInvariant('TenantUsageMetric', {\n subscriberKind: this.subscriberKind,\n subscriberExternalId: this.subscriberExternalId,\n });\n if (this.id) {\n const row = await this.db.get(this.tableName, { id: this.id });\n if (row) {\n const persisted = [\n row.tenant_id,\n row.subscriber_kind,\n row.subscriber_external_id,\n row.metric_key,\n row.quantity,\n row.window_start,\n row.window_end,\n row.source,\n row.source_id,\n row.project_id,\n row.work_ref_type,\n row.work_ref_id,\n row.provider,\n row.dimensions,\n ];\n const current = [\n this.tenantId,\n this.subscriberKind,\n this.subscriberExternalId,\n this.metricKey,\n this.quantity,\n this.windowStart,\n this.windowEnd,\n this.source,\n this.sourceId,\n this.projectId,\n this.workRefType,\n this.workRefId,\n this.provider,\n this.dimensions,\n ];\n if (\n persisted.some(\n (value, index) =>\n normalizeEvidence(value) !== normalizeEvidence(current[index]),\n )\n ) {\n throw new Error(\n 'Usage events are immutable; record a new event instead.',\n );\n }\n }\n }\n }\n\n /**\n * Project this row's polymorphic subscriber columns onto the\n * {@link Subscriber} discriminated union.\n */\n getSubscriber(): Subscriber | null {\n if (!this.tenantId) {\n return null;\n }\n if (this.subscriberKind === 'external') {\n if (!this.subscriberExternalId) {\n return null;\n }\n return {\n kind: 'external',\n tenantId: this.tenantId,\n externalId: this.subscriberExternalId,\n };\n }\n return { kind: 'tenant', tenantId: this.tenantId };\n }\n\n getDimensions(): JsonObject {\n return parseJsonObject(this.dimensions, {});\n }\n\n setDimensions(dimensions: JsonObject): void {\n this.dimensions = stringifyJson(dimensions);\n }\n}\n\nexport default TenantUsageMetric;\n\nfunction normalizeEvidence(value: unknown): string {\n if (value instanceof Date) return value.toISOString();\n if (typeof value === 'string') {\n const timestamp = Date.parse(value);\n if (/^\\d{4}-\\d{2}-\\d{2}[T ]/.test(value) && Number.isFinite(timestamp)) {\n return new Date(timestamp).toISOString();\n }\n }\n return String(value ?? '');\n}\n","import { SmrtCollection } from '@happyvertical/smrt-core';\nimport { TenantUsageMetric } from '../models/TenantUsageMetric.js';\nimport type {\n AiUsageSummary,\n RecordUsageOptions,\n SummarizeAiUsageOptions,\n SummarizeUsageBatchOptions,\n SummarizeUsageOptions,\n UsageSummary,\n} from '../types.js';\nimport {\n deterministicUuid,\n normalizeSubscriber,\n stringifyJson,\n subscriberToColumns,\n} from '../utils.js';\n\nexport class TenantUsageMetricCollection extends SmrtCollection<TenantUsageMetric> {\n static readonly _itemClass = TenantUsageMetric;\n\n async recordUsage(options: RecordUsageOptions): Promise<TenantUsageMetric> {\n const subscriber = normalizeSubscriber({\n tenantId: options.tenantId,\n subscriberKind: options.subscriberKind,\n subscriberExternalId: options.subscriberExternalId,\n });\n const columns = subscriberToColumns(subscriber);\n const sourcedId =\n options.source && options.sourceId\n ? await deterministicUuid([\n 'tenant-usage',\n columns.tenantId,\n columns.subscriberKind,\n columns.subscriberExternalId,\n options.metricKey,\n options.source,\n options.sourceId,\n ])\n : null;\n if (options.source && options.sourceId) {\n const existing = await this.get(sourcedId as string);\n if (existing) return existing;\n }\n try {\n return await this.create({\n ...(sourcedId ? { id: sourcedId } : {}),\n tenantId: columns.tenantId,\n subscriberKind: columns.subscriberKind,\n subscriberExternalId: columns.subscriberExternalId,\n metricKey: options.metricKey,\n quantity: options.quantity,\n windowStart: options.windowStart,\n windowEnd: options.windowEnd,\n source: options.source ?? '',\n sourceId: options.sourceId ?? '',\n projectId: options.projectId ?? '',\n workRefType: options.workRefType ?? '',\n workRefId: options.workRefId ?? '',\n provider: options.provider ?? '',\n dimensions: stringifyJson(options.dimensions ?? {}),\n _insertOnly: Boolean(sourcedId),\n });\n } catch (error) {\n if (sourcedId) {\n const existing = await this.get(sourcedId);\n if (existing) return existing;\n }\n throw error;\n }\n }\n\n /**\n * Legacy accessor — finds metrics for `subscriberKind = 'tenant'` under the\n * given tenant. External-kind rows scoped to the same tenant are excluded.\n */\n async findByTenantAndMetric(\n tenantId: string,\n metricKey: string,\n ): Promise<TenantUsageMetric[]> {\n return this.list({\n where: { tenantId, metricKey, subscriberKind: 'tenant' },\n orderBy: 'windowStart DESC',\n });\n }\n\n async summarizeUsage(options: SummarizeUsageOptions): Promise<UsageSummary> {\n const subscriber = normalizeSubscriber({\n tenantId: options.tenantId,\n subscriberKind: options.subscriberKind,\n subscriberExternalId: options.subscriberExternalId,\n });\n const columns = subscriberToColumns(subscriber);\n\n const where: Record<string, unknown> = {\n tenantId: columns.tenantId,\n subscriberKind: columns.subscriberKind,\n metricKey: options.metricKey,\n 'windowStart <': options.window.end.toISOString(),\n 'windowEnd >': options.window.start.toISOString(),\n };\n if (subscriber.kind === 'external') {\n where.subscriberExternalId = columns.subscriberExternalId;\n }\n\n const metrics = await this.list({ where });\n\n const baseSummary: UsageSummary = {\n tenantId: columns.tenantId,\n metricKey: options.metricKey,\n quantity: metrics.reduce((sum, metric) => sum + metric.quantity, 0),\n windowStart: options.window.start,\n windowEnd: options.window.end,\n };\n if (subscriber.kind === 'external') {\n return {\n ...baseSummary,\n subscriberKind: 'external',\n subscriberExternalId: subscriber.externalId,\n };\n }\n return baseSummary;\n }\n\n async summarizeUsageBatch(\n options: SummarizeUsageBatchOptions,\n ): Promise<UsageSummary[]> {\n const metricKeys = Array.from(new Set(options.metricKeys));\n if (metricKeys.length === 0) {\n return [];\n }\n\n const subscriber = normalizeSubscriber({\n tenantId: options.tenantId,\n subscriberKind: options.subscriberKind,\n subscriberExternalId: options.subscriberExternalId,\n });\n const columns = subscriberToColumns(subscriber);\n\n const metricPlaceholders = metricKeys.map(() => '?').join(', ');\n const params: unknown[] = [\n columns.tenantId,\n columns.subscriberKind,\n ...metricKeys,\n options.window.end.toISOString(),\n options.window.start.toISOString(),\n ];\n let subscriberSql = '';\n if (subscriber.kind === 'external') {\n subscriberSql = 'AND subscriber_external_id = ?';\n params.splice(2, 0, columns.subscriberExternalId);\n }\n\n const result = await this.db.query(\n `SELECT\n metric_key,\n COALESCE(SUM(quantity), 0) AS quantity\n FROM _smrt_tenant_usage_metrics\n WHERE tenant_id = ?\n AND subscriber_kind = ?\n ${subscriberSql}\n AND metric_key IN (${metricPlaceholders})\n AND window_start < ?\n AND window_end > ?\n GROUP BY metric_key`,\n ...params,\n );\n\n const quantityByMetric = new Map<string, number>();\n for (const row of resultRows(result)) {\n const metricKey = String(row.metric_key ?? row.metricKey ?? '');\n if (metricKey) {\n quantityByMetric.set(metricKey, numberFromRow(row, 'quantity'));\n }\n }\n\n return metricKeys.map((metricKey) => {\n const baseSummary: UsageSummary = {\n tenantId: columns.tenantId,\n metricKey,\n quantity: quantityByMetric.get(metricKey) ?? 0,\n windowStart: options.window.start,\n windowEnd: options.window.end,\n };\n if (subscriber.kind === 'external') {\n return {\n ...baseSummary,\n subscriberKind: 'external',\n subscriberExternalId: subscriber.externalId,\n };\n }\n return baseSummary;\n });\n }\n\n /**\n * Summarize persisted AI usage for a tenant within a window.\n *\n * Reads the framework `_smrt_ai_usage` system table via a raw aggregate\n * query. This deliberately uses `this.db.query` rather than the inherited\n * `query()`: those rows are framework usage records, not `TenantUsageMetric`\n * instances, so model hydration would discard the aggregate columns. Tenant\n * scoping is applied explicitly through the `tenant_id` filter.\n *\n * Named distinctly from the inherited `SmrtClass.summarizeAiUsage` (which\n * returns grouped stats across all tenants) to avoid overriding it.\n */\n async summarizeTenantAiUsage(\n options: SummarizeAiUsageOptions,\n ): Promise<AiUsageSummary> {\n const result = await this.db.query(\n `SELECT\n COALESCE(SUM(prompt_tokens), 0) AS prompt_tokens,\n COALESCE(SUM(completion_tokens), 0) AS completion_tokens,\n COALESCE(SUM(total_tokens), 0) AS total_tokens,\n COALESCE(SUM(estimated_cost), 0) AS estimated_cost,\n COUNT(*) AS request_count\n FROM _smrt_ai_usage\n WHERE tenant_id = ?\n AND created_at >= ?\n AND created_at < ?`,\n options.tenantId,\n options.window.start.toISOString(),\n options.window.end.toISOString(),\n );\n const row = firstRow(result);\n\n return {\n tenantId: options.tenantId,\n promptTokens: numberFromRow(row, 'prompt_tokens'),\n completionTokens: numberFromRow(row, 'completion_tokens'),\n totalTokens: numberFromRow(row, 'total_tokens'),\n estimatedCost: numberFromRow(row, 'estimated_cost'),\n requestCount: numberFromRow(row, 'request_count'),\n windowStart: options.window.start,\n windowEnd: options.window.end,\n };\n }\n}\n\nfunction firstRow(result: unknown): Record<string, unknown> {\n const rows = resultRows(result);\n return (rows[0] ?? {}) as Record<string, unknown>;\n}\n\nfunction resultRows(result: unknown): Record<string, unknown>[] {\n return Array.isArray(result)\n ? (result as Record<string, unknown>[])\n : ((result as { rows?: Record<string, unknown>[] })?.rows ?? []);\n}\n\nfunction numberFromRow(row: Record<string, unknown>, key: string): number {\n const value = row[key];\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'bigint') {\n return Number(value);\n }\n if (typeof value === 'string') {\n return Number.parseFloat(value) || 0;\n }\n return 0;\n}\n","/**\n * Subscriptions money columns: floating-point major units → integer minor units.\n *\n * Ships as an explicit, opt-in migration rather than a schema-differ upgrade\n * because REAL→INTEGER is not information-preserving: an automatic\n * `ALTER … TYPE integer` would truncate `19.99` to `19`. The values have to be\n * rescaled by the currency's minor-unit factor during the type change (#2401).\n *\n * ```ts\n * console.log((await preflightSubscriptionsMoneyMinorUnits(db)).summary);\n * await migrateSubscriptionsMoneyToMinorUnits(db);\n * ```\n *\n * On SQLite the values are rescaled but the declared type cannot change in\n * place; those columns come back in `declaredTypeChangePending` and need the\n * table-rebuild path (#2370).\n *\n * **Pricing rules are not migrated.** `PricingRule.terms` is a JSON blob whose\n * `unitPrice` / `overageUnitPrice` / `amount` / tier prices are now read as\n * *minor units per unit of usage*. They are deliberately left fractional (a\n * per-token rate is routinely a fraction of a cent), so there is no type to\n * change — but every existing rule's terms are in major units and must be\n * rescaled by the operator, who alone knows which keys in a given rule are\n * prices and which are quantities or ratios.\n */\n\nimport {\n type DatabaseInterface,\n type MinorUnitsPreflightResult,\n type MinorUnitsRescaleResult,\n type MoneyColumnTarget,\n preflightMinorUnitsRescale,\n rescaleMoneyColumnsToMinorUnits,\n} from '@happyvertical/smrt-core/migrations';\n\n/** Marker recorded in `_smrt_backfills` once the rescale has run. */\nexport const SUBSCRIPTIONS_MONEY_MINOR_UNITS_BACKFILL =\n '@happyvertical/smrt-subscriptions:money-minor-units:v1';\n\n/**\n * Every subscriptions money column that held major units before #2401.\n *\n * `quantity` columns are absent on purpose: metered quantities are genuinely\n * fractional and stay DECIMAL.\n */\nexport const SUBSCRIPTIONS_MONEY_COLUMNS: MoneyColumnTarget[] = [\n { table: '_smrt_subscription_plans', columns: ['price_amount'] },\n { table: '_smrt_client_charges', columns: ['amount'] },\n { table: '_smrt_billing_adjustments', columns: ['amount'] },\n { table: '_smrt_spending_policies', columns: ['limit_amount'] },\n];\n\n/**\n * Report what {@link migrateSubscriptionsMoneyToMinorUnits} would do, without\n * writing anything.\n */\nexport function preflightSubscriptionsMoneyMinorUnits(\n db: DatabaseInterface,\n options: { scale?: number; engineHint?: string } = {},\n): Promise<MinorUnitsPreflightResult> {\n return preflightMinorUnitsRescale(db, SUBSCRIPTIONS_MONEY_COLUMNS, options);\n}\n\n/**\n * Convert every subscriptions money column from floating-point major units to\n * integer minor units. Idempotent via a `_smrt_backfills` marker.\n *\n * @throws `MinorUnitsPreflightError` when a row would be rounded or would\n * overflow `int4` and `force` was not set.\n */\nexport function migrateSubscriptionsMoneyToMinorUnits(\n db: DatabaseInterface,\n options: { scale?: number; engineHint?: string; force?: boolean } = {},\n): Promise<MinorUnitsRescaleResult> {\n return rescaleMoneyColumnsToMinorUnits(db, SUBSCRIPTIONS_MONEY_COLUMNS, {\n ...options,\n backfillName: SUBSCRIPTIONS_MONEY_MINOR_UNITS_BACKFILL,\n packageName: '@happyvertical/smrt-subscriptions',\n });\n}\n","import {\n crossPackageRef,\n foreignKey,\n SmrtCollection,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport {\n getTenantId,\n isSuperAdminBypass,\n isSystemContext,\n TenantIsolationError,\n TenantScoped,\n tenantId,\n} from '@happyvertical/smrt-tenancy';\n\nexport type PricingStrategy =\n | 'fixed_unit'\n | 'cost_plus'\n | 'multiplier'\n | 'tiered'\n | 'included_overage'\n | 'flat'\n | 'custom';\nexport type SpendingPolicyBehavior =\n | 'observe'\n | 'warn'\n | 'block'\n | 'approval_required';\n/**\n * `balance` is a prepaid credit balance: the policy's limit is the sum of its\n * {@link CreditGrant}s and spend accumulates from `balanceFrom` onward.\n */\nexport type SpendingPeriod =\n | 'day'\n | 'week'\n | 'month'\n | 'year'\n | 'rolling'\n | 'balance';\n/**\n * Which charges a spending policy counts (#3059).\n *\n * - `billed`: provider charges payable by the policy tenant (`ClientCharge`\n * rows whose `tenantId` is the tenant) — the pre-#3059 behavior.\n * - `retail`: what the tenant owes its reseller (`RetailCharge` rows).\n * - `wholesale`: what the policy's parent (`setByTenantId`) pays the provider\n * for this tenant's usage (`ClientCharge` rows billed to the parent with\n * `usageTenantId` = the tenant). Requires a delegated policy.\n */\nexport type SpendingBasis = 'billed' | 'retail' | 'wholesale';\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_pricing_rules',\n api: true,\n cli: true,\n mcp: true,\n})\nexport class PricingRule extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @tenantId() tenantId?: string;\n ruleKey: string = '';\n metricKey: string = '';\n serviceKey: string = '';\n strategy: PricingStrategy = 'fixed_unit';\n currency: string = 'USD';\n effectiveFrom: Date = new Date();\n effectiveTo: Date | null = null;\n priority: number = 0;\n terms: string = '{}';\n active: boolean = true;\n /**\n * The price book this rule belongs to (#3059), or empty for a tenant's\n * direct pricing. Book rules are priced only through\n * `CommercialUsageService.rateUsage()`; `price()` ignores them.\n */\n @foreignKey('PriceBook')\n priceBookId: string = '';\n\n getTerms(): Record<string, unknown> {\n try {\n return JSON.parse(this.terms) as Record<string, unknown>;\n } catch {\n return {};\n }\n }\n setTerms(value: Record<string, unknown>): void {\n this.terms = JSON.stringify(value);\n }\n}\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_client_charges',\n api: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n conflictColumns: ['usage_event_id'],\n})\nexport class ClientCharge extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n /** The payer: the usage tenant, or its billing owner when parent-billed. */\n @tenantId() tenantId?: string;\n @foreignKey('TenantUsageMetric')\n usageEventId: string = '';\n /** The tenant whose usage was charged; differs from `tenantId` for wholesale. */\n @crossPackageRef('@happyvertical/smrt-users:Tenant')\n usageTenantId: string = '';\n subscriberKind: string = 'tenant';\n subscriberExternalId: string = '';\n projectId: string = '';\n workRefType: string = '';\n workRefId: string = '';\n provider: string = '';\n serviceKey: string = '';\n metricKey: string = '';\n /**\n * Metered quantity — genuinely fractional (`duration.seconds`, token counts\n * scaled by a rate), so it stays DECIMAL.\n */\n quantity: number = 0.0;\n /**\n * Charge in **integer minor units** of {@link currency} (#2401).\n *\n * Summed against {@link BillingAdjustment.amount} and compared against\n * {@link SpendingPolicy.limitAmount}, so all three carry the same unit —\n * `CommercialService.calculateAmount()` rounds to a whole minor unit at the\n * one boundary where the fractional pricing terms meet money.\n */\n amount: number = 0;\n currency: string = 'USD';\n @foreignKey('PricingRule')\n pricingRuleId: string = '';\n /** Wholesale book that priced this charge, or empty for direct pricing. */\n @foreignKey('PriceBook')\n priceBookId: string = '';\n pricingSnapshot: string = '{}';\n status: 'draft' | 'approved' | 'adjusted' = 'draft';\n approvedAt: Date | null = null;\n\n getPricingSnapshot(): Record<string, unknown> {\n try {\n return JSON.parse(this.pricingSnapshot) as Record<string, unknown>;\n } catch {\n return {};\n }\n }\n\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n if (!this.id) return;\n const row = await this.getCanonicalPersistedRow({ id: this.id });\n if (!row || (row.status !== 'approved' && row.status !== 'adjusted'))\n return;\n if (\n (row.status === 'approved' &&\n this.status !== 'approved' &&\n this.status !== 'adjusted') ||\n (row.status === 'adjusted' && this.status !== 'adjusted')\n ) {\n throw new Error(\n 'Approved client charges cannot be reverted to an editable status.',\n );\n }\n const persisted = [\n row.tenant_id,\n row.usage_event_id,\n row.subscriber_kind,\n row.subscriber_external_id,\n row.project_id,\n row.work_ref_type,\n row.work_ref_id,\n row.provider,\n row.service_key,\n row.metric_key,\n row.quantity,\n row.amount,\n row.currency,\n row.pricing_rule_id,\n row.pricing_snapshot,\n row.approved_at,\n row.usage_tenant_id,\n row.price_book_id,\n ];\n const current = [\n this.tenantId,\n this.usageEventId,\n this.subscriberKind,\n this.subscriberExternalId,\n this.projectId,\n this.workRefType,\n this.workRefId,\n this.provider,\n this.serviceKey,\n this.metricKey,\n this.quantity,\n this.amount,\n this.currency,\n this.pricingRuleId,\n this.pricingSnapshot,\n this.approvedAt,\n this.usageTenantId,\n this.priceBookId,\n ];\n if (\n persisted.some(\n (value, index) =>\n normalizeSnapshot(value) !== normalizeSnapshot(current[index]),\n )\n ) {\n throw new Error(\n 'Approved client charges are immutable; append a BillingAdjustment instead.',\n );\n }\n }\n}\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_billing_adjustments',\n api: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n})\nexport class BillingAdjustment extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @tenantId() tenantId?: string;\n @foreignKey('ClientCharge')\n clientChargeId: string = '';\n /**\n * Signed correction in **integer minor units**, same unit as\n * {@link ClientCharge.amount} it adjusts. Negative values are legitimate\n * (a credit) — that is why the non-negative guard in\n * `CommercialService.calculateAmount()` does not apply here (#2401).\n */\n amount: number = 0;\n currency: string = 'USD';\n reason: string = '';\n source: string = '';\n sourceId: string = '';\n createdBy: string = '';\n\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n if (!this.id) return;\n const row = await this.db.get(this.tableName, { id: this.id });\n if (row) {\n throw new Error(\n 'Billing adjustments are append-only; create a new adjustment instead.',\n );\n }\n }\n}\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_spending_policies',\n conflictColumns: [\n 'tenant_id',\n 'subscriber_kind',\n 'subscriber_external_id',\n 'project_id',\n 'service_key',\n 'metric_key',\n 'period',\n 'name',\n ],\n api: true,\n cli: true,\n mcp: true,\n hooks: { beforeDelete: 'assertDelegationAuthority' },\n})\nexport class SpendingPolicy extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @tenantId() tenantId?: string;\n name: string = '';\n subscriberKind: string = '';\n subscriberExternalId: string = '';\n projectId: string = '';\n serviceKey: string = '';\n metricKey: string = '';\n period: SpendingPeriod = 'month';\n rollingSeconds: number = 0;\n /**\n * Spending cap in **integer minor units** of {@link currency}. Compared\n * directly against the sum of `ClientCharge.amount` + `BillingAdjustment`s\n * plus the caller's estimate, so it must carry the same unit (#2401).\n * Must be zero for a `balance` policy, whose limit is its credit grants.\n */\n limitAmount: number = 0;\n currency: string = 'USD';\n behavior: SpendingPolicyBehavior = 'observe';\n priority: number = 0;\n active: boolean = true;\n /** Which charges count toward the policy; see {@link SpendingBasis}. */\n basis: SpendingBasis = 'billed';\n /**\n * The parent tenant that set this policy on its child (#3059), or empty for\n * a tenant's own policy. A delegated policy can be changed or deleted only\n * by that parent, a system context, or a super-admin bypass.\n */\n @crossPackageRef('@happyvertical/smrt-users:Tenant')\n setByTenantId: string = '';\n /** Start of the spend window for a `balance` policy; defaults to creation. */\n balanceFrom: Date | null = null;\n\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n if (this.subscriberExternalId && !this.subscriberKind) {\n throw new Error(\n 'Spending policies with subscriberExternalId require subscriberKind.',\n );\n }\n if (\n this.period === 'rolling' &&\n (!Number.isFinite(this.rollingSeconds) || this.rollingSeconds <= 0)\n ) {\n throw new Error(\n 'Rolling spending policies require rollingSeconds greater than zero.',\n );\n }\n if (\n this.basis !== 'billed' &&\n this.basis !== 'retail' &&\n this.basis !== 'wholesale'\n ) {\n throw new Error(\n 'Spending policy basis must be billed, retail, or wholesale.',\n );\n }\n if (this.basis === 'wholesale' && !this.setByTenantId) {\n throw new Error(\n 'Wholesale spending policies must be delegated by a parent (setByTenantId).',\n );\n }\n if (this.period === 'balance') {\n if (this.limitAmount !== 0) {\n throw new Error(\n 'Balance spending policies take their limit from credit grants; limitAmount must be 0.',\n );\n }\n if (!this.balanceFrom) this.balanceFrom = new Date();\n }\n const targets = await this.persistedTargets();\n await this.assertBalanceLedgerStable(targets);\n await this.assertDelegationAuthority(targets);\n }\n\n /**\n * A balance policy's credit grants are scoped to its currency and period;\n * changing either would silently detach the ledger, so create a new\n * balance instead.\n */\n protected async assertBalanceLedgerStable(\n rows: Array<Record<string, unknown> | null>,\n ): Promise<void> {\n for (const row of rows) {\n if (row?.period !== 'balance') continue;\n if (this.period !== 'balance' || row.currency !== this.currency) {\n throw new Error(\n 'A balance policy cannot change currency or period; create a new balance policy.',\n );\n }\n }\n }\n\n /**\n * The rows this save can overwrite: by id and, because a new object may\n * already carry a generated id, by conflict key (an upsert target).\n */\n protected async persistedTargets(): Promise<\n Array<Record<string, unknown> | null>\n > {\n const byId = this.id\n ? await this.getCanonicalPersistedRow({ id: this.id })\n : null;\n const byKey = this.tenantId\n ? await this.getCanonicalPersistedRow({\n tenant_id: this.tenantId,\n subscriber_kind: this.subscriberKind,\n subscriber_external_id: this.subscriberExternalId,\n project_id: this.projectId,\n service_key: this.serviceKey,\n metric_key: this.metricKey,\n period: this.period,\n name: this.name,\n })\n : null;\n return [byId, byKey];\n }\n\n /**\n * A delegated policy belongs to the parent that set it: the constrained\n * child cannot create one in a parent's name, loosen it, or delete it.\n * The parent's-own-context allowance applies only where no tenancy\n * interceptor is registered; with one, the interceptor refuses a parent\n * writing the child's row, so parents change delegated policies through\n * `ResellerBillingService.setDelegatedSpendingPolicy()` (set\n * `active: false` to retire one).\n * Checks both the persisted row (by id, or by conflict key for an upsert)\n * and the incoming value.\n */\n protected async assertDelegationAuthority(\n targets?: Array<Record<string, unknown> | null>,\n ): Promise<void> {\n const [byId, byKey] = targets ?? (await this.persistedTargets());\n const owners = new Set(\n [byId?.set_by_tenant_id, byKey?.set_by_tenant_id, this.setByTenantId]\n .filter((value): value is string => Boolean(value))\n .map((value) => String(value).toLowerCase()),\n );\n if (owners.size === 0) return;\n if (isSystemContext() || isSuperAdminBypass()) return;\n const current = getTenantId()?.toLowerCase();\n if (owners.size === 1 && current && owners.has(current)) return;\n throw new TenantIsolationError(\n 'Delegated spending policies can be changed only by the parent that set them.',\n );\n }\n}\n\nexport class PricingRuleCollection extends SmrtCollection<PricingRule> {\n static readonly _itemClass = PricingRule;\n}\nexport class ClientChargeCollection extends SmrtCollection<ClientCharge> {\n static readonly _itemClass = ClientCharge;\n}\nexport class BillingAdjustmentCollection extends SmrtCollection<BillingAdjustment> {\n static readonly _itemClass = BillingAdjustment;\n}\nexport class SpendingPolicyCollection extends SmrtCollection<SpendingPolicy> {\n static readonly _itemClass = SpendingPolicy;\n}\n\nfunction normalizeSnapshot(value: unknown): string {\n if (value instanceof Date) return value.toISOString();\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}[T ]/.test(value)) {\n const timestamp = Date.parse(value);\n if (Number.isFinite(timestamp)) return new Date(timestamp).toISOString();\n }\n return String(value ?? '');\n}\n","/**\n * Reseller billing records (#3059): price books, their per-relationship\n * assignment, the reseller's retail ledger, and prepaid credit grants.\n *\n * Money is integer minor units throughout, exactly as in `commercial.ts`.\n */\nimport {\n crossPackageRef,\n field,\n foreignKey,\n SmrtCollection,\n SmrtObject,\n smrt,\n} from '@happyvertical/smrt-core';\nimport {\n getTenantId,\n isSuperAdminBypass,\n isSystemContext,\n TenantIsolationError,\n TenantScoped,\n tenantId,\n} from '@happyvertical/smrt-tenancy';\nimport { tenantKey } from '../utils.js';\n\n/**\n * `wholesale` books price what a service provider charges a reseller for its\n * children's usage; `retail` books price what a reseller charges its children.\n */\nexport type PriceBookKind = 'wholesale' | 'retail';\n\nconst PRICE_BOOK_KINDS: readonly PriceBookKind[] = ['wholesale', 'retail'];\nconst CURRENCY_PATTERN = /^[A-Z]{3}$/;\n\nexport function isPriceBookKind(value: unknown): value is PriceBookKind {\n return PRICE_BOOK_KINDS.includes(value as PriceBookKind);\n}\n\n/** ISO 4217-shaped (three upper-case letters) currency code check. */\nexport function isCurrencyCode(value: unknown): value is string {\n return typeof value === 'string' && CURRENCY_PATTERN.test(value);\n}\n\n/**\n * A named set of prices published by one seller tenant. Its prices are\n * ordinary {@link PricingRule} rows that carry this book's id and the same\n * tenant; one rule per currency gives a price in several currencies.\n */\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_price_books',\n conflictColumns: ['tenant_id', 'book_key'],\n api: false,\n cli: false,\n mcp: false,\n})\nexport class PriceBook extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n /** The seller that publishes and owns the book. */\n @tenantId() tenantId?: string;\n bookKey: string = '';\n name: string = '';\n kind: PriceBookKind = 'retail';\n active: boolean = true;\n\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n if (!this.bookKey.trim()) {\n throw new Error('Price books require a bookKey.');\n }\n if (!isPriceBookKind(this.kind)) {\n throw new Error('Price book kind must be wholesale or retail.');\n }\n }\n}\n\n/**\n * Which price books rate one child tenant's usage, keyed like the tenancy\n * billing relationship it belongs to (one row per child). The reseller is\n * recorded so an assignment made under one relationship never prices usage\n * after the child moves to a different reseller.\n *\n * A system table managed through `ResellerBillingService`, like\n * `_smrt_billing_relationships`; it has no generated API surface.\n */\n@smrt({\n tableName: '_smrt_price_book_assignments',\n conflictColumns: ['child_tenant_id'],\n api: false,\n cli: false,\n mcp: false,\n})\nexport class PriceBookAssignment extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @crossPackageRef('@happyvertical/smrt-users:Tenant')\n @field({ required: true })\n childTenantId: string = '';\n @crossPackageRef('@happyvertical/smrt-users:Tenant')\n @field({ required: true })\n resellerTenantId: string = '';\n @foreignKey('PriceBook')\n wholesalePriceBookId: string = '';\n wholesaleCurrency: string = '';\n @foreignKey('PriceBook')\n retailPriceBookId: string = '';\n retailCurrency: string = '';\n}\n\n/**\n * What a reseller charges one child for one usage event, priced from the\n * reseller's retail book. The provider's charge for the same event is the\n * {@link ClientCharge} in `clientChargeId`, payable by the billing owner.\n *\n * `tenantId` is always the payer (the child), so tenant-scoped reads and the\n * child's `retail`-basis spending policies see exactly what it owes.\n */\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_retail_charges',\n api: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n conflictColumns: ['usage_event_id'],\n})\nexport class RetailCharge extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n @tenantId() tenantId?: string;\n @crossPackageRef('@happyvertical/smrt-users:Tenant')\n resellerTenantId: string = '';\n @foreignKey('TenantUsageMetric')\n usageEventId: string = '';\n @foreignKey('ClientCharge')\n clientChargeId: string = '';\n subscriberKind: string = 'tenant';\n subscriberExternalId: string = '';\n projectId: string = '';\n workRefType: string = '';\n workRefId: string = '';\n provider: string = '';\n serviceKey: string = '';\n metricKey: string = '';\n /** Metered quantity; fractional, like `ClientCharge.quantity`. */\n quantity: number = 0.0;\n /** Charge in integer minor units of {@link currency}. */\n amount: number = 0;\n currency: string = 'USD';\n @foreignKey('PriceBook')\n priceBookId: string = '';\n @foreignKey('PricingRule')\n pricingRuleId: string = '';\n pricingSnapshot: string = '{}';\n status: 'draft' | 'approved' = 'draft';\n approvedAt: Date | null = null;\n\n getPricingSnapshot(): Record<string, unknown> {\n try {\n return JSON.parse(this.pricingSnapshot) as Record<string, unknown>;\n } catch {\n return {};\n }\n }\n\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n if (!this.id) return;\n const row = await this.getCanonicalPersistedRow({ id: this.id });\n if (row?.status !== 'approved') return;\n const persisted = [\n row.tenant_id,\n row.reseller_tenant_id,\n row.usage_event_id,\n row.client_charge_id,\n row.subscriber_kind,\n row.subscriber_external_id,\n row.project_id,\n row.work_ref_type,\n row.work_ref_id,\n row.provider,\n row.service_key,\n row.metric_key,\n row.quantity,\n row.amount,\n row.currency,\n row.price_book_id,\n row.pricing_rule_id,\n row.pricing_snapshot,\n row.status,\n row.approved_at,\n ];\n const current = [\n this.tenantId,\n this.resellerTenantId,\n this.usageEventId,\n this.clientChargeId,\n this.subscriberKind,\n this.subscriberExternalId,\n this.projectId,\n this.workRefType,\n this.workRefId,\n this.provider,\n this.serviceKey,\n this.metricKey,\n this.quantity,\n this.amount,\n this.currency,\n this.priceBookId,\n this.pricingRuleId,\n this.pricingSnapshot,\n this.status,\n this.approvedAt,\n ];\n if (\n persisted.some(\n (value, index) =>\n normalizeLedgerValue(value) !== normalizeLedgerValue(current[index]),\n )\n ) {\n throw new Error('Approved retail charges are immutable.');\n }\n }\n}\n\n/**\n * An append-only credit on a prepaid (`period: 'balance'`) spending policy.\n * Positive amounts add credit; a negative amount reverses an earlier grant.\n */\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: '_smrt_credit_grants',\n api: { include: ['list', 'get'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n hooks: { beforeDelete: 'refuseDelete' },\n})\nexport class CreditGrant extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-subscriptions\";\n /** The tenant whose balance is credited (the policy's tenant). */\n @tenantId() tenantId?: string;\n @foreignKey('SpendingPolicy')\n spendingPolicyId: string = '';\n /** Signed credit in integer minor units of {@link currency}. */\n amount: number = 0;\n currency: string = 'USD';\n reason: string = '';\n source: string = '';\n sourceId: string = '';\n /** A parent tenant that granted the credit, or empty when self-granted. */\n @crossPackageRef('@happyvertical/smrt-users:Tenant')\n grantedByTenantId: string = '';\n\n /** Append-only: history is corrected by a reversing grant, never removed. */\n protected refuseDelete(): void {\n throw new Error(\n 'Credit grants are append-only; record a reversing grant instead of deleting.',\n );\n }\n\n protected async validateBeforeSave(): Promise<void> {\n await super.validateBeforeSave();\n if (!Number.isSafeInteger(this.amount) || this.amount === 0) {\n throw new Error(\n 'Credit grant amounts must be nonzero integer minor units (cents).',\n );\n }\n if (this.id) {\n const row = await this.db.get(this.tableName, { id: this.id });\n if (row) {\n throw new Error(\n 'Credit grants are append-only; record a reversing grant instead.',\n );\n }\n }\n const policy = this.spendingPolicyId\n ? ((await this.db.get('_smrt_spending_policies', {\n id: this.spendingPolicyId,\n })) as Record<string, unknown> | null)\n : null;\n if (\n policy?.period !== 'balance' ||\n tenantKey(policy.tenant_id as string) !== tenantKey(this.tenantId) ||\n policy.currency !== this.currency\n ) {\n throw new Error(\n 'Credit grants must credit a balance policy of the same tenant and currency.',\n );\n }\n // A parent's delegated balance is funded only by that parent.\n const setBy = tenantKey(policy.set_by_tenant_id as string);\n if (!setBy) return;\n if (tenantKey(this.grantedByTenantId) !== setBy) {\n throw new TenantIsolationError(\n 'Delegated balance credit must be granted by the parent that set it.',\n );\n }\n if (\n !isSystemContext() &&\n !isSuperAdminBypass() &&\n tenantKey(getTenantId()) !== setBy\n ) {\n throw new TenantIsolationError(\n 'Only the parent that set a delegated policy can grant it credit.',\n );\n }\n }\n}\n\nexport class PriceBookCollection extends SmrtCollection<PriceBook> {\n static readonly _itemClass = PriceBook;\n}\nexport class PriceBookAssignmentCollection extends SmrtCollection<PriceBookAssignment> {\n static readonly _itemClass = PriceBookAssignment;\n}\nexport class RetailChargeCollection extends SmrtCollection<RetailCharge> {\n static readonly _itemClass = RetailCharge;\n}\nexport class CreditGrantCollection extends SmrtCollection<CreditGrant> {\n static readonly _itemClass = CreditGrant;\n}\n\nfunction normalizeLedgerValue(value: unknown): string {\n if (value instanceof Date) return value.toISOString();\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}[T ]/.test(value)) {\n const timestamp = Date.parse(value);\n if (Number.isFinite(timestamp)) return new Date(timestamp).toISOString();\n }\n if (typeof value === 'boolean') return value ? '1' : '0';\n return String(value ?? '');\n}\n","export type ResellerBillingErrorCode =\n | 'INVALID_TENANT'\n | 'INVALID_CURRENCY'\n | 'INVALID_AMOUNT'\n | 'PRICE_BOOK_NOT_FOUND'\n | 'PRICE_BOOK_INACTIVE'\n | 'PRICE_BOOK_KIND_MISMATCH'\n | 'PRICE_BOOK_OWNER_MISMATCH'\n | 'PRICE_BOOK_NOT_ASSIGNED'\n | 'NO_EFFECTIVE_PRICE'\n | 'RELATIONSHIP_REQUIRED'\n | 'POLICY_NOT_FOUND'\n | 'POLICY_NOT_BALANCE'\n | 'POLICY_CONFLICT'\n | 'ASSIGNMENT_CONFLICT';\n\n/** A reseller price book, rating, or delegated-spending rule was violated. */\nexport class ResellerBillingError extends Error {\n constructor(\n message: string,\n public readonly code: ResellerBillingErrorCode,\n ) {\n super(message);\n this.name = 'ResellerBillingError';\n }\n}\n","import {\n type DatabaseConfig,\n isDatabaseInterface,\n isEmbeddedDatabase,\n type SmrtClassOptions,\n withEmbeddedWriteTransaction,\n} from '@happyvertical/smrt-core';\nimport {\n type BillingRelationshipService,\n type BillingRelationshipView,\n getTenantId,\n isSuperAdminBypass,\n isSystemContext,\n TenantIsolationError,\n withSystemContext,\n} from '@happyvertical/smrt-tenancy';\nimport type { SqlAdapterType } from '@happyvertical/sql';\nimport { TenantUsageMetricCollection } from '../collections/TenantUsageMetricCollection.js';\nimport {\n BillingAdjustmentCollection,\n type ClientCharge,\n ClientChargeCollection,\n type PricingRule,\n PricingRuleCollection,\n type PricingStrategy,\n type SpendingBasis,\n type SpendingPolicy,\n SpendingPolicyCollection,\n} from '../models/commercial.js';\nimport {\n type CreditGrant,\n CreditGrantCollection,\n type PriceBook,\n PriceBookAssignmentCollection,\n PriceBookCollection,\n type PriceBookKind,\n type RetailCharge,\n RetailChargeCollection,\n} from '../models/reseller.js';\nimport type { TenantUsageMetric } from '../models/TenantUsageMetric.js';\nimport type { RecordUsageOptions, SubscriberKind } from '../types.js';\nimport {\n deterministicUuid,\n normalizeSubscriber,\n subscriberToColumns,\n tenantKey,\n} from '../utils.js';\nimport { ResellerBillingError } from './reseller-errors.js';\n\nexport interface PriceUsageOptions {\n usageEventId: string;\n approved?: boolean;\n at?: Date;\n}\n\n/** The released smrt-tenancy billing-owner read this package depends on. */\nexport type BillingRelationshipReader = Pick<\n BillingRelationshipService,\n 'getRelationship'\n>;\n\nexport interface RateUsageOptions extends PriceUsageOptions {\n /** Resolves the usage tenant's reseller relationship and billing owner. */\n billingRelationships: BillingRelationshipReader;\n}\n\n/**\n * The outcome of rating one usage event (#3059). A usage event is rated\n * exactly once: the first rating fixes the payer and price books, and later\n * calls return the same records even if the billing owner has since changed.\n */\nexport interface UsageRating {\n /** The tenant that produced the usage. */\n usageTenantId: string;\n /** Who pays the provider: the usage tenant, or its reseller. */\n billingOwnerTenantId: string;\n /** `direct` for self-billed usage, `wholesale` for reseller-billed usage. */\n mode: 'direct' | 'wholesale';\n /** The provider's charge, payable by {@link billingOwnerTenantId}. */\n charge: ClientCharge;\n /** The reseller's retail charge to the child, when a retail book applies. */\n retailCharge: RetailCharge | null;\n}\nexport interface CustomPricingContext {\n usage: { quantity: number; dimensions: Record<string, unknown> };\n rule: PricingRule;\n terms: Record<string, unknown>;\n}\nexport type CustomPricingStrategy = (\n context: CustomPricingContext,\n) => number | Promise<number>;\n\nexport interface CommercialBillingStorage {\n adapterType: SqlAdapterType;\n writeStrategy?: 'immediate' | 'manual' | 'none';\n}\n\nexport interface CommercialUsageServiceOptions extends SmrtClassOptions {\n /**\n * Required when `db` is an already-resolved database handle, whose public\n * interface does not expose its adapter/write-back configuration.\n */\n billingStorage?: CommercialBillingStorage;\n}\n\nconst embeddedAdjustmentLocks = new Map<string | object, Promise<void>>();\n\nasync function withEmbeddedSourcedAdjustmentLock<T>(\n db: { url?: string },\n storage: CommercialBillingStorage,\n sourced: boolean,\n operation: () => Promise<T>,\n): Promise<T> {\n if (!sourced || storage.adapterType === 'postgres') return operation();\n\n const key = db.url ? `${storage.adapterType}:${db.url}` : (db as object);\n const previous = embeddedAdjustmentLocks.get(key) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const queued = previous.then(() => current);\n embeddedAdjustmentLocks.set(key, queued);\n await previous;\n try {\n return await operation();\n } finally {\n release();\n if (embeddedAdjustmentLocks.get(key) === queued) {\n embeddedAdjustmentLocks.delete(key);\n }\n }\n}\n\nexport class UnsupportedCommercialBillingStorageError extends Error {\n readonly code = 'UNSUPPORTED_COMMERCIAL_BILLING_STORAGE';\n\n constructor(storage: CommercialBillingStorage) {\n super(\n `Commercial billing does not support ${storage.adapterType} ` +\n `with immediate JSON write-back because exported files are not ` +\n `transactionally rolled back. Use PostgreSQL, SQLite, ordinary ` +\n `DuckDB, or a non-immediate write strategy.`,\n );\n this.name = 'UnsupportedCommercialBillingStorageError';\n }\n}\n\nexport class CommercialBillingStorageConfigurationError extends Error {\n readonly code = 'COMMERCIAL_BILLING_STORAGE_CONFIGURATION_REQUIRED';\n\n constructor(message?: string) {\n super(\n message ??\n 'Commercial billing requires billingStorage when db is an already-resolved handle because adapter write-back capabilities are not public on that interface.',\n );\n this.name = 'CommercialBillingStorageConfigurationError';\n }\n}\n\nfunction assertValidCommercialBillingWriteStrategy(\n writeStrategy: unknown,\n): asserts writeStrategy is CommercialBillingStorage['writeStrategy'] {\n if (\n writeStrategy !== undefined &&\n writeStrategy !== 'immediate' &&\n writeStrategy !== 'manual' &&\n writeStrategy !== 'none'\n ) {\n throw new CommercialBillingStorageConfigurationError(\n 'Commercial billing database writeStrategy must be immediate, manual, or none.',\n );\n }\n}\n\nfunction snapshotCommercialBillingStorage(\n storage: CommercialBillingStorage,\n): CommercialBillingStorage {\n const adapterType: unknown = storage.adapterType;\n if (\n adapterType !== 'sqlite' &&\n adapterType !== 'postgres' &&\n adapterType !== 'duckdb' &&\n adapterType !== 'json'\n ) {\n throw new CommercialBillingStorageConfigurationError(\n 'Commercial billing storage adapterType must be sqlite, postgres, duckdb, or json.',\n );\n }\n const writeStrategy: unknown = storage.writeStrategy;\n assertValidCommercialBillingWriteStrategy(writeStrategy);\n return { adapterType, writeStrategy };\n}\n\nfunction snapshotCommercialUsageServiceOptions(\n options: CommercialUsageServiceOptions,\n): CommercialUsageServiceOptions {\n const snapshot = { ...options };\n if (snapshot.billingStorage) {\n snapshot.billingStorage = snapshotCommercialBillingStorage(\n snapshot.billingStorage,\n );\n }\n for (const key of ['db', 'persistence'] as const) {\n const database = snapshot[key];\n if (\n database &&\n typeof database !== 'string' &&\n !isDatabaseInterface(database)\n ) {\n snapshot[key] = { ...database };\n }\n }\n return snapshot;\n}\n\nexport function assertCommercialBillingStorageSupported(\n storage: CommercialBillingStorage,\n): void {\n const snapshot = snapshotCommercialBillingStorage(storage);\n const writeStrategy =\n snapshot.adapterType === 'json'\n ? (snapshot.writeStrategy ?? 'immediate')\n : snapshot.writeStrategy;\n if (\n (snapshot.adapterType === 'json' || snapshot.adapterType === 'duckdb') &&\n writeStrategy === 'immediate'\n ) {\n throw new UnsupportedCommercialBillingStorageError({\n ...snapshot,\n writeStrategy,\n });\n }\n}\n\nfunction inferAdapterType(url: string): SqlAdapterType | undefined {\n if (/^postgres(?:ql)?:/iu.test(url)) return 'postgres';\n if (/^(?:https?|libsql):\\/\\//iu.test(url)) return 'sqlite';\n if (/\\.duckdb(?:$|\\?)/iu.test(url)) return 'duckdb';\n if (url === ':memory:' || url.startsWith('file:')) return 'sqlite';\n return undefined;\n}\n\nfunction environmentAdapterType(): SqlAdapterType | undefined {\n const type = process.env.HAVE_SQL_TYPE;\n if (type === undefined || type === '') return undefined;\n if (\n type === 'sqlite' ||\n type === 'postgres' ||\n type === 'duckdb' ||\n type === 'json'\n ) {\n return type;\n }\n throw new CommercialBillingStorageConfigurationError(\n 'Commercial billing HAVE_SQL_TYPE must be sqlite, postgres, duckdb, or json.',\n );\n}\n\nfunction environmentWriteStrategy(): CommercialBillingStorage['writeStrategy'] {\n const strategy = process.env.HAVE_SQL_WRITE_STRATEGY;\n if (strategy === undefined || strategy === '') return undefined;\n if (\n strategy === 'immediate' ||\n strategy === 'manual' ||\n strategy === 'none'\n ) {\n return strategy;\n }\n throw new CommercialBillingStorageConfigurationError(\n 'Commercial billing HAVE_SQL_WRITE_STRATEGY must be immediate, manual, or none.',\n );\n}\n\nfunction billingStorageFromConfig(\n config: DatabaseConfig | undefined,\n declared?: CommercialBillingStorage,\n): CommercialBillingStorage {\n // Validate a configured environment value even when an explicit config type\n // wins adapter precedence. Otherwise normalization below could hide an SDK\n // configuration error by replacing the invalid environment value.\n const environmentType = environmentAdapterType();\n if (config === undefined) {\n if (environmentType)\n return {\n adapterType: environmentType,\n writeStrategy: environmentWriteStrategy(),\n };\n return { adapterType: 'sqlite' };\n }\n if (isDatabaseInterface(config)) {\n throw new CommercialBillingStorageConfigurationError();\n }\n if (typeof config === 'string') {\n const adapterType =\n environmentType ?? inferAdapterType(config) ?? declared?.adapterType;\n if (adapterType)\n return {\n adapterType,\n writeStrategy: environmentWriteStrategy() ?? declared?.writeStrategy,\n };\n throw new Error(\n 'Commercial billing requires an explicit billingStorage adapter contract for ambiguous database URLs.',\n );\n }\n const adapterType =\n config.type ??\n environmentType ??\n inferAdapterType(String(config.url ?? '')) ??\n declared?.adapterType;\n if (!adapterType) {\n throw new Error(\n 'Commercial billing requires an explicit database type or billingStorage adapter contract.',\n );\n }\n const configuredWriteStrategy = config.writeStrategy;\n assertValidCommercialBillingWriteStrategy(configuredWriteStrategy);\n const writeStrategy =\n configuredWriteStrategy === 'immediate' ||\n configuredWriteStrategy === 'manual' ||\n configuredWriteStrategy === 'none'\n ? configuredWriteStrategy\n : (environmentWriteStrategy() ?? declared?.writeStrategy);\n return { adapterType, writeStrategy };\n}\n\nfunction effectiveWriteStrategy(\n storage: CommercialBillingStorage,\n): CommercialBillingStorage['writeStrategy'] {\n if (storage.writeStrategy) return storage.writeStrategy;\n if (storage.adapterType === 'json') return 'immediate';\n if (storage.adapterType === 'duckdb') return 'none';\n return undefined;\n}\n\nfunction resolveCommercialBillingStorage(\n options: CommercialUsageServiceOptions,\n): CommercialBillingStorage {\n // Environment declarations are configuration contracts, even when explicit\n // options win precedence. Reject invalid nonempty values before setup.\n environmentAdapterType();\n environmentWriteStrategy();\n const configuredDatabase = options.db ?? options.persistence;\n if (isDatabaseInterface(configuredDatabase)) {\n if (!options.billingStorage) {\n throw new CommercialBillingStorageConfigurationError();\n }\n return options.billingStorage;\n }\n const configured = billingStorageFromConfig(\n configuredDatabase,\n options.billingStorage,\n );\n if (\n options.billingStorage &&\n (options.billingStorage.adapterType !== configured.adapterType ||\n effectiveWriteStrategy(options.billingStorage) !==\n effectiveWriteStrategy(configured))\n ) {\n throw new CommercialBillingStorageConfigurationError(\n 'Commercial billingStorage must match the configured database adapter and write strategy.',\n );\n }\n return configured;\n}\n\nfunction normalizedCommercialClassOptions(\n options: CommercialUsageServiceOptions,\n billingStorage: CommercialBillingStorage,\n): SmrtClassOptions {\n const { billingStorage: _billingStorage, ...classOptions } = options;\n const configuredDatabase = options.db ?? options.persistence;\n if (configuredDatabase && !isDatabaseInterface(configuredDatabase)) {\n const normalizedDatabase =\n typeof configuredDatabase === 'string'\n ? {\n type: billingStorage.adapterType,\n url: configuredDatabase,\n writeStrategy: billingStorage.writeStrategy,\n }\n : {\n ...configuredDatabase,\n type: billingStorage.adapterType,\n writeStrategy: billingStorage.writeStrategy,\n };\n if (options.db !== undefined) classOptions.db = normalizedDatabase;\n else classOptions.persistence = normalizedDatabase;\n }\n return classOptions;\n}\n\ninterface ResellerCollections {\n books: PriceBookCollection;\n assignments: PriceBookAssignmentCollection;\n retailCharges: RetailChargeCollection;\n}\n\nexport class CommercialUsageService {\n private readonly customStrategies = new Map<string, CustomPricingStrategy>();\n private resellerCollections?: Promise<ResellerCollections>;\n constructor(\n private readonly usage: TenantUsageMetricCollection,\n private readonly rules: PricingRuleCollection,\n private readonly charges: ClientChargeCollection,\n private readonly adjustments: BillingAdjustmentCollection,\n private readonly billingStorage: CommercialBillingStorage,\n ) {\n if (!billingStorage) {\n throw new CommercialBillingStorageConfigurationError();\n }\n assertCommercialBillingStorageSupported(billingStorage);\n }\n\n static async create(\n options: CommercialUsageServiceOptions = {},\n ): Promise<CommercialUsageService> {\n const optionSnapshot = snapshotCommercialUsageServiceOptions(options);\n const billingStorage = resolveCommercialBillingStorage(optionSnapshot);\n assertCommercialBillingStorageSupported(billingStorage);\n const classOptions = normalizedCommercialClassOptions(\n optionSnapshot,\n billingStorage,\n );\n const usage = await TenantUsageMetricCollection.create(classOptions);\n const sharedOptions = { ...classOptions, db: usage.db };\n return new CommercialUsageService(\n usage,\n await PricingRuleCollection.create(sharedOptions),\n await ClientChargeCollection.create(sharedOptions),\n await BillingAdjustmentCollection.create(sharedOptions),\n billingStorage,\n );\n }\n\n registerCustomStrategy(key: string, strategy: CustomPricingStrategy): void {\n this.customStrategies.set(key, strategy);\n }\n\n async record(options: RecordUsageOptions) {\n return this.usage.recordUsage(options);\n }\n\n async price(options: PriceUsageOptions): Promise<ClientCharge> {\n const existing = await this.charges.list({\n where: { usageEventId: options.usageEventId },\n limit: 1,\n });\n if (existing[0]) {\n return this.approveCharge(existing[0], options.approved);\n }\n const usage = await this.usage.get(options.usageEventId);\n if (!usage)\n throw new Error(`Usage event ${options.usageEventId} was not found.`);\n const at = options.at ?? usage.windowStart;\n const dimensions = usage.getDimensions();\n const rules = await this.rules.list({\n where: {\n tenantId: usage.tenantId,\n metricKey: usage.metricKey,\n active: true,\n },\n });\n // Price-book rules are published by a seller for rateUsage(); they are\n // never a tenant's own direct pricing.\n const rule = selectRule(\n rules.filter((candidate) => !candidate.priceBookId),\n at,\n String(dimensions.serviceKey ?? ''),\n );\n if (!rule)\n throw new Error(\n `No effective pricing rule for metric '${usage.metricKey}'.`,\n );\n if (!usage.id)\n throw new Error(\n `Usage event ${options.usageEventId} has no persisted id.`,\n );\n if (!rule.id)\n throw new Error(`Pricing rule '${rule.ruleKey}' has no persisted id.`);\n const amount = await this.calculateAmount(rule, usage.quantity, dimensions);\n const chargeId = await deterministicUuid([\n 'client-charge',\n String(usage.tenantId),\n String(usage.id),\n ]);\n try {\n return await this.charges.create({\n id: chargeId,\n tenantId: usage.tenantId,\n usageEventId: String(usage.id),\n usageTenantId: usage.tenantId,\n subscriberKind: usage.subscriberKind,\n subscriberExternalId: usage.subscriberExternalId,\n projectId: usage.projectId,\n workRefType: usage.workRefType,\n workRefId: usage.workRefId,\n provider: usage.provider,\n serviceKey: String(dimensions.serviceKey ?? ''),\n metricKey: usage.metricKey,\n quantity: usage.quantity,\n amount,\n currency: rule.currency,\n pricingRuleId: String(rule.id),\n pricingSnapshot: JSON.stringify({\n ruleKey: rule.ruleKey,\n strategy: rule.strategy,\n terms: rule.getTerms(),\n effectiveFrom: rule.effectiveFrom,\n }),\n status: options.approved ? 'approved' : 'draft',\n approvedAt: options.approved ? new Date() : null,\n _insertOnly: true,\n });\n } catch (error) {\n const concurrent = await this.charges.get(chargeId);\n if (!concurrent) throw error;\n return this.approveCharge(concurrent, options.approved);\n }\n }\n\n /**\n * Rate one usage event under its billing owner's price books (#3059).\n *\n * - No reseller relationship, or a `self`-billed one: the usage tenant pays\n * the provider directly, priced exactly as {@link price} prices it.\n * - `reseller`-billed: the reseller pays the provider from the child's\n * assigned wholesale book (a {@link ClientCharge} with `tenantId` = the\n * reseller and `usageTenantId` = the child) and, when the child has a\n * retail book assigned, the child owes the reseller a\n * {@link RetailCharge}. Both records commit in one transaction.\n *\n * Rating is idempotent per usage event and frozen at first rating: a later\n * billing-owner change never re-prices or double-charges an event that\n * already has a provider charge, because `ClientCharge` holds exactly one\n * row per usage event.\n *\n * Rating reads the seller's books across tenants; run it where the host's\n * tenancy rules allow that (typically a system context).\n */\n async rateUsage(options: RateUsageOptions): Promise<UsageRating> {\n const { retailCharges } = await this.getResellerCollections();\n const existing = await this.charges.list({\n where: { usageEventId: options.usageEventId },\n limit: 1,\n });\n if (existing[0]) {\n return this.frozenRating(existing[0], retailCharges, options.approved);\n }\n const usage = await this.usage.get(options.usageEventId);\n if (!usage)\n throw new Error(`Usage event ${options.usageEventId} was not found.`);\n if (!usage.id || !usage.tenantId)\n throw new Error(\n `Usage event ${options.usageEventId} has no persisted tenant id.`,\n );\n const relationship = await options.billingRelationships.getRelationship(\n usage.tenantId,\n );\n if (relationship?.billingOwnerMode !== 'reseller') {\n const charge = await this.price(options);\n return this.frozenRating(charge, retailCharges, options.approved);\n }\n let failure: unknown;\n try {\n await this.rateResellerBilled(usage, relationship, options);\n } catch (error) {\n failure = error;\n }\n // Return root-bound records (never the committed transaction's handles).\n // After a failure, a concurrent rating of the same event may have won the\n // one-row-per-event insert; its transaction wrote the complete rating.\n const rated = await this.charges.list({\n where: { usageEventId: String(usage.id) },\n limit: 1,\n });\n if (!rated[0]) throw failure ?? new Error('Rating was not persisted.');\n return this.frozenRating(rated[0], retailCharges, options.approved);\n }\n\n private async rateResellerBilled(\n usage: TenantUsageMetric,\n relationship: BillingRelationshipView,\n options: RateUsageOptions,\n ): Promise<UsageRating> {\n const { books, assignments } = await this.getResellerCollections();\n const childTenantId = relationship.childTenantId;\n const resellerTenantId = relationship.resellerTenantId;\n const assignment = await assignments.get({ childTenantId });\n if (\n !assignment?.wholesalePriceBookId ||\n tenantKey(assignment.resellerTenantId) !== resellerTenantId\n ) {\n throw new ResellerBillingError(\n `No wholesale price book is assigned to tenant ${childTenantId} under reseller ${resellerTenantId}.`,\n 'PRICE_BOOK_NOT_ASSIGNED',\n );\n }\n const at = options.at ?? usage.windowStart;\n const dimensions = usage.getDimensions();\n const serviceKey = String(dimensions.serviceKey ?? '');\n const wholesaleBook = await loadBook(\n books,\n assignment.wholesalePriceBookId,\n 'wholesale',\n );\n assertWholesalePublisher(wholesaleBook, resellerTenantId, childTenantId);\n const wholesaleRule = await this.selectBookRule(\n wholesaleBook,\n usage.metricKey,\n serviceKey,\n assignment.wholesaleCurrency,\n at,\n );\n let retail: { book: PriceBook; rule: PricingRule } | null = null;\n if (assignment.retailPriceBookId) {\n const retailBook = await loadBook(\n books,\n assignment.retailPriceBookId,\n 'retail',\n );\n if (tenantKey(retailBook.tenantId) !== resellerTenantId) {\n throw new ResellerBillingError(\n `Retail price book '${retailBook.bookKey}' is not published by reseller ${resellerTenantId}.`,\n 'PRICE_BOOK_OWNER_MISMATCH',\n );\n }\n retail = {\n book: retailBook,\n rule: await this.selectBookRule(\n retailBook,\n usage.metricKey,\n serviceKey,\n assignment.retailCurrency,\n at,\n ),\n };\n }\n const wholesaleAmount = await this.calculateAmount(\n wholesaleRule,\n usage.quantity,\n dimensions,\n );\n const retailAmount = retail\n ? await this.calculateAmount(retail.rule, usage.quantity, dimensions)\n : 0;\n const usageEventId = String(usage.id);\n const chargeId = await deterministicUuid([\n 'client-charge',\n String(usage.tenantId),\n usageEventId,\n ]);\n const retailChargeId = await deterministicUuid([\n 'retail-charge',\n String(usage.tenantId),\n usageEventId,\n ]);\n const approvedAt = options.approved ? new Date() : null;\n const status = options.approved ? 'approved' : 'draft';\n const usageColumns = {\n usageEventId,\n subscriberKind: usage.subscriberKind,\n subscriberExternalId: usage.subscriberExternalId,\n projectId: usage.projectId,\n workRefType: usage.workRefType,\n workRefId: usage.workRefId,\n provider: usage.provider,\n serviceKey,\n metricKey: usage.metricKey,\n quantity: usage.quantity,\n };\n const snapshot = (book: PriceBook, rule: PricingRule) =>\n JSON.stringify({\n ruleKey: rule.ruleKey,\n strategy: rule.strategy,\n terms: rule.getTerms(),\n effectiveFrom: rule.effectiveFrom,\n priceBookKey: book.bookKey,\n priceBookKind: book.kind,\n usageTenantId: childTenantId,\n billingOwnerTenantId: resellerTenantId,\n });\n const db = this.charges.db;\n return withEmbeddedWriteTransaction(\n db,\n isEmbeddedDatabase(db),\n async (transaction) => {\n const charges = await ClientChargeCollection.create({\n db: transaction,\n });\n const retailCharges = await RetailChargeCollection.create({\n db: transaction,\n });\n const charge = await charges.create({\n id: chargeId,\n tenantId: resellerTenantId,\n usageTenantId: childTenantId,\n ...usageColumns,\n amount: wholesaleAmount,\n currency: wholesaleRule.currency,\n pricingRuleId: String(wholesaleRule.id),\n priceBookId: String(wholesaleBook.id),\n pricingSnapshot: snapshot(wholesaleBook, wholesaleRule),\n status,\n approvedAt,\n _insertOnly: true,\n });\n const retailCharge = retail\n ? await retailCharges.create({\n id: retailChargeId,\n tenantId: childTenantId,\n resellerTenantId,\n clientChargeId: chargeId,\n ...usageColumns,\n amount: retailAmount,\n currency: retail.rule.currency,\n priceBookId: String(retail.book.id),\n pricingRuleId: String(retail.rule.id),\n pricingSnapshot: snapshot(retail.book, retail.rule),\n status,\n approvedAt,\n _insertOnly: true,\n })\n : null;\n return {\n usageTenantId: childTenantId,\n billingOwnerTenantId: resellerTenantId,\n mode: 'wholesale' as const,\n charge,\n retailCharge,\n };\n },\n );\n }\n\n private async selectBookRule(\n book: PriceBook,\n metricKey: string,\n serviceKey: string,\n currency: string,\n at: Date,\n ): Promise<PricingRule> {\n const rules = await this.rules.list({\n where: {\n tenantId: book.tenantId,\n priceBookId: book.id,\n metricKey,\n currency,\n active: true,\n },\n });\n const rule = selectRule(\n // The owner check keeps a rule filed under someone else's book (the\n // rules API is tenant-writable) from pricing that book.\n rules.filter(\n (candidate) =>\n candidate.priceBookId === book.id &&\n candidate.tenantId === book.tenantId &&\n candidate.currency === currency,\n ),\n at,\n serviceKey,\n );\n if (!rule?.id) {\n throw new ResellerBillingError(\n `Price book '${book.bookKey}' has no effective ${currency} price for metric '${metricKey}'.`,\n 'NO_EFFECTIVE_PRICE',\n );\n }\n return rule;\n }\n\n private async frozenRating(\n charge: ClientCharge,\n retailCharges: RetailChargeCollection,\n approved = false,\n ): Promise<UsageRating> {\n const retail = await retailCharges.list({\n where: { usageEventId: charge.usageEventId },\n limit: 1,\n });\n let providerCharge = charge;\n let retailCharge: RetailCharge | null = retail[0] ?? null;\n if (\n approved &&\n (providerCharge.status === 'draft' || retailCharge?.status === 'draft')\n ) {\n // Approve both legs in one transaction so they never disagree.\n const db = this.charges.db;\n [providerCharge, retailCharge] = await withEmbeddedWriteTransaction(\n db,\n isEmbeddedDatabase(db),\n async (transaction) => {\n const charges = await ClientChargeCollection.create({\n db: transaction,\n });\n const retails = await RetailChargeCollection.create({\n db: transaction,\n });\n const provider = await charges.get(String(charge.id));\n if (!provider) {\n throw new Error(`Client charge ${charge.id} was not found.`);\n }\n const leg = retailCharge\n ? await retails.get(String(retailCharge.id))\n : null;\n const approvedAt = new Date();\n if (provider.status === 'draft') {\n provider.status = 'approved';\n provider.approvedAt = approvedAt;\n await provider.save();\n }\n if (leg?.status === 'draft') {\n leg.status = 'approved';\n leg.approvedAt = approvedAt;\n await leg.save();\n }\n return [provider, leg ?? null] as const;\n },\n );\n // Hand back root-bound records, not the committed transaction's.\n providerCharge = (await this.charges.get(String(charge.id))) ?? charge;\n retailCharge = retailCharge?.id\n ? ((await retailCharges.get(String(retailCharge.id))) ?? null)\n : null;\n }\n return {\n usageTenantId:\n tenantKey(providerCharge.usageTenantId) ||\n tenantKey(providerCharge.tenantId),\n billingOwnerTenantId: tenantKey(providerCharge.tenantId),\n mode: providerCharge.priceBookId ? 'wholesale' : 'direct',\n charge: providerCharge,\n retailCharge,\n };\n }\n\n private getResellerCollections(): Promise<ResellerCollections> {\n this.resellerCollections ??= (async () => {\n const options = { db: this.charges.db };\n return {\n books: await PriceBookCollection.create(options),\n assignments: await PriceBookAssignmentCollection.create(options),\n retailCharges: await RetailChargeCollection.create(options),\n };\n })();\n this.resellerCollections.catch(() => {\n this.resellerCollections = undefined;\n });\n return this.resellerCollections;\n }\n\n private async approveCharge(\n charge: ClientCharge,\n approved = false,\n ): Promise<ClientCharge> {\n if (approved && charge.status === 'draft') {\n charge.status = 'approved';\n charge.approvedAt = new Date();\n await charge.save();\n }\n return charge;\n }\n\n /**\n * Append a signed correction to an approved charge.\n *\n * @param amount - Signed correction in **integer minor units**, same unit as\n * the charge (#2401). Negative is legitimate — that is a credit. A\n * fractional value is rejected rather than silently rounded, because it\n * almost always means the caller passed major units.\n */\n async adjust(\n chargeId: string,\n amount: number,\n reason: string,\n source = '',\n sourceId = '',\n ) {\n if (!Number.isInteger(amount)) {\n throw new Error(\n `Billing adjustment amount must be an integer number of minor units ` +\n `(cents) — got ${amount}. Money is exact: -$0.25 is -25, not -0.25.`,\n );\n }\n const sourced = Boolean(source && sourceId);\n return withEmbeddedSourcedAdjustmentLock(\n this.charges.db,\n this.billingStorage,\n sourced,\n () => this.adjustWithinLock(chargeId, amount, reason, source, sourceId),\n );\n }\n\n private async adjustWithinLock(\n chargeId: string,\n amount: number,\n reason: string,\n source: string,\n sourceId: string,\n ) {\n const initialCharge = await this.charges.get(chargeId);\n if (!initialCharge)\n throw new Error(`Client charge ${chargeId} was not found.`);\n if (\n initialCharge.status !== 'approved' &&\n initialCharge.status !== 'adjusted'\n ) {\n throw new Error(\n `Client charge ${chargeId} must be approved before it can be adjusted.`,\n );\n }\n const sourcedId =\n source && sourceId\n ? await deterministicUuid([\n 'billing-adjustment',\n String(initialCharge.tenantId),\n chargeId,\n source,\n sourceId,\n ])\n : null;\n const db = this.charges.db;\n if (!db.transaction) {\n throw new Error('Atomic billing adjustment requires transaction support');\n }\n try {\n return await withEmbeddedWriteTransaction(\n db,\n isEmbeddedDatabase(db),\n async (transaction) => {\n const options = { db: transaction };\n const charges = await ClientChargeCollection.create(options);\n const adjustments = await BillingAdjustmentCollection.create(options);\n const charge = await charges.get(chargeId);\n if (!charge)\n throw new Error(`Client charge ${chargeId} was not found.`);\n if (charge.status !== 'approved' && charge.status !== 'adjusted') {\n throw new Error(\n `Client charge ${chargeId} must be approved before it can be adjusted.`,\n );\n }\n let adjustment = sourcedId\n ? await adjustments.get(sourcedId)\n : undefined;\n if (!adjustment) {\n adjustment = await adjustments.create({\n ...(sourcedId ? { id: sourcedId } : {}),\n tenantId: charge.tenantId,\n clientChargeId: chargeId,\n amount,\n currency: charge.currency,\n reason,\n source,\n sourceId,\n _insertOnly: Boolean(sourcedId),\n });\n }\n if (charge.status === 'approved') {\n charge.status = 'adjusted';\n await charge.save();\n }\n return adjustment;\n },\n );\n } catch (error) {\n // A concurrent sourced adjustment may win the deterministic insert. Its\n // transaction also owns the charge-state transition, so it is safe to\n // return only after both durable records are visible.\n if (sourcedId) {\n // Embedded adapters multiplex one native handle. Keep recovery reads\n // sequential just like the transaction flow protected above.\n const adjustment = await this.adjustments.get(sourcedId);\n const charge = await this.charges.get(chargeId);\n if (adjustment && charge?.status === 'adjusted') return adjustment;\n }\n throw error;\n }\n }\n\n /**\n * Price one usage event, in **integer minor units** (#2401).\n *\n * The pricing terms stay fractional on purpose — a per-token rate is\n * routinely a fraction of a cent, and an integer `unitPrice` would truncate\n * it to zero — so terms are read as *minor units per unit of usage* and only\n * the result is rounded. This is the single boundary in the package where a\n * rate meets money, which is what lets `evaluateSpending()` compare sums\n * against `SpendingPolicy.limitAmount` exactly.\n *\n * Replaces the old micro-unit rounding (`Math.round(amount * 1e6) / 1e6`),\n * which kept six sub-cent digits in a column that is now integral.\n */\n async calculateAmount(\n rule: PricingRule,\n quantity: number,\n dimensions: Record<string, unknown> = {},\n ): Promise<number> {\n const terms = rule.getTerms();\n const number = (key: string, fallback = 0) =>\n Number(terms[key] ?? fallback);\n let amount: number;\n switch (rule.strategy as PricingStrategy) {\n case 'fixed_unit':\n amount = quantity * number('unitPrice');\n break;\n case 'cost_plus':\n amount =\n Number(dimensions.providerCost ?? 0) +\n number('fixedMarkup') +\n Number(dimensions.providerCost ?? 0) * number('markupRatio');\n break;\n case 'multiplier':\n amount =\n Number(dimensions.providerCost ?? quantity) * number('multiplier', 1);\n break;\n case 'flat':\n amount = number('amount');\n break;\n case 'included_overage':\n amount =\n Math.max(0, quantity - number('includedQuantity')) *\n number('overageUnitPrice');\n break;\n case 'tiered':\n amount = priceTiers(\n quantity,\n Array.isArray(terms.tiers) ? terms.tiers : [],\n );\n break;\n case 'custom': {\n const custom = this.customStrategies.get(\n String(terms.strategyKey ?? ''),\n );\n if (!custom)\n throw new Error(\n `Custom pricing strategy '${String(terms.strategyKey ?? '')}' is not registered.`,\n );\n amount = await custom({ usage: { quantity, dimensions }, rule, terms });\n break;\n }\n }\n if (!Number.isFinite(amount) || amount < 0)\n throw new Error('Pricing produced an invalid amount.');\n return Math.round(amount);\n }\n}\n\nexport interface SpendingDecision {\n allowed: boolean;\n approvalRequired: boolean;\n state: 'ok' | 'observed' | 'warned' | 'blocked' | 'approval_required';\n /**\n * Already-spent plus estimated, in **integer minor units** — the same unit as\n * `SpendingPolicy.limitAmount` it is compared against (#2401).\n */\n projectedAmount: number;\n matchedPolicyId: string | null;\n /**\n * For a prepaid `balance` policy: credit remaining before this estimate\n * (grants minus spend), in integer minor units. Absent for other periods.\n */\n balanceAmount?: number;\n}\n\nexport interface SpendingEvaluationInput {\n tenantId: string;\n subscriberKind?: SubscriberKind;\n subscriberExternalId?: string;\n projectId?: string;\n serviceKey?: string;\n metricKey: string;\n /** Estimated cost of the pending call, in integer minor units (#2401). */\n estimatedAmount: number;\n /**\n * Per-basis estimates, in integer minor units, for policies whose basis\n * prices the call differently (a retail estimate for `retail` policies, a\n * wholesale estimate for `wholesale` ones). Falls back to\n * {@link estimatedAmount}.\n */\n estimatedAmounts?: Partial<Record<SpendingBasis, number>>;\n currency: string;\n at?: Date;\n}\n\n/** Context handed to an {@link AutoTopUpHook} when a balance would run out. */\nexport interface AutoTopUpRequest {\n policyId: string;\n tenantId: string;\n /** The parent that set the policy, or empty for the tenant's own policy. */\n setByTenantId: string;\n currency: string;\n /** Credit remaining before the estimate, in integer minor units. */\n balanceAmount: number;\n estimatedAmount: number;\n /** How far the estimate overshoots the balance, in integer minor units. */\n shortfall: number;\n /**\n * Recompute the shortfall against the credit and spend recorded now. A\n * hook that secures funds asynchronously calls it before charging: a\n * concurrent evaluation may have topped the balance up since this one read\n * it, and the evaluator re-reads the credit after the hook returns.\n */\n currentShortfall?: () => Promise<number>;\n}\n\n/**\n * A top-up the hook has secured. `sourceId` makes it idempotent: the same\n * `source`/`sourceId` pair is credited once however often it is returned.\n */\nexport interface AutoTopUpGrant {\n amount: number;\n sourceId: string;\n source?: string;\n reason?: string;\n}\n\n/**\n * Host hook for prepaid balances. Called when a pending charge would exhaust a\n * `balance` policy; return a grant to credit it (after the host has secured\n * the funds) or nothing to let the policy's behavior apply. The evaluator\n * never calls a payment provider itself, and re-reads the balance after the\n * hook returns either way, so credit granted meanwhile by another path counts.\n */\nexport type AutoTopUpHook = (\n request: AutoTopUpRequest,\n) =>\n | AutoTopUpGrant\n | null\n | undefined\n | Promise<AutoTopUpGrant | null | undefined>;\n\nexport interface SpendingPolicyEvaluatorOptions extends SmrtClassOptions {\n autoTopUp?: AutoTopUpHook;\n /**\n * The smrt-tenancy relationship reader. When supplied, a delegated policy\n * applies only while its `setByTenantId` is the tenant's current reseller;\n * without it every delegated policy applies (fail closed).\n */\n billingRelationships?: BillingRelationshipReader;\n}\n\nexport interface GrantCreditInput {\n spendingPolicyId: string;\n /** Signed, nonzero credit in integer minor units of the policy currency. */\n amount: number;\n reason?: string;\n /** With `sourceId`, makes the grant idempotent (a payment or order id). */\n source?: string;\n sourceId?: string;\n /** The parent granting credit on its child's delegated policy. */\n grantedByTenantId?: string;\n}\n\nexport interface SpendingPolicyEvaluatorExtensions {\n retailCharges?: RetailChargeCollection;\n credits?: CreditGrantCollection;\n autoTopUp?: AutoTopUpHook;\n billingRelationships?: BillingRelationshipReader;\n}\n\ninterface LedgerRow {\n id?: string | null;\n amount: number;\n status: string;\n projectId: string;\n serviceKey: string;\n metricKey: string;\n subscriberKind: string;\n subscriberExternalId: string;\n}\n\nexport class SpendingPolicyEvaluator {\n private ledgers?: Promise<{\n retailCharges: RetailChargeCollection;\n credits: CreditGrantCollection;\n }>;\n constructor(\n private readonly policies: SpendingPolicyCollection,\n private readonly charges: ClientChargeCollection,\n private readonly adjustments: BillingAdjustmentCollection,\n private readonly extensions: SpendingPolicyEvaluatorExtensions = {},\n ) {}\n static async create(options: SpendingPolicyEvaluatorOptions = {}) {\n const { autoTopUp, billingRelationships, ...classOptions } = options;\n const policies = await SpendingPolicyCollection.create(classOptions);\n const sharedOptions = { ...classOptions, db: policies.db };\n return new SpendingPolicyEvaluator(\n policies,\n await ClientChargeCollection.create(sharedOptions),\n await BillingAdjustmentCollection.create(sharedOptions),\n {\n retailCharges: await RetailChargeCollection.create(sharedOptions),\n credits: await CreditGrantCollection.create(sharedOptions),\n autoTopUp,\n billingRelationships,\n },\n );\n }\n\n async evaluate(input: SpendingEvaluationInput): Promise<SpendingDecision> {\n const at = input.at ?? new Date();\n const normalizedInput = {\n ...input,\n ...subscriberToColumns(\n normalizeSubscriber({\n tenantId: input.tenantId,\n subscriberKind: input.subscriberKind,\n subscriberExternalId: input.subscriberExternalId,\n }),\n ),\n };\n const candidates = await this.policies.list({\n where: {\n tenantId: input.tenantId,\n currency: input.currency,\n active: true,\n },\n });\n const matchingPolicies = await this.withoutStaleDelegations(\n input.tenantId,\n selectPolicies(candidates, normalizedInput),\n );\n if (matchingPolicies.length === 0)\n return {\n allowed: true,\n approvalRequired: false,\n state: 'ok',\n projectedAmount: input.estimatedAmount,\n matchedPolicyId: null,\n };\n const decisions = await Promise.all(\n matchingPolicies.map((policy) =>\n this.evaluatePolicy(policy, normalizedInput, at),\n ),\n );\n return decisions.reduce((mostRestrictive, decision) =>\n decisionRank(decision) > decisionRank(mostRestrictive)\n ? decision\n : mostRestrictive,\n );\n }\n\n /**\n * Drop delegated policies whose parent is no longer the tenant's reseller,\n * when a relationship reader is configured.\n */\n private async withoutStaleDelegations(\n tenantId: string,\n policies: SpendingPolicy[],\n ): Promise<SpendingPolicy[]> {\n const reader = this.extensions.billingRelationships;\n if (!reader || !policies.some((policy) => tenantKey(policy.setByTenantId)))\n return policies;\n const relationship = await reader.getRelationship(tenantId);\n const currentParent = tenantKey(relationship?.resellerTenantId);\n return policies.filter((policy) => {\n const setBy = tenantKey(policy.setByTenantId);\n return !setBy || setBy === currentParent;\n });\n }\n\n /**\n * Credit a prepaid `balance` policy. A delegated policy accepts grants only\n * from the parent that set it (or a system context / super-admin bypass).\n */\n async grantCredit(input: GrantCreditInput): Promise<CreditGrant> {\n const policy = await this.policies.get(input.spendingPolicyId);\n if (!policy?.id) {\n throw new ResellerBillingError(\n `Spending policy ${input.spendingPolicyId} was not found.`,\n 'POLICY_NOT_FOUND',\n );\n }\n const setBy = tenantKey(policy.setByTenantId);\n if (\n setBy &&\n !isSystemContext() &&\n !isSuperAdminBypass() &&\n getTenantId()?.toLowerCase() !== setBy\n ) {\n throw new TenantIsolationError(\n 'Only the parent that set a delegated policy can grant it credit.',\n );\n }\n if (\n input.grantedByTenantId &&\n setBy &&\n tenantKey(input.grantedByTenantId) !== setBy\n ) {\n throw new TenantIsolationError(\n 'Delegated policy credit must be granted by the parent that set it.',\n );\n }\n return this.recordGrant(policy, {\n ...input,\n grantedByTenantId: input.grantedByTenantId || setBy,\n });\n }\n\n private async recordGrant(\n policy: SpendingPolicy,\n input: GrantCreditInput,\n ): Promise<CreditGrant> {\n if (policy.period !== 'balance') {\n throw new ResellerBillingError(\n `Spending policy '${policy.name}' is not a balance policy.`,\n 'POLICY_NOT_BALANCE',\n );\n }\n if (!Number.isSafeInteger(input.amount) || input.amount === 0) {\n throw new ResellerBillingError(\n `Credit amount must be a nonzero integer number of minor units — got ${input.amount}.`,\n 'INVALID_AMOUNT',\n );\n }\n const { credits } = await this.getLedgers();\n const source = input.source ?? '';\n const sourceId = input.sourceId ?? '';\n const id =\n source && sourceId\n ? await deterministicUuid([\n 'credit-grant',\n String(policy.tenantId),\n String(policy.id),\n source,\n sourceId,\n ])\n : undefined;\n if (id) {\n const existing = await credits.get(id);\n if (existing) return existing;\n }\n try {\n return await credits.create({\n ...(id ? { id } : {}),\n tenantId: policy.tenantId,\n spendingPolicyId: String(policy.id),\n amount: input.amount,\n currency: policy.currency,\n reason: input.reason ?? '',\n source,\n sourceId,\n grantedByTenantId: input.grantedByTenantId ?? '',\n _insertOnly: Boolean(id),\n });\n } catch (error) {\n const concurrent = id ? await credits.get(id) : undefined;\n if (concurrent) return concurrent;\n throw error;\n }\n }\n\n private async evaluatePolicy(\n policy: SpendingPolicy,\n input: SpendingEvaluationInput,\n at: Date,\n ): Promise<SpendingDecision> {\n const estimatedAmount =\n input.estimatedAmounts?.[policy.basis] ?? input.estimatedAmount;\n const [start, end] = policyWindow(policy, at);\n const spent = await this.spentFor(policy, input.tenantId, start, end);\n if (policy.period !== 'balance') {\n return decide(policy, spent + estimatedAmount, policy.limitAmount);\n }\n let credit = await this.creditFor(policy);\n const projectedAmount = spent + estimatedAmount;\n const policyId = policy.id;\n if (projectedAmount > credit && this.extensions.autoTopUp && policyId) {\n const grant = await this.extensions.autoTopUp({\n policyId,\n tenantId: String(policy.tenantId),\n setByTenantId: tenantKey(policy.setByTenantId),\n currency: policy.currency,\n balanceAmount: credit - spent,\n estimatedAmount,\n shortfall: projectedAmount - credit,\n currentShortfall: async () =>\n (await this.spentFor(policy, input.tenantId, start, end)) +\n estimatedAmount -\n (await this.creditFor(policy)),\n });\n if (grant) {\n // The hook is host code configured on this evaluator; its grant is\n // recorded with the policy's own grantor even when evaluation runs in\n // the constrained child's tenant context.\n await withSystemContext(() =>\n this.recordGrant(policy, {\n spendingPolicyId: policyId,\n amount: grant.amount,\n reason: grant.reason ?? 'auto top-up',\n source: grant.source ?? 'auto_top_up',\n sourceId: grant.sourceId,\n grantedByTenantId: tenantKey(policy.setByTenantId),\n }),\n );\n }\n // Re-read either way: a concurrent top-up may have landed.\n credit = await this.creditFor(policy);\n }\n return {\n ...decide(policy, projectedAmount, credit),\n balanceAmount: credit - spent,\n };\n }\n\n /** Approved spend in the policy's window, currency, scope, and basis. */\n private async spentFor(\n policy: SpendingPolicy,\n tenantId: string,\n start: Date,\n end: Date,\n ): Promise<number> {\n const scope: Record<string, unknown> = {\n currency: policy.currency,\n 'approvedAt >=': start.toISOString(),\n 'approvedAt <': end.toISOString(),\n };\n if (policy.metricKey) scope.metricKey = policy.metricKey;\n if (policy.projectId) scope.projectId = policy.projectId;\n if (policy.serviceKey) scope.serviceKey = policy.serviceKey;\n if (policy.subscriberKind) scope.subscriberKind = policy.subscriberKind;\n if (policy.subscriberExternalId)\n scope.subscriberExternalId = policy.subscriberExternalId;\n\n const setBy = tenantKey(policy.setByTenantId);\n if (policy.basis === 'retail') {\n const { retailCharges } = await this.getLedgers();\n const where: Record<string, unknown> = {\n ...scope,\n tenantId,\n status: 'approved',\n };\n // A parent's cap counts only what the child owes that parent.\n if (setBy) where.resellerTenantId = setBy;\n const rows = await retailCharges.list({ where });\n return sumScoped(\n policy,\n rows.filter(\n (row) => !setBy || tenantKey(row.resellerTenantId) === setBy,\n ),\n ['approved'],\n );\n }\n\n if (policy.basis === 'wholesale') {\n if (!setBy) return 0;\n // Reviewed cross-tenant read: the parent's provider charges for this\n // child's usage, bounded to (payer = setBy, usageTenantId = tenant) and\n // reduced to a sum, so a child-context evaluation can enforce its\n // parent's wholesale cap without reading the parent's other rows.\n return withSystemContext(() =>\n this.sumProviderCharges(policy, scope, setBy, tenantId),\n );\n }\n return this.sumProviderCharges(policy, scope, tenantId);\n }\n\n private async sumProviderCharges(\n policy: SpendingPolicy,\n scope: Record<string, unknown>,\n payer: string,\n usageTenantId?: string,\n ): Promise<number> {\n const where: Record<string, unknown> = {\n ...scope,\n tenantId: payer,\n status: ['approved', 'adjusted'],\n };\n if (usageTenantId) where.usageTenantId = usageTenantId;\n const rows = await this.charges.list({ where });\n const scopedCharges = rows.filter(\n (charge) =>\n (!usageTenantId ||\n tenantKey(charge.usageTenantId) === tenantKey(usageTenantId)) &&\n (charge.status === 'approved' || charge.status === 'adjusted') &&\n matchesChargeScope(policy, charge),\n );\n const chargeIds = scopedCharges\n .map((charge) => charge.id)\n .filter((id): id is string => Boolean(id));\n const chargeIdSet = new Set(chargeIds);\n const adjustmentRows =\n chargeIds.length > 0\n ? await this.adjustments.list({\n where: {\n tenantId: payer,\n currency: policy.currency,\n clientChargeId: chargeIds,\n },\n })\n : [];\n const spent = scopedCharges.reduce((sum, charge) => sum + charge.amount, 0);\n return (\n spent +\n adjustmentRows\n .filter((adjustment) => chargeIdSet.has(adjustment.clientChargeId))\n .reduce((sum, adjustment) => sum + adjustment.amount, 0)\n );\n }\n\n private async creditFor(policy: SpendingPolicy): Promise<number> {\n const { credits } = await this.getLedgers();\n const grants = await credits.list({\n where: {\n tenantId: policy.tenantId,\n spendingPolicyId: policy.id,\n currency: policy.currency,\n },\n });\n // A delegated balance holds only credit its current parent granted: when\n // a new parent takes over the policy, a former parent's grants stay with\n // that former relationship instead of funding the new one.\n const setBy = tenantKey(policy.setByTenantId);\n return grants\n .filter(\n (grant) =>\n grant.spendingPolicyId === policy.id &&\n (!setBy || tenantKey(grant.grantedByTenantId) === setBy),\n )\n .reduce((sum, grant) => sum + grant.amount, 0);\n }\n\n private getLedgers(): Promise<{\n retailCharges: RetailChargeCollection;\n credits: CreditGrantCollection;\n }> {\n this.ledgers ??= (async () => {\n const options = { db: this.policies.db };\n return {\n retailCharges:\n this.extensions.retailCharges ??\n (await RetailChargeCollection.create(options)),\n credits:\n this.extensions.credits ??\n (await CreditGrantCollection.create(options)),\n };\n })();\n this.ledgers.catch(() => {\n this.ledgers = undefined;\n });\n return this.ledgers;\n }\n}\n\nfunction decide(\n policy: SpendingPolicy,\n projectedAmount: number,\n limitAmount: number,\n): SpendingDecision {\n const exceeded = projectedAmount > limitAmount;\n const matchedPolicyId = policy.id ?? null;\n if (!exceeded || policy.behavior === 'observe')\n return {\n allowed: true,\n approvalRequired: false,\n state: exceeded ? 'observed' : 'ok',\n projectedAmount,\n matchedPolicyId,\n };\n if (policy.behavior === 'warn')\n return {\n allowed: true,\n approvalRequired: false,\n state: 'warned',\n projectedAmount,\n matchedPolicyId,\n };\n if (policy.behavior === 'approval_required')\n return {\n allowed: false,\n approvalRequired: true,\n state: 'approval_required',\n projectedAmount,\n matchedPolicyId,\n };\n return {\n allowed: false,\n approvalRequired: false,\n state: 'blocked',\n projectedAmount,\n matchedPolicyId,\n };\n}\n\nfunction sumScoped(\n policy: SpendingPolicy,\n rows: LedgerRow[],\n statuses: string[],\n): number {\n return rows\n .filter(\n (row) => statuses.includes(row.status) && matchesChargeScope(policy, row),\n )\n .reduce((sum, row) => sum + row.amount, 0);\n}\n\n/**\n * The provider leg must be priced by someone other than the payer: a reseller\n * (or its child) never publishes the wholesale book it is charged from.\n */\nexport function assertWholesalePublisher(\n book: PriceBook,\n resellerTenantId: string,\n childTenantId: string,\n): void {\n const publisher = tenantKey(book.tenantId);\n if (publisher === resellerTenantId || publisher === childTenantId) {\n throw new ResellerBillingError(\n `Wholesale price book '${book.bookKey}' is published by the tenant it would charge.`,\n 'PRICE_BOOK_OWNER_MISMATCH',\n );\n }\n}\n\nasync function loadBook(\n books: PriceBookCollection,\n id: string,\n kind: PriceBookKind,\n): Promise<PriceBook> {\n const book = await books.get(id);\n if (!book?.id) {\n throw new ResellerBillingError(\n `Price book ${id} was not found.`,\n 'PRICE_BOOK_NOT_FOUND',\n );\n }\n if (book.kind !== kind) {\n throw new ResellerBillingError(\n `Price book '${book.bookKey}' is a ${book.kind} book, not ${kind}.`,\n 'PRICE_BOOK_KIND_MISMATCH',\n );\n }\n if (!book.active) {\n throw new ResellerBillingError(\n `Price book '${book.bookKey}' is inactive.`,\n 'PRICE_BOOK_INACTIVE',\n );\n }\n return book;\n}\n\nfunction selectRule(\n rules: PricingRule[],\n at: Date,\n serviceKey: string,\n): PricingRule | undefined {\n return rules\n .filter(\n (rule) =>\n rule.effectiveFrom <= at &&\n (!rule.effectiveTo || rule.effectiveTo > at) &&\n (!rule.serviceKey || rule.serviceKey === serviceKey),\n )\n .sort(\n (a, b) =>\n Number(Boolean(b.serviceKey)) - Number(Boolean(a.serviceKey)) ||\n b.priority - a.priority ||\n b.effectiveFrom.getTime() - a.effectiveFrom.getTime(),\n )[0];\n}\nfunction priceTiers(quantity: number, tiers: unknown[]): number {\n let remaining = quantity,\n prior = 0,\n amount = 0;\n for (const raw of tiers as Array<Record<string, unknown>>) {\n const upTo = raw.upTo == null ? Infinity : Number(raw.upTo);\n const units = Math.max(0, Math.min(remaining, upTo - prior));\n amount += units * Number(raw.unitPrice ?? 0);\n remaining -= units;\n prior = upTo;\n if (remaining <= 0) break;\n }\n return amount;\n}\nfunction selectPolicies(\n policies: SpendingPolicy[],\n input: Record<string, unknown>,\n): SpendingPolicy[] {\n return policies\n .filter(\n (p) =>\n hasValidSubscriberScope(p) &&\n (!p.metricKey || p.metricKey === input.metricKey) &&\n p.currency === input.currency &&\n (!p.projectId || p.projectId === input.projectId) &&\n (!p.serviceKey || p.serviceKey === input.serviceKey) &&\n (!p.subscriberKind ||\n (p.subscriberKind === (input.subscriberKind ?? 'tenant') &&\n (!p.subscriberExternalId ||\n p.subscriberExternalId === input.subscriberExternalId))),\n )\n .sort((a, b) => scopeScore(b) - scopeScore(a) || b.priority - a.priority);\n}\n\nfunction decisionRank(decision: SpendingDecision): number {\n return {\n ok: 0,\n observed: 1,\n warned: 2,\n approval_required: 3,\n blocked: 4,\n }[decision.state];\n}\nfunction scopeScore(p: SpendingPolicy): number {\n return (\n Number(Boolean(p.subscriberKind)) +\n Number(Boolean(p.subscriberExternalId)) +\n Number(Boolean(p.projectId)) +\n Number(Boolean(p.serviceKey)) +\n Number(Boolean(p.metricKey))\n );\n}\nfunction matchesChargeScope(p: SpendingPolicy, c: LedgerRow): boolean {\n return (\n hasValidSubscriberScope(p) &&\n (!p.projectId || p.projectId === c.projectId) &&\n (!p.serviceKey || p.serviceKey === c.serviceKey) &&\n (!p.metricKey || p.metricKey === c.metricKey) &&\n (!p.subscriberKind ||\n (p.subscriberKind === c.subscriberKind &&\n (!p.subscriberExternalId ||\n p.subscriberExternalId === c.subscriberExternalId)))\n );\n}\nfunction hasValidSubscriberScope(p: SpendingPolicy): boolean {\n return !p.subscriberExternalId || Boolean(p.subscriberKind);\n}\nfunction policyWindow(policy: SpendingPolicy, at: Date): [Date, Date] {\n const end = new Date(at);\n const start = new Date(at);\n if (policy.period === 'balance')\n start.setTime(\n new Date(policy.balanceFrom ?? policy.created_at ?? 0).getTime(),\n );\n else if (policy.period === 'rolling')\n start.setTime(at.getTime() - policy.rollingSeconds * 1000);\n else if (policy.period === 'day') start.setUTCHours(0, 0, 0, 0);\n else if (policy.period === 'week') {\n start.setUTCHours(0, 0, 0, 0);\n start.setUTCDate(start.getUTCDate() - ((start.getUTCDay() + 6) % 7));\n } else if (policy.period === 'month') {\n start.setUTCDate(1);\n start.setUTCHours(0, 0, 0, 0);\n } else {\n start.setUTCMonth(0, 1);\n start.setUTCHours(0, 0, 0, 0);\n }\n return [start, end];\n}\n","/**\n * Reseller price books and parent-delegated spending (#3059).\n *\n * Billing ownership comes from the released smrt-tenancy\n * `BillingRelationshipService`; this service never re-derives it. Rating lives\n * on `CommercialUsageService.rateUsage()`, enforcement on\n * `SpendingPolicyEvaluator` — this service manages the records they read.\n */\nimport {\n isEmbeddedDatabase,\n isPostgresDatabase,\n type SmrtClassOptions,\n withEmbeddedWriteTransaction,\n} from '@happyvertical/smrt-core';\nimport {\n type BillingRelationshipView,\n getTenantId,\n isSuperAdminBypass,\n isSystemContext,\n TenantIsolationError,\n withSystemContext,\n} from '@happyvertical/smrt-tenancy';\nimport {\n BillingAdjustmentCollection,\n ClientChargeCollection,\n type PricingRule,\n PricingRuleCollection,\n type PricingStrategy,\n type SpendingBasis,\n type SpendingPeriod,\n type SpendingPolicy,\n type SpendingPolicyBehavior,\n SpendingPolicyCollection,\n} from '../models/commercial.js';\nimport {\n type CreditGrant,\n CreditGrantCollection,\n isCurrencyCode,\n type PriceBook,\n type PriceBookAssignment,\n PriceBookAssignmentCollection,\n PriceBookCollection,\n type PriceBookKind,\n RetailChargeCollection,\n} from '../models/reseller.js';\nimport type { SubscriberKind } from '../types.js';\nimport { deterministicUuid, tenantKey } from '../utils.js';\nimport {\n assertWholesalePublisher,\n type BillingRelationshipReader,\n SpendingPolicyEvaluator,\n} from './commercial.js';\nimport { ResellerBillingError } from './reseller-errors.js';\n\nexport type ResellerBillingAction =\n | 'define_prices'\n | 'assign_wholesale_price_book'\n | 'assign_retail_price_book'\n | 'manage_child_spending';\n\nexport interface ResellerBillingServiceOptions extends SmrtClassOptions {\n /** The released smrt-tenancy billing relationship reader. */\n billingRelationships: BillingRelationshipReader;\n /**\n * Optional host permission check. Without it, only a system context or a\n * super-admin bypass may mutate reseller billing records, mirroring\n * `BillingRelationshipService`. Once it (or the context) authorizes a call,\n * the service performs that call's writes in a system context, because\n * they span tenants (a parent writes rows owned by its child).\n */\n authorize?: (request: {\n action: ResellerBillingAction;\n /**\n * The tenant whose authority the action exercises: the book's seller for\n * `define_prices` and `assign_wholesale_price_book`, the parent for\n * `assign_retail_price_book` and `manage_child_spending`.\n */\n tenantId: string;\n childTenantId?: string;\n /**\n * For price-book assignments and child spending: the child's current\n * reseller, which pays the wholesale leg. A host must confirm the caller\n * holds `tenantId`'s authority and, for `assign_wholesale_price_book`,\n * that the publisher is a legitimate provider for this reseller — the\n * package can refuse only a payer-published book.\n */\n resellerTenantId?: string;\n }) => Promise<boolean>;\n}\n\nexport interface DefinePriceBookPriceInput {\n priceBookId: string;\n ruleKey: string;\n metricKey: string;\n serviceKey?: string;\n strategy: PricingStrategy;\n effectiveFrom?: Date;\n effectiveTo?: Date | null;\n priority?: number;\n /**\n * One entry per currency. Terms use the same *minor units per unit of usage*\n * convention as any `PricingRule` (#2401).\n */\n prices: Array<{ currency: string; terms: Record<string, unknown> }>;\n}\n\nexport interface PriceBookLeg {\n priceBookId: string;\n /** Currency the leg is charged in; the book needs a price in it. */\n currency: string;\n}\n\nexport interface AssignPriceBooksInput {\n childTenantId: string;\n /** `undefined` keeps the current leg; `null` clears it. */\n wholesale?: PriceBookLeg | null;\n retail?: PriceBookLeg | null;\n}\n\nexport interface PriceBookAssignmentView {\n childTenantId: string;\n resellerTenantId: string;\n wholesale: PriceBookLeg | null;\n retail: PriceBookLeg | null;\n}\n\nexport interface DelegatedSpendingPolicyInput {\n parentTenantId: string;\n childTenantId: string;\n name: string;\n basis: SpendingBasis;\n currency: string;\n behavior: SpendingPolicyBehavior;\n period?: SpendingPeriod;\n rollingSeconds?: number;\n /** Integer minor units; must be 0 (the default) for a `balance` policy. */\n limitAmount?: number;\n metricKey?: string;\n serviceKey?: string;\n projectId?: string;\n subscriberKind?: SubscriberKind | '';\n subscriberExternalId?: string;\n priority?: number;\n active?: boolean;\n balanceFrom?: Date;\n}\n\nexport interface GrantChildCreditInput {\n parentTenantId: string;\n childTenantId: string;\n spendingPolicyId: string;\n /** Signed, nonzero integer minor units of the policy currency. */\n amount: number;\n reason?: string;\n source?: string;\n sourceId?: string;\n}\n\nconst UUID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction canonicalTenantId(id: string): string {\n if (typeof id !== 'string' || !UUID_PATTERN.test(id)) {\n throw new ResellerBillingError(\n 'Tenant IDs must be UUIDs.',\n 'INVALID_TENANT',\n );\n }\n return id.toLowerCase();\n}\n\nfunction assertCurrency(currency: string): void {\n if (!isCurrencyCode(currency)) {\n throw new ResellerBillingError(\n `Currency '${currency}' must be a three-letter upper-case code.`,\n 'INVALID_CURRENCY',\n );\n }\n}\n\nfunction legView(\n priceBookId: string | null | undefined,\n currency: string,\n): PriceBookLeg | null {\n return priceBookId ? { priceBookId: String(priceBookId), currency } : null;\n}\n\nfunction assignmentView(row: PriceBookAssignment): PriceBookAssignmentView {\n return {\n childTenantId: tenantKey(row.childTenantId),\n resellerTenantId: tenantKey(row.resellerTenantId),\n wholesale: legView(row.wholesalePriceBookId, row.wholesaleCurrency),\n retail: legView(row.retailPriceBookId, row.retailCurrency),\n };\n}\n\n/**\n * Run an already-authorized operation in a system context. Only called after\n * `assertManage()` (or for a book metadata read that precedes it).\n */\nfunction authorized<T>(operation: () => Promise<T>): Promise<T> {\n return withSystemContext(operation);\n}\n\n/**\n * Manages price books, their per-relationship assignment, and the spending\n * policies and credits a parent tenant sets on its children.\n */\nexport class ResellerBillingService {\n private constructor(\n private readonly options: ResellerBillingServiceOptions,\n private readonly books: PriceBookCollection,\n private readonly assignments: PriceBookAssignmentCollection,\n private readonly rules: PricingRuleCollection,\n private readonly policies: SpendingPolicyCollection,\n private readonly evaluator: SpendingPolicyEvaluator,\n ) {}\n\n static async create(\n options: ResellerBillingServiceOptions,\n ): Promise<ResellerBillingService> {\n if (typeof options.billingRelationships?.getRelationship !== 'function') {\n throw new Error(\n 'Reseller billing requires a billingRelationships reader from smrt-tenancy.',\n );\n }\n const {\n billingRelationships: _reader,\n authorize: _authorize,\n ...rest\n } = options;\n const books = await PriceBookCollection.create(rest);\n const shared = { ...rest, db: books.db };\n const policies = await SpendingPolicyCollection.create(shared);\n const evaluator = new SpendingPolicyEvaluator(\n policies,\n await ClientChargeCollection.create(shared),\n await BillingAdjustmentCollection.create(shared),\n {\n retailCharges: await RetailChargeCollection.create(shared),\n credits: await CreditGrantCollection.create(shared),\n },\n );\n return new ResellerBillingService(\n options,\n books,\n await PriceBookAssignmentCollection.create(shared),\n await PricingRuleCollection.create(shared),\n policies,\n evaluator,\n );\n }\n\n /**\n * Publish one price in a book, in one or more currencies. Each currency is\n * a `PricingRule` owned by the book's seller; re-defining the same rule key,\n * currency, and effective date replaces that rule's terms.\n */\n async definePrice(input: DefinePriceBookPriceInput): Promise<PricingRule[]> {\n const book = await this.readBook(input.priceBookId);\n const sellerTenantId = canonicalTenantId(String(book.tenantId));\n await this.assertManage('define_prices', sellerTenantId, undefined, true);\n if (!input.ruleKey.trim() || !input.metricKey.trim()) {\n throw new Error('Price book prices require a ruleKey and metricKey.');\n }\n if (input.prices.length === 0) {\n throw new ResellerBillingError(\n 'A price needs at least one currency.',\n 'INVALID_CURRENCY',\n );\n }\n const currencies = new Set<string>();\n for (const { currency } of input.prices) {\n assertCurrency(currency);\n if (currencies.has(currency)) {\n throw new ResellerBillingError(\n `Currency ${currency} is listed twice for one price.`,\n 'INVALID_CURRENCY',\n );\n }\n currencies.add(currency);\n }\n const effectiveFrom = input.effectiveFrom ?? new Date();\n return authorized(async () => {\n const saved: PricingRule[] = [];\n for (const { currency, terms } of input.prices) {\n const id = await deterministicUuid([\n 'price-book-rule',\n String(book.id),\n input.ruleKey,\n input.metricKey,\n input.serviceKey ?? '',\n currency,\n effectiveFrom.toISOString(),\n ]);\n const values = {\n tenantId: book.tenantId,\n priceBookId: String(book.id),\n ruleKey: input.ruleKey,\n metricKey: input.metricKey,\n serviceKey: input.serviceKey ?? '',\n strategy: input.strategy,\n currency,\n effectiveFrom,\n effectiveTo: input.effectiveTo ?? null,\n priority: input.priority ?? 0,\n terms: JSON.stringify(terms),\n active: true,\n };\n const existing = await this.rules.get(id);\n if (existing) {\n Object.assign(existing, values);\n await existing.save();\n saved.push(existing);\n } else {\n saved.push(await this.rules.create({ id, ...values }));\n }\n }\n return saved;\n });\n }\n\n /**\n * Select the wholesale and/or retail book that rates a child's usage under\n * its current reseller relationship. The retail book must be published by\n * that reseller; the wholesale book must be published by someone other\n * than the reseller or child it charges. Each leg is authorized separately:\n * the wholesale leg by its publisher (`assign_wholesale_price_book`), the\n * retail leg by the reseller (`assign_retail_price_book`).\n */\n async assignPriceBooks(\n input: AssignPriceBooksInput,\n ): Promise<PriceBookAssignmentView> {\n const relationship = await this.requireRelationship(input.childTenantId);\n const { childTenantId, resellerTenantId } = relationship;\n const existing = await authorized(() =>\n this.assignments.get({ childTenantId }),\n );\n // An assignment made under a previous reseller does not carry over.\n const current =\n existing && tenantKey(existing.resellerTenantId) === resellerTenantId\n ? assignmentView(existing)\n : null;\n\n if (input.wholesale !== undefined) {\n let publisher = resellerTenantId;\n if (input.wholesale) {\n const book = await this.requireLeg(input.wholesale, 'wholesale');\n assertWholesalePublisher(book, resellerTenantId, childTenantId);\n publisher = tenantKey(book.tenantId);\n } else if (current?.wholesale) {\n publisher = tenantKey(\n (await this.readBook(current.wholesale.priceBookId)).tenantId,\n );\n }\n await this.assertManage(\n 'assign_wholesale_price_book',\n publisher,\n childTenantId,\n false,\n resellerTenantId,\n );\n }\n if (input.retail) {\n const book = await this.requireLeg(input.retail, 'retail');\n if (tenantKey(book.tenantId) !== resellerTenantId) {\n throw new ResellerBillingError(\n `Retail price book '${book.bookKey}' is not published by the child's reseller.`,\n 'PRICE_BOOK_OWNER_MISMATCH',\n );\n }\n }\n if (input.retail !== undefined || input.wholesale === undefined) {\n await this.assertManage(\n 'assign_retail_price_book',\n resellerTenantId,\n childTenantId,\n false,\n resellerTenantId,\n );\n }\n\n // Read-merge-write under one lock so concurrent single-leg updates\n // cannot overwrite each other's leg.\n const db = this.assignments.db;\n return authorized(() =>\n withEmbeddedWriteTransaction(\n db,\n isEmbeddedDatabase(db),\n async (transaction) => {\n if (isPostgresDatabase(transaction)) {\n await transaction.query(\n \"SELECT pg_advisory_xact_lock(hashtext('smrt-price-book-assignments'))\",\n );\n }\n const assignments = await PriceBookAssignmentCollection.create({\n db: transaction,\n });\n const row = await assignments.get({ childTenantId });\n const fresh =\n row && tenantKey(row.resellerTenantId) === resellerTenantId\n ? assignmentView(row)\n : null;\n if (\n input.wholesale === null &&\n fresh?.wholesale?.priceBookId !== current?.wholesale?.priceBookId\n ) {\n // The clear was authorized against a different wholesale book.\n throw new ResellerBillingError(\n 'The wholesale assignment changed concurrently; retry.',\n 'ASSIGNMENT_CONFLICT',\n );\n }\n const wholesale =\n input.wholesale === undefined\n ? (fresh?.wholesale ?? null)\n : input.wholesale;\n const retail =\n input.retail === undefined ? (fresh?.retail ?? null) : input.retail;\n const values = {\n childTenantId,\n resellerTenantId,\n wholesalePriceBookId: wholesale?.priceBookId ?? '',\n wholesaleCurrency: wholesale?.currency ?? '',\n retailPriceBookId: retail?.priceBookId ?? '',\n retailCurrency: retail?.currency ?? '',\n };\n if (row) {\n Object.assign(row, values);\n await row.save();\n return assignmentView(row);\n }\n return assignmentView(await assignments.create(values));\n },\n ),\n );\n }\n\n /** The child's assignment under its current reseller, if any. */\n async getPriceBookAssignment(\n childTenantId: string,\n ): Promise<PriceBookAssignmentView | null> {\n const relationship =\n await this.options.billingRelationships.getRelationship(\n canonicalTenantId(childTenantId),\n );\n if (!relationship) return null;\n const row = await this.assignments.get({\n childTenantId: relationship.childTenantId,\n });\n if (\n !row ||\n tenantKey(row.resellerTenantId) !== relationship.resellerTenantId\n ) {\n return null;\n }\n return assignmentView(row);\n }\n\n /**\n * Create or replace a spending policy that a parent sets on its child. The\n * row belongs to the child (so the ordinary evaluator enforces it for the\n * child) and records the parent in `setByTenantId`, which locks it against\n * changes by the child. A delegated limit left by a former parent may be\n * replaced (not a former parent's prepaid balance, which keeps its credit\n * ledger); one the child set for itself may not. Use `period: 'balance'`\n * for a prepaid credit balance and fund it with {@link grantChildCredit}.\n */\n async setDelegatedSpendingPolicy(\n input: DelegatedSpendingPolicyInput,\n ): Promise<SpendingPolicy> {\n const parentTenantId = canonicalTenantId(input.parentTenantId);\n const relationship = await this.requireChildOf(\n input.childTenantId,\n parentTenantId,\n );\n await this.assertManage(\n 'manage_child_spending',\n parentTenantId,\n relationship.childTenantId,\n false,\n relationship.resellerTenantId,\n );\n assertCurrency(input.currency);\n if (\n input.limitAmount !== undefined &&\n !Number.isSafeInteger(input.limitAmount)\n ) {\n throw new ResellerBillingError(\n `Spending limits must be integer minor units — got ${input.limitAmount}.`,\n 'INVALID_AMOUNT',\n );\n }\n const values = {\n tenantId: relationship.childTenantId,\n name: input.name,\n subscriberKind: input.subscriberKind ?? '',\n subscriberExternalId: input.subscriberExternalId ?? '',\n projectId: input.projectId ?? '',\n serviceKey: input.serviceKey ?? '',\n metricKey: input.metricKey ?? '',\n period: input.period ?? 'month',\n rollingSeconds: input.rollingSeconds ?? 0,\n limitAmount: input.limitAmount ?? 0,\n currency: input.currency,\n behavior: input.behavior,\n priority: input.priority ?? 0,\n active: input.active ?? true,\n basis: input.basis,\n setByTenantId: parentTenantId,\n ...(input.balanceFrom ? { balanceFrom: input.balanceFrom } : {}),\n };\n // Authorized above; the row belongs to the child, so write it outside\n // the parent's own tenant scope.\n return authorized(async () => {\n const existing = (\n await this.policies.list({\n where: {\n tenantId: values.tenantId,\n subscriberKind: values.subscriberKind,\n subscriberExternalId: values.subscriberExternalId,\n projectId: values.projectId,\n serviceKey: values.serviceKey,\n metricKey: values.metricKey,\n period: values.period,\n name: values.name,\n },\n limit: 1,\n })\n )[0];\n if (existing) {\n const owner = tenantKey(existing.setByTenantId);\n if (!owner) {\n throw new ResellerBillingError(\n `Spending policy '${input.name}' already exists for this child and was set by the child.`,\n 'POLICY_CONFLICT',\n );\n }\n // A former parent's prepaid balance keeps its credit ledger: taking\n // it over would strand that credit (or revive it if the child\n // returns), so the new parent must use a different name.\n if (owner !== parentTenantId && existing.period === 'balance') {\n throw new ResellerBillingError(\n `Balance policy '${input.name}' belongs to a former parent; choose another name.`,\n 'POLICY_CONFLICT',\n );\n }\n Object.assign(existing, values);\n await existing.save();\n return existing;\n }\n return this.policies.create(values);\n });\n }\n\n /** Credit a prepaid balance policy the parent set on its child. */\n async grantChildCredit(input: GrantChildCreditInput): Promise<CreditGrant> {\n const parentTenantId = canonicalTenantId(input.parentTenantId);\n const relationship = await this.requireChildOf(\n input.childTenantId,\n parentTenantId,\n );\n await this.assertManage(\n 'manage_child_spending',\n parentTenantId,\n relationship.childTenantId,\n false,\n relationship.resellerTenantId,\n );\n return authorized(async () => {\n const policy = await this.policies.get(input.spendingPolicyId);\n if (\n !policy ||\n tenantKey(policy.tenantId) !== relationship.childTenantId ||\n tenantKey(policy.setByTenantId) !== parentTenantId\n ) {\n throw new ResellerBillingError(\n `Spending policy ${input.spendingPolicyId} is not a policy this parent set on the child.`,\n 'POLICY_NOT_FOUND',\n );\n }\n return this.evaluator.grantCredit({\n spendingPolicyId: input.spendingPolicyId,\n amount: input.amount,\n reason: input.reason,\n source: input.source,\n sourceId: input.sourceId,\n grantedByTenantId: parentTenantId,\n });\n });\n }\n\n private async requireRelationship(\n childTenantId: string,\n ): Promise<BillingRelationshipView> {\n const relationship =\n await this.options.billingRelationships.getRelationship(\n canonicalTenantId(childTenantId),\n );\n if (!relationship) {\n throw new ResellerBillingError(\n `Tenant ${childTenantId} has no reseller relationship.`,\n 'RELATIONSHIP_REQUIRED',\n );\n }\n return relationship;\n }\n\n private async requireChildOf(\n childTenantId: string,\n parentTenantId: string,\n ): Promise<BillingRelationshipView> {\n const relationship = await this.requireRelationship(childTenantId);\n if (relationship.resellerTenantId !== parentTenantId) {\n throw new ResellerBillingError(\n `Tenant ${childTenantId} is not a child of ${parentTenantId}.`,\n 'RELATIONSHIP_REQUIRED',\n );\n }\n return relationship;\n }\n\n /**\n * Read a book's metadata to learn its publisher and kind before deciding\n * authorization. Books belong to their seller, so the read is not scoped to\n * the caller; nothing beyond a validation error is returned on denial.\n */\n private async readBook(id: string): Promise<PriceBook> {\n const book = await authorized(() => this.books.get(id));\n if (!book?.id) {\n throw new ResellerBillingError(\n `Price book ${id} was not found.`,\n 'PRICE_BOOK_NOT_FOUND',\n );\n }\n return book;\n }\n\n private async requireLeg(\n leg: PriceBookLeg,\n kind: PriceBookKind,\n ): Promise<PriceBook> {\n assertCurrency(leg.currency);\n const book = await this.readBook(leg.priceBookId);\n if (book.kind !== kind) {\n throw new ResellerBillingError(\n `Price book '${book.bookKey}' is a ${book.kind} book, not ${kind}.`,\n 'PRICE_BOOK_KIND_MISMATCH',\n );\n }\n return book;\n }\n\n private async assertManage(\n action: ResellerBillingAction,\n tenantId: string,\n childTenantId?: string,\n allowOwnTenant = false,\n resellerTenantId?: string,\n ): Promise<void> {\n if (\n isSystemContext() ||\n isSuperAdminBypass() ||\n (allowOwnTenant && getTenantId()?.toLowerCase() === tenantId) ||\n (await this.options.authorize?.({\n action,\n tenantId,\n childTenantId,\n ...(resellerTenantId ? { resellerTenantId } : {}),\n }))\n ) {\n return;\n }\n throw new TenantIsolationError('Reseller billing mutation denied.');\n }\n}\n","import type {\n PlanThreshold,\n ThresholdEvaluation,\n UsageSummary,\n} from '../types.js';\n\nexport function evaluateThreshold(\n threshold: PlanThreshold,\n usage: UsageSummary,\n): ThresholdEvaluation {\n const ratio =\n threshold.limit === 0\n ? usage.quantity > 0\n ? Infinity\n : 0\n : usage.quantity / threshold.limit;\n const warningRatio = threshold.warningRatio ?? 0.8;\n const blocked =\n threshold.enforcement === 'block' &&\n (threshold.limit === 0\n ? usage.quantity > 0\n : usage.quantity >= threshold.limit);\n const warned = !blocked && ratio >= warningRatio;\n\n return {\n threshold,\n usage,\n ratio,\n state: blocked ? 'blocked' : warned ? 'warn' : 'ok',\n allowed: !blocked,\n remaining: Math.max(0, threshold.limit - usage.quantity),\n };\n}\n\nexport function evaluateThresholds(\n thresholds: PlanThreshold[],\n usage: UsageSummary[],\n): ThresholdEvaluation[] {\n const usageByMetric = new Map(\n usage.map((summary) => [summary.metricKey, summary]),\n );\n\n return thresholds.map((threshold) => {\n const summary =\n usageByMetric.get(threshold.metricKey) ??\n emptyUsageSummary(threshold.metricKey);\n return evaluateThreshold(threshold, summary);\n });\n}\n\nfunction emptyUsageSummary(metricKey: string): UsageSummary {\n const now = new Date();\n return {\n tenantId: '',\n metricKey,\n quantity: 0,\n windowStart: now,\n windowEnd: now,\n };\n}\n","import type { SmrtClassOptions } from '@happyvertical/smrt-core';\nimport { TenantUsageMetricCollection } from '../collections/TenantUsageMetricCollection.js';\nimport type {\n AiUsageSummary,\n RecordUsageOptions,\n SummarizeAiUsageOptions,\n SummarizeUsageBatchOptions,\n SummarizeUsageOptions,\n UsageSummary,\n} from '../types.js';\nimport { normalizeSubscriber } from '../utils.js';\n\nexport class TenantUsageMeter {\n constructor(\n private readonly metrics: TenantUsageMetricCollection,\n private readonly classOptions: SmrtClassOptions = {},\n ) {}\n\n static async create(\n classOptions: SmrtClassOptions = {},\n ): Promise<TenantUsageMeter> {\n const metrics = await TenantUsageMetricCollection.create(classOptions);\n return new TenantUsageMeter(metrics, classOptions);\n }\n\n /**\n * Record one usage row.\n *\n * Accepts the polymorphic subscriber fields directly on the options object\n * (`subscriberKind`/`subscriberExternalId`); when omitted defaults to a\n * `'tenant'`-kind row keyed off `tenantId`. The collection layer enforces\n * the XOR invariant — passing `subscriberKind: 'external'` without a\n * non-empty `subscriberExternalId` throws.\n */\n async record(options: RecordUsageOptions): Promise<void> {\n await this.metrics.recordUsage(options);\n }\n\n /**\n * Summarize usage over a window for a given subscriber.\n *\n * The `ai.*` short-circuit only fires for `'tenant'`-kind subscribers since\n * the `_smrt_ai_usage` system table is tenant-scoped; external subscribers\n * fall through to the normal `_smrt_tenant_usage_metrics` aggregation.\n */\n async summarize(options: SummarizeUsageOptions): Promise<UsageSummary> {\n // Normalize at the boundary so the `ai.*` short-circuit and the standard\n // `summarizeUsage` path both refuse the same XOR violations (e.g. caller\n // passes subscriberExternalId without subscriberKind: 'external'). Without\n // this, the AI short-circuit would silently re-scope to tenant-wide\n // _smrt_ai_usage totals.\n normalizeSubscriber({\n tenantId: options.tenantId,\n subscriberKind: options.subscriberKind,\n subscriberExternalId: options.subscriberExternalId,\n });\n\n const aiSummary = await this.trySummarizeAiMetric(options);\n if (aiSummary) {\n return aiSummary;\n }\n\n return this.metrics.summarizeUsage(options);\n }\n\n async summarizeBatch(\n options: SummarizeUsageBatchOptions,\n ): Promise<UsageSummary[]> {\n const subscriber = normalizeSubscriber({\n tenantId: options.tenantId,\n subscriberKind: options.subscriberKind,\n subscriberExternalId: options.subscriberExternalId,\n });\n const metricKeys = Array.from(new Set(options.metricKeys));\n if (metricKeys.length === 0) {\n return [];\n }\n\n const useTenantAiSummary = subscriber.kind === 'tenant';\n const aiMetricKeys = useTenantAiSummary\n ? metricKeys.filter((metricKey) => metricKey.startsWith('ai.'))\n : [];\n const persistedMetricKeys = useTenantAiSummary\n ? metricKeys.filter((metricKey) => !metricKey.startsWith('ai.'))\n : metricKeys;\n\n const summaries = new Map<string, UsageSummary>();\n let fallbackAiMetricKeys: string[] = [];\n if (aiMetricKeys.length > 0) {\n if (!(await this.hasAiUsageTable())) {\n fallbackAiMetricKeys = aiMetricKeys;\n } else {\n try {\n const aiSummary = await this.summarizeAiUsage({\n tenantId: options.tenantId,\n window: options.window,\n });\n const quantityByMetric = aiQuantityByMetric(aiSummary);\n for (const metricKey of aiMetricKeys) {\n summaries.set(metricKey, {\n tenantId: options.tenantId,\n metricKey,\n quantity: quantityByMetric[metricKey] ?? 0,\n windowStart: options.window.start,\n windowEnd: options.window.end,\n });\n }\n } catch (error) {\n if (!isMissingAiUsageTableError(error)) {\n throw error;\n }\n fallbackAiMetricKeys = aiMetricKeys;\n }\n }\n }\n\n const persistedSummaries = await this.metrics.summarizeUsageBatch({\n ...options,\n metricKeys: [...persistedMetricKeys, ...fallbackAiMetricKeys],\n });\n for (const summary of persistedSummaries) {\n summaries.set(summary.metricKey, summary);\n }\n\n return metricKeys.map(\n (metricKey) =>\n summaries.get(metricKey) ??\n emptyUsageSummary(subscriber, metricKey, options.window),\n );\n }\n\n async summarizeAiUsage(\n options: SummarizeAiUsageOptions,\n ): Promise<AiUsageSummary> {\n return this.metrics.summarizeTenantAiUsage(options);\n }\n\n getOptions(): SmrtClassOptions {\n return this.classOptions;\n }\n\n private async trySummarizeAiMetric(\n options: SummarizeUsageOptions,\n ): Promise<UsageSummary | null> {\n if (!options.metricKey.startsWith('ai.')) {\n return null;\n }\n // _smrt_ai_usage is tenant-scoped only; external subscribers must use the\n // standard usage path. Skip the short-circuit so the caller's recorded\n // usage rows are summed instead.\n const kind = options.subscriberKind ?? 'tenant';\n if (kind !== 'tenant') {\n return null;\n }\n if (!(await this.hasAiUsageTable())) {\n return null;\n }\n\n let summary: AiUsageSummary;\n try {\n summary = await this.summarizeAiUsage({\n tenantId: options.tenantId,\n window: options.window,\n });\n } catch (error) {\n if (isMissingAiUsageTableError(error)) {\n return null;\n }\n throw error;\n }\n\n const quantityByMetric: Record<string, number> = {\n ...aiQuantityByMetric(summary),\n };\n\n return {\n tenantId: options.tenantId,\n metricKey: options.metricKey,\n quantity: quantityByMetric[options.metricKey] ?? 0,\n windowStart: options.window.start,\n windowEnd: options.window.end,\n };\n }\n\n private async hasAiUsageTable(): Promise<boolean> {\n return this.metrics.db.tableExists('_smrt_ai_usage');\n }\n}\n\nfunction aiQuantityByMetric(summary: AiUsageSummary): Record<string, number> {\n return {\n 'ai.tokens.prompt': summary.promptTokens,\n 'ai.tokens.completion': summary.completionTokens,\n 'ai.tokens.total': summary.totalTokens,\n 'ai.cost.estimated': summary.estimatedCost,\n 'ai.requests': summary.requestCount,\n };\n}\n\nfunction isMissingAiUsageTableError(\n error: unknown,\n seen = new Set<unknown>(),\n): boolean {\n if (!error) {\n return false;\n }\n if (typeof error !== 'object') {\n return isMissingAiUsageTableMessage(String(error));\n }\n if (seen.has(error)) {\n return false;\n }\n seen.add(error);\n\n const err = error as {\n code?: unknown;\n message?: unknown;\n cause?: unknown;\n context?: Record<string, unknown>;\n };\n const codes = [err?.code, err?.context?.code, err?.context?.errorCode];\n if (codes.some((code) => code === '42P01')) {\n return true;\n }\n\n const messages = [\n err?.message,\n err?.context?.originalError,\n err?.context?.error,\n err?.context?.details,\n ];\n for (const candidate of messages) {\n if (\n candidate &&\n typeof candidate === 'object' &&\n isMissingAiUsageTableError(candidate, seen)\n ) {\n return true;\n }\n if (isMissingAiUsageTableMessage(String(candidate ?? ''))) {\n return true;\n }\n }\n\n return err?.cause ? isMissingAiUsageTableError(err.cause, seen) : false;\n}\n\nfunction isMissingAiUsageTableMessage(message: string): boolean {\n const normalized = message.toLowerCase();\n return (\n normalized.includes('_smrt_ai_usage') &&\n (normalized.includes('no such table') ||\n normalized.includes('does not exist') ||\n normalized.includes('undefined table'))\n );\n}\n\nfunction emptyUsageSummary(\n subscriber: ReturnType<typeof normalizeSubscriber>,\n metricKey: string,\n window: SummarizeUsageBatchOptions['window'],\n): UsageSummary {\n const summary: UsageSummary = {\n tenantId: subscriber.tenantId,\n metricKey,\n quantity: 0,\n windowStart: window.start,\n windowEnd: window.end,\n };\n if (subscriber.kind === 'external') {\n return {\n ...summary,\n subscriberKind: 'external',\n subscriberExternalId: subscriber.externalId,\n };\n }\n return summary;\n}\n","import { isSystemContext } from '@happyvertical/smrt-tenancy';\nimport { SubscriptionPlanCollection } from '../collections/SubscriptionPlanCollection.js';\nimport { TenantSubscriptionCollection } from '../collections/TenantSubscriptionCollection.js';\nimport type { SubscriptionPlan } from '../models/SubscriptionPlan.js';\nimport type { TenantSubscription } from '../models/TenantSubscription.js';\nimport type {\n EntitlementResolution,\n EntitlementResolutionContext,\n PlanThreshold,\n SmrtClassOptions,\n Subscriber,\n SubscriptionResolverOptions,\n ThresholdEvaluation,\n UsageSummary,\n UsageWindow,\n} from '../types.js';\nimport {\n getWindowForThreshold,\n getWindowKey,\n isValidThreshold,\n} from '../utils.js';\nimport { evaluateThreshold } from './threshold-evaluator.js';\nimport { TenantUsageMeter } from './usage-meter.js';\n\nexport interface SubscriptionPlanReader {\n get(criteria: { id: string }): Promise<SubscriptionPlan | null>;\n}\n\n/**\n * Reader contract for finding the current subscription for a subscriber.\n *\n * The legacy `findCurrentForTenant(tenantId)` signature stays for backward\n * compatibility with the original tenant-only resolver. New implementations\n * should provide `findCurrentForSubscriber(subscriber)` — it's preferred when\n * present and lets the resolver work with both `'tenant'` and `'external'`\n * subscribers without callers having to pre-narrow the discriminator.\n */\nexport interface TenantSubscriptionReader {\n findCurrentForTenant(\n tenantId: string,\n now?: Date,\n ): Promise<TenantSubscription | null>;\n findCurrentForSubscriber?(\n subscriber: Subscriber,\n now?: Date,\n ): Promise<TenantSubscription | null>;\n}\n\n/**\n * Reader contract for summarizing usage.\n *\n * `summarize(options)` already accepts the polymorphic\n * `subscriberKind`/`subscriberExternalId` fields. When omitted the reader\n * defaults to `'tenant'`, which is what existing callers got before this\n * change — no behavior shift for them. The discriminator type is derived\n * from `Subscriber['kind']` rather than inlined so any future additions to\n * the union stay consistent across the package.\n */\nexport interface UsageSummaryReader {\n summarize(options: {\n tenantId: string;\n subscriberKind?: Subscriber['kind'];\n subscriberExternalId?: string;\n metricKey: string;\n window: UsageWindow;\n }): Promise<UsageSummary>;\n summarizeBatch?(options: {\n tenantId: string;\n subscriberKind?: Subscriber['kind'];\n subscriberExternalId?: string;\n metricKeys: string[];\n window: UsageWindow;\n }): Promise<UsageSummary[]>;\n}\n\nexport interface SubscriptionResolverReaders {\n plans: SubscriptionPlanReader;\n subscriptions: TenantSubscriptionReader;\n usage: UsageSummaryReader;\n}\n\nexport class SubscriptionResolver {\n constructor(private readonly readers: SubscriptionResolverReaders) {}\n\n /**\n * Build the default resolver readers once for a request or app lifecycle and\n * reuse the returned resolver across entitlement checks.\n */\n static async create(\n classOptions: SmrtClassOptions = {},\n ): Promise<SubscriptionResolver> {\n const [plans, subscriptions, usage] = await Promise.all([\n SubscriptionPlanCollection.create(classOptions),\n TenantSubscriptionCollection.create(classOptions),\n TenantUsageMeter.create(classOptions),\n ]);\n return new SubscriptionResolver({ plans, subscriptions, usage });\n }\n\n /**\n * Load the subscription/plan pair used by entitlement resolution. Callers\n * that need both the entitlement snapshot and the backing records can load\n * this once, then pass it back via `options.context`.\n */\n async loadEntitlementContext(\n subscriberOrTenantId: Subscriber | string,\n options: SubscriptionResolverOptions = {},\n ): Promise<EntitlementResolutionContext> {\n const subscriber = toSubscriber(subscriberOrTenantId);\n const now = options.now ?? new Date();\n const subscription = await this.resolveSubscription(\n subscriber,\n now,\n options.context,\n );\n const plan = await this.resolvePlan(subscription, options.context);\n return { subscription, plan };\n }\n\n /**\n * Polymorphic entitlement resolution. Works for both `'tenant'`-kind and\n * `'external'`-kind subscribers and is the preferred surface — the\n * `resolveTenantEntitlements(tenantId)` method below is a thin wrapper.\n */\n async resolveEntitlements(\n subscriber: Subscriber,\n options: SubscriptionResolverOptions = {},\n ): Promise<EntitlementResolution> {\n const now = options.now ?? new Date();\n const { subscription, plan } = await this.loadEntitlementContext(\n subscriber,\n { ...options, now },\n );\n\n if (!subscription) {\n return emptyResolution(subscriber);\n }\n\n if (!plan?.isActive() || !subscription.isEntitled(now)) {\n return {\n ...emptyResolution(subscriber),\n planId: plan?.id ?? subscription.planId ?? null,\n planKey: plan?.planKey ?? null,\n subscriptionId: subscription.id ?? null,\n status: subscription.status,\n };\n }\n\n const thresholds = plan.getThresholds().filter(isValidThreshold);\n const thresholdEvaluations = await this.resolveThresholdEvaluations(\n subscriber,\n thresholds,\n now,\n options,\n );\n\n return {\n tenantId: subscriber.tenantId,\n subscriber,\n planId: plan.id ?? null,\n planKey: plan.planKey,\n subscriptionId: subscription.id ?? null,\n status: subscription.status,\n featureKeys: plan.getFeatureKeys(),\n thresholds,\n thresholdEvaluations,\n allowed: thresholdEvaluations.every((evaluation) => evaluation.allowed),\n };\n }\n\n /**\n * Legacy single-tenant wrapper around {@link resolveEntitlements}. Kept so\n * existing tenant-only callers don't need to update their call sites.\n */\n async resolveTenantEntitlements(\n tenantId: string,\n options: SubscriptionResolverOptions = {},\n ): Promise<EntitlementResolution> {\n return this.resolveEntitlements({ kind: 'tenant', tenantId }, options);\n }\n\n async isFeatureEnabled(\n subscriberOrTenantId: Subscriber | string,\n featureKey: string,\n options: SubscriptionResolverOptions = {},\n ): Promise<boolean> {\n const resolution = await this.resolveEntitlements(\n toSubscriber(subscriberOrTenantId),\n options,\n );\n return resolution.featureKeys.includes(featureKey);\n }\n\n async assertWithinThresholds(\n subscriberOrTenantId: Subscriber | string,\n options: SubscriptionResolverOptions = {},\n ): Promise<void> {\n const subscriber = toSubscriber(subscriberOrTenantId);\n const resolution = await this.resolveEntitlements(subscriber, options);\n const blocked = resolution.thresholdEvaluations.find(\n (evaluation) => !evaluation.allowed,\n );\n\n if (blocked) {\n const subject =\n subscriber.kind === 'external'\n ? `external:${subscriber.externalId}`\n : `Tenant ${subscriber.tenantId}`;\n throw new Error(\n `${subject} exceeded subscription threshold ${blocked.threshold.metricKey}`,\n );\n }\n }\n\n private async resolveSubscription(\n subscriber: Subscriber,\n now: Date,\n context?: EntitlementResolutionContext,\n ): Promise<TenantSubscription | null> {\n if (hasContextValue(context, 'subscription')) {\n const subscription = context?.subscription ?? null;\n assertSubscriptionMatchesSubscriber(subscription, subscriber);\n return subscription;\n }\n return this.findCurrentSubscription(subscriber, now);\n }\n\n private async resolvePlan(\n subscription: TenantSubscription | null,\n context?: EntitlementResolutionContext,\n ): Promise<SubscriptionPlan | null> {\n if (!subscription?.planId) {\n return null;\n }\n if (hasContextValue(context, 'plan')) {\n const plan = context?.plan ?? null;\n assertPlanMatchesSubscription(plan, subscription);\n return plan;\n }\n const plan = await this.readers.plans.get({ id: subscription.planId });\n assertPlanMatchesSubscription(plan, subscription);\n return plan;\n }\n\n /**\n * Bridge the legacy and polymorphic reader contracts.\n *\n * Prefers `findCurrentForSubscriber` when the reader provides it (the\n * preferred shape). For `'tenant'` subscribers we fall back to the legacy\n * `findCurrentForTenant`. For `'external'` subscribers the reader MUST\n * implement `findCurrentForSubscriber` — otherwise we have no way to scope\n * the lookup and we throw rather than silently returning the tenant's\n * primary subscription.\n */\n private async findCurrentSubscription(\n subscriber: Subscriber,\n now: Date,\n ): Promise<TenantSubscription | null> {\n if (this.readers.subscriptions.findCurrentForSubscriber) {\n return this.readers.subscriptions.findCurrentForSubscriber(\n subscriber,\n now,\n );\n }\n if (subscriber.kind === 'tenant') {\n return this.readers.subscriptions.findCurrentForTenant(\n subscriber.tenantId,\n now,\n );\n }\n throw new Error(\n 'External-subscriber resolution requires a TenantSubscriptionReader ' +\n 'that implements findCurrentForSubscriber()',\n );\n }\n\n private async resolveThresholdEvaluations(\n subscriber: Subscriber,\n thresholds: PlanThreshold[],\n now: Date,\n options: SubscriptionResolverOptions,\n ): Promise<ThresholdEvaluation[]> {\n if (thresholds.length === 0) {\n return [];\n }\n\n if (!this.readers.usage.summarizeBatch) {\n const evaluations: ThresholdEvaluation[] = [];\n for (const threshold of thresholds) {\n const window =\n options.usageWindows?.[threshold.window] ??\n getWindowForThreshold(threshold.window, now);\n const usage = await this.readers.usage.summarize({\n tenantId: subscriber.tenantId,\n subscriberKind: subscriber.kind,\n subscriberExternalId:\n subscriber.kind === 'external' ? subscriber.externalId : undefined,\n metricKey: threshold.metricKey,\n window,\n });\n evaluations.push(evaluateThreshold(threshold, usage));\n }\n return evaluations;\n }\n\n const groups = new Map<\n string,\n {\n window: UsageWindow;\n entries: Array<{ index: number; threshold: PlanThreshold }>;\n }\n >();\n\n thresholds.forEach((threshold, index) => {\n const window =\n options.usageWindows?.[threshold.window] ??\n getWindowForThreshold(threshold.window, now);\n const key = getWindowKey(window);\n const group = groups.get(key) ?? { window, entries: [] };\n group.entries.push({ index, threshold });\n groups.set(key, group);\n });\n\n const evaluations: ThresholdEvaluation[] = new Array(thresholds.length);\n await Promise.all(\n Array.from(groups.values()).map(async ({ window, entries }) => {\n const metricKeys = uniqueMetricKeys(\n entries.map((entry) => entry.threshold.metricKey),\n );\n const summaries = await this.readers.usage.summarizeBatch?.({\n tenantId: subscriber.tenantId,\n subscriberKind: subscriber.kind,\n subscriberExternalId:\n subscriber.kind === 'external' ? subscriber.externalId : undefined,\n metricKeys,\n window,\n });\n const summaryByMetric = new Map(\n (summaries ?? []).map((summary) => [summary.metricKey, summary]),\n );\n\n for (const { index, threshold } of entries) {\n const usage =\n summaryByMetric.get(threshold.metricKey) ??\n emptyUsageSummary(subscriber, threshold.metricKey, window);\n evaluations[index] = evaluateThreshold(threshold, usage);\n }\n }),\n );\n\n return evaluations;\n }\n}\n\nfunction toSubscriber(input: Subscriber | string): Subscriber {\n if (typeof input === 'string') {\n return { kind: 'tenant', tenantId: input };\n }\n return input;\n}\n\nfunction emptyResolution(subscriber: Subscriber): EntitlementResolution {\n return {\n tenantId: subscriber.tenantId,\n subscriber,\n planId: null,\n planKey: null,\n subscriptionId: null,\n status: 'none',\n featureKeys: [],\n thresholds: [],\n thresholdEvaluations: [],\n allowed: false,\n };\n}\n\nfunction hasContextValue<K extends keyof EntitlementResolutionContext>(\n context: EntitlementResolutionContext | undefined,\n key: K,\n): boolean {\n return context?.[key] !== undefined;\n}\n\nfunction assertSubscriptionMatchesSubscriber(\n subscription: TenantSubscription | null,\n subscriber: Subscriber,\n): void {\n if (!subscription) {\n return;\n }\n const subscriptionSubscriber = subscription.getSubscriber();\n if (\n !subscriptionSubscriber ||\n !sameSubscriber(subscriptionSubscriber, subscriber)\n ) {\n throw new Error(\n 'Provided entitlement context subscription does not match requested subscriber',\n );\n }\n}\n\nfunction assertPlanMatchesSubscription(\n plan: SubscriptionPlan | null,\n subscription: TenantSubscription,\n): void {\n if (!plan) {\n return;\n }\n if (\n !isSystemContext() &&\n plan.tenantId !== null &&\n plan.tenantId !== subscription.tenantId\n ) {\n throw new Error('Entitlement plan does not belong to subscription tenant');\n }\n if (!plan.id || plan.id !== subscription.planId) {\n throw new Error(\n 'Provided entitlement context plan does not match subscription.planId',\n );\n }\n}\n\nfunction sameSubscriber(left: Subscriber, right: Subscriber): boolean {\n if (left.kind !== right.kind || left.tenantId !== right.tenantId) {\n return false;\n }\n if (left.kind === 'tenant') {\n return true;\n }\n return right.kind === 'external' && left.externalId === right.externalId;\n}\n\nfunction uniqueMetricKeys(metricKeys: string[]): string[] {\n return Array.from(new Set(metricKeys));\n}\n\nfunction emptyUsageSummary(\n subscriber: Subscriber,\n metricKey: string,\n window: UsageWindow,\n): UsageSummary {\n const summary: UsageSummary = {\n tenantId: subscriber.tenantId,\n metricKey,\n quantity: 0,\n windowStart: window.start,\n windowEnd: window.end,\n };\n if (subscriber.kind === 'external') {\n return {\n ...summary,\n subscriberKind: 'external',\n subscriberExternalId: subscriber.externalId,\n };\n }\n return summary;\n}\n\nexport type { PlanThreshold };\n"],"mappings":"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"}
|