@happyvertical/smrt-sites 0.60.9 → 0.60.11

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/AGENTS.md CHANGED
@@ -16,3 +16,4 @@ Stateless lifecycle ops: `activate()`, `suspend()`, `archive()`. `bindAgent()` h
16
16
  - **Required tenancy**: both models use `@TenantScoped({ mode: 'required' })` — must have tenant context
17
17
  - **portalConfig accepts both object and JSON string** in constructor
18
18
  - **SiteAgentBinding.config is nullable**: auto-parsed from JSON on init
19
+ - **Status tracking only; nothing is provisioned here**: `markProvisioned()` / `markProvisioningFailed()` record `provisioningStatus` for a host that does the real provisioning and deployment (infrastructure, credentials, content UI)
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ObjectRegistry, SmrtCollection, SmrtObject, foreignKey, smrt } from "@happyvertical/smrt-core";
2
2
  import { TenantScoped, tenantId } from "@happyvertical/smrt-tenancy";
3
3
  //#region src/__smrt-register__.ts
4
- ObjectRegistry.registerPackageManifest(JSON.parse(`{"version":"1.0.0","timestamp":0,"packageName":"@happyvertical/smrt-sites","packageVersion":"0.60.9","objects":{"@happyvertical/smrt-sites:SiteAgentBindingCollection":{"name":"siteagentbindingcollection","className":"SiteAgentBindingCollection","qualifiedName":"@happyvertical/smrt-sites:SiteAgentBindingCollection","collection":"siteagentbindings","filePath":"/home/runner/work/smrt/smrt/packages/sites/src/collections/SiteAgentBindingCollection.ts","packageName":"@happyvertical/smrt-sites","fields":{},"methods":{"findBySite":{"name":"findBySite","async":true,"parameters":[{"name":"siteId","type":"string","optional":false}],"returnType":"Promise<SiteAgentBinding[]>","isStatic":false,"isPublic":true},"findByAgent":{"name":"findByAgent","async":true,"parameters":[{"name":"agentClass","type":"string","optional":false}],"returnType":"Promise<SiteAgentBinding[]>","isStatic":false,"isPublic":true},"findEnabled":{"name":"findEnabled","async":true,"parameters":[{"name":"siteId","type":"string","optional":false}],"returnType":"Promise<SiteAgentBinding[]>","isStatic":false,"isPublic":true},"findBySiteAndAgent":{"name":"findBySiteAndAgent","async":true,"parameters":[{"name":"siteId","type":"string","optional":false},{"name":"agentClass","type":"string","optional":false}],"returnType":"Promise<SiteAgentBinding | null>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"site_agent_bindings","api":{"include":["list","get","create","update","delete"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]}},"extends":"SmrtCollection","extendsTypeArg":"SiteAgentBinding","exportName":"SiteAgentBindingCollection","collectionExportName":"SiteAgentBindingCollectionCollection","collectionOf":"@happyvertical/smrt-sites:SiteAgentBinding","inheritedExposure":["api","mcp","cli"],"schema":{"tableName":"site_agent_bindings","ddl":"CREATE TABLE IF NOT EXISTS \\"site_agent_bindings\\" (\\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 \\"site_id\\" UUID,\\n \\"agent_class\\" TEXT DEFAULT '',\\n \\"enabled\\" BOOLEAN DEFAULT TRUE,\\n \\"config\\" JSON DEFAULT '{}',\\n \\"priority\\" INTEGER DEFAULT 0\\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},"site_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"sites","column":"id","onDelete":"CASCADE","onUpdate":"CASCADE"}},"agent_class":{"type":"TEXT","notNull":false,"unique":false,"default":""},"enabled":{"type":"BOOLEAN","notNull":false,"unique":false,"default":true},"config":{"type":"JSON","notNull":false,"unique":false,"default":{}},"priority":{"type":"INTEGER","notNull":false,"unique":false,"default":0}},"indexes":[{"name":"site_agent_bindings_site_id_agent_class_idx","columns":["site_id","agent_class"],"unique":true,"nullsNotDistinct":true},{"name":"site_agent_bindings_slug_context_idx","columns":["slug","context"]},{"name":"site_agent_bindings_tenant_id_created_at_idx","columns":["tenant_id","created_at"]}],"version":"dec43c9c"},"importPath":"@happyvertical/smrt-sites"},"@happyvertical/smrt-sites:SiteCollection":{"name":"sitecollection","className":"SiteCollection","qualifiedName":"@happyvertical/smrt-sites:SiteCollection","collection":"sites","filePath":"/home/runner/work/smrt/smrt/packages/sites/src/collections/SiteCollection.ts","packageName":"@happyvertical/smrt-sites","fields":{},"methods":{"findByDomain":{"name":"findByDomain","async":true,"parameters":[{"name":"domain","type":"string","optional":false}],"returnType":"Promise<Site | null>","isStatic":false,"isPublic":true},"findByTenant":{"name":"findByTenant","async":true,"parameters":[{"name":"tenantId","type":"string","optional":false}],"returnType":"Promise<Site[]>","isStatic":false,"isPublic":true},"findByStatus":{"name":"findByStatus","async":true,"parameters":[{"name":"status","type":"SiteStatus","optional":false}],"returnType":"Promise<Site[]>","isStatic":false,"isPublic":true},"findActive":{"name":"findActive","async":true,"parameters":[],"returnType":"Promise<Site[]>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"sites","api":{"include":["list","get","create","update","delete"]},"mcp":{"include":["list","get","create","update"]}},"extends":"SmrtCollection","extendsTypeArg":"Site","exportName":"SiteCollection","collectionExportName":"SiteCollectionCollection","collectionOf":"@happyvertical/smrt-sites:Site","inheritedExposure":["api","mcp"],"schema":{"tableName":"sites","ddl":"CREATE TABLE IF NOT EXISTS \\"sites\\" (\\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 \\"domain\\" TEXT DEFAULT '',\\n \\"status\\" TEXT DEFAULT 'draft',\\n \\"tier\\" TEXT DEFAULT 'free',\\n \\"database_url\\" TEXT DEFAULT '',\\n \\"database_type\\" TEXT DEFAULT '',\\n \\"portal_config\\" TEXT DEFAULT '',\\n \\"repository_url\\" TEXT DEFAULT '',\\n \\"template_name\\" TEXT DEFAULT '',\\n \\"provisioning_status\\" TEXT DEFAULT '',\\n \\"provisioned_at\\" TIMESTAMP,\\n \\"provisioning_error\\" 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},"name":{"type":"TEXT","notNull":false,"unique":false,"default":""},"domain":{"type":"TEXT","notNull":false,"unique":false,"default":""},"status":{"type":"TEXT","notNull":false,"unique":false,"default":"draft"},"tier":{"type":"TEXT","notNull":false,"unique":false,"default":"free"},"database_url":{"type":"TEXT","notNull":false,"unique":false,"default":""},"database_type":{"type":"TEXT","notNull":false,"unique":false,"default":""},"portal_config":{"type":"TEXT","notNull":false,"unique":false,"default":""},"repository_url":{"type":"TEXT","notNull":false,"unique":false,"default":""},"template_name":{"type":"TEXT","notNull":false,"unique":false,"default":""},"provisioning_status":{"type":"TEXT","notNull":false,"unique":false,"default":""},"provisioned_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"provisioning_error":{"type":"TEXT","notNull":false,"unique":false,"default":""},"metadata":{"type":"TEXT","notNull":false,"unique":false,"default":""}},"indexes":[{"name":"sites_tenant_id_domain_idx","columns":["tenant_id","domain"],"unique":true,"nullsNotDistinct":true},{"name":"sites_slug_context_idx","columns":["slug","context"]},{"name":"sites_tenant_id_created_at_idx","columns":["tenant_id","created_at"]}],"version":"1845042e"},"importPath":"@happyvertical/smrt-sites"},"@happyvertical/smrt-sites:Site":{"name":"site","className":"Site","qualifiedName":"@happyvertical/smrt-sites:Site","collection":"sites","filePath":"/home/runner/work/smrt/smrt/packages/sites/src/models/Site.ts","packageName":"@happyvertical/smrt-sites","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":""},"domain":{"type":"text","required":false,"default":""},"status":{"type":"text","required":false,"default":"draft","enum":["draft","active","suspended","archived"]},"tier":{"type":"text","required":false,"default":"free","enum":["free","standard","premium"]},"databaseUrl":{"type":"text","required":false,"default":""},"databaseType":{"type":"text","required":false,"default":""},"portalConfig":{"type":"text","required":false,"default":""},"repositoryUrl":{"type":"text","required":false,"default":""},"templateName":{"type":"text","required":false,"default":""},"provisioningStatus":{"type":"text","required":false,"default":"","enum":["pending","provisioning","ready","failed",""]},"provisionedAt":{"type":"datetime","required":false},"provisioningError":{"type":"text","required":false,"default":""},"metadata":{"type":"text","required":false,"default":""},"createdAt":{"type":"datetime","required":false},"updatedAt":{"type":"datetime","required":false}},"methods":{"isActive":{"name":"isActive","async":false,"parameters":[],"returnType":"boolean","isStatic":false,"isPublic":true},"isReady":{"name":"isReady","async":false,"parameters":[],"returnType":"boolean","isStatic":false,"isPublic":true},"getPortalConfig":{"name":"getPortalConfig","async":false,"parameters":[],"returnType":"SitePortalConfig","isStatic":false,"isPublic":true},"setPortalConfig":{"name":"setPortalConfig","async":false,"parameters":[{"name":"config","type":"SitePortalConfig","optional":false}],"returnType":"void","isStatic":false,"isPublic":true},"getMetadata":{"name":"getMetadata","async":false,"parameters":[],"returnType":"Record<string, unknown>","isStatic":false,"isPublic":true},"setMetadata":{"name":"setMetadata","async":false,"parameters":[{"name":"data","type":"Record<string, unknown>","optional":false}],"returnType":"void","isStatic":false,"isPublic":true},"updateMetadata":{"name":"updateMetadata","async":false,"parameters":[{"name":"updates","type":"Record<string, unknown>","optional":false}],"returnType":"void","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"sites","api":{"include":["list","get","create","update","delete"]},"mcp":{"include":["list","get","create","update"]},"cli":{"skipApiCheck":true},"conflictColumns":["tenant_id","domain"],"tenantScoped":{"mode":"required"}},"extends":"SmrtObject","exportName":"Site","collectionExportName":"SiteCollection","displayLabelField":"name","validationRules":[],"schema":{"tableName":"sites","ddl":"CREATE TABLE IF NOT EXISTS \\"sites\\" (\\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 \\"domain\\" TEXT DEFAULT '',\\n \\"status\\" TEXT DEFAULT 'draft',\\n \\"tier\\" TEXT DEFAULT 'free',\\n \\"database_url\\" TEXT DEFAULT '',\\n \\"database_type\\" TEXT DEFAULT '',\\n \\"portal_config\\" TEXT DEFAULT '',\\n \\"repository_url\\" TEXT DEFAULT '',\\n \\"template_name\\" TEXT DEFAULT '',\\n \\"provisioning_status\\" TEXT DEFAULT '',\\n \\"provisioned_at\\" TIMESTAMP,\\n \\"provisioning_error\\" 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},"name":{"type":"TEXT","notNull":false,"unique":false,"default":""},"domain":{"type":"TEXT","notNull":false,"unique":false,"default":""},"status":{"type":"TEXT","notNull":false,"unique":false,"default":"draft"},"tier":{"type":"TEXT","notNull":false,"unique":false,"default":"free"},"database_url":{"type":"TEXT","notNull":false,"unique":false,"default":""},"database_type":{"type":"TEXT","notNull":false,"unique":false,"default":""},"portal_config":{"type":"TEXT","notNull":false,"unique":false,"default":""},"repository_url":{"type":"TEXT","notNull":false,"unique":false,"default":""},"template_name":{"type":"TEXT","notNull":false,"unique":false,"default":""},"provisioning_status":{"type":"TEXT","notNull":false,"unique":false,"default":""},"provisioned_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"provisioning_error":{"type":"TEXT","notNull":false,"unique":false,"default":""},"metadata":{"type":"TEXT","notNull":false,"unique":false,"default":""}},"indexes":[{"name":"sites_tenant_id_domain_idx","columns":["tenant_id","domain"],"unique":true,"nullsNotDistinct":true},{"name":"sites_slug_context_idx","columns":["slug","context"]},{"name":"sites_tenant_id_created_at_idx","columns":["tenant_id","created_at"]}],"version":"1845042e"},"importPath":"@happyvertical/smrt-sites"},"@happyvertical/smrt-sites:SiteAgentBinding":{"name":"siteagentbinding","className":"SiteAgentBinding","qualifiedName":"@happyvertical/smrt-sites:SiteAgentBinding","collection":"siteagentbindings","filePath":"/home/runner/work/smrt/smrt/packages/sites/src/models/SiteAgentBinding.ts","packageName":"@happyvertical/smrt-sites","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}}},"siteId":{"type":"foreignKey","required":false,"related":"Site"},"agentClass":{"type":"text","required":false,"default":""},"enabled":{"type":"boolean","required":false,"default":true},"config":{"type":"json","required":false,"default":{}},"priority":{"type":"integer","required":false,"default":0}},"methods":{},"decoratorConfig":{"tableName":"site_agent_bindings","api":{"include":["list","get","create","update","delete"]},"cli":{"include":["list","get"]},"mcp":{"include":["list","get"]},"conflictColumns":["site_id","agent_class"],"tenantScoped":{"mode":"required"}},"extends":"SmrtObject","exportName":"SiteAgentBinding","collectionExportName":"SiteAgentBindingCollection","validationRules":[],"schema":{"tableName":"site_agent_bindings","ddl":"CREATE TABLE IF NOT EXISTS \\"site_agent_bindings\\" (\\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 \\"site_id\\" UUID,\\n \\"agent_class\\" TEXT DEFAULT '',\\n \\"enabled\\" BOOLEAN DEFAULT TRUE,\\n \\"config\\" JSON DEFAULT '{}',\\n \\"priority\\" INTEGER DEFAULT 0\\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},"site_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"sites","column":"id","onDelete":"CASCADE","onUpdate":"CASCADE"}},"agent_class":{"type":"TEXT","notNull":false,"unique":false,"default":""},"enabled":{"type":"BOOLEAN","notNull":false,"unique":false,"default":true},"config":{"type":"JSON","notNull":false,"unique":false,"default":{}},"priority":{"type":"INTEGER","notNull":false,"unique":false,"default":0}},"indexes":[{"name":"site_agent_bindings_site_id_agent_class_idx","columns":["site_id","agent_class"],"unique":true,"nullsNotDistinct":true},{"name":"site_agent_bindings_slug_context_idx","columns":["slug","context"]},{"name":"site_agent_bindings_tenant_id_created_at_idx","columns":["tenant_id","created_at"]}],"version":"dec43c9c"},"importPath":"@happyvertical/smrt-sites"}},"moduleType":"smrt","smrtDependencies":["@happyvertical/smrt-core","@happyvertical/smrt-tenancy"],"browser":{"status":"server-only","issues":["#3624"],"via":["@happyvertical/smrt-tenancy"]},"stampsConstructors":true}`));
4
+ ObjectRegistry.registerPackageManifest(JSON.parse(`{"version":"1.0.0","timestamp":0,"packageName":"@happyvertical/smrt-sites","packageVersion":"0.60.11","objects":{"@happyvertical/smrt-sites:SiteAgentBindingCollection":{"name":"siteagentbindingcollection","className":"SiteAgentBindingCollection","qualifiedName":"@happyvertical/smrt-sites:SiteAgentBindingCollection","collection":"siteagentbindings","filePath":"/home/runner/work/smrt/smrt/packages/sites/src/collections/SiteAgentBindingCollection.ts","packageName":"@happyvertical/smrt-sites","fields":{},"methods":{"findBySite":{"name":"findBySite","async":true,"parameters":[{"name":"siteId","type":"string","optional":false}],"returnType":"Promise<SiteAgentBinding[]>","isStatic":false,"isPublic":true},"findByAgent":{"name":"findByAgent","async":true,"parameters":[{"name":"agentClass","type":"string","optional":false}],"returnType":"Promise<SiteAgentBinding[]>","isStatic":false,"isPublic":true},"findEnabled":{"name":"findEnabled","async":true,"parameters":[{"name":"siteId","type":"string","optional":false}],"returnType":"Promise<SiteAgentBinding[]>","isStatic":false,"isPublic":true},"findBySiteAndAgent":{"name":"findBySiteAndAgent","async":true,"parameters":[{"name":"siteId","type":"string","optional":false},{"name":"agentClass","type":"string","optional":false}],"returnType":"Promise<SiteAgentBinding | null>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"site_agent_bindings","api":{"include":["list","get","create","update","delete"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]}},"extends":"SmrtCollection","extendsTypeArg":"SiteAgentBinding","exportName":"SiteAgentBindingCollection","collectionExportName":"SiteAgentBindingCollectionCollection","collectionOf":"@happyvertical/smrt-sites:SiteAgentBinding","inheritedExposure":["api","mcp","cli"],"schema":{"tableName":"site_agent_bindings","ddl":"CREATE TABLE IF NOT EXISTS \\"site_agent_bindings\\" (\\n \\"_sync_origin_device_id\\" TEXT,\\n \\"_sync_revision\\" INTEGER,\\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 \\"site_id\\" UUID,\\n \\"agent_class\\" TEXT DEFAULT '',\\n \\"enabled\\" BOOLEAN DEFAULT TRUE,\\n \\"config\\" JSON DEFAULT '{}',\\n \\"priority\\" INTEGER DEFAULT 0\\n);","columns":{"_sync_origin_device_id":{"type":"TEXT"},"_sync_revision":{"type":"INTEGER"},"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},"site_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"sites","column":"id","onDelete":"CASCADE","onUpdate":"CASCADE"}},"agent_class":{"type":"TEXT","notNull":false,"unique":false,"default":""},"enabled":{"type":"BOOLEAN","notNull":false,"unique":false,"default":true},"config":{"type":"JSON","notNull":false,"unique":false,"default":{}},"priority":{"type":"INTEGER","notNull":false,"unique":false,"default":0}},"indexes":[{"name":"site_agent_bindings_site_id_agent_class_idx","columns":["site_id","agent_class"],"unique":true,"nullsNotDistinct":true},{"name":"site_agent_bindings_slug_context_idx","columns":["slug","context"]},{"name":"site_agent_bindings_tenant_id_created_at_idx","columns":["tenant_id","created_at"]}],"version":"a739eab3"},"importPath":"@happyvertical/smrt-sites"},"@happyvertical/smrt-sites:SiteCollection":{"name":"sitecollection","className":"SiteCollection","qualifiedName":"@happyvertical/smrt-sites:SiteCollection","collection":"sites","filePath":"/home/runner/work/smrt/smrt/packages/sites/src/collections/SiteCollection.ts","packageName":"@happyvertical/smrt-sites","fields":{},"methods":{"findByDomain":{"name":"findByDomain","async":true,"parameters":[{"name":"domain","type":"string","optional":false}],"returnType":"Promise<Site | null>","isStatic":false,"isPublic":true},"findByTenant":{"name":"findByTenant","async":true,"parameters":[{"name":"tenantId","type":"string","optional":false}],"returnType":"Promise<Site[]>","isStatic":false,"isPublic":true},"findByStatus":{"name":"findByStatus","async":true,"parameters":[{"name":"status","type":"SiteStatus","optional":false}],"returnType":"Promise<Site[]>","isStatic":false,"isPublic":true},"findActive":{"name":"findActive","async":true,"parameters":[],"returnType":"Promise<Site[]>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"sites","api":{"include":["list","get","create","update","delete"]},"mcp":{"include":["list","get","create","update"]}},"extends":"SmrtCollection","extendsTypeArg":"Site","exportName":"SiteCollection","collectionExportName":"SiteCollectionCollection","collectionOf":"@happyvertical/smrt-sites:Site","inheritedExposure":["api","mcp"],"schema":{"tableName":"sites","ddl":"CREATE TABLE IF NOT EXISTS \\"sites\\" (\\n \\"_sync_origin_device_id\\" TEXT,\\n \\"_sync_revision\\" INTEGER,\\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 \\"domain\\" TEXT DEFAULT '',\\n \\"status\\" TEXT DEFAULT 'draft',\\n \\"tier\\" TEXT DEFAULT 'free',\\n \\"database_url\\" TEXT DEFAULT '',\\n \\"database_type\\" TEXT DEFAULT '',\\n \\"portal_config\\" TEXT DEFAULT '',\\n \\"repository_url\\" TEXT DEFAULT '',\\n \\"template_name\\" TEXT DEFAULT '',\\n \\"provisioning_status\\" TEXT DEFAULT '',\\n \\"provisioned_at\\" TIMESTAMP,\\n \\"provisioning_error\\" TEXT DEFAULT '',\\n \\"metadata\\" TEXT DEFAULT ''\\n);","columns":{"_sync_origin_device_id":{"type":"TEXT"},"_sync_revision":{"type":"INTEGER"},"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":""},"domain":{"type":"TEXT","notNull":false,"unique":false,"default":""},"status":{"type":"TEXT","notNull":false,"unique":false,"default":"draft"},"tier":{"type":"TEXT","notNull":false,"unique":false,"default":"free"},"database_url":{"type":"TEXT","notNull":false,"unique":false,"default":""},"database_type":{"type":"TEXT","notNull":false,"unique":false,"default":""},"portal_config":{"type":"TEXT","notNull":false,"unique":false,"default":""},"repository_url":{"type":"TEXT","notNull":false,"unique":false,"default":""},"template_name":{"type":"TEXT","notNull":false,"unique":false,"default":""},"provisioning_status":{"type":"TEXT","notNull":false,"unique":false,"default":""},"provisioned_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"provisioning_error":{"type":"TEXT","notNull":false,"unique":false,"default":""},"metadata":{"type":"TEXT","notNull":false,"unique":false,"default":""}},"indexes":[{"name":"sites_tenant_id_domain_idx","columns":["tenant_id","domain"],"unique":true,"nullsNotDistinct":true},{"name":"sites_slug_context_idx","columns":["slug","context"]},{"name":"sites_tenant_id_created_at_idx","columns":["tenant_id","created_at"]}],"version":"e8449af3"},"importPath":"@happyvertical/smrt-sites"},"@happyvertical/smrt-sites:Site":{"name":"site","className":"Site","qualifiedName":"@happyvertical/smrt-sites:Site","collection":"sites","filePath":"/home/runner/work/smrt/smrt/packages/sites/src/models/Site.ts","packageName":"@happyvertical/smrt-sites","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":""},"domain":{"type":"text","required":false,"default":""},"status":{"type":"text","required":false,"default":"draft","enum":["draft","active","suspended","archived"]},"tier":{"type":"text","required":false,"default":"free","enum":["free","standard","premium"]},"databaseUrl":{"type":"text","required":false,"default":""},"databaseType":{"type":"text","required":false,"default":""},"portalConfig":{"type":"text","required":false,"default":""},"repositoryUrl":{"type":"text","required":false,"default":""},"templateName":{"type":"text","required":false,"default":""},"provisioningStatus":{"type":"text","required":false,"default":"","enum":["pending","provisioning","ready","failed",""]},"provisionedAt":{"type":"datetime","required":false},"provisioningError":{"type":"text","required":false,"default":""},"metadata":{"type":"text","required":false,"default":""},"createdAt":{"type":"datetime","required":false},"updatedAt":{"type":"datetime","required":false}},"methods":{"isActive":{"name":"isActive","async":false,"parameters":[],"returnType":"boolean","isStatic":false,"isPublic":true},"isReady":{"name":"isReady","async":false,"parameters":[],"returnType":"boolean","isStatic":false,"isPublic":true},"getPortalConfig":{"name":"getPortalConfig","async":false,"parameters":[],"returnType":"SitePortalConfig","isStatic":false,"isPublic":true},"setPortalConfig":{"name":"setPortalConfig","async":false,"parameters":[{"name":"config","type":"SitePortalConfig","optional":false}],"returnType":"void","isStatic":false,"isPublic":true},"getMetadata":{"name":"getMetadata","async":false,"parameters":[],"returnType":"Record<string, unknown>","isStatic":false,"isPublic":true},"setMetadata":{"name":"setMetadata","async":false,"parameters":[{"name":"data","type":"Record<string, unknown>","optional":false}],"returnType":"void","isStatic":false,"isPublic":true},"updateMetadata":{"name":"updateMetadata","async":false,"parameters":[{"name":"updates","type":"Record<string, unknown>","optional":false}],"returnType":"void","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"sites","api":{"include":["list","get","create","update","delete"]},"mcp":{"include":["list","get","create","update"]},"cli":{"skipApiCheck":true},"conflictColumns":["tenant_id","domain"],"tenantScoped":{"mode":"required"}},"extends":"SmrtObject","exportName":"Site","collectionExportName":"SiteCollection","displayLabelField":"name","validationRules":[],"schema":{"tableName":"sites","ddl":"CREATE TABLE IF NOT EXISTS \\"sites\\" (\\n \\"_sync_origin_device_id\\" TEXT,\\n \\"_sync_revision\\" INTEGER,\\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 \\"domain\\" TEXT DEFAULT '',\\n \\"status\\" TEXT DEFAULT 'draft',\\n \\"tier\\" TEXT DEFAULT 'free',\\n \\"database_url\\" TEXT DEFAULT '',\\n \\"database_type\\" TEXT DEFAULT '',\\n \\"portal_config\\" TEXT DEFAULT '',\\n \\"repository_url\\" TEXT DEFAULT '',\\n \\"template_name\\" TEXT DEFAULT '',\\n \\"provisioning_status\\" TEXT DEFAULT '',\\n \\"provisioned_at\\" TIMESTAMP,\\n \\"provisioning_error\\" TEXT DEFAULT '',\\n \\"metadata\\" TEXT DEFAULT ''\\n);","columns":{"_sync_origin_device_id":{"type":"TEXT"},"_sync_revision":{"type":"INTEGER"},"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":""},"domain":{"type":"TEXT","notNull":false,"unique":false,"default":""},"status":{"type":"TEXT","notNull":false,"unique":false,"default":"draft"},"tier":{"type":"TEXT","notNull":false,"unique":false,"default":"free"},"database_url":{"type":"TEXT","notNull":false,"unique":false,"default":""},"database_type":{"type":"TEXT","notNull":false,"unique":false,"default":""},"portal_config":{"type":"TEXT","notNull":false,"unique":false,"default":""},"repository_url":{"type":"TEXT","notNull":false,"unique":false,"default":""},"template_name":{"type":"TEXT","notNull":false,"unique":false,"default":""},"provisioning_status":{"type":"TEXT","notNull":false,"unique":false,"default":""},"provisioned_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"provisioning_error":{"type":"TEXT","notNull":false,"unique":false,"default":""},"metadata":{"type":"TEXT","notNull":false,"unique":false,"default":""}},"indexes":[{"name":"sites_tenant_id_domain_idx","columns":["tenant_id","domain"],"unique":true,"nullsNotDistinct":true},{"name":"sites_slug_context_idx","columns":["slug","context"]},{"name":"sites_tenant_id_created_at_idx","columns":["tenant_id","created_at"]}],"version":"e8449af3"},"importPath":"@happyvertical/smrt-sites"},"@happyvertical/smrt-sites:SiteAgentBinding":{"name":"siteagentbinding","className":"SiteAgentBinding","qualifiedName":"@happyvertical/smrt-sites:SiteAgentBinding","collection":"siteagentbindings","filePath":"/home/runner/work/smrt/smrt/packages/sites/src/models/SiteAgentBinding.ts","packageName":"@happyvertical/smrt-sites","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}}},"siteId":{"type":"foreignKey","required":false,"related":"Site"},"agentClass":{"type":"text","required":false,"default":""},"enabled":{"type":"boolean","required":false,"default":true},"config":{"type":"json","required":false,"default":{}},"priority":{"type":"integer","required":false,"default":0}},"methods":{},"decoratorConfig":{"tableName":"site_agent_bindings","api":{"include":["list","get","create","update","delete"]},"cli":{"include":["list","get"]},"mcp":{"include":["list","get"]},"conflictColumns":["site_id","agent_class"],"tenantScoped":{"mode":"required"}},"extends":"SmrtObject","exportName":"SiteAgentBinding","collectionExportName":"SiteAgentBindingCollection","validationRules":[],"schema":{"tableName":"site_agent_bindings","ddl":"CREATE TABLE IF NOT EXISTS \\"site_agent_bindings\\" (\\n \\"_sync_origin_device_id\\" TEXT,\\n \\"_sync_revision\\" INTEGER,\\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 \\"site_id\\" UUID,\\n \\"agent_class\\" TEXT DEFAULT '',\\n \\"enabled\\" BOOLEAN DEFAULT TRUE,\\n \\"config\\" JSON DEFAULT '{}',\\n \\"priority\\" INTEGER DEFAULT 0\\n);","columns":{"_sync_origin_device_id":{"type":"TEXT"},"_sync_revision":{"type":"INTEGER"},"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},"site_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"sites","column":"id","onDelete":"CASCADE","onUpdate":"CASCADE"}},"agent_class":{"type":"TEXT","notNull":false,"unique":false,"default":""},"enabled":{"type":"BOOLEAN","notNull":false,"unique":false,"default":true},"config":{"type":"JSON","notNull":false,"unique":false,"default":{}},"priority":{"type":"INTEGER","notNull":false,"unique":false,"default":0}},"indexes":[{"name":"site_agent_bindings_site_id_agent_class_idx","columns":["site_id","agent_class"],"unique":true,"nullsNotDistinct":true},{"name":"site_agent_bindings_slug_context_idx","columns":["slug","context"]},{"name":"site_agent_bindings_tenant_id_created_at_idx","columns":["tenant_id","created_at"]}],"version":"a739eab3"},"importPath":"@happyvertical/smrt-sites"}},"moduleType":"smrt","smrtDependencies":["@happyvertical/smrt-core","@happyvertical/smrt-tenancy"],"browser":{"status":"server-only","issues":["#3624"],"via":["@happyvertical/smrt-tenancy"]},"stampsConstructors":true}`));
5
5
  //#endregion
