{
  "schemaVersion": 1,
  "sensitiveFieldsExcluded": true,
  "generatedAt": "1970-01-01T00:00:00.000Z",
  "packageName": "@happyvertical/smrt-analytics",
  "packageVersion": "0.43.3",
  "sourceManifestPath": "dist/manifest.json",
  "agentDocPath": "AGENTS.md",
  "sourceHashes": {
    "manifest": "293a4e6a700e3afa25ecb6a81c3202e85169a6d41d70f0ce81551eb80125af55",
    "packageJson": "13d1e4e03dfb7c444770c005da83122e9bf44aefaafca85f79f8ebc57e294e3b",
    "agents": "baaeb44320f95dc5dc86925318e791369681ad80acfbb82a0f667f2aed0e511c"
  },
  "exports": [
    ".",
    "./manifest",
    "./manifest.json",
    "./playground",
    "./svelte",
    "./ui"
  ],
  "dependencies": {
    "@happyvertical/smrt-core": "workspace:*",
    "@happyvertical/smrt-prompts": "workspace:*",
    "@happyvertical/smrt-tenancy": "workspace:*",
    "@happyvertical/smrt-types": "workspace:*",
    "@happyvertical/smrt-ui": "workspace:*",
    "@happyvertical/smrt-vitest": "workspace:*",
    "@happyvertical/sql": "catalog:",
    "@sveltejs/package": "^2.5.8",
    "@types/node": "24.13.2",
    "fast-glob": "3.3.3",
    "svelte-check": "^4.7.1",
    "svelte": "^5.56.4",
    "typescript": "5.9.3",
    "vite": "8.1.4",
    "vitest": "4.1.10"
  },
  "smrtDependencies": [
    "@happyvertical/smrt-core",
    "@happyvertical/smrt-prompts",
    "@happyvertical/smrt-tenancy",
    "@happyvertical/smrt-types",
    "@happyvertical/smrt-ui",
    "@happyvertical/smrt-vitest"
  ],
  "sdkDependencies": [
    "@happyvertical/sql"
  ],
  "tags": [],
  "risks": [],
  "objects": [
    {
      "name": "AnalyticsDataStreamCollection",
      "qualifiedName": "@happyvertical/smrt-analytics:AnalyticsDataStreamCollection",
      "collection": "analyticsdatastreams",
      "tableName": "analytics_data_stream_collections",
      "packageName": "@happyvertical/smrt-analytics",
      "extends": "SmrtCollection",
      "fields": [],
      "relationships": [],
      "methods": [
        "findActive",
        "findActiveByProperty",
        "findAndroidStreams",
        "findByExternalId",
        "findByMeasurementId",
        "findByProperty",
        "findByStatus",
        "findByType",
        "findIOSStreams",
        "findMobileStreams",
        "findWebStreams"
      ],
      "methodSignatures": [
        {
          "name": "findActive",
          "async": true,
          "returns": "Promise<AnalyticsDataStream[]>"
        },
        {
          "name": "findActiveByProperty",
          "async": true,
          "params": [
            "propertyId: string"
          ],
          "returns": "Promise<AnalyticsDataStream[]>"
        },
        {
          "name": "findAndroidStreams",
          "async": true,
          "returns": "Promise<AnalyticsDataStream[]>"
        },
        {
          "name": "findByExternalId",
          "async": true,
          "params": [
            "externalId: string"
          ],
          "returns": "Promise<AnalyticsDataStream | null>"
        },
        {
          "name": "findByMeasurementId",
          "async": true,
          "params": [
            "measurementId: string"
          ],
          "returns": "Promise<AnalyticsDataStream | null>"
        },
        {
          "name": "findByProperty",
          "async": true,
          "params": [
            "propertyId: string"
          ],
          "returns": "Promise<AnalyticsDataStream[]>"
        },
        {
          "name": "findByStatus",
          "async": true,
          "params": [
            "status: DataStreamStatus"
          ],
          "returns": "Promise<AnalyticsDataStream[]>"
        },
        {
          "name": "findByType",
          "async": true,
          "params": [
            "streamType: DataStreamType"
          ],
          "returns": "Promise<AnalyticsDataStream[]>"
        },
        {
          "name": "findIOSStreams",
          "async": true,
          "returns": "Promise<AnalyticsDataStream[]>"
        },
        {
          "name": "findMobileStreams",
          "async": true,
          "returns": "Promise<AnalyticsDataStream[]>"
        },
        {
          "name": "findWebStreams",
          "async": true,
          "returns": "Promise<AnalyticsDataStream[]>"
        }
      ],
      "surfaces": [],
      "relationshipFeatures": [
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "AnalyticsEventCollection",
      "qualifiedName": "@happyvertical/smrt-analytics:AnalyticsEventCollection",
      "collection": "analyticsevents",
      "tableName": "analytics_event_collections",
      "packageName": "@happyvertical/smrt-analytics",
      "extends": "SmrtCollection",
      "fields": [],
      "relationships": [],
      "methods": [
        "countByEventName",
        "findByClientId",
        "findByDateRange",
        "findByEventName",
        "findByProperty",
        "findByStatus",
        "findByUserId",
        "findConversions",
        "findFailed",
        "findForRetry",
        "findPageviews",
        "findPending",
        "findPendingByProperty",
        "findSent",
        "getBatchPropertyStats",
        "getPropertyStats",
        "getPropertyStatsWithTrend"
      ],
      "methodSignatures": [
        {
          "name": "countByEventName",
          "async": true,
          "params": [
            "propertyId: string"
          ],
          "returns": "Promise<Map<string, number>>"
        },
        {
          "name": "findByClientId",
          "async": true,
          "params": [
            "clientId: string"
          ],
          "returns": "Promise<AnalyticsEvent[]>"
        },
        {
          "name": "findByDateRange",
          "async": true,
          "params": [
            "startDate: Date",
            "endDate: Date"
          ],
          "returns": "Promise<AnalyticsEvent[]>"
        },
        {
          "name": "findByEventName",
          "async": true,
          "params": [
            "eventName: string"
          ],
          "returns": "Promise<AnalyticsEvent[]>"
        },
        {
          "name": "findByProperty",
          "async": true,
          "params": [
            "propertyId: string"
          ],
          "returns": "Promise<AnalyticsEvent[]>"
        },
        {
          "name": "findByStatus",
          "async": true,
          "params": [
            "status: TrackingEventStatus"
          ],
          "returns": "Promise<AnalyticsEvent[]>"
        },
        {
          "name": "findByUserId",
          "async": true,
          "params": [
            "userId: string"
          ],
          "returns": "Promise<AnalyticsEvent[]>"
        },
        {
          "name": "findConversions",
          "async": true,
          "params": [
            "propertyId?: string"
          ],
          "returns": "Promise<AnalyticsEvent[]>"
        },
        {
          "name": "findFailed",
          "async": true,
          "returns": "Promise<AnalyticsEvent[]>"
        },
        {
          "name": "findForRetry",
          "async": true,
          "params": [
            "maxRetries?: number"
          ],
          "returns": "Promise<AnalyticsEvent[]>"
        },
        {
          "name": "findPageviews",
          "async": true,
          "params": [
            "propertyId?: string"
          ],
          "returns": "Promise<AnalyticsEvent[]>"
        },
        {
          "name": "findPending",
          "async": true,
          "returns": "Promise<AnalyticsEvent[]>"
        },
        {
          "name": "findPendingByProperty",
          "async": true,
          "params": [
            "propertyId: string"
          ],
          "returns": "Promise<AnalyticsEvent[]>"
        },
        {
          "name": "findSent",
          "async": true,
          "returns": "Promise<AnalyticsEvent[]>"
        },
        {
          "name": "getBatchPropertyStats",
          "async": true,
          "params": [
            "propertyIds: string[]",
            "now?: Date",
            "timeZone?: string"
          ],
          "returns": "Promise<Map<string, PropertyStatsWithTrend>>"
        },
        {
          "name": "getPropertyStats",
          "async": true,
          "params": [
            "propertyId: string"
          ],
          "returns": "Promise<object>"
        },
        {
          "name": "getPropertyStatsWithTrend",
          "async": true,
          "params": [
            "propertyId: string",
            "now?: Date",
            "timeZone?: string"
          ],
          "returns": "Promise<PropertyStatsWithTrend>"
        }
      ],
      "surfaces": [],
      "relationshipFeatures": [
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "AnalyticsPropertyCollection",
      "qualifiedName": "@happyvertical/smrt-analytics:AnalyticsPropertyCollection",
      "collection": "analyticsproperties",
      "tableName": "analytics_property_collections",
      "packageName": "@happyvertical/smrt-analytics",
      "extends": "SmrtCollection",
      "fields": [],
      "relationships": [],
      "methods": [
        "findActive",
        "findByExternalId",
        "findByMeasurementId",
        "findByProvider",
        "findBySiteDomain",
        "findByStatus",
        "findGA4Properties",
        "findMatomoSites",
        "findNeedingSync",
        "findPlausibleSites"
      ],
      "methodSignatures": [
        {
          "name": "findActive",
          "async": true,
          "returns": "Promise<AnalyticsProperty[]>"
        },
        {
          "name": "findByExternalId",
          "async": true,
          "params": [
            "externalId: string"
          ],
          "returns": "Promise<AnalyticsProperty | null>"
        },
        {
          "name": "findByMeasurementId",
          "async": true,
          "params": [
            "measurementId: string"
          ],
          "returns": "Promise<AnalyticsProperty | null>"
        },
        {
          "name": "findByProvider",
          "async": true,
          "params": [
            "provider: AnalyticsProvider"
          ],
          "returns": "Promise<AnalyticsProperty[]>"
        },
        {
          "name": "findBySiteDomain",
          "async": true,
          "params": [
            "siteDomain: string",
            "provider?: AnalyticsProvider"
          ],
          "returns": "Promise<AnalyticsProperty | null>"
        },
        {
          "name": "findByStatus",
          "async": true,
          "params": [
            "status: AnalyticsPropertyStatus"
          ],
          "returns": "Promise<AnalyticsProperty[]>"
        },
        {
          "name": "findGA4Properties",
          "async": true,
          "returns": "Promise<AnalyticsProperty[]>"
        },
        {
          "name": "findMatomoSites",
          "async": true,
          "returns": "Promise<AnalyticsProperty[]>"
        },
        {
          "name": "findNeedingSync",
          "async": true,
          "params": [
            "hoursAgo?: number"
          ],
          "returns": "Promise<AnalyticsProperty[]>"
        },
        {
          "name": "findPlausibleSites",
          "async": true,
          "returns": "Promise<AnalyticsProperty[]>"
        }
      ],
      "surfaces": [],
      "relationshipFeatures": [
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "AnalyticsReportCollection",
      "qualifiedName": "@happyvertical/smrt-analytics:AnalyticsReportCollection",
      "collection": "analyticsreports",
      "tableName": "analytics_report_collections",
      "packageName": "@happyvertical/smrt-analytics",
      "extends": "SmrtCollection",
      "fields": [],
      "relationships": [],
      "methods": [
        "findByFrequency",
        "findByProperty",
        "findByPropertyAndStatus",
        "findByStatus",
        "findCompleted",
        "findDrafts",
        "findDue",
        "findFailed",
        "findRecentlyRun",
        "findRecurring",
        "findScheduled"
      ],
      "methodSignatures": [
        {
          "name": "findByFrequency",
          "async": true,
          "params": [
            "frequency: ReportFrequency"
          ],
          "returns": "Promise<AnalyticsReport[]>"
        },
        {
          "name": "findByProperty",
          "async": true,
          "params": [
            "propertyId: string"
          ],
          "returns": "Promise<AnalyticsReport[]>"
        },
        {
          "name": "findByPropertyAndStatus",
          "async": true,
          "params": [
            "propertyId: string",
            "status: ReportStatus"
          ],
          "returns": "Promise<AnalyticsReport[]>"
        },
        {
          "name": "findByStatus",
          "async": true,
          "params": [
            "status: ReportStatus"
          ],
          "returns": "Promise<AnalyticsReport[]>"
        },
        {
          "name": "findCompleted",
          "async": true,
          "returns": "Promise<AnalyticsReport[]>"
        },
        {
          "name": "findDrafts",
          "async": true,
          "returns": "Promise<AnalyticsReport[]>"
        },
        {
          "name": "findDue",
          "async": true,
          "returns": "Promise<AnalyticsReport[]>"
        },
        {
          "name": "findFailed",
          "async": true,
          "returns": "Promise<AnalyticsReport[]>"
        },
        {
          "name": "findRecentlyRun",
          "async": true,
          "params": [
            "hoursAgo?: number"
          ],
          "returns": "Promise<AnalyticsReport[]>"
        },
        {
          "name": "findRecurring",
          "async": true,
          "returns": "Promise<AnalyticsReport[]>"
        },
        {
          "name": "findScheduled",
          "async": true,
          "returns": "Promise<AnalyticsReport[]>"
        }
      ],
      "surfaces": [],
      "relationshipFeatures": [
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "AnalyticsDataStream",
      "qualifiedName": "@happyvertical/smrt-analytics:AnalyticsDataStream",
      "collection": "analyticsdatastreams",
      "tableName": "analytics_data_streams",
      "packageName": "@happyvertical/smrt-analytics",
      "extends": "SmrtObject",
      "fields": [
        {
          "name": "created_at",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "updated_at",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "tenantId",
          "type": "text",
          "required": false,
          "columnType": "UUID"
        },
        {
          "name": "propertyId",
          "type": "foreignKey",
          "required": false,
          "related": "AnalyticsProperty",
          "columnType": "UUID"
        },
        {
          "name": "displayName",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "streamType",
          "type": "text",
          "required": false,
          "columnType": "TEXT"
        },
        {
          "name": "externalId",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "measurementId",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "firebaseAppId",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "defaultUri",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "bundleId",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "packageName",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "status",
          "type": "text",
          "required": false,
          "columnType": "TEXT"
        },
        {
          "name": "enhancedMeasurement",
          "type": "boolean",
          "required": false,
          "columnType": "BOOLEAN",
          "default": true
        }
      ],
      "relationships": [
        {
          "name": "propertyId",
          "type": "foreignKey",
          "required": false,
          "related": "AnalyticsProperty",
          "columnType": "UUID"
        }
      ],
      "methods": [
        "_setLoadedRelationship",
        "classifyConstraintError",
        "clearEmbeddings",
        "delete",
        "describe",
        "destroy",
        "do",
        "executeToolCall",
        "forget",
        "forgetScope",
        "generateEmbeddings",
        "getAiUsageSnapshot",
        "getAvailableTools",
        "getEmbedding",
        "getFields",
        "getId",
        "getPlatformId",
        "getRelated",
        "getSavedId",
        "getSlug",
        "hasStaleEmbeddings",
        "initialize",
        "is",
        "isAndroid",
        "isIOS",
        "isMobileApp",
        "isRelatedLoaded",
        "isSaved",
        "isWeb",
        "listAiUsage",
        "loadDataFromDb",
        "loadFromId",
        "loadFromSlug",
        "loadRelated",
        "loadRelatedMany",
        "markAsPersisted",
        "recall",
        "recallAll",
        "remember",
        "requireInsertOnSave",
        "resetAiUsage",
        "save",
        "summarizeAiUsage",
        "toJSON",
        "toPlainObject",
        "toPublicJSON",
        "withDatabase"
      ],
      "methodSignatures": [
        {
          "name": "_setLoadedRelationship",
          "params": [
            "fieldName: string",
            "value: any"
          ],
          "returns": "void"
        },
        {
          "name": "classifyConstraintError",
          "static": true,
          "params": [
            "message: string"
          ],
          "returns": "'unique' | 'not_null' | null"
        },
        {
          "name": "clearEmbeddings",
          "async": true,
          "returns": "Promise<void>"
        },
        {
          "name": "delete",
          "async": true,
          "returns": "Promise<void>"
        },
        {
          "name": "describe",
          "async": true,
          "params": [
            "options?: AiOperationOptions"
          ],
          "returns": "any"
        },
        {
          "name": "destroy",
          "returns": "void"
        },
        {
          "name": "do",
          "async": true,
          "params": [
            "instructions: string",
            "options?: AiOperationOptions"
          ],
          "returns": "any"
        },
        {
          "name": "executeToolCall",
          "async": true,
          "params": [
            "toolCall: ToolCall"
          ],
          "returns": "Promise<ToolCallResult>"
        },
        {
          "name": "forget",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise<void>"
        },
        {
          "name": "forgetScope",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise<number>"
        },
        {
          "name": "generateEmbeddings",
          "async": true,
          "params": [
            "options?: GenerateEmbeddingsOptions"
          ],
          "returns": "Promise<void>"
        },
        {
          "name": "getAiUsageSnapshot",
          "returns": "AiUsageSnapshot | undefined"
        },
        {
          "name": "getAvailableTools",
          "returns": "AITool[]"
        },
        {
          "name": "getEmbedding",
          "async": true,
          "params": [
            "fieldName: string",
            "model?: string"
          ],
          "returns": "Promise<number[] | null>"
        },
        {
          "name": "getFields",
          "async": true,
          "returns": "Promise<any>"
        },
        {
          "name": "getId",
          "async": true,
          "returns": "any"
        },
        {
          "name": "getPlatformId",
          "returns": "string"
        },
        {
          "name": "getRelated",
          "async": true,
          "params": [
            "fieldName: string",
            "opts?: LoadRelatedOptions"
          ],
          "returns": "Promise<any>"
        },
        {
          "name": "getSavedId",
          "async": true,
          "returns": "any"
        },
        {
          "name": "getSlug",
          "async": true,
          "returns": "any"
        },
        {
          "name": "hasStaleEmbeddings",
          "async": true,
          "returns": "Promise<boolean>"
        },
        {
          "name": "initialize",
          "async": true,
          "returns": "Promise"
        },
        {
          "name": "is",
          "async": true,
          "params": [
            "criteria: string",
            "options?: AiOperationOptions"
          ],
          "returns": "any"
        },
        {
          "name": "isAndroid",
          "returns": "boolean"
        },
        {
          "name": "isIOS",
          "returns": "boolean"
        },
        {
          "name": "isMobileApp",
          "returns": "boolean"
        },
        {
          "name": "isRelatedLoaded",
          "params": [
            "fieldName: string"
          ],
          "returns": "boolean"
        },
        {
          "name": "isSaved",
          "async": true,
          "returns": "any"
        },
        {
          "name": "isWeb",
          "returns": "boolean"
        },
        {
          "name": "listAiUsage",
          "async": true,
          "params": [
            "options?: AiUsageListOptions"
          ],
          "returns": "Promise<SmrtAiUsageRecord[]>"
        },
        {
          "name": "loadDataFromDb",
          "async": true,
          "params": [
            "data: Record<string>"
          ],
          "returns": "any"
        },
        {
          "name": "loadFromId",
          "async": true,
          "returns": "any"
        },
        {
          "name": "loadFromSlug",
          "async": true,
          "returns": "any"
        },
        {
          "name": "loadRelated",
          "async": true,
          "params": [
            "fieldName: string",
            "opts?: LoadRelatedOptions"
          ],
          "returns": "Promise<any>"
        },
        {
          "name": "loadRelatedMany",
          "async": true,
          "params": [
            "fieldName: string",
            "opts?: LoadRelatedOptions"
          ],
          "returns": "Promise<any[]>"
        },
        {
          "name": "markAsPersisted",
          "returns": "void"
        },
        {
          "name": "recall",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise"
        },
        {
          "name": "recallAll",
          "async": true,
          "params": [
            "options?: object"
          ],
          "returns": "Promise<Map<string>>"
        },
        {
          "name": "remember",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise<void>"
        },
        {
          "name": "requireInsertOnSave",
          "returns": "void"
        },
        {
          "name": "resetAiUsage",
          "returns": "void"
        },
        {
          "name": "save",
          "async": true,
          "returns": "any"
        },
        {
          "name": "summarizeAiUsage",
          "async": true,
          "params": [
            "options?: AiUsageSummaryOptions"
          ],
          "returns": "Promise<Record<string, AiUsageStats>>"
        },
        {
          "name": "toJSON",
          "returns": "any"
        },
        {
          "name": "toPlainObject",
          "returns": "Record<string>"
        },
        {
          "name": "toPublicJSON",
          "params": [
            "options?: PublicJsonOptions"
          ],
          "returns": "Record<string>"
        },
        {
          "name": "withDatabase",
          "async": true,
          "params": [
            "db: DatabaseInterface",
            "operation: Function"
          ],
          "returns": "Promise<T>"
        }
      ],
      "tenant": {
        "scoped": true,
        "mode": "optional",
        "field": "tenantId"
      },
      "tableStrategy": "sti",
      "conflictColumns": [
        "tenant_id",
        "slug",
        "context",
        "_meta_type"
      ],
      "surfaces": [
        {
          "kind": "api",
          "name": "analyticsdatastreams.list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream",
          "path": "/analyticsdatastreams",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "analyticsdatastreams.get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream",
          "path": "/analyticsdatastreams/[id]",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "analyticsdatastreams.create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream",
          "path": "/analyticsdatastreams",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "analyticsdatastreams.update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream",
          "path": "/analyticsdatastreams/[id]",
          "method": "PATCH"
        },
        {
          "kind": "cli",
          "name": "analyticsdatastream_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream"
        },
        {
          "kind": "cli",
          "name": "analyticsdatastream_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream"
        },
        {
          "kind": "cli",
          "name": "analyticsdatastream_create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream"
        },
        {
          "kind": "cli",
          "name": "analyticsdatastream_update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream"
        },
        {
          "kind": "cli",
          "name": "analyticsdatastream_delete",
          "operation": "delete",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream"
        },
        {
          "kind": "mcp",
          "name": "analyticsdatastream_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream"
        },
        {
          "kind": "mcp",
          "name": "analyticsdatastream_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream"
        }
      ],
      "relationshipFeatures": [
        "foreignKey",
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "AnalyticsEvent",
      "qualifiedName": "@happyvertical/smrt-analytics:AnalyticsEvent",
      "collection": "analyticsevents",
      "tableName": "analytics_events",
      "packageName": "@happyvertical/smrt-analytics",
      "extends": "SmrtObject",
      "fields": [
        {
          "name": "created_at",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "updated_at",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "tenantId",
          "type": "text",
          "required": false,
          "columnType": "UUID"
        },
        {
          "name": "propertyId",
          "type": "foreignKey",
          "required": false,
          "related": "AnalyticsProperty",
          "columnType": "UUID"
        },
        {
          "name": "eventName",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "clientId",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "userId",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "params",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "{}"
        },
        {
          "name": "eventTimestamp",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "status",
          "type": "text",
          "required": false,
          "columnType": "TEXT"
        },
        {
          "name": "sentAt",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "errorMessage",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "retryCount",
          "type": "integer",
          "required": false,
          "columnType": "INTEGER",
          "default": 0
        },
        {
          "name": "nonPersonalizedAds",
          "type": "boolean",
          "required": false,
          "columnType": "BOOLEAN",
          "default": false
        },
        {
          "name": "sessionId",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "pagePath",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "pageTitle",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "userAgent",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "ipAddress",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        }
      ],
      "relationships": [
        {
          "name": "propertyId",
          "type": "foreignKey",
          "required": false,
          "related": "AnalyticsProperty",
          "columnType": "UUID"
        }
      ],
      "methods": [
        "_setLoadedRelationship",
        "addParam",
        "classifyConstraintError",
        "clearEmbeddings",
        "delete",
        "describe",
        "destroy",
        "do",
        "executeToolCall",
        "forget",
        "forgetScope",
        "generateEmbeddings",
        "getAiUsageSnapshot",
        "getAvailableTools",
        "getEmbedding",
        "getFields",
        "getId",
        "getParams",
        "getRelated",
        "getSavedId",
        "getSlug",
        "hasStaleEmbeddings",
        "initialize",
        "is",
        "isConversion",
        "isPageview",
        "isRelatedLoaded",
        "isSaved",
        "listAiUsage",
        "loadDataFromDb",
        "loadFromId",
        "loadFromSlug",
        "loadRelated",
        "loadRelatedMany",
        "markAsPersisted",
        "markFailed",
        "markSent",
        "recall",
        "recallAll",
        "remember",
        "requireInsertOnSave",
        "resetAiUsage",
        "resetForRetry",
        "save",
        "setParams",
        "shouldRetry",
        "summarizeAiUsage",
        "toJSON",
        "toPlainObject",
        "toPublicJSON",
        "toTrackEvent",
        "withDatabase"
      ],
      "methodSignatures": [
        {
          "name": "_setLoadedRelationship",
          "params": [
            "fieldName: string",
            "value: any"
          ],
          "returns": "void"
        },
        {
          "name": "addParam",
          "params": [
            "key: string",
            "value: string | number | boolean"
          ],
          "returns": "void"
        },
        {
          "name": "classifyConstraintError",
          "static": true,
          "params": [
            "message: string"
          ],
          "returns": "'unique' | 'not_null' | null"
        },
        {
          "name": "clearEmbeddings",
          "async": true,
          "returns": "Promise<void>"
        },
        {
          "name": "delete",
          "async": true,
          "returns": "Promise<void>"
        },
        {
          "name": "describe",
          "async": true,
          "params": [
            "options?: AiOperationOptions"
          ],
          "returns": "any"
        },
        {
          "name": "destroy",
          "returns": "void"
        },
        {
          "name": "do",
          "async": true,
          "params": [
            "instructions: string",
            "options?: AiOperationOptions"
          ],
          "returns": "any"
        },
        {
          "name": "executeToolCall",
          "async": true,
          "params": [
            "toolCall: ToolCall"
          ],
          "returns": "Promise<ToolCallResult>"
        },
        {
          "name": "forget",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise<void>"
        },
        {
          "name": "forgetScope",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise<number>"
        },
        {
          "name": "generateEmbeddings",
          "async": true,
          "params": [
            "options?: GenerateEmbeddingsOptions"
          ],
          "returns": "Promise<void>"
        },
        {
          "name": "getAiUsageSnapshot",
          "returns": "AiUsageSnapshot | undefined"
        },
        {
          "name": "getAvailableTools",
          "returns": "AITool[]"
        },
        {
          "name": "getEmbedding",
          "async": true,
          "params": [
            "fieldName: string",
            "model?: string"
          ],
          "returns": "Promise<number[] | null>"
        },
        {
          "name": "getFields",
          "async": true,
          "returns": "Promise<any>"
        },
        {
          "name": "getId",
          "async": true,
          "returns": "any"
        },
        {
          "name": "getParams",
          "returns": "Record<string, string | number | boolean>"
        },
        {
          "name": "getRelated",
          "async": true,
          "params": [
            "fieldName: string",
            "opts?: LoadRelatedOptions"
          ],
          "returns": "Promise<any>"
        },
        {
          "name": "getSavedId",
          "async": true,
          "returns": "any"
        },
        {
          "name": "getSlug",
          "async": true,
          "returns": "any"
        },
        {
          "name": "hasStaleEmbeddings",
          "async": true,
          "returns": "Promise<boolean>"
        },
        {
          "name": "initialize",
          "async": true,
          "returns": "Promise"
        },
        {
          "name": "is",
          "async": true,
          "params": [
            "criteria: string",
            "options?: AiOperationOptions"
          ],
          "returns": "any"
        },
        {
          "name": "isConversion",
          "returns": "boolean"
        },
        {
          "name": "isPageview",
          "returns": "boolean"
        },
        {
          "name": "isRelatedLoaded",
          "params": [
            "fieldName: string"
          ],
          "returns": "boolean"
        },
        {
          "name": "isSaved",
          "async": true,
          "returns": "any"
        },
        {
          "name": "listAiUsage",
          "async": true,
          "params": [
            "options?: AiUsageListOptions"
          ],
          "returns": "Promise<SmrtAiUsageRecord[]>"
        },
        {
          "name": "loadDataFromDb",
          "async": true,
          "params": [
            "data: Record<string>"
          ],
          "returns": "any"
        },
        {
          "name": "loadFromId",
          "async": true,
          "returns": "any"
        },
        {
          "name": "loadFromSlug",
          "async": true,
          "returns": "any"
        },
        {
          "name": "loadRelated",
          "async": true,
          "params": [
            "fieldName: string",
            "opts?: LoadRelatedOptions"
          ],
          "returns": "Promise<any>"
        },
        {
          "name": "loadRelatedMany",
          "async": true,
          "params": [
            "fieldName: string",
            "opts?: LoadRelatedOptions"
          ],
          "returns": "Promise<any[]>"
        },
        {
          "name": "markAsPersisted",
          "returns": "void"
        },
        {
          "name": "markFailed",
          "params": [
            "error: string"
          ],
          "returns": "void"
        },
        {
          "name": "markSent",
          "returns": "void"
        },
        {
          "name": "recall",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise"
        },
        {
          "name": "recallAll",
          "async": true,
          "params": [
            "options?: object"
          ],
          "returns": "Promise<Map<string>>"
        },
        {
          "name": "remember",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise<void>"
        },
        {
          "name": "requireInsertOnSave",
          "returns": "void"
        },
        {
          "name": "resetAiUsage",
          "returns": "void"
        },
        {
          "name": "resetForRetry",
          "returns": "void"
        },
        {
          "name": "save",
          "async": true,
          "returns": "any"
        },
        {
          "name": "setParams",
          "params": [
            "params: Record<string, string | number | boolean>"
          ],
          "returns": "void"
        },
        {
          "name": "shouldRetry",
          "params": [
            "maxRetries?: number"
          ],
          "returns": "boolean"
        },
        {
          "name": "summarizeAiUsage",
          "async": true,
          "params": [
            "options?: AiUsageSummaryOptions"
          ],
          "returns": "Promise<Record<string, AiUsageStats>>"
        },
        {
          "name": "toJSON",
          "returns": "any"
        },
        {
          "name": "toPlainObject",
          "returns": "Record<string>"
        },
        {
          "name": "toPublicJSON",
          "params": [
            "options?: PublicJsonOptions"
          ],
          "returns": "Record<string>"
        },
        {
          "name": "toTrackEvent",
          "returns": "object"
        },
        {
          "name": "withDatabase",
          "async": true,
          "params": [
            "db: DatabaseInterface",
            "operation: Function"
          ],
          "returns": "Promise<T>"
        }
      ],
      "tenant": {
        "scoped": true,
        "mode": "optional",
        "field": "tenantId"
      },
      "tableStrategy": "sti",
      "conflictColumns": [
        "tenant_id",
        "slug",
        "context",
        "_meta_type"
      ],
      "surfaces": [
        {
          "kind": "api",
          "name": "analyticsevents.list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent",
          "path": "/analyticsevents",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "analyticsevents.get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent",
          "path": "/analyticsevents/[id]",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "analyticsevents.create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent",
          "path": "/analyticsevents",
          "method": "POST"
        },
        {
          "kind": "cli",
          "name": "analyticsevent_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
        },
        {
          "kind": "cli",
          "name": "analyticsevent_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
        },
        {
          "kind": "cli",
          "name": "analyticsevent_create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
        },
        {
          "kind": "cli",
          "name": "analyticsevent_update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
        },
        {
          "kind": "cli",
          "name": "analyticsevent_delete",
          "operation": "delete",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
        },
        {
          "kind": "mcp",
          "name": "analyticsevent_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
        },
        {
          "kind": "mcp",
          "name": "analyticsevent_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
        },
        {
          "kind": "mcp",
          "name": "analyticsevent_track",
          "operation": "track",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
        }
      ],
      "relationshipFeatures": [
        "foreignKey",
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "AnalyticsProperty",
      "qualifiedName": "@happyvertical/smrt-analytics:AnalyticsProperty",
      "collection": "analyticsproperties",
      "tableName": "analytics_properties",
      "packageName": "@happyvertical/smrt-analytics",
      "extends": "SmrtObject",
      "fields": [
        {
          "name": "created_at",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "updated_at",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "tenantId",
          "type": "text",
          "required": false,
          "columnType": "UUID"
        },
        {
          "name": "name",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "displayName",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "provider",
          "type": "text",
          "required": false,
          "columnType": "TEXT"
        },
        {
          "name": "externalId",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "measurementId",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "siteDomain",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "timeZone",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "America/Los_Angeles"
        },
        {
          "name": "currencyCode",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "USD"
        },
        {
          "name": "industryCategory",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "serviceLevel",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "STANDARD"
        },
        {
          "name": "status",
          "type": "text",
          "required": false,
          "columnType": "TEXT"
        },
        {
          "name": "lastSyncAt",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        }
      ],
      "relationships": [],
      "methods": [
        "_setLoadedRelationship",
        "analyzePerformance",
        "classifyConstraintError",
        "clearEmbeddings",
        "delete",
        "describe",
        "destroy",
        "do",
        "executeToolCall",
        "forget",
        "forgetScope",
        "generateEmbeddings",
        "getAiUsageSnapshot",
        "getAvailableTools",
        "getEmbedding",
        "getFields",
        "getId",
        "getProviderMetadata",
        "getRelated",
        "getSavedId",
        "getSlug",
        "hasStaleEmbeddings",
        "initialize",
        "is",
        "isGA4",
        "isMatomo",
        "isPerformingWell",
        "isPlausible",
        "isRelatedLoaded",
        "isSaved",
        "listAiUsage",
        "loadDataFromDb",
        "loadFromId",
        "loadFromSlug",
        "loadRelated",
        "loadRelatedMany",
        "markAsPersisted",
        "markSynced",
        "recall",
        "recallAll",
        "remember",
        "requireInsertOnSave",
        "resetAiUsage",
        "save",
        "setProviderMetadata",
        "summarizeAiUsage",
        "toJSON",
        "toPlainObject",
        "toPublicJSON",
        "withDatabase"
      ],
      "methodSignatures": [
        {
          "name": "_setLoadedRelationship",
          "params": [
            "fieldName: string",
            "value: any"
          ],
          "returns": "void"
        },
        {
          "name": "analyzePerformance",
          "async": true,
          "params": [
            "options?: object"
          ],
          "returns": "Promise<object>"
        },
        {
          "name": "classifyConstraintError",
          "static": true,
          "params": [
            "message: string"
          ],
          "returns": "'unique' | 'not_null' | null"
        },
        {
          "name": "clearEmbeddings",
          "async": true,
          "returns": "Promise<void>"
        },
        {
          "name": "delete",
          "async": true,
          "returns": "Promise<void>"
        },
        {
          "name": "describe",
          "async": true,
          "params": [
            "options?: AiOperationOptions"
          ],
          "returns": "any"
        },
        {
          "name": "destroy",
          "returns": "void"
        },
        {
          "name": "do",
          "async": true,
          "params": [
            "instructions: string",
            "options?: AiOperationOptions"
          ],
          "returns": "any"
        },
        {
          "name": "executeToolCall",
          "async": true,
          "params": [
            "toolCall: ToolCall"
          ],
          "returns": "Promise<ToolCallResult>"
        },
        {
          "name": "forget",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise<void>"
        },
        {
          "name": "forgetScope",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise<number>"
        },
        {
          "name": "generateEmbeddings",
          "async": true,
          "params": [
            "options?: GenerateEmbeddingsOptions"
          ],
          "returns": "Promise<void>"
        },
        {
          "name": "getAiUsageSnapshot",
          "returns": "AiUsageSnapshot | undefined"
        },
        {
          "name": "getAvailableTools",
          "returns": "AITool[]"
        },
        {
          "name": "getEmbedding",
          "async": true,
          "params": [
            "fieldName: string",
            "model?: string"
          ],
          "returns": "Promise<number[] | null>"
        },
        {
          "name": "getFields",
          "async": true,
          "returns": "Promise<any>"
        },
        {
          "name": "getId",
          "async": true,
          "returns": "any"
        },
        {
          "name": "getProviderMetadata",
          "returns": "Record<string>"
        },
        {
          "name": "getRelated",
          "async": true,
          "params": [
            "fieldName: string",
            "opts?: LoadRelatedOptions"
          ],
          "returns": "Promise<any>"
        },
        {
          "name": "getSavedId",
          "async": true,
          "returns": "any"
        },
        {
          "name": "getSlug",
          "async": true,
          "returns": "any"
        },
        {
          "name": "hasStaleEmbeddings",
          "async": true,
          "returns": "Promise<boolean>"
        },
        {
          "name": "initialize",
          "async": true,
          "returns": "Promise"
        },
        {
          "name": "is",
          "async": true,
          "params": [
            "criteria: string",
            "options?: AiOperationOptions"
          ],
          "returns": "any"
        },
        {
          "name": "isGA4",
          "returns": "boolean"
        },
        {
          "name": "isMatomo",
          "returns": "boolean"
        },
        {
          "name": "isPerformingWell",
          "async": true,
          "returns": "Promise<boolean>"
        },
        {
          "name": "isPlausible",
          "returns": "boolean"
        },
        {
          "name": "isRelatedLoaded",
          "params": [
            "fieldName: string"
          ],
          "returns": "boolean"
        },
        {
          "name": "isSaved",
          "async": true,
          "returns": "any"
        },
        {
          "name": "listAiUsage",
          "async": true,
          "params": [
            "options?: AiUsageListOptions"
          ],
          "returns": "Promise<SmrtAiUsageRecord[]>"
        },
        {
          "name": "loadDataFromDb",
          "async": true,
          "params": [
            "data: Record<string>"
          ],
          "returns": "any"
        },
        {
          "name": "loadFromId",
          "async": true,
          "returns": "any"
        },
        {
          "name": "loadFromSlug",
          "async": true,
          "returns": "any"
        },
        {
          "name": "loadRelated",
          "async": true,
          "params": [
            "fieldName: string",
            "opts?: LoadRelatedOptions"
          ],
          "returns": "Promise<any>"
        },
        {
          "name": "loadRelatedMany",
          "async": true,
          "params": [
            "fieldName: string",
            "opts?: LoadRelatedOptions"
          ],
          "returns": "Promise<any[]>"
        },
        {
          "name": "markAsPersisted",
          "returns": "void"
        },
        {
          "name": "markSynced",
          "returns": "void"
        },
        {
          "name": "recall",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise"
        },
        {
          "name": "recallAll",
          "async": true,
          "params": [
            "options?: object"
          ],
          "returns": "Promise<Map<string>>"
        },
        {
          "name": "remember",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise<void>"
        },
        {
          "name": "requireInsertOnSave",
          "returns": "void"
        },
        {
          "name": "resetAiUsage",
          "returns": "void"
        },
        {
          "name": "save",
          "async": true,
          "returns": "any"
        },
        {
          "name": "setProviderMetadata",
          "params": [
            "metadata: Record<string>"
          ],
          "returns": "void"
        },
        {
          "name": "summarizeAiUsage",
          "async": true,
          "params": [
            "options?: AiUsageSummaryOptions"
          ],
          "returns": "Promise<Record<string, AiUsageStats>>"
        },
        {
          "name": "toJSON",
          "returns": "any"
        },
        {
          "name": "toPlainObject",
          "returns": "Record<string>"
        },
        {
          "name": "toPublicJSON",
          "params": [
            "options?: PublicJsonOptions"
          ],
          "returns": "Record<string>"
        },
        {
          "name": "withDatabase",
          "async": true,
          "params": [
            "db: DatabaseInterface",
            "operation: Function"
          ],
          "returns": "Promise<T>"
        }
      ],
      "tenant": {
        "scoped": true,
        "mode": "optional",
        "field": "tenantId"
      },
      "tableStrategy": "sti",
      "conflictColumns": [
        "tenant_id",
        "slug",
        "context",
        "_meta_type"
      ],
      "surfaces": [
        {
          "kind": "api",
          "name": "analyticsproperties.list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty",
          "path": "/analyticsproperties",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "analyticsproperties.get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty",
          "path": "/analyticsproperties/[id]",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "analyticsproperties.create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty",
          "path": "/analyticsproperties",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "analyticsproperties.update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty",
          "path": "/analyticsproperties/[id]",
          "method": "PATCH"
        },
        {
          "kind": "cli",
          "name": "analyticsproperty_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
        },
        {
          "kind": "cli",
          "name": "analyticsproperty_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
        },
        {
          "kind": "cli",
          "name": "analyticsproperty_create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
        },
        {
          "kind": "cli",
          "name": "analyticsproperty_update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
        },
        {
          "kind": "cli",
          "name": "analyticsproperty_delete",
          "operation": "delete",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
        },
        {
          "kind": "mcp",
          "name": "analyticsproperty_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
        },
        {
          "kind": "mcp",
          "name": "analyticsproperty_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
        },
        {
          "kind": "mcp",
          "name": "analyticsproperty_sync",
          "operation": "sync",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
        },
        {
          "kind": "mcp",
          "name": "analyticsproperty_runReport",
          "operation": "runReport",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
        }
      ],
      "relationshipFeatures": [
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "AnalyticsReport",
      "qualifiedName": "@happyvertical/smrt-analytics:AnalyticsReport",
      "collection": "analyticsreports",
      "tableName": "analytics_reports",
      "packageName": "@happyvertical/smrt-analytics",
      "extends": "SmrtObject",
      "fields": [
        {
          "name": "created_at",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "updated_at",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "tenantId",
          "type": "text",
          "required": false,
          "columnType": "UUID"
        },
        {
          "name": "propertyId",
          "type": "foreignKey",
          "required": false,
          "related": "AnalyticsProperty",
          "columnType": "UUID"
        },
        {
          "name": "name",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "description",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "dimensions",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "[]"
        },
        {
          "name": "metrics",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "[]"
        },
        {
          "name": "dateRangeStart",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "7daysAgo"
        },
        {
          "name": "dateRangeEnd",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "today"
        },
        {
          "name": "dimensionFilter",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "metricFilter",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "orderBy",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "[]"
        },
        {
          "name": "maxResults",
          "type": "integer",
          "required": false,
          "columnType": "INTEGER",
          "default": 0
        },
        {
          "name": "status",
          "type": "text",
          "required": false,
          "columnType": "TEXT"
        },
        {
          "name": "frequency",
          "type": "text",
          "required": false,
          "columnType": "TEXT"
        },
        {
          "name": "lastRunAt",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "nextRunAt",
          "type": "datetime",
          "required": false,
          "columnType": "TIMESTAMP"
        },
        {
          "name": "resultData",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "rowCount",
          "type": "integer",
          "required": false,
          "columnType": "INTEGER",
          "default": 0
        },
        {
          "name": "lastError",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        }
      ],
      "relationships": [
        {
          "name": "propertyId",
          "type": "foreignKey",
          "required": false,
          "related": "AnalyticsProperty",
          "columnType": "UUID"
        }
      ],
      "methods": [
        "_setLoadedRelationship",
        "analyzeResults",
        "calculateNextRun",
        "classifyConstraintError",
        "clearEmbeddings",
        "delete",
        "describe",
        "destroy",
        "do",
        "executeToolCall",
        "forget",
        "forgetScope",
        "generateEmbeddings",
        "getAiUsageSnapshot",
        "getAvailableTools",
        "getDimensions",
        "getEmbedding",
        "getFields",
        "getId",
        "getMetrics",
        "getRelated",
        "getResultData",
        "getSavedId",
        "getSlug",
        "hasPositiveTrends",
        "hasStaleEmbeddings",
        "initialize",
        "is",
        "isDue",
        "isRelatedLoaded",
        "isSaved",
        "listAiUsage",
        "loadDataFromDb",
        "loadFromId",
        "loadFromSlug",
        "loadRelated",
        "loadRelatedMany",
        "markAsPersisted",
        "markCompleted",
        "markFailed",
        "markRunning",
        "recall",
        "recallAll",
        "remember",
        "requireInsertOnSave",
        "resetAiUsage",
        "save",
        "setDimensions",
        "setMetrics",
        "setResultData",
        "summarizeAiUsage",
        "toJSON",
        "toPlainObject",
        "toPublicJSON",
        "withDatabase"
      ],
      "methodSignatures": [
        {
          "name": "_setLoadedRelationship",
          "params": [
            "fieldName: string",
            "value: any"
          ],
          "returns": "void"
        },
        {
          "name": "analyzeResults",
          "async": true,
          "params": [
            "_options?: Record<string>"
          ],
          "returns": "Promise<object>"
        },
        {
          "name": "calculateNextRun",
          "returns": "void"
        },
        {
          "name": "classifyConstraintError",
          "static": true,
          "params": [
            "message: string"
          ],
          "returns": "'unique' | 'not_null' | null"
        },
        {
          "name": "clearEmbeddings",
          "async": true,
          "returns": "Promise<void>"
        },
        {
          "name": "delete",
          "async": true,
          "returns": "Promise<void>"
        },
        {
          "name": "describe",
          "async": true,
          "params": [
            "options?: AiOperationOptions"
          ],
          "returns": "any"
        },
        {
          "name": "destroy",
          "returns": "void"
        },
        {
          "name": "do",
          "async": true,
          "params": [
            "instructions: string",
            "options?: AiOperationOptions"
          ],
          "returns": "any"
        },
        {
          "name": "executeToolCall",
          "async": true,
          "params": [
            "toolCall: ToolCall"
          ],
          "returns": "Promise<ToolCallResult>"
        },
        {
          "name": "forget",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise<void>"
        },
        {
          "name": "forgetScope",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise<number>"
        },
        {
          "name": "generateEmbeddings",
          "async": true,
          "params": [
            "options?: GenerateEmbeddingsOptions"
          ],
          "returns": "Promise<void>"
        },
        {
          "name": "getAiUsageSnapshot",
          "returns": "AiUsageSnapshot | undefined"
        },
        {
          "name": "getAvailableTools",
          "returns": "AITool[]"
        },
        {
          "name": "getDimensions",
          "returns": "Array<object>"
        },
        {
          "name": "getEmbedding",
          "async": true,
          "params": [
            "fieldName: string",
            "model?: string"
          ],
          "returns": "Promise<number[] | null>"
        },
        {
          "name": "getFields",
          "async": true,
          "returns": "Promise<any>"
        },
        {
          "name": "getId",
          "async": true,
          "returns": "any"
        },
        {
          "name": "getMetrics",
          "returns": "Array<object>"
        },
        {
          "name": "getRelated",
          "async": true,
          "params": [
            "fieldName: string",
            "opts?: LoadRelatedOptions"
          ],
          "returns": "Promise<any>"
        },
        {
          "name": "getResultData",
          "returns": "Record<string> | null"
        },
        {
          "name": "getSavedId",
          "async": true,
          "returns": "any"
        },
        {
          "name": "getSlug",
          "async": true,
          "returns": "any"
        },
        {
          "name": "hasPositiveTrends",
          "async": true,
          "returns": "Promise<boolean>"
        },
        {
          "name": "hasStaleEmbeddings",
          "async": true,
          "returns": "Promise<boolean>"
        },
        {
          "name": "initialize",
          "async": true,
          "returns": "Promise"
        },
        {
          "name": "is",
          "async": true,
          "params": [
            "criteria: string",
            "options?: AiOperationOptions"
          ],
          "returns": "any"
        },
        {
          "name": "isDue",
          "returns": "boolean"
        },
        {
          "name": "isRelatedLoaded",
          "params": [
            "fieldName: string"
          ],
          "returns": "boolean"
        },
        {
          "name": "isSaved",
          "async": true,
          "returns": "any"
        },
        {
          "name": "listAiUsage",
          "async": true,
          "params": [
            "options?: AiUsageListOptions"
          ],
          "returns": "Promise<SmrtAiUsageRecord[]>"
        },
        {
          "name": "loadDataFromDb",
          "async": true,
          "params": [
            "data: Record<string>"
          ],
          "returns": "any"
        },
        {
          "name": "loadFromId",
          "async": true,
          "returns": "any"
        },
        {
          "name": "loadFromSlug",
          "async": true,
          "returns": "any"
        },
        {
          "name": "loadRelated",
          "async": true,
          "params": [
            "fieldName: string",
            "opts?: LoadRelatedOptions"
          ],
          "returns": "Promise<any>"
        },
        {
          "name": "loadRelatedMany",
          "async": true,
          "params": [
            "fieldName: string",
            "opts?: LoadRelatedOptions"
          ],
          "returns": "Promise<any[]>"
        },
        {
          "name": "markAsPersisted",
          "returns": "void"
        },
        {
          "name": "markCompleted",
          "params": [
            "rowCount: number"
          ],
          "returns": "void"
        },
        {
          "name": "markFailed",
          "params": [
            "error: string"
          ],
          "returns": "void"
        },
        {
          "name": "markRunning",
          "returns": "void"
        },
        {
          "name": "recall",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise"
        },
        {
          "name": "recallAll",
          "async": true,
          "params": [
            "options?: object"
          ],
          "returns": "Promise<Map<string>>"
        },
        {
          "name": "remember",
          "async": true,
          "params": [
            "options: object"
          ],
          "returns": "Promise<void>"
        },
        {
          "name": "requireInsertOnSave",
          "returns": "void"
        },
        {
          "name": "resetAiUsage",
          "returns": "void"
        },
        {
          "name": "save",
          "async": true,
          "returns": "any"
        },
        {
          "name": "setDimensions",
          "params": [
            "dimensions: Array<object>"
          ],
          "returns": "void"
        },
        {
          "name": "setMetrics",
          "params": [
            "metrics: Array<object>"
          ],
          "returns": "void"
        },
        {
          "name": "setResultData",
          "params": [
            "data: Record<string>"
          ],
          "returns": "void"
        },
        {
          "name": "summarizeAiUsage",
          "async": true,
          "params": [
            "options?: AiUsageSummaryOptions"
          ],
          "returns": "Promise<Record<string, AiUsageStats>>"
        },
        {
          "name": "toJSON",
          "returns": "any"
        },
        {
          "name": "toPlainObject",
          "returns": "Record<string>"
        },
        {
          "name": "toPublicJSON",
          "params": [
            "options?: PublicJsonOptions"
          ],
          "returns": "Record<string>"
        },
        {
          "name": "withDatabase",
          "async": true,
          "params": [
            "db: DatabaseInterface",
            "operation: Function"
          ],
          "returns": "Promise<T>"
        }
      ],
      "tenant": {
        "scoped": true,
        "mode": "optional",
        "field": "tenantId"
      },
      "tableStrategy": "sti",
      "conflictColumns": [
        "tenant_id",
        "slug",
        "context",
        "_meta_type"
      ],
      "surfaces": [
        {
          "kind": "api",
          "name": "analyticsreports.list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsReport",
          "path": "/analyticsreports",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "analyticsreports.get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsReport",
          "path": "/analyticsreports/[id]",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "analyticsreports.create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsReport",
          "path": "/analyticsreports",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "analyticsreports.update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsReport",
          "path": "/analyticsreports/[id]",
          "method": "PATCH"
        },
        {
          "kind": "api",
          "name": "analyticsreports.run",
          "operation": "run",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsReport",
          "path": "/analyticsreports/run",
          "method": "POST"
        },
        {
          "kind": "cli",
          "name": "analyticsreport_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
        },
        {
          "kind": "cli",
          "name": "analyticsreport_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
        },
        {
          "kind": "cli",
          "name": "analyticsreport_create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
        },
        {
          "kind": "cli",
          "name": "analyticsreport_update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
        },
        {
          "kind": "cli",
          "name": "analyticsreport_delete",
          "operation": "delete",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
        },
        {
          "kind": "mcp",
          "name": "analyticsreport_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
        },
        {
          "kind": "mcp",
          "name": "analyticsreport_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
        },
        {
          "kind": "mcp",
          "name": "analyticsreport_run",
          "operation": "run",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
        },
        {
          "kind": "mcp",
          "name": "analyticsreport_analyze",
          "operation": "analyze",
          "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
        }
      ],
      "relationshipFeatures": [
        "foreignKey",
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    }
  ],
  "surfaces": [
    {
      "kind": "api",
      "name": "analyticsdatastreams.list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream",
      "path": "/analyticsdatastreams",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "analyticsdatastreams.get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream",
      "path": "/analyticsdatastreams/[id]",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "analyticsdatastreams.create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream",
      "path": "/analyticsdatastreams",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "analyticsdatastreams.update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream",
      "path": "/analyticsdatastreams/[id]",
      "method": "PATCH"
    },
    {
      "kind": "cli",
      "name": "analyticsdatastream_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream"
    },
    {
      "kind": "cli",
      "name": "analyticsdatastream_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream"
    },
    {
      "kind": "cli",
      "name": "analyticsdatastream_create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream"
    },
    {
      "kind": "cli",
      "name": "analyticsdatastream_update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream"
    },
    {
      "kind": "cli",
      "name": "analyticsdatastream_delete",
      "operation": "delete",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream"
    },
    {
      "kind": "mcp",
      "name": "analyticsdatastream_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream"
    },
    {
      "kind": "mcp",
      "name": "analyticsdatastream_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsDataStream"
    },
    {
      "kind": "api",
      "name": "analyticsevents.list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent",
      "path": "/analyticsevents",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "analyticsevents.get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent",
      "path": "/analyticsevents/[id]",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "analyticsevents.create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent",
      "path": "/analyticsevents",
      "method": "POST"
    },
    {
      "kind": "cli",
      "name": "analyticsevent_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
    },
    {
      "kind": "cli",
      "name": "analyticsevent_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
    },
    {
      "kind": "cli",
      "name": "analyticsevent_create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
    },
    {
      "kind": "cli",
      "name": "analyticsevent_update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
    },
    {
      "kind": "cli",
      "name": "analyticsevent_delete",
      "operation": "delete",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
    },
    {
      "kind": "mcp",
      "name": "analyticsevent_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
    },
    {
      "kind": "mcp",
      "name": "analyticsevent_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
    },
    {
      "kind": "mcp",
      "name": "analyticsevent_track",
      "operation": "track",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsEvent"
    },
    {
      "kind": "api",
      "name": "analyticsproperties.list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty",
      "path": "/analyticsproperties",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "analyticsproperties.get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty",
      "path": "/analyticsproperties/[id]",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "analyticsproperties.create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty",
      "path": "/analyticsproperties",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "analyticsproperties.update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty",
      "path": "/analyticsproperties/[id]",
      "method": "PATCH"
    },
    {
      "kind": "cli",
      "name": "analyticsproperty_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
    },
    {
      "kind": "cli",
      "name": "analyticsproperty_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
    },
    {
      "kind": "cli",
      "name": "analyticsproperty_create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
    },
    {
      "kind": "cli",
      "name": "analyticsproperty_update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
    },
    {
      "kind": "cli",
      "name": "analyticsproperty_delete",
      "operation": "delete",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
    },
    {
      "kind": "mcp",
      "name": "analyticsproperty_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
    },
    {
      "kind": "mcp",
      "name": "analyticsproperty_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
    },
    {
      "kind": "mcp",
      "name": "analyticsproperty_sync",
      "operation": "sync",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
    },
    {
      "kind": "mcp",
      "name": "analyticsproperty_runReport",
      "operation": "runReport",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsProperty"
    },
    {
      "kind": "api",
      "name": "analyticsreports.list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsReport",
      "path": "/analyticsreports",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "analyticsreports.get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsReport",
      "path": "/analyticsreports/[id]",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "analyticsreports.create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsReport",
      "path": "/analyticsreports",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "analyticsreports.update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsReport",
      "path": "/analyticsreports/[id]",
      "method": "PATCH"
    },
    {
      "kind": "api",
      "name": "analyticsreports.run",
      "operation": "run",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsReport",
      "path": "/analyticsreports/run",
      "method": "POST"
    },
    {
      "kind": "cli",
      "name": "analyticsreport_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
    },
    {
      "kind": "cli",
      "name": "analyticsreport_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
    },
    {
      "kind": "cli",
      "name": "analyticsreport_create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
    },
    {
      "kind": "cli",
      "name": "analyticsreport_update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
    },
    {
      "kind": "cli",
      "name": "analyticsreport_delete",
      "operation": "delete",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
    },
    {
      "kind": "mcp",
      "name": "analyticsreport_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
    },
    {
      "kind": "mcp",
      "name": "analyticsreport_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
    },
    {
      "kind": "mcp",
      "name": "analyticsreport_run",
      "operation": "run",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
    },
    {
      "kind": "mcp",
      "name": "analyticsreport_analyze",
      "operation": "analyze",
      "objectName": "@happyvertical/smrt-analytics:AnalyticsReport"
    }
  ],
  "prompts": [
    {
      "filePath": "src/prompts.ts"
    }
  ],
  "relationshipsV2": {
    "foreignKeyFields": 3,
    "crossPackageRefFields": 0,
    "junctionCollections": 0,
    "hierarchicalObjects": 0,
    "polymorphicAssociations": 0,
    "uuidColumns": 15
  },
  "agentDoc": "# @happyvertical/smrt-analytics\n\nGA4/Plausible/Matomo analytics integration with server-side event tracking and AI-powered reporting.\n\n## Models\n\n- **AnalyticsProperty**: GA4 property, Plausible site, or Matomo site. Provider metadata, status, sync timestamps.\n- **AnalyticsDataStream**: web/iOS/Android data streams. Measurement IDs (G-XXXXXX for GA4, Firebase app ID for mobile).\n- **AnalyticsEvent**: tracked events with params (JSON), retry queue, conversion classification.\n- **AnalyticsReport**: saved report configs with dimensions/metrics (JSON), scheduling (daily/weekly/monthly), result caching.\n\nAll models use STI (`tableStrategy: 'sti'`).\n\nAll four persisted models are `@TenantScoped({ mode: 'optional' })` with a nullable `tenantId` (#1410), matching the framework convention used by sibling domain packages (ads/jobs/commerce). **When a tenant context is active**, the interceptor auto-filters `list`/`get`/raw reads and binds `create`/`save` writes to that tenant, keeping one tenant's properties, data streams, events (end-user PII), and cached report rows from reaching another. Because the mode is `optional`, the interceptor intentionally passes **through unfiltered when no tenant context is established** — so a surface is only safe insofar as it establishes tenant context first. Generated SvelteKit routes do this (#1540); the CLI/MCP code paths do not yet, which is a known framework-level residual (fail-closed tenant context for CLI/MCP) tracked outside this package, not an analytics-specific gap.\n\n## Key Collection Methods\n\n`findByExternalId()`, `findByProvider()`, `findNeedingSync()`, `findGA4Properties()`, `findPlausibleSites()`, `findMatomoSites()`\n\n## AI Operations\n\n`analyzePerformance()`, `analyzeResults()`, `hasPositiveTrends()` route through registered prompts (see Prompt Registry below) so tenant overrides apply via `resolvePrompt()`. `isPerformingWell()` still uses the inline `is()` shortcut.\n\n## Prompt Registry\n\nThree prompts are registered at module-load time via `definePrompt()` from `@happyvertical/smrt-prompts`. Re-exported from the package root for tenant override targeting.\n\n| Key | Method | Variables (PII-conscious) |\n|-----|--------|---------------------------|\n| `smrtAnalytics.property.analyzePerformance` | `AnalyticsProperty.analyzePerformance()` | `period`, `propertyDisplayName`, `propertyProvider` |\n| `smrtAnalytics.report.analyzeResults` | `AnalyticsReport.analyzeResults()` | `reportName`, `reportDimensions`, `reportMetrics`, `dateRangeStart`, `dateRangeEnd`, `rowCount`, `reportData` |\n| `smrtAnalytics.report.hasPositiveTrends` | `AnalyticsReport.hasPositiveTrends()` | `reportMetrics`, `reportData` |\n\n**Excluded from variables (never reach the AI provider):**\n- `id`, `propertyId`, `tenantId`, `externalId` — internal foreign keys / UUIDs that link to identifying records.\n- `apiSecret`, `measurementId`, `siteDomain` — provider credentials and platform-specific identifiers (GA4 API secrets, Matomo `idSite`, custom `G-XXXX` measurement IDs).\n- `providerMetadata` — extensible JSON blob that may contain credentials, account IDs, or other configuration secrets.\n- `lastError`, raw `dimensionFilter` / `metricFilter` JSON — internal error strings (may contain auth tokens) and filter expressions that may reference cookie IDs, user-pseudo-IDs, or IP-derived geos.\n\n**`resultData` is forwarded verbatim.** This package does not — and cannot — strip PII from result rows, because the row schema is determined by the dimensions/metrics the caller asked the analytics provider to return. If the caller persists rows containing a `userPseudoId`, `clientId`, IP-derived geolocation, or any other identifier, those fields WILL reach the AI provider. Callers must:\n\n- exclude PII-bearing dimensions before persisting `resultData` (e.g. don't request `userPseudoId` as a GA4 dimension), or\n- apply a column allowlist at the call site before invoking `analyzeResults()`, or\n- override the prompt template via `PromptOverride` to redact rows.\n\nThe forwarding contract is pinned by a regression test in `src/__tests__/analytics-report-prompt.test.ts`.\n\nSee `src/prompts.ts` for the full rationale block.\n\n## UI Registry\n\nSvelte components live in `src/svelte/` and auto-register with `ModuleUIRegistry` from `@happyvertical/smrt-ui/registry` when `@happyvertical/smrt-analytics/svelte` is imported.\n\nSlot declarations live in `src/ui.ts`, exported via the `./ui` package subpath. The slots are: `analytics-summary`, `events-table`, `property-info`, `property-status-badge`, `stat-card`, `trend-badge` (see `ANALYTICS_UI_SLOTS` for icons / categories / display order).\n\n```typescript\nimport '@happyvertical/smrt-analytics/svelte'; // side-effect: registers slots\nimport { ModuleUIRegistry } from '@happyvertical/smrt-ui/registry';\nconst StatCard = ModuleUIRegistry.get('@happyvertical/smrt-analytics', 'stat-card');\n```\n\n## Gotchas\n\n- **`apiSecret` / `providerMetadata` stripped from API/MCP**: marked `@field({ sensitive: true })` (#1540) so they never appear in generated responses or `where` filters. They are still stored at rest **unencrypted** — envelope encryption via `@happyvertical/smrt-secrets` is a separate, breaking follow-up (tracked, not done here).\n- **Event retry at model level**: no background job integration\n- **JSON fields**: params, dimensions, metrics use string storage with getter/setter helpers\n- **Measurement IDs differ per platform**: G-XXXXXX (GA4 web) vs Firebase app ID (mobile)\n- **`analyzeResults` is now a single AI call**: previously issued a second freeform `do()` to summarize \"top 3 insights\"; folded into the registered template, and `insights` mirrors `analysis` in the response shape.\n"
}