6
6
  //#region src/models/SiteAgentBinding.ts
7
7
  var __defProp$1 = Object.defineProperty;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/__smrt-register__.ts","../src/models/SiteAgentBinding.ts","../src/collections/SiteAgentBindingCollection.ts","../src/models/Site.ts","../src/collections/SiteCollection.ts","../src/services/SiteService.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-sites\\\",\\\"packageVersion\\\":\\\"0.60.9\\\",\\\"objects\\\":{\\\"@happyvertical/smrt-sites:SiteAgentBindingCollection\\\":{\\\"name\\\":\\\"siteagentbindingcollection\\\",\\\"className\\\":\\\"SiteAgentBindingCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-sites:SiteAgentBindingCollection\\\",\\\"collection\\\":\\\"siteagentbindings\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/sites/src/collections/SiteAgentBindingCollection.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-sites\\\",\\\"fields\\\":{},\\\"methods\\\":{\\\"findBySite\\\":{\\\"name\\\":\\\"findBySite\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"siteId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<SiteAgentBinding[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findByAgent\\\":{\\\"name\\\":\\\"findByAgent\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"agentClass\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<SiteAgentBinding[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findEnabled\\\":{\\\"name\\\":\\\"findEnabled\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"siteId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<SiteAgentBinding[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findBySiteAndAgent\\\":{\\\"name\\\":\\\"findBySiteAndAgent\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"siteId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"agentClass\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<SiteAgentBinding | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"site_agent_bindings\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\",\\\"delete\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"SiteAgentBinding\\\",\\\"exportName\\\":\\\"SiteAgentBindingCollection\\\",\\\"collectionExportName\\\":\\\"SiteAgentBindingCollectionCollection\\\",\\\"collectionOf\\\":\\\"@happyvertical/smrt-sites:SiteAgentBinding\\\",\\\"inheritedExposure\\\":[\\\"api\\\",\\\"mcp\\\",\\\"cli\\\"],\\\"schema\\\":{\\\"tableName\\\":\\\"site_agent_bindings\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"site_agent_bindings\\\\\\\" (\\\\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 \\\\\\\"site_id\\\\\\\" UUID,\\\\n \\\\\\\"agent_class\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"enabled\\\\\\\" BOOLEAN DEFAULT TRUE,\\\\n \\\\\\\"config\\\\\\\" JSON DEFAULT '{}',\\\\n \\\\\\\"priority\\\\\\\" INTEGER DEFAULT 0\\\\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},\\\"site_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"sites\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"agent_class\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"enabled\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true},\\\"config\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":{}},\\\"priority\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"site_agent_bindings_site_id_agent_class_idx\\\",\\\"columns\\\":[\\\"site_id\\\",\\\"agent_class\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"site_agent_bindings_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"site_agent_bindings_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"dec43c9c\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-sites\\\"},\\\"@happyvertical/smrt-sites:SiteCollection\\\":{\\\"name\\\":\\\"sitecollection\\\",\\\"className\\\":\\\"SiteCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-sites:SiteCollection\\\",\\\"collection\\\":\\\"sites\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/sites/src/collections/SiteCollection.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-sites\\\",\\\"fields\\\":{},\\\"methods\\\":{\\\"findByDomain\\\":{\\\"name\\\":\\\"findByDomain\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"domain\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<Site | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findByTenant\\\":{\\\"name\\\":\\\"findByTenant\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"tenantId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<Site[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findByStatus\\\":{\\\"name\\\":\\\"findByStatus\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"status\\\",\\\"type\\\":\\\"SiteStatus\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<Site[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findActive\\\":{\\\"name\\\":\\\"findActive\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<Site[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"sites\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\",\\\"delete\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Site\\\",\\\"exportName\\\":\\\"SiteCollection\\\",\\\"collectionExportName\\\":\\\"SiteCollectionCollection\\\",\\\"collectionOf\\\":\\\"@happyvertical/smrt-sites:Site\\\",\\\"inheritedExposure\\\":[\\\"api\\\",\\\"mcp\\\"],\\\"schema\\\":{\\\"tableName\\\":\\\"sites\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"sites\\\\\\\" (\\\\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 \\\\\\\"domain\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft',\\\\n \\\\\\\"tier\\\\\\\" TEXT DEFAULT 'free',\\\\n \\\\\\\"database_url\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"database_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"portal_config\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"repository_url\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"template_name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provisioning_status\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provisioned_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"provisioning_error\\\\\\\" 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},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"domain\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"draft\\\"},\\\"tier\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"free\\\"},\\\"database_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"database_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"portal_config\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"repository_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"template_name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provisioning_status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provisioned_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"provisioning_error\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"sites_tenant_id_domain_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"domain\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"sites_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"sites_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"1845042e\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-sites\\\"},\\\"@happyvertical/smrt-sites:Site\\\":{\\\"name\\\":\\\"site\\\",\\\"className\\\":\\\"Site\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-sites:Site\\\",\\\"collection\\\":\\\"sites\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/sites/src/models/Site.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-sites\\\",\\\"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\\\":\\\"\\\"},\\\"domain\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"draft\\\",\\\"enum\\\":[\\\"draft\\\",\\\"active\\\",\\\"suspended\\\",\\\"archived\\\"]},\\\"tier\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"free\\\",\\\"enum\\\":[\\\"free\\\",\\\"standard\\\",\\\"premium\\\"]},\\\"databaseUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"databaseType\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"portalConfig\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"repositoryUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"templateName\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"provisioningStatus\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\",\\\"enum\\\":[\\\"pending\\\",\\\"provisioning\\\",\\\"ready\\\",\\\"failed\\\",\\\"\\\"]},\\\"provisionedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"provisioningError\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"createdAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updatedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"isActive\\\":{\\\"name\\\":\\\"isActive\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"boolean\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"isReady\\\":{\\\"name\\\":\\\"isReady\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"boolean\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getPortalConfig\\\":{\\\"name\\\":\\\"getPortalConfig\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"SitePortalConfig\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setPortalConfig\\\":{\\\"name\\\":\\\"setPortalConfig\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"config\\\",\\\"type\\\":\\\"SitePortalConfig\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getMetadata\\\":{\\\"name\\\":\\\"getMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setMetadata\\\":{\\\"name\\\":\\\"setMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"data\\\",\\\"type\\\":\\\"Record<string, unknown>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"updateMetadata\\\":{\\\"name\\\":\\\"updateMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"updates\\\",\\\"type\\\":\\\"Record<string, unknown>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"sites\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\",\\\"delete\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\"]},\\\"cli\\\":{\\\"skipApiCheck\\\":true},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"domain\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Site\\\",\\\"collectionExportName\\\":\\\"SiteCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"sites\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"sites\\\\\\\" (\\\\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 \\\\\\\"domain\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft',\\\\n \\\\\\\"tier\\\\\\\" TEXT DEFAULT 'free',\\\\n \\\\\\\"database_url\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"database_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"portal_config\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"repository_url\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"template_name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provisioning_status\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provisioned_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"provisioning_error\\\\\\\" 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},\\\"name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"domain\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"draft\\\"},\\\"tier\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"free\\\"},\\\"database_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"database_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"portal_config\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"repository_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"template_name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provisioning_status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provisioned_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"provisioning_error\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"sites_tenant_id_domain_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"domain\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"sites_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"sites_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"1845042e\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-sites\\\"},\\\"@happyvertical/smrt-sites:SiteAgentBinding\\\":{\\\"name\\\":\\\"siteagentbinding\\\",\\\"className\\\":\\\"SiteAgentBinding\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-sites:SiteAgentBinding\\\",\\\"collection\\\":\\\"siteagentbindings\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/sites/src/models/SiteAgentBinding.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-sites\\\",\\\"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}}},\\\"siteId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"Site\\\"},\\\"agentClass\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"enabled\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"default\\\":true},\\\"config\\\":{\\\"type\\\":\\\"json\\\",\\\"required\\\":false,\\\"default\\\":{}},\\\"priority\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"site_agent_bindings\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\",\\\"delete\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"conflictColumns\\\":[\\\"site_id\\\",\\\"agent_class\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"SiteAgentBinding\\\",\\\"collectionExportName\\\":\\\"SiteAgentBindingCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"site_agent_bindings\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"site_agent_bindings\\\\\\\" (\\\\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 \\\\\\\"site_id\\\\\\\" UUID,\\\\n \\\\\\\"agent_class\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"enabled\\\\\\\" BOOLEAN DEFAULT TRUE,\\\\n \\\\\\\"config\\\\\\\" JSON DEFAULT '{}',\\\\n \\\\\\\"priority\\\\\\\" INTEGER DEFAULT 0\\\\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},\\\"site_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"sites\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"agent_class\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"enabled\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true},\\\"config\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":{}},\\\"priority\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"site_agent_bindings_site_id_agent_class_idx\\\",\\\"columns\\\":[\\\"site_id\\\",\\\"agent_class\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"site_agent_bindings_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"site_agent_bindings_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"dec43c9c\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-sites\\\"}},\\\"moduleType\\\":\\\"smrt\\\",\\\"smrtDependencies\\\":[\\\"@happyvertical/smrt-core\\\",\\\"@happyvertical/smrt-tenancy\\\"],\\\"browser\\\":{\\\"status\\\":\\\"server-only\\\",\\\"issues\\\":[\\\"#3624\\\"],\\\"via\\\":[\\\"@happyvertical/smrt-tenancy\\\"]},\\\"stampsConstructors\\\":true}\"));\n","/**\n * SiteAgentBinding - Junction between sites and agents\n *\n * Represents which agents are bound to a specific site,\n * with optional per-site agent configuration overrides.\n *\n * Each row binds an agent class to a site. The absence of a row\n * means the agent is not enabled for that site.\n */\n\nimport { foreignKey, SmrtObject, smrt } from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type { SiteAgentBindingOptions } from '../types';\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'site_agent_bindings',\n api: { include: ['list', 'get', 'create', 'update', 'delete'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n conflictColumns: ['site_id', 'agent_class'],\n})\nexport class SiteAgentBinding extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-sites\";\n @tenantId()\n tenantId: string = '';\n\n /** FK to sites table */\n @foreignKey('Site')\n siteId: string = '';\n\n /** Agent class name, e.g. \"Praeco\" */\n agentClass: string = '';\n\n /** Whether this agent is enabled for the site */\n enabled: boolean = true;\n\n /** Per-site agent configuration overrides (JSON) */\n config: Record<string, unknown> | null = null;\n\n /** Sort priority (higher = first) */\n priority: number = 0;\n\n constructor(options: SiteAgentBindingOptions = {}) {\n super(options);\n\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.siteId !== undefined) this.siteId = options.siteId;\n if (options.agentClass !== undefined) this.agentClass = options.agentClass;\n if (options.enabled !== undefined) this.enabled = options.enabled;\n if (options.priority !== undefined) this.priority = options.priority;\n\n // Handle config — can be object, JSON string, or null\n if (options.config !== undefined) {\n if (typeof options.config === 'string') {\n try {\n this.config = JSON.parse(options.config);\n } catch {\n this.config = null;\n }\n } else {\n this.config = options.config;\n }\n }\n }\n}\n","/**\n * SiteAgentBindingCollection - Collection manager for SiteAgentBinding objects\n *\n * Provides queries for agent bindings by site, agent class, and enabled state.\n */\n\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { SiteAgentBinding } from '../models/SiteAgentBinding';\n\nexport class SiteAgentBindingCollection extends SmrtCollection<SiteAgentBinding> {\n static readonly _itemClass = SiteAgentBinding;\n\n /**\n * Find all agent bindings for a site\n */\n async findBySite(siteId: string): Promise<SiteAgentBinding[]> {\n return this.list({ where: { siteId } });\n }\n\n /**\n * Find all sites using a specific agent class\n */\n async findByAgent(agentClass: string): Promise<SiteAgentBinding[]> {\n return this.list({ where: { agentClass } });\n }\n\n /**\n * Find enabled bindings for a site, ordered by priority descending\n */\n async findEnabled(siteId: string): Promise<SiteAgentBinding[]> {\n const bindings = await this.list({\n where: { siteId, enabled: true },\n });\n return bindings.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * Find a specific site-agent binding\n */\n async findBySiteAndAgent(\n siteId: string,\n agentClass: string,\n ): Promise<SiteAgentBinding | null> {\n const results = await this.list({\n where: { siteId, agentClass },\n });\n return results[0] ?? null;\n }\n}\n","/**\n * Site model - Represents a deployable website within a multi-tenant network\n *\n * Manages site lifecycle from draft through active/suspended/archived states,\n * with infrastructure provisioning tracking and portal configuration.\n *\n * Tenancy: Sites are tenant-scoped with required mode — every site\n * belongs to exactly one tenant.\n */\n\nimport { SmrtObject, smrt } from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type {\n ProvisioningStatus,\n SiteOptions,\n SitePortalConfig,\n SiteStatus,\n SiteTier,\n} from '../types';\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'sites',\n api: { include: ['list', 'get', 'create', 'update', 'delete'] },\n mcp: { include: ['list', 'get', 'create', 'update'] },\n cli: { skipApiCheck: true },\n conflictColumns: ['tenant_id', 'domain'],\n})\nexport class Site extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-sites\";\n @tenantId()\n tenantId: string = '';\n\n /** Display name, e.g. \"Bentley Alberta\" */\n name: string = '';\n\n /** Primary domain, e.g. \"bentleyalberta.com\" */\n domain: string = '';\n\n /** Lifecycle status */\n status: SiteStatus = 'draft';\n\n /** Pricing/feature tier */\n tier: SiteTier = 'free';\n\n /** Site-specific database connection URL */\n databaseUrl: string = '';\n\n /** Database type: sqlite, postgres, libsql */\n databaseType: string = '';\n\n /** Theme, branding, navigation settings (JSON) */\n portalConfig: string = '';\n\n /** Git repository URL */\n repositoryUrl: string = '';\n\n /** Starter template name */\n templateName: string = '';\n\n /** Infrastructure provisioning status */\n provisioningStatus: ProvisioningStatus | '' = '';\n\n /** When provisioning completed */\n provisionedAt: Date | null = null;\n\n /** Last provisioning error message */\n provisioningError: string = '';\n\n /** Extensible key-value metadata (JSON) */\n metadata: string = '';\n\n createdAt: Date = new Date();\n updatedAt: Date = new Date();\n\n constructor(options: SiteOptions = {}) {\n super(options);\n\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.name !== undefined) this.name = options.name;\n if (options.domain !== undefined) this.domain = options.domain;\n if (options.status !== undefined) this.status = options.status;\n if (options.tier !== undefined) this.tier = options.tier;\n if (options.databaseUrl !== undefined)\n this.databaseUrl = options.databaseUrl;\n if (options.databaseType !== undefined)\n this.databaseType = options.databaseType;\n if (options.repositoryUrl !== undefined)\n this.repositoryUrl = options.repositoryUrl;\n if (options.templateName !== undefined)\n this.templateName = options.templateName;\n if (options.provisioningStatus !== undefined)\n this.provisioningStatus = options.provisioningStatus;\n if (options.provisionedAt !== undefined)\n this.provisionedAt = options.provisionedAt;\n if (options.provisioningError !== undefined)\n this.provisioningError = options.provisioningError;\n\n // Handle portalConfig — can be object or JSON string\n if (options.portalConfig !== undefined) {\n if (typeof options.portalConfig === 'string') {\n this.portalConfig = options.portalConfig;\n } else {\n this.portalConfig = JSON.stringify(options.portalConfig);\n }\n }\n\n // Handle metadata — can be object or JSON string\n if (options.metadata !== undefined) {\n if (typeof options.metadata === 'string') {\n this.metadata = options.metadata;\n } else {\n this.metadata = JSON.stringify(options.metadata);\n }\n }\n\n if (options.createdAt) this.createdAt = options.createdAt;\n if (options.updatedAt) this.updatedAt = options.updatedAt;\n }\n\n /**\n * Check if the site is active\n */\n isActive(): boolean {\n return this.status === 'active';\n }\n\n /**\n * Check if the site is provisioned and ready\n */\n isReady(): boolean {\n return this.provisioningStatus === 'ready';\n }\n\n /**\n * Get portal config as parsed object\n */\n getPortalConfig(): SitePortalConfig {\n if (!this.portalConfig) return {};\n try {\n return JSON.parse(this.portalConfig);\n } catch {\n return {};\n }\n }\n\n /**\n * Set portal config from object\n */\n setPortalConfig(config: SitePortalConfig): void {\n this.portalConfig = JSON.stringify(config);\n }\n\n /**\n * Get metadata as parsed object\n */\n getMetadata(): Record<string, unknown> {\n if (!this.metadata) return {};\n try {\n return JSON.parse(this.metadata);\n } catch {\n return {};\n }\n }\n\n /**\n * Set metadata from object\n */\n setMetadata(data: Record<string, unknown>): void {\n this.metadata = JSON.stringify(data);\n }\n\n /**\n * Update metadata by merging with existing values\n */\n updateMetadata(updates: Record<string, unknown>): void {\n const current = this.getMetadata();\n this.setMetadata({ ...current, ...updates });\n }\n}\n","/**\n * SiteCollection - Collection manager for Site objects\n *\n * Provides domain lookup, tenant filtering, and status queries.\n */\n\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { Site } from '../models/Site';\nimport type { SiteStatus } from '../types';\n\nexport class SiteCollection extends SmrtCollection<Site> {\n static readonly _itemClass = Site;\n\n /**\n * Find a site by its primary domain\n */\n async findByDomain(domain: string): Promise<Site | null> {\n const results = await this.list({ where: { domain } });\n return results[0] ?? null;\n }\n\n /**\n * Find all sites belonging to a tenant\n */\n async findByTenant(tenantId: string): Promise<Site[]> {\n return this.list({ where: { tenantId } });\n }\n\n /**\n * Find sites by lifecycle status\n */\n async findByStatus(status: SiteStatus): Promise<Site[]> {\n return this.list({ where: { status } });\n }\n\n /**\n * Find all active sites\n */\n async findActive(): Promise<Site[]> {\n return this.findByStatus('active');\n }\n}\n","/**\n * SiteService - High-level API for site lifecycle management\n *\n * Provides stateless operations for creating, activating, suspending,\n * and archiving sites, as well as managing agent bindings.\n */\n\nimport type { SiteAgentBindingCollection } from '../collections/SiteAgentBindingCollection';\nimport type { SiteCollection } from '../collections/SiteCollection';\nimport type { Site } from '../models/Site';\nimport type { SiteAgentBinding } from '../models/SiteAgentBinding';\nimport type { CreateSiteData } from '../types';\n\n/**\n * Options for creating a SiteService\n */\nexport interface SiteServiceOptions {\n sites: SiteCollection;\n bindings: SiteAgentBindingCollection;\n}\n\nexport class SiteService {\n private sites: SiteCollection;\n private bindings: SiteAgentBindingCollection;\n\n constructor(options: SiteServiceOptions) {\n this.sites = options.sites;\n this.bindings = options.bindings;\n }\n\n /**\n * Create a new site in draft status\n */\n async createSite(tenantId: string, data: CreateSiteData): Promise<Site> {\n const site = await this.sites.create({\n tenantId,\n name: data.name,\n domain: data.domain,\n status: 'draft',\n tier: data.tier ?? 'free',\n databaseUrl: data.databaseUrl ?? '',\n databaseType: data.databaseType ?? '',\n portalConfig: JSON.stringify(data.portalConfig ?? {}),\n repositoryUrl: data.repositoryUrl ?? '',\n templateName: data.templateName ?? '',\n provisioningStatus: 'pending',\n metadata: JSON.stringify(data.metadata ?? {}),\n });\n await site.save();\n return site;\n }\n\n /**\n * Activate a site — validates required fields then sets status to active\n */\n async activateSite(siteId: string): Promise<Site> {\n const site = await this.requireSite(siteId);\n\n if (!site.name) {\n throw new Error('Cannot activate site: name is required');\n }\n if (!site.domain) {\n throw new Error('Cannot activate site: domain is required');\n }\n\n site.status = 'active';\n site.updatedAt = new Date();\n await site.save();\n return site;\n }\n\n /**\n * Suspend a site\n */\n async suspendSite(siteId: string): Promise<Site> {\n const site = await this.requireSite(siteId);\n site.status = 'suspended';\n site.updatedAt = new Date();\n await site.save();\n return site;\n }\n\n /**\n * Archive a site\n */\n async archiveSite(siteId: string): Promise<Site> {\n const site = await this.requireSite(siteId);\n site.status = 'archived';\n site.updatedAt = new Date();\n await site.save();\n return site;\n }\n\n /**\n * Mark site as provisioned and ready\n */\n async markProvisioned(siteId: string): Promise<Site> {\n const site = await this.requireSite(siteId);\n site.provisioningStatus = 'ready';\n site.provisionedAt = new Date();\n site.provisioningError = '';\n site.updatedAt = new Date();\n await site.save();\n return site;\n }\n\n /**\n * Mark site provisioning as failed\n */\n async markProvisioningFailed(siteId: string, error: string): Promise<Site> {\n const site = await this.requireSite(siteId);\n site.provisioningStatus = 'failed';\n site.provisioningError = error;\n site.updatedAt = new Date();\n await site.save();\n return site;\n }\n\n /**\n * Bind an agent to a site\n */\n async bindAgent(\n siteId: string,\n agentClass: string,\n config?: Record<string, unknown>,\n ): Promise<SiteAgentBinding> {\n const site = await this.requireSite(siteId);\n\n const existing = await this.bindings.findBySiteAndAgent(siteId, agentClass);\n if (existing) {\n existing.enabled = true;\n if (config !== undefined) existing.config = config;\n await existing.save();\n return existing;\n }\n\n const binding = await this.bindings.create({\n tenantId: site.tenantId,\n siteId,\n agentClass,\n enabled: true,\n config: config ?? null,\n });\n await binding.save();\n return binding;\n }\n\n /**\n * Unbind an agent from a site\n */\n async unbindAgent(siteId: string, agentClass: string): Promise<void> {\n const binding = await this.bindings.findBySiteAndAgent(siteId, agentClass);\n if (binding) {\n await binding.delete();\n }\n }\n\n /**\n * Get all enabled agent bindings for a site\n */\n async getEnabledAgents(siteId: string): Promise<SiteAgentBinding[]> {\n return this.bindings.findEnabled(siteId);\n }\n\n /**\n * Load a site by ID, throwing if not found\n */\n private async requireSite(siteId: string): Promise<Site> {\n const site = await this.sites.get({ id: siteId });\n if (!site) {\n throw new Error(`Site '${siteId}' not found`);\n }\n return site;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/__smrt-register__.ts","../src/models/SiteAgentBinding.ts","../src/collections/SiteAgentBindingCollection.ts","../src/models/Site.ts","../src/collections/SiteCollection.ts","../src/services/SiteService.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-sites\\\",\\\"packageVersion\\\":\\\"0.60.11\\\",\\\"objects\\\":{\\\"@happyvertical/smrt-sites:SiteAgentBindingCollection\\\":{\\\"name\\\":\\\"siteagentbindingcollection\\\",\\\"className\\\":\\\"SiteAgentBindingCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-sites:SiteAgentBindingCollection\\\",\\\"collection\\\":\\\"siteagentbindings\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/sites/src/collections/SiteAgentBindingCollection.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-sites\\\",\\\"fields\\\":{},\\\"methods\\\":{\\\"findBySite\\\":{\\\"name\\\":\\\"findBySite\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"siteId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<SiteAgentBinding[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findByAgent\\\":{\\\"name\\\":\\\"findByAgent\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"agentClass\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<SiteAgentBinding[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findEnabled\\\":{\\\"name\\\":\\\"findEnabled\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"siteId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<SiteAgentBinding[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findBySiteAndAgent\\\":{\\\"name\\\":\\\"findBySiteAndAgent\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"siteId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false},{\\\"name\\\":\\\"agentClass\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<SiteAgentBinding | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"site_agent_bindings\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\",\\\"delete\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"SiteAgentBinding\\\",\\\"exportName\\\":\\\"SiteAgentBindingCollection\\\",\\\"collectionExportName\\\":\\\"SiteAgentBindingCollectionCollection\\\",\\\"collectionOf\\\":\\\"@happyvertical/smrt-sites:SiteAgentBinding\\\",\\\"inheritedExposure\\\":[\\\"api\\\",\\\"mcp\\\",\\\"cli\\\"],\\\"schema\\\":{\\\"tableName\\\":\\\"site_agent_bindings\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"site_agent_bindings\\\\\\\" (\\\\n \\\\\\\"_sync_origin_device_id\\\\\\\" TEXT,\\\\n \\\\\\\"_sync_revision\\\\\\\" INTEGER,\\\\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 \\\\\\\"site_id\\\\\\\" UUID,\\\\n \\\\\\\"agent_class\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"enabled\\\\\\\" BOOLEAN DEFAULT TRUE,\\\\n \\\\\\\"config\\\\\\\" JSON DEFAULT '{}',\\\\n \\\\\\\"priority\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"_sync_origin_device_id\\\":{\\\"type\\\":\\\"TEXT\\\"},\\\"_sync_revision\\\":{\\\"type\\\":\\\"INTEGER\\\"},\\\"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},\\\"site_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"sites\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"agent_class\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"enabled\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true},\\\"config\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":{}},\\\"priority\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"site_agent_bindings_site_id_agent_class_idx\\\",\\\"columns\\\":[\\\"site_id\\\",\\\"agent_class\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"site_agent_bindings_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"site_agent_bindings_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"a739eab3\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-sites\\\"},\\\"@happyvertical/smrt-sites:SiteCollection\\\":{\\\"name\\\":\\\"sitecollection\\\",\\\"className\\\":\\\"SiteCollection\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-sites:SiteCollection\\\",\\\"collection\\\":\\\"sites\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/sites/src/collections/SiteCollection.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-sites\\\",\\\"fields\\\":{},\\\"methods\\\":{\\\"findByDomain\\\":{\\\"name\\\":\\\"findByDomain\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"domain\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<Site | null>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findByTenant\\\":{\\\"name\\\":\\\"findByTenant\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"tenantId\\\",\\\"type\\\":\\\"string\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<Site[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findByStatus\\\":{\\\"name\\\":\\\"findByStatus\\\",\\\"async\\\":true,\\\"parameters\\\":[{\\\"name\\\":\\\"status\\\",\\\"type\\\":\\\"SiteStatus\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"Promise<Site[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"findActive\\\":{\\\"name\\\":\\\"findActive\\\",\\\"async\\\":true,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Promise<Site[]>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"sites\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\",\\\"delete\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\"]}},\\\"extends\\\":\\\"SmrtCollection\\\",\\\"extendsTypeArg\\\":\\\"Site\\\",\\\"exportName\\\":\\\"SiteCollection\\\",\\\"collectionExportName\\\":\\\"SiteCollectionCollection\\\",\\\"collectionOf\\\":\\\"@happyvertical/smrt-sites:Site\\\",\\\"inheritedExposure\\\":[\\\"api\\\",\\\"mcp\\\"],\\\"schema\\\":{\\\"tableName\\\":\\\"sites\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"sites\\\\\\\" (\\\\n \\\\\\\"_sync_origin_device_id\\\\\\\" TEXT,\\\\n \\\\\\\"_sync_revision\\\\\\\" INTEGER,\\\\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 \\\\\\\"domain\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft',\\\\n \\\\\\\"tier\\\\\\\" TEXT DEFAULT 'free',\\\\n \\\\\\\"database_url\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"database_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"portal_config\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"repository_url\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"template_name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provisioning_status\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provisioned_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"provisioning_error\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metadata\\\\\\\" TEXT DEFAULT ''\\\\n);\\\",\\\"columns\\\":{\\\"_sync_origin_device_id\\\":{\\\"type\\\":\\\"TEXT\\\"},\\\"_sync_revision\\\":{\\\"type\\\":\\\"INTEGER\\\"},\\\"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\\\":\\\"\\\"},\\\"domain\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"draft\\\"},\\\"tier\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"free\\\"},\\\"database_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"database_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"portal_config\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"repository_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"template_name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provisioning_status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provisioned_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"provisioning_error\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"sites_tenant_id_domain_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"domain\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"sites_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"sites_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"e8449af3\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-sites\\\"},\\\"@happyvertical/smrt-sites:Site\\\":{\\\"name\\\":\\\"site\\\",\\\"className\\\":\\\"Site\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-sites:Site\\\",\\\"collection\\\":\\\"sites\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/sites/src/models/Site.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-sites\\\",\\\"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\\\":\\\"\\\"},\\\"domain\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"status\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"draft\\\",\\\"enum\\\":[\\\"draft\\\",\\\"active\\\",\\\"suspended\\\",\\\"archived\\\"]},\\\"tier\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"free\\\",\\\"enum\\\":[\\\"free\\\",\\\"standard\\\",\\\"premium\\\"]},\\\"databaseUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"databaseType\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"portalConfig\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"repositoryUrl\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"templateName\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"provisioningStatus\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\",\\\"enum\\\":[\\\"pending\\\",\\\"provisioning\\\",\\\"ready\\\",\\\"failed\\\",\\\"\\\"]},\\\"provisionedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"provisioningError\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"createdAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false},\\\"updatedAt\\\":{\\\"type\\\":\\\"datetime\\\",\\\"required\\\":false}},\\\"methods\\\":{\\\"isActive\\\":{\\\"name\\\":\\\"isActive\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"boolean\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"isReady\\\":{\\\"name\\\":\\\"isReady\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"boolean\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getPortalConfig\\\":{\\\"name\\\":\\\"getPortalConfig\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"SitePortalConfig\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setPortalConfig\\\":{\\\"name\\\":\\\"setPortalConfig\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"config\\\",\\\"type\\\":\\\"SitePortalConfig\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"getMetadata\\\":{\\\"name\\\":\\\"getMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[],\\\"returnType\\\":\\\"Record<string, unknown>\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"setMetadata\\\":{\\\"name\\\":\\\"setMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"data\\\",\\\"type\\\":\\\"Record<string, unknown>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true},\\\"updateMetadata\\\":{\\\"name\\\":\\\"updateMetadata\\\",\\\"async\\\":false,\\\"parameters\\\":[{\\\"name\\\":\\\"updates\\\",\\\"type\\\":\\\"Record<string, unknown>\\\",\\\"optional\\\":false}],\\\"returnType\\\":\\\"void\\\",\\\"isStatic\\\":false,\\\"isPublic\\\":true}},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"sites\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\",\\\"delete\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\"]},\\\"cli\\\":{\\\"skipApiCheck\\\":true},\\\"conflictColumns\\\":[\\\"tenant_id\\\",\\\"domain\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"Site\\\",\\\"collectionExportName\\\":\\\"SiteCollection\\\",\\\"displayLabelField\\\":\\\"name\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"sites\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"sites\\\\\\\" (\\\\n \\\\\\\"_sync_origin_device_id\\\\\\\" TEXT,\\\\n \\\\\\\"_sync_revision\\\\\\\" INTEGER,\\\\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 \\\\\\\"domain\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"status\\\\\\\" TEXT DEFAULT 'draft',\\\\n \\\\\\\"tier\\\\\\\" TEXT DEFAULT 'free',\\\\n \\\\\\\"database_url\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"database_type\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"portal_config\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"repository_url\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"template_name\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provisioning_status\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"provisioned_at\\\\\\\" TIMESTAMP,\\\\n \\\\\\\"provisioning_error\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"metadata\\\\\\\" TEXT DEFAULT ''\\\\n);\\\",\\\"columns\\\":{\\\"_sync_origin_device_id\\\":{\\\"type\\\":\\\"TEXT\\\"},\\\"_sync_revision\\\":{\\\"type\\\":\\\"INTEGER\\\"},\\\"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\\\":\\\"\\\"},\\\"domain\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"draft\\\"},\\\"tier\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"free\\\"},\\\"database_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"database_type\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"portal_config\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"repository_url\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"template_name\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provisioning_status\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"provisioned_at\\\":{\\\"type\\\":\\\"TIMESTAMP\\\",\\\"notNull\\\":false,\\\"unique\\\":false},\\\"provisioning_error\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"metadata\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"}},\\\"indexes\\\":[{\\\"name\\\":\\\"sites_tenant_id_domain_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"domain\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"sites_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"sites_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"e8449af3\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-sites\\\"},\\\"@happyvertical/smrt-sites:SiteAgentBinding\\\":{\\\"name\\\":\\\"siteagentbinding\\\",\\\"className\\\":\\\"SiteAgentBinding\\\",\\\"qualifiedName\\\":\\\"@happyvertical/smrt-sites:SiteAgentBinding\\\",\\\"collection\\\":\\\"siteagentbindings\\\",\\\"filePath\\\":\\\"/home/runner/work/smrt/smrt/packages/sites/src/models/SiteAgentBinding.ts\\\",\\\"packageName\\\":\\\"@happyvertical/smrt-sites\\\",\\\"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}}},\\\"siteId\\\":{\\\"type\\\":\\\"foreignKey\\\",\\\"required\\\":false,\\\"related\\\":\\\"Site\\\"},\\\"agentClass\\\":{\\\"type\\\":\\\"text\\\",\\\"required\\\":false,\\\"default\\\":\\\"\\\"},\\\"enabled\\\":{\\\"type\\\":\\\"boolean\\\",\\\"required\\\":false,\\\"default\\\":true},\\\"config\\\":{\\\"type\\\":\\\"json\\\",\\\"required\\\":false,\\\"default\\\":{}},\\\"priority\\\":{\\\"type\\\":\\\"integer\\\",\\\"required\\\":false,\\\"default\\\":0}},\\\"methods\\\":{},\\\"decoratorConfig\\\":{\\\"tableName\\\":\\\"site_agent_bindings\\\",\\\"api\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\",\\\"create\\\",\\\"update\\\",\\\"delete\\\"]},\\\"cli\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"mcp\\\":{\\\"include\\\":[\\\"list\\\",\\\"get\\\"]},\\\"conflictColumns\\\":[\\\"site_id\\\",\\\"agent_class\\\"],\\\"tenantScoped\\\":{\\\"mode\\\":\\\"required\\\"}},\\\"extends\\\":\\\"SmrtObject\\\",\\\"exportName\\\":\\\"SiteAgentBinding\\\",\\\"collectionExportName\\\":\\\"SiteAgentBindingCollection\\\",\\\"validationRules\\\":[],\\\"schema\\\":{\\\"tableName\\\":\\\"site_agent_bindings\\\",\\\"ddl\\\":\\\"CREATE TABLE IF NOT EXISTS \\\\\\\"site_agent_bindings\\\\\\\" (\\\\n \\\\\\\"_sync_origin_device_id\\\\\\\" TEXT,\\\\n \\\\\\\"_sync_revision\\\\\\\" INTEGER,\\\\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 \\\\\\\"site_id\\\\\\\" UUID,\\\\n \\\\\\\"agent_class\\\\\\\" TEXT DEFAULT '',\\\\n \\\\\\\"enabled\\\\\\\" BOOLEAN DEFAULT TRUE,\\\\n \\\\\\\"config\\\\\\\" JSON DEFAULT '{}',\\\\n \\\\\\\"priority\\\\\\\" INTEGER DEFAULT 0\\\\n);\\\",\\\"columns\\\":{\\\"_sync_origin_device_id\\\":{\\\"type\\\":\\\"TEXT\\\"},\\\"_sync_revision\\\":{\\\"type\\\":\\\"INTEGER\\\"},\\\"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},\\\"site_id\\\":{\\\"type\\\":\\\"UUID\\\",\\\"referenceKind\\\":\\\"foreignKey\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"foreignKey\\\":{\\\"table\\\":\\\"sites\\\",\\\"column\\\":\\\"id\\\",\\\"onDelete\\\":\\\"CASCADE\\\",\\\"onUpdate\\\":\\\"CASCADE\\\"}},\\\"agent_class\\\":{\\\"type\\\":\\\"TEXT\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":\\\"\\\"},\\\"enabled\\\":{\\\"type\\\":\\\"BOOLEAN\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":true},\\\"config\\\":{\\\"type\\\":\\\"JSON\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":{}},\\\"priority\\\":{\\\"type\\\":\\\"INTEGER\\\",\\\"notNull\\\":false,\\\"unique\\\":false,\\\"default\\\":0}},\\\"indexes\\\":[{\\\"name\\\":\\\"site_agent_bindings_site_id_agent_class_idx\\\",\\\"columns\\\":[\\\"site_id\\\",\\\"agent_class\\\"],\\\"unique\\\":true,\\\"nullsNotDistinct\\\":true},{\\\"name\\\":\\\"site_agent_bindings_slug_context_idx\\\",\\\"columns\\\":[\\\"slug\\\",\\\"context\\\"]},{\\\"name\\\":\\\"site_agent_bindings_tenant_id_created_at_idx\\\",\\\"columns\\\":[\\\"tenant_id\\\",\\\"created_at\\\"]}],\\\"version\\\":\\\"a739eab3\\\"},\\\"importPath\\\":\\\"@happyvertical/smrt-sites\\\"}},\\\"moduleType\\\":\\\"smrt\\\",\\\"smrtDependencies\\\":[\\\"@happyvertical/smrt-core\\\",\\\"@happyvertical/smrt-tenancy\\\"],\\\"browser\\\":{\\\"status\\\":\\\"server-only\\\",\\\"issues\\\":[\\\"#3624\\\"],\\\"via\\\":[\\\"@happyvertical/smrt-tenancy\\\"]},\\\"stampsConstructors\\\":true}\"));\n","/**\n * SiteAgentBinding - Junction between sites and agents\n *\n * Represents which agents are bound to a specific site,\n * with optional per-site agent configuration overrides.\n *\n * Each row binds an agent class to a site. The absence of a row\n * means the agent is not enabled for that site.\n */\n\nimport { foreignKey, SmrtObject, smrt } from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type { SiteAgentBindingOptions } from '../types';\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'site_agent_bindings',\n api: { include: ['list', 'get', 'create', 'update', 'delete'] },\n cli: { include: ['list', 'get'] },\n mcp: { include: ['list', 'get'] },\n conflictColumns: ['site_id', 'agent_class'],\n})\nexport class SiteAgentBinding extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-sites\";\n @tenantId()\n tenantId: string = '';\n\n /** FK to sites table */\n @foreignKey('Site')\n siteId: string = '';\n\n /** Agent class name, e.g. \"Praeco\" */\n agentClass: string = '';\n\n /** Whether this agent is enabled for the site */\n enabled: boolean = true;\n\n /** Per-site agent configuration overrides (JSON) */\n config: Record<string, unknown> | null = null;\n\n /** Sort priority (higher = first) */\n priority: number = 0;\n\n constructor(options: SiteAgentBindingOptions = {}) {\n super(options);\n\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.siteId !== undefined) this.siteId = options.siteId;\n if (options.agentClass !== undefined) this.agentClass = options.agentClass;\n if (options.enabled !== undefined) this.enabled = options.enabled;\n if (options.priority !== undefined) this.priority = options.priority;\n\n // Handle config — can be object, JSON string, or null\n if (options.config !== undefined) {\n if (typeof options.config === 'string') {\n try {\n this.config = JSON.parse(options.config);\n } catch {\n this.config = null;\n }\n } else {\n this.config = options.config;\n }\n }\n }\n}\n","/**\n * SiteAgentBindingCollection - Collection manager for SiteAgentBinding objects\n *\n * Provides queries for agent bindings by site, agent class, and enabled state.\n */\n\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { SiteAgentBinding } from '../models/SiteAgentBinding';\n\nexport class SiteAgentBindingCollection extends SmrtCollection<SiteAgentBinding> {\n static readonly _itemClass = SiteAgentBinding;\n\n /**\n * Find all agent bindings for a site\n */\n async findBySite(siteId: string): Promise<SiteAgentBinding[]> {\n return this.list({ where: { siteId } });\n }\n\n /**\n * Find all sites using a specific agent class\n */\n async findByAgent(agentClass: string): Promise<SiteAgentBinding[]> {\n return this.list({ where: { agentClass } });\n }\n\n /**\n * Find enabled bindings for a site, ordered by priority descending\n */\n async findEnabled(siteId: string): Promise<SiteAgentBinding[]> {\n const bindings = await this.list({\n where: { siteId, enabled: true },\n });\n return bindings.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * Find a specific site-agent binding\n */\n async findBySiteAndAgent(\n siteId: string,\n agentClass: string,\n ): Promise<SiteAgentBinding | null> {\n const results = await this.list({\n where: { siteId, agentClass },\n });\n return results[0] ?? null;\n }\n}\n","/**\n * Site model - Represents a deployable website within a multi-tenant network\n *\n * Manages site lifecycle from draft through active/suspended/archived states,\n * with infrastructure provisioning tracking and portal configuration.\n *\n * Tenancy: Sites are tenant-scoped with required mode — every site\n * belongs to exactly one tenant.\n */\n\nimport { SmrtObject, smrt } from '@happyvertical/smrt-core';\nimport { TenantScoped, tenantId } from '@happyvertical/smrt-tenancy';\nimport type {\n ProvisioningStatus,\n SiteOptions,\n SitePortalConfig,\n SiteStatus,\n SiteTier,\n} from '../types';\n\n@TenantScoped({ mode: 'required' })\n@smrt({\n tableName: 'sites',\n api: { include: ['list', 'get', 'create', 'update', 'delete'] },\n mcp: { include: ['list', 'get', 'create', 'update'] },\n cli: { skipApiCheck: true },\n conflictColumns: ['tenant_id', 'domain'],\n})\nexport class Site extends SmrtObject { static __smrtPackage__ = \"@happyvertical/smrt-sites\";\n @tenantId()\n tenantId: string = '';\n\n /** Display name, e.g. \"Bentley Alberta\" */\n name: string = '';\n\n /** Primary domain, e.g. \"bentleyalberta.com\" */\n domain: string = '';\n\n /** Lifecycle status */\n status: SiteStatus = 'draft';\n\n /** Pricing/feature tier */\n tier: SiteTier = 'free';\n\n /** Site-specific database connection URL */\n databaseUrl: string = '';\n\n /** Database type: sqlite, postgres, libsql */\n databaseType: string = '';\n\n /** Theme, branding, navigation settings (JSON) */\n portalConfig: string = '';\n\n /** Git repository URL */\n repositoryUrl: string = '';\n\n /** Starter template name */\n templateName: string = '';\n\n /** Infrastructure provisioning status */\n provisioningStatus: ProvisioningStatus | '' = '';\n\n /** When provisioning completed */\n provisionedAt: Date | null = null;\n\n /** Last provisioning error message */\n provisioningError: string = '';\n\n /** Extensible key-value metadata (JSON) */\n metadata: string = '';\n\n createdAt: Date = new Date();\n updatedAt: Date = new Date();\n\n constructor(options: SiteOptions = {}) {\n super(options);\n\n if (options.tenantId !== undefined) this.tenantId = options.tenantId;\n if (options.name !== undefined) this.name = options.name;\n if (options.domain !== undefined) this.domain = options.domain;\n if (options.status !== undefined) this.status = options.status;\n if (options.tier !== undefined) this.tier = options.tier;\n if (options.databaseUrl !== undefined)\n this.databaseUrl = options.databaseUrl;\n if (options.databaseType !== undefined)\n this.databaseType = options.databaseType;\n if (options.repositoryUrl !== undefined)\n this.repositoryUrl = options.repositoryUrl;\n if (options.templateName !== undefined)\n this.templateName = options.templateName;\n if (options.provisioningStatus !== undefined)\n this.provisioningStatus = options.provisioningStatus;\n if (options.provisionedAt !== undefined)\n this.provisionedAt = options.provisionedAt;\n if (options.provisioningError !== undefined)\n this.provisioningError = options.provisioningError;\n\n // Handle portalConfig — can be object or JSON string\n if (options.portalConfig !== undefined) {\n if (typeof options.portalConfig === 'string') {\n this.portalConfig = options.portalConfig;\n } else {\n this.portalConfig = JSON.stringify(options.portalConfig);\n }\n }\n\n // Handle metadata — can be object or JSON string\n if (options.metadata !== undefined) {\n if (typeof options.metadata === 'string') {\n this.metadata = options.metadata;\n } else {\n this.metadata = JSON.stringify(options.metadata);\n }\n }\n\n if (options.createdAt) this.createdAt = options.createdAt;\n if (options.updatedAt) this.updatedAt = options.updatedAt;\n }\n\n /**\n * Check if the site is active\n */\n isActive(): boolean {\n return this.status === 'active';\n }\n\n /**\n * Check if the site is provisioned and ready\n */\n isReady(): boolean {\n return this.provisioningStatus === 'ready';\n }\n\n /**\n * Get portal config as parsed object\n */\n getPortalConfig(): SitePortalConfig {\n if (!this.portalConfig) return {};\n try {\n return JSON.parse(this.portalConfig);\n } catch {\n return {};\n }\n }\n\n /**\n * Set portal config from object\n */\n setPortalConfig(config: SitePortalConfig): void {\n this.portalConfig = JSON.stringify(config);\n }\n\n /**\n * Get metadata as parsed object\n */\n getMetadata(): Record<string, unknown> {\n if (!this.metadata) return {};\n try {\n return JSON.parse(this.metadata);\n } catch {\n return {};\n }\n }\n\n /**\n * Set metadata from object\n */\n setMetadata(data: Record<string, unknown>): void {\n this.metadata = JSON.stringify(data);\n }\n\n /**\n * Update metadata by merging with existing values\n */\n updateMetadata(updates: Record<string, unknown>): void {\n const current = this.getMetadata();\n this.setMetadata({ ...current, ...updates });\n }\n}\n","/**\n * SiteCollection - Collection manager for Site objects\n *\n * Provides domain lookup, tenant filtering, and status queries.\n */\n\nimport { SmrtCollection } from '@happyvertical/smrt-core';\nimport { Site } from '../models/Site';\nimport type { SiteStatus } from '../types';\n\nexport class SiteCollection extends SmrtCollection<Site> {\n static readonly _itemClass = Site;\n\n /**\n * Find a site by its primary domain\n */\n async findByDomain(domain: string): Promise<Site | null> {\n const results = await this.list({ where: { domain } });\n return results[0] ?? null;\n }\n\n /**\n * Find all sites belonging to a tenant\n */\n async findByTenant(tenantId: string): Promise<Site[]> {\n return this.list({ where: { tenantId } });\n }\n\n /**\n * Find sites by lifecycle status\n */\n async findByStatus(status: SiteStatus): Promise<Site[]> {\n return this.list({ where: { status } });\n }\n\n /**\n * Find all active sites\n */\n async findActive(): Promise<Site[]> {\n return this.findByStatus('active');\n }\n}\n","/**\n * SiteService - High-level API for site lifecycle management\n *\n * Provides stateless operations for creating, activating, suspending,\n * and archiving sites, as well as managing agent bindings.\n */\n\nimport type { SiteAgentBindingCollection } from '../collections/SiteAgentBindingCollection';\nimport type { SiteCollection } from '../collections/SiteCollection';\nimport type { Site } from '../models/Site';\nimport type { SiteAgentBinding } from '../models/SiteAgentBinding';\nimport type { CreateSiteData } from '../types';\n\n/**\n * Options for creating a SiteService\n */\nexport interface SiteServiceOptions {\n sites: SiteCollection;\n bindings: SiteAgentBindingCollection;\n}\n\nexport class SiteService {\n private sites: SiteCollection;\n private bindings: SiteAgentBindingCollection;\n\n constructor(options: SiteServiceOptions) {\n this.sites = options.sites;\n this.bindings = options.bindings;\n }\n\n /**\n * Create a new site in draft status\n */\n async createSite(tenantId: string, data: CreateSiteData): Promise<Site> {\n const site = await this.sites.create({\n tenantId,\n name: data.name,\n domain: data.domain,\n status: 'draft',\n tier: data.tier ?? 'free',\n databaseUrl: data.databaseUrl ?? '',\n databaseType: data.databaseType ?? '',\n portalConfig: JSON.stringify(data.portalConfig ?? {}),\n repositoryUrl: data.repositoryUrl ?? '',\n templateName: data.templateName ?? '',\n provisioningStatus: 'pending',\n metadata: JSON.stringify(data.metadata ?? {}),\n });\n await site.save();\n return site;\n }\n\n /**\n * Activate a site — validates required fields then sets status to active\n */\n async activateSite(siteId: string): Promise<Site> {\n const site = await this.requireSite(siteId);\n\n if (!site.name) {\n throw new Error('Cannot activate site: name is required');\n }\n if (!site.domain) {\n throw new Error('Cannot activate site: domain is required');\n }\n\n site.status = 'active';\n site.updatedAt = new Date();\n await site.save();\n return site;\n }\n\n /**\n * Suspend a site\n */\n async suspendSite(siteId: string): Promise<Site> {\n const site = await this.requireSite(siteId);\n site.status = 'suspended';\n site.updatedAt = new Date();\n await site.save();\n return site;\n }\n\n /**\n * Archive a site\n */\n async archiveSite(siteId: string): Promise<Site> {\n const site = await this.requireSite(siteId);\n site.status = 'archived';\n site.updatedAt = new Date();\n await site.save();\n return site;\n }\n\n /**\n * Mark site as provisioned and ready\n */\n async markProvisioned(siteId: string): Promise<Site> {\n const site = await this.requireSite(siteId);\n site.provisioningStatus = 'ready';\n site.provisionedAt = new Date();\n site.provisioningError = '';\n site.updatedAt = new Date();\n await site.save();\n return site;\n }\n\n /**\n * Mark site provisioning as failed\n */\n async markProvisioningFailed(siteId: string, error: string): Promise<Site> {\n const site = await this.requireSite(siteId);\n site.provisioningStatus = 'failed';\n site.provisioningError = error;\n site.updatedAt = new Date();\n await site.save();\n return site;\n }\n\n /**\n * Bind an agent to a site\n */\n async bindAgent(\n siteId: string,\n agentClass: string,\n config?: Record<string, unknown>,\n ): Promise<SiteAgentBinding> {\n const site = await this.requireSite(siteId);\n\n const existing = await this.bindings.findBySiteAndAgent(siteId, agentClass);\n if (existing) {\n existing.enabled = true;\n if (config !== undefined) existing.config = config;\n await existing.save();\n return existing;\n }\n\n const binding = await this.bindings.create({\n tenantId: site.tenantId,\n siteId,\n agentClass,\n enabled: true,\n config: config ?? null,\n });\n await binding.save();\n return binding;\n }\n\n /**\n * Unbind an agent from a site\n */\n async unbindAgent(siteId: string, agentClass: string): Promise<void> {\n const binding = await this.bindings.findBySiteAndAgent(siteId, agentClass);\n if (binding) {\n await binding.delete();\n }\n }\n\n /**\n * Get all enabled agent bindings for a site\n */\n async getEnabledAgents(siteId: string): Promise<SiteAgentBinding[]> {\n return this.bindings.findEnabled(siteId);\n }\n\n /**\n * Load a site by ID, throwing if not found\n */\n private async requireSite(siteId: string): Promise<Site> {\n const site = await this.sites.get({ id: siteId });\n if (!site) {\n throw new Error(`Site '${siteId}' not found`);\n }\n return site;\n }\n}\n"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  "version": "1.0.0",
3
3
  "timestamp": 0,
4
4
  "packageName": "@happyvertical/smrt-sites",
5
- "packageVersion": "0.60.9",
5
+ "packageVersion": "0.60.11",
6
6
  "objects": {
7
7
  "@happyvertical/smrt-sites:SiteAgentBindingCollection": {
8
8
  "name": "siteagentbindingcollection",
@@ -111,8 +111,14 @@
111
111
  ],
112
112
  "schema": {
113
113
  "tableName": "site_agent_bindings",
114
- "ddl": "CREATE TABLE IF NOT EXISTS \"site_agent_bindings\" (\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 \"site_id\" UUID,\n \"agent_class\" TEXT DEFAULT '',\n \"enabled\" BOOLEAN DEFAULT TRUE,\n \"config\" JSON DEFAULT '{}',\n \"priority\" INTEGER DEFAULT 0\n);",
114
+ "ddl": "CREATE TABLE IF NOT EXISTS \"site_agent_bindings\" (\n \"_sync_origin_device_id\" TEXT,\n \"_sync_revision\" INTEGER,\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 \"site_id\" UUID,\n \"agent_class\" TEXT DEFAULT '',\n \"enabled\" BOOLEAN DEFAULT TRUE,\n \"config\" JSON DEFAULT '{}',\n \"priority\" INTEGER DEFAULT 0\n);",
115
115
  "columns": {
116
+ "_sync_origin_device_id": {
117
+ "type": "TEXT"
118
+ },
119
+ "_sync_revision": {
120
+ "type": "INTEGER"
121
+ },
116
122
  "id": {
117
123
  "type": "UUID",
118
124
  "primaryKey": true,
@@ -206,7 +212,7 @@
206
212
  ]
207
213
  }
208
214
  ],
209
- "version": "dec43c9c"
215
+ "version": "a739eab3"
210
216
  },
211
217
  "importPath": "@happyvertical/smrt-sites"
212
218
  },
@@ -301,8 +307,14 @@
301
307
  ],
302
308
  "schema": {
303
309
  "tableName": "sites",
304
- "ddl": "CREATE TABLE IF NOT EXISTS \"sites\" (\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 \"domain\" TEXT DEFAULT '',\n \"status\" TEXT DEFAULT 'draft',\n \"tier\" TEXT DEFAULT 'free',\n \"database_url\" TEXT DEFAULT '',\n \"database_type\" TEXT DEFAULT '',\n \"portal_config\" TEXT DEFAULT '',\n \"repository_url\" TEXT DEFAULT '',\n \"template_name\" TEXT DEFAULT '',\n \"provisioning_status\" TEXT DEFAULT '',\n \"provisioned_at\" TIMESTAMP,\n \"provisioning_error\" TEXT DEFAULT '',\n \"metadata\" TEXT DEFAULT ''\n);",
310
+ "ddl": "CREATE TABLE IF NOT EXISTS \"sites\" (\n \"_sync_origin_device_id\" TEXT,\n \"_sync_revision\" INTEGER,\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 \"domain\" TEXT DEFAULT '',\n \"status\" TEXT DEFAULT 'draft',\n \"tier\" TEXT DEFAULT 'free',\n \"database_url\" TEXT DEFAULT '',\n \"database_type\" TEXT DEFAULT '',\n \"portal_config\" TEXT DEFAULT '',\n \"repository_url\" TEXT DEFAULT '',\n \"template_name\" TEXT DEFAULT '',\n \"provisioning_status\" TEXT DEFAULT '',\n \"provisioned_at\" TIMESTAMP,\n \"provisioning_error\" TEXT DEFAULT '',\n \"metadata\" TEXT DEFAULT ''\n);",
305
311
  "columns": {
312
+ "_sync_origin_device_id": {
313
+ "type": "TEXT"
314
+ },
315
+ "_sync_revision": {
316
+ "type": "INTEGER"
317
+ },
306
318
  "id": {
307
319
  "type": "UUID",
308
320
  "primaryKey": true,
@@ -437,7 +449,7 @@
437
449
  ]
438
450
  }
439
451
  ],
440
- "version": "1845042e"
452
+ "version": "e8449af3"
441
453
  },
442
454
  "importPath": "@happyvertical/smrt-sites"
443
455
  },
@@ -670,8 +682,14 @@
670
682
  "validationRules": [],
671
683
  "schema": {
672
684
  "tableName": "sites",
673
- "ddl": "CREATE TABLE IF NOT EXISTS \"sites\" (\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 \"domain\" TEXT DEFAULT '',\n \"status\" TEXT DEFAULT 'draft',\n \"tier\" TEXT DEFAULT 'free',\n \"database_url\" TEXT DEFAULT '',\n \"database_type\" TEXT DEFAULT '',\n \"portal_config\" TEXT DEFAULT '',\n \"repository_url\" TEXT DEFAULT '',\n \"template_name\" TEXT DEFAULT '',\n \"provisioning_status\" TEXT DEFAULT '',\n \"provisioned_at\" TIMESTAMP,\n \"provisioning_error\" TEXT DEFAULT '',\n \"metadata\" TEXT DEFAULT ''\n);",
685
+ "ddl": "CREATE TABLE IF NOT EXISTS \"sites\" (\n \"_sync_origin_device_id\" TEXT,\n \"_sync_revision\" INTEGER,\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 \"domain\" TEXT DEFAULT '',\n \"status\" TEXT DEFAULT 'draft',\n \"tier\" TEXT DEFAULT 'free',\n \"database_url\" TEXT DEFAULT '',\n \"database_type\" TEXT DEFAULT '',\n \"portal_config\" TEXT DEFAULT '',\n \"repository_url\" TEXT DEFAULT '',\n \"template_name\" TEXT DEFAULT '',\n \"provisioning_status\" TEXT DEFAULT '',\n \"provisioned_at\" TIMESTAMP,\n \"provisioning_error\" TEXT DEFAULT '',\n \"metadata\" TEXT DEFAULT ''\n);",
674
686
  "columns": {
687
+ "_sync_origin_device_id": {
688
+ "type": "TEXT"
689
+ },
690
+ "_sync_revision": {
691
+ "type": "INTEGER"
692
+ },
675
693
  "id": {
676
694
  "type": "UUID",
677
695
  "primaryKey": true,
@@ -806,7 +824,7 @@
806
824
  ]
807
825
  }
808
826
  ],
809
- "version": "1845042e"
827
+ "version": "e8449af3"
810
828
  },
811
829
  "importPath": "@happyvertical/smrt-sites"
812
830
  },
@@ -899,8 +917,14 @@
899
917
  "validationRules": [],
900
918
  "schema": {
901
919
  "tableName": "site_agent_bindings",
902
- "ddl": "CREATE TABLE IF NOT EXISTS \"site_agent_bindings\" (\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 \"site_id\" UUID,\n \"agent_class\" TEXT DEFAULT '',\n \"enabled\" BOOLEAN DEFAULT TRUE,\n \"config\" JSON DEFAULT '{}',\n \"priority\" INTEGER DEFAULT 0\n);",
920
+ "ddl": "CREATE TABLE IF NOT EXISTS \"site_agent_bindings\" (\n \"_sync_origin_device_id\" TEXT,\n \"_sync_revision\" INTEGER,\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 \"site_id\" UUID,\n \"agent_class\" TEXT DEFAULT '',\n \"enabled\" BOOLEAN DEFAULT TRUE,\n \"config\" JSON DEFAULT '{}',\n \"priority\" INTEGER DEFAULT 0\n);",
903
921
  "columns": {
922
+ "_sync_origin_device_id": {
923
+ "type": "TEXT"
924
+ },
925
+ "_sync_revision": {
926
+ "type": "INTEGER"
927
+ },
904
928
  "id": {
905
929
  "type": "UUID",
906
930
  "primaryKey": true,
@@ -994,7 +1018,7 @@
994
1018
  ]
995
1019
  }
996
1020
  ],
997
- "version": "dec43c9c"
1021
+ "version": "a739eab3"
998
1022
  },
999
1023
  "importPath": "@happyvertical/smrt-sites"
1000
1024
  }
@@ -3,13 +3,13 @@
3
3
  "sensitiveFieldsExcluded": true,
4
4
  "generatedAt": "1970-01-01T00:00:00.000Z",
5
5
  "packageName": "@happyvertical/smrt-sites",
6
- "packageVersion": "0.60.9",
6
+ "packageVersion": "0.60.11",
7
7
  "sourceManifestPath": "dist/manifest.json",
8
8
  "agentDocPath": "AGENTS.md",
9
9
  "sourceHashes": {
10
- "manifest": "9a86de330c91604bf4935541db6dfcf1c9f02971df6c12becebd9ca49de538b1",
11
- "packageJson": "a3be542101c7d3e5af5c0c9b801f2bdfcce95cd19c354053fd4b362e36449749",
12
- "agents": "20ecba2963426d3e132157f077fbdc5583a20bb0f68d8a7942cf7f8ada5d5aa2"
10
+ "manifest": "c65cfe3566c544b96f88c16c357d2e95321ce741fb7a2a28b1a5ad2634c736cf",
11
+ "packageJson": "adaef57d86fc50e3594d738ac02b56732c7e3044a73b346863ae0688da17f125",
12
+ "agents": "0ee34501763edd03b724f974703c4db0719d0e0a813099c38de86782c5fa2f78"
13
13
  },
14
14
  "exports": [
15
15
  ".",
@@ -992,7 +992,7 @@
992
992
  "polymorphicAssociations": 0,
993
993
  "uuidColumns": 10
994
994
  },
995
- "agentDoc": "# @happyvertical/smrt-sites\n\nMulti-tenant site lifecycle management with agent bindings.\n\n## Models\n\n- **Site**: `domain` (unique per tenant), `tier` (free/standard/premium), `portalConfig` JSON, database connection, `provisioningStatus`/`provisioningTimestamp`. Status: draft/active/suspended/archived.\n- **SiteAgentBinding**: junction linking sites to agent classes. Per-site `config` overrides and `priority` ordering. `conflictColumns: ['site_id', 'agent_class']`.\n\n## SiteService\n\nStateless lifecycle ops: `activate()`, `suspend()`, `archive()`. `bindAgent()` handles upsert (update config if exists, create if not).\n\n## Gotchas\n\n- **Required tenancy**: both models use `@TenantScoped({ mode: 'required' })` — must have tenant context\n- **portalConfig accepts both object and JSON string** in constructor\n- **SiteAgentBinding.config is nullable**: auto-parsed from JSON on init\n",
995
+ "agentDoc": "# @happyvertical/smrt-sites\n\nMulti-tenant site lifecycle management with agent bindings.\n\n## Models\n\n- **Site**: `domain` (unique per tenant), `tier` (free/standard/premium), `portalConfig` JSON, database connection, `provisioningStatus`/`provisioningTimestamp`. Status: draft/active/suspended/archived.\n- **SiteAgentBinding**: junction linking sites to agent classes. Per-site `config` overrides and `priority` ordering. `conflictColumns: ['site_id', 'agent_class']`.\n\n## SiteService\n\nStateless lifecycle ops: `activate()`, `suspend()`, `archive()`. `bindAgent()` handles upsert (update config if exists, create if not).\n\n## Gotchas\n\n- **Required tenancy**: both models use `@TenantScoped({ mode: 'required' })` — must have tenant context\n- **portalConfig accepts both object and JSON string** in constructor\n- **SiteAgentBinding.config is nullable**: auto-parsed from JSON on init\n- **Status tracking only; nothing is provisioned here**: `markProvisioned()` / `markProvisioningFailed()` record `provisioningStatus` for a host that does the real provisioning and deployment (infrastructure, credentials, content UI)\n",
996
996
  "browser": {
997
997
  "status": "server-only",
998
998
  "issues": [
@@ -0,0 +1,65 @@
1
+ ---
2
+ type: "Component"
3
+ title: "@happyvertical/smrt-sites"
4
+ description: "Site lifecycle management for multi-tenant SMRT networks"
5
+ status: "stable"
6
+ generated:
7
+ by: "smrt/scripts/generate-knowledge-okf.ts"
8
+ at: "2026-11-05T15:48:19Z"
9
+ audience: "internal"
10
+ evidence_level: "source-inspected"
11
+ source_revision: "sha256:e957a649b560c73fb0d275f97490b43c8c067f7cf9d267514cd9a6a82ee8b936"
12
+ sources:
13
+ - id: "manifest"
14
+ resource: "https://github.com/happyvertical/smrt/blob/main/packages/sites/package.json"
15
+ title: "@happyvertical/smrt-sites package manifest"
16
+ - id: "agents"
17
+ resource: "https://github.com/happyvertical/smrt/blob/main/packages/sites/AGENTS.md"
18
+ title: "@happyvertical/smrt-sites packages/sites/AGENTS.md"
19
+ ---
20
+
21
+ # @happyvertical/smrt-sites
22
+
23
+ ## Package
24
+
25
+ - Directory: `packages/sites`
26
+ - Private: no
27
+ - Object source: `domain-artifact`
28
+ - Evidence level: `source-inspected`
29
+
30
+ ## Documentation
31
+
32
+ - `packages/sites/AGENTS.md`
33
+
34
+ ## Framework dependencies
35
+
36
+ - [smrt-cli](/components/smrt-cli.md)
37
+ - [smrt-core](/components/smrt-core.md)
38
+ - [smrt-tenancy](/components/smrt-tenancy.md)
39
+ - [smrt-vitest](/components/smrt-vitest.md)
40
+
41
+ ## SDK dependencies
42
+
43
+ - `@happyvertical/sql`
44
+
45
+ ## Exports
46
+
47
+ - `.`
48
+ - `./manifest`
49
+ - `./manifest.json`
50
+
51
+ ## Models
52
+
53
+ - `Site` (collection `sites`, extends `SmrtObject`)
54
+ - `SiteAgentBinding` (collection `siteagentbindings`, extends `SmrtObject`)
55
+ - `SiteAgentBindingCollection` (collection `siteagentbindings`, extends `SmrtCollection`)
56
+ - `SiteCollection` (collection `sites`, extends `SmrtCollection`)
57
+
58
+ ## MCP tools
59
+
60
+ - `site_create`: create on `@happyvertical/smrt-sites:Site`
61
+ - `site_get`: get on `@happyvertical/smrt-sites:Site`
62
+ - `site_list`: list on `@happyvertical/smrt-sites:Site`
63
+ - `site_update`: update on `@happyvertical/smrt-sites:Site`
64
+ - `siteagentbinding_get`: get on `@happyvertical/smrt-sites:SiteAgentBinding`
65
+ - `siteagentbinding_list`: list on `@happyvertical/smrt-sites:SiteAgentBinding`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-sites",
3
- "version": "0.60.9",
3
+ "version": "0.60.11",
4
4
  "description": "Site lifecycle management for multi-tenant SMRT networks",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -19,13 +19,13 @@
19
19
  "./manifest.json": "./dist/manifest.json"
20
20
  },
21
21
  "dependencies": {
22
- "@happyvertical/smrt-core": "0.60.9",
23
- "@happyvertical/smrt-tenancy": "0.60.9"
22
+ "@happyvertical/smrt-core": "0.60.11",
23
+ "@happyvertical/smrt-tenancy": "0.60.11"
24
24
  },
25
25
  "devDependencies": {
26
- "@happyvertical/smrt-cli": "0.60.9",
27
- "@happyvertical/smrt-vitest": "0.60.9",
28
- "@happyvertical/sql": "^0.111.3",
26
+ "@happyvertical/smrt-cli": "0.60.11",
27
+ "@happyvertical/smrt-vitest": "0.60.11",
28
+ "@happyvertical/sql": "^0.111.5",
29
29
  "@types/node": "24.13.6",
30
30
  "typescript": "6.0.3",
31
31
  "vite": "8.1.6",