@aglyn/aglyn 1.0.0-beta.220 → 1.0.0-beta.221
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/package.json +11 -11
- package/src/lib/app-utils/docs-help.generated.d.ts +2 -2
- package/src/lib/app-utils/docs-help.generated.js +3 -0
- package/src/lib/app-utils/docs-help.generated.js.map +1 -1
- package/src/lib/app-utils/docs-index.generated.js +9 -2
- package/src/lib/app-utils/docs-index.generated.js.map +1 -1
- package/src/lib/app-utils/health-report.js +22 -0
- package/src/lib/app-utils/health-report.js.map +1 -1
- package/src/lib/app-utils/leaving-notice.d.ts +96 -0
- package/src/lib/app-utils/leaving-notice.js +157 -0
- package/src/lib/app-utils/leaving-notice.js.map +1 -0
- package/src/lib/app-utils/operator-alerts.js +17 -0
- package/src/lib/app-utils/operator-alerts.js.map +1 -1
- package/src/lib/app-utils/screen-link-context-value.d.ts +7 -0
- package/src/lib/app-utils/screen-link-context-value.js.map +1 -1
- package/src/lib/app-utils/screen-link-context.js +14 -2
- package/src/lib/app-utils/screen-link-context.js.map +1 -1
- package/src/lib/app-utils/screen-route.d.ts +3 -0
- package/src/lib/app-utils/screen-route.js +6 -1
- package/src/lib/app-utils/screen-route.js.map +1 -1
- package/src/lib/plugin-manager/first-party-plugins.generated.d.ts +6 -0
- package/src/lib/plugin-manager/first-party-plugins.generated.js +4 -0
- package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -1
- package/src/lib/plugin-manager/plugin-server-steps.d.ts +170 -0
- package/src/lib/plugin-manager/plugin-server-steps.js +116 -0
- package/src/lib/plugin-manager/plugin-server-steps.js.map +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/plugin-manager/first-party-plugins.generated.ts"],"sourcesContent":["/**\n * GENERATED FILE — do not edit. Regenerate with:\n * node tools/scripts/generate-plugin-manifests.mjs\n *\n * The switchboard catalog (AGL-3080): one row per plugin and capability, each\n * declared by its own `catalog` block in plugins.config.json. The core holds\n * the types and the resolvers in `enabled-plugins.ts`; it holds no row.\n */\n\nimport type { FirstPartyPlugin, PluginEditBarLink, PublishedSiteImpact } from './enabled-plugins'\nimport type { ResolvedPluginHostCollection, ResolvedPluginOrgCollection } from './plugin-host-collections'\nimport type { ResolvedPluginSitemapSection } from './plugin-sitemap-sections'\nimport type { ResolvedPluginSiteBundleSectionDeclaration } from './plugin-site-bundle'\nimport type { ResolvedPluginOrgCapacity } from './plugin-org-capacity'\nimport type { ResolvedPluginCostAxis, ResolvedPluginSpendLine, ResolvedPluginUsageBand, ResolvedPluginUsageMeter } from './plugin-usage-axes'\nimport type { ResolvedPluginPlanFeature, ResolvedPluginPlanQuota } from './plugin-plan-entitlements'\nimport type { FunctionBindings } from './plugin-contributions'\nimport type { PluginDistribution } from './plugin-distribution'\nimport type { RepeatSourceDeclaration } from './repeat-rows'\nimport type { PluginTemplateSource } from './plugin-template-sources'\nimport type { FormRecordTargetDeclaration } from './submission-record-target'\nimport type { ResolvedBesignerDocument } from './besigner-documents'\nimport type { PluginOrgKeyedCollection } from './plugin-org-erasure'\nimport type { ResolvedVideoEmbedProvider } from './video-embed-provider'\nimport type { AnalyticsProviderDeclaration } from '../app-utils/analytics-provider'\nimport type { InteractionStepDeclaration } from '../app-utils/site-interactions'\nimport type { NotificationCategoryDeclaration, NotificationDigestDeclaration } from '../app-utils/notifications'\n\nexport const FIRST_PARTY_PLUGINS: readonly FirstPartyPlugin[] = [\n {\n \"id\": \"mui\",\n \"label\": \"Components\",\n \"alwaysOn\": true,\n \"description\": \"The base component and theme library every site builds on.\"\n },\n {\n \"id\": \"forms\",\n \"label\": \"Forms\",\n \"alwaysOnForWorkspace\": true,\n \"description\": \"Forms on the site and the catalog that owns them.\",\n \"siteOff\": {\n \"stops\": \"Switching Forms off for this site stops forms rendering on its published pages, refuses every submission sent to it, and blocks publishing a form, or a page that carries one, until Forms is back on.\",\n \"keeps\": \"Submissions already received, the workspace’s form catalog and the CRM leads its forms created are kept, and forms keep working on the workspace’s other sites.\",\n \"confirm\": true,\n \"pages\": {\n \"heading\": \"These published pages carry a form. Their forms stop rendering and stop accepting submissions:\",\n \"none\": \"No published page on this site carries a form.\"\n }\n }\n },\n {\n \"id\": \"ai\",\n \"label\": \"AI\",\n \"alwaysOnForWorkspace\": true,\n \"description\": \"The assistant, generative building and automation, and the AI add-on.\",\n \"siteOff\": {\n \"stops\": \"Switching AI off for this site hides the assistant, Describe it, the AI cards and the editor’s AI controls on this site, refuses every AI request made for it, and stops its queued AI jobs without spending credits.\",\n \"keeps\": \"It does not stop the workspace’s AI add-on, credits, allotments or overage billing, and AI keeps working on the workspace’s other sites.\"\n }\n },\n {\n \"id\": \"theme-presets\",\n \"label\": \"Themes\",\n \"alwaysOnForWorkspace\": true,\n \"description\": \"Built-in themes to pick from on Setup → Theme: Bootstrap, Minimal and Material 3.\",\n \"siteOff\": {\n \"stops\": \"Switching Themes off for this site removes its built-in themes from the theme picker.\",\n \"keeps\": \"A site already using one keeps it, with every edit made to it: picking a theme copies it onto the site, so nothing on the published site changes.\"\n }\n },\n {\n \"id\": \"accounts\",\n \"label\": \"User Accounts\",\n \"description\": \"Visitor accounts on the site: the /signin, /signup and /recover pages, and the Members blocks. On for a new site; a site created before that stays off until you turn it on.\",\n \"releaseFlag\": \"release_member_accounts\",\n \"defaultOffPerSite\": true,\n \"requires\": [\n \"commerce\"\n ]\n },\n {\n \"id\": \"bookings\",\n \"label\": \"Bookings\",\n \"description\": \"Services, open slots, and paid bookings.\",\n \"releaseFlag\": \"release_bookings\"\n },\n {\n \"id\": \"commerce\",\n \"label\": \"Commerce\",\n \"description\": \"Products, carts, checkout, orders, POS.\",\n \"releaseFlag\": \"release_commerce_v2\"\n },\n {\n \"id\": \"marketplace\",\n \"label\": \"Marketplace\",\n \"description\": \"Marketplace listings, templates, and installs.\",\n \"releaseFlag\": \"release_marketplace\"\n },\n {\n \"id\": \"crm\",\n \"label\": \"CRM\",\n \"description\": \"Leads, contacts, companies, deals, tasks and reports.\",\n \"releaseFlag\": \"release_crm\"\n },\n {\n \"id\": \"outreach\",\n \"label\": \"Sequences\",\n \"description\": \"One-to-one email sequences sent from connected mailboxes.\",\n \"releaseFlag\": \"release_outreach\"\n },\n {\n \"id\": \"data\",\n \"label\": \"Data\",\n \"description\": \"Datasets, records, and CSV import/export.\",\n \"releaseFlag\": \"release_data_store\"\n },\n {\n \"id\": \"email\",\n \"label\": \"Email\",\n \"description\": \"Designed emails and campaign sending.\",\n \"releaseFlag\": \"release_email\"\n },\n {\n \"id\": \"events-calendar\",\n \"label\": \"Events Calendar\",\n \"description\": \"Event lists and calendars.\",\n \"releaseFlag\": \"release_events\"\n },\n {\n \"id\": \"inbox\",\n \"label\": \"Inbox\",\n \"description\": \"Form submissions and lead inbox.\",\n \"releaseFlag\": \"release_inbox\"\n },\n {\n \"id\": \"logic\",\n \"label\": \"Logic\",\n \"description\": \"Variables, functions, and reference health.\",\n \"releaseFlag\": \"release_logic\"\n },\n {\n \"id\": \"marketing\",\n \"label\": \"Marketing\",\n \"description\": \"Overlays, campaigns, and experiments.\",\n \"releaseFlag\": \"release_marketing\"\n },\n {\n \"id\": \"redirects\",\n \"label\": \"Redirects\",\n \"description\": \"URL redirect rules.\",\n \"releaseFlag\": \"release_redirects\"\n },\n {\n \"id\": \"workflows\",\n \"label\": \"Automation\",\n \"description\": \"Workflows, actions, webhooks, and run logs.\",\n \"releaseFlag\": \"release_workflows\"\n },\n]\n\nexport const PUBLISHED_SITE_IMPACT: Readonly<Record<string, PublishedSiteImpact>> = {\n \"mui\": \"elements\",\n \"forms\": \"elements\",\n \"ai\": \"console-only\",\n \"theme-presets\": \"console-only\",\n \"accounts\": \"routes\",\n \"bookings\": \"elements\",\n \"commerce\": \"elements\",\n \"marketplace\": \"console-only\",\n \"crm\": \"console-only\",\n \"outreach\": \"console-only\",\n \"data\": \"console-only\",\n \"email\": \"elements\",\n \"events-calendar\": \"elements\",\n \"inbox\": \"console-only\",\n \"logic\": \"console-only\",\n \"marketing\": \"elements\",\n \"redirects\": \"routes\",\n \"workflows\": \"routes\",\n}\n\n/**\n * The admin edit bar's quick links, in the order they are drawn — each\n * declared by the plugin whose console page it opens (AGL-3080).\n */\nexport const PLUGIN_EDIT_BAR_LINKS: readonly PluginEditBarLink[] = [\n {\n \"pluginId\": \"inbox\",\n \"order\": 20,\n \"label\": \"Inbox\",\n \"path\": \"/inbox\"\n },\n {\n \"pluginId\": \"commerce\",\n \"order\": 30,\n \"label\": \"Orders\",\n \"path\": \"/products/orders\"\n },\n]\n\n/**\n * Every host subcollection a first-party plugin owns, declared by that plugin\n * (AGL-3080). Core's readers ask this list; core names no collection.\n */\nexport const PLUGIN_HOST_COLLECTIONS_DECLARED: readonly ResolvedPluginHostCollection[] = [\n {\n \"pluginId\": \"forms\",\n \"name\": \"forms\",\n \"routeSlug\": \"forms\"\n },\n {\n \"pluginId\": \"bookings\",\n \"name\": \"services\",\n \"routeSlug\": \"bookings\",\n \"resource\": {\n \"kind\": \"service\",\n \"label\": \"services\",\n \"activityNoun\": \"service\",\n \"quotaKey\": \"servicesPerHost\",\n \"entitlement\": \"bookings\",\n \"fields\": [\n \"name\",\n \"description\",\n \"durationMinutes\",\n \"priceUsd\",\n \"timezone\",\n \"windows\",\n \"crmFollowUpTask\",\n \"crmMeetingActivity\"\n ]\n },\n \"siteExport\": {\n \"limit\": 50,\n \"fields\": [\n \"name\",\n \"description\",\n \"durationMinutes\",\n \"priceUsd\",\n \"timezone\",\n \"windows\",\n \"crmFollowUpTask\",\n \"crmMeetingActivity\"\n ]\n }\n },\n {\n \"pluginId\": \"bookings\",\n \"name\": \"bookings\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Booking records — a customer, a time and a service pointer. The service holds the imagery and IS scanned; a booking is the transaction against it.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"products\",\n \"routeSlug\": \"products\",\n \"resource\": {\n \"kind\": \"product\",\n \"label\": \"products\",\n \"activityNoun\": \"product\",\n \"quotaKey\": \"productsPerHost\",\n \"entitlement\": \"commerce\",\n \"fields\": [\n \"name\",\n \"slug\",\n \"description\",\n \"type\",\n \"status\",\n \"mediaUrls\",\n \"categoryIds\",\n \"tags\",\n \"options\",\n \"variants\",\n \"seo\",\n \"supplierId\",\n \"oversellPolicy\",\n \"taxExempt\",\n \"digitalFiles\",\n \"downloadLimit\",\n \"subscription\",\n \"subscriptionOptional\",\n \"gatedVideos\",\n \"relatedProductIds\",\n \"giftCard\",\n \"lowStockThreshold\",\n \"createdAtMs\",\n \"updatedAtMs\",\n \"nameLower\",\n \"nameTokens\",\n \"nameReversed\",\n \"skus\",\n \"barcodes\",\n \"priceFromCents\",\n \"soldOut\",\n \"collectionIds\",\n \"priceUsd\",\n \"inventory\",\n \"imageUrl\"\n ],\n \"stamps\": {\n \"deletedAt\": null\n }\n }\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"productCategories\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"suppliers\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"locations\",\n \"routeSlug\": \"products\",\n \"resource\": {\n \"kind\": \"location\",\n \"label\": \"inventory locations\",\n \"activityNoun\": \"inventory location\",\n \"quotaKey\": \"inventoryLocations\",\n \"entitlement\": \"commerce\",\n \"fields\": [\n \"name\",\n \"isDefault\",\n \"address\"\n ]\n }\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"coupons\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"discounts\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"reviews\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"memberPosts\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"resources\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"settings\",\n \"label\": \"Store settings\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"siteMembers\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"siteMemberCredentials\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"A site member's password hash, one document per member, read and written only by the membership routes (AGL-3308). A credential with no content field, and no client may read it.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"orders\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Completed orders. Line items COPY a product's `imageUrl` at purchase time, so these would match — and matching would be the wrong answer: an order is an immutable record of what was sold, deleting the asset changes nothing about it, and no author can edit one. A busy store also holds more of these than the whole read budget.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"carts\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Live and abandoned carts, with the same copied line-item image and the same reasoning, at higher volume — one document per shopper session.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"checkouts\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"In-flight checkout sessions. Transient buyer state carrying the same line-item snapshot as `carts`.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"reservations\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"POS and booking holds. Short-lived transaction rows pointing at a resource that is itself scanned.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"stockHolds\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Inventory holds taken during checkout. Machine-written, short-lived, and a quantity rather than content.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"subscriptions\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Site membership subscriptions: a plan pointer, a status and Stripe ids. Server-written from the billing webhook.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"registers\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"POS register allocations — a count against the register add-on, read by billing (AGL-1775). No content field at all.\",\n \"resource\": {\n \"kind\": \"register\",\n \"label\": \"POS registers\",\n \"activityNoun\": \"POS register\",\n \"quotaKey\": \"posRegisters\",\n \"entitlement\": \"pos\",\n \"fields\": [\n \"name\",\n \"locationId\"\n ]\n }\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"giftCards\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Gift card balances and redemption history. Money, not content.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"licenseKeys\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Digital-product license keys issued at fulfilment: a code, an order pointer and a revocation flag.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"inventoryAdjustments\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"The append-only stock adjustment ledger (AGL-2269). One row per manual stock edit and per cancellation release, unbounded over a store's life.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"inventoryReconciliation\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Reconciliation runs comparing counted stock against recorded stock. Machine-written totals.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"restockAlerts\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Back-in-stock requests: an email address and a product pointer, written by visitors.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"stripeTaxRates\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Cached Stripe tax rate ids, written by the tax sync. Vendor ids.\"\n },\n {\n \"pluginId\": \"marketplace\",\n \"name\": \"installs\"\n },\n {\n \"pluginId\": \"crm\",\n \"name\": \"leads\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Captured leads, on the same footing as `formSubmissions`: visitor-submitted, unbounded, and never a place an author places an asset.\"\n },\n {\n \"pluginId\": \"email\",\n \"name\": \"suppressions\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Unsubscribes, bounces and spam complaints. Email addresses and a reason.\"\n },\n {\n \"pluginId\": \"events-calendar\",\n \"name\": \"events\",\n \"routeSlug\": \"events\"\n },\n {\n \"pluginId\": \"inbox\",\n \"name\": \"formSubmissions\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Visitor form submissions. Unbounded, PII-heavy, and a file attached to one is the visitor's upload — not a library asset an author picked, and not something deleting a library asset would break.\"\n },\n {\n \"pluginId\": \"logic\",\n \"name\": \"functions\",\n \"routeSlug\": \"logic\",\n \"resource\": {\n \"kind\": \"function\",\n \"label\": \"functions\",\n \"activityNoun\": \"function\",\n \"activityType\": \"function\",\n \"quotaKey\": \"functionsPerHost\",\n \"fields\": [\n \"name\",\n \"parameters\",\n \"variables\",\n \"operations\",\n \"returnValue\"\n ]\n },\n \"siteExport\": {\n \"limit\": 100,\n \"fields\": [\n \"name\",\n \"parameters\",\n \"variables\",\n \"operations\",\n \"returnValue\"\n ]\n }\n },\n {\n \"pluginId\": \"logic\",\n \"name\": \"variables\",\n \"routeSlug\": \"logic\",\n \"resource\": {\n \"kind\": \"variable\",\n \"label\": \"variables\",\n \"activityNoun\": \"variable\",\n \"activityType\": \"variable\",\n \"quotaKey\": \"variablesPerHost\",\n \"fields\": [\n \"name\",\n \"type\",\n \"value\",\n \"workflowId\",\n \"workflowName\"\n ]\n },\n \"siteExport\": {\n \"limit\": 100,\n \"fields\": [\n \"name\",\n \"type\",\n \"value\",\n \"workflowId\",\n \"workflowName\"\n ]\n }\n },\n {\n \"pluginId\": \"marketing\",\n \"name\": \"experiments\",\n \"routeSlug\": \"marketing\"\n },\n {\n \"pluginId\": \"marketing\",\n \"name\": \"overlays\",\n \"routeSlug\": \"marketing\"\n },\n {\n \"pluginId\": \"marketing\",\n \"name\": \"campaignAttributions\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"One row per conversion — a form submission, a lead, a contact or a booking — recording which campaign the visitor arrived from. Written only by the Admin SDK, and the whole record is three sanitized UTM strings capped at a hundred characters: there is no field an asset could occupy and no surface that could pick one into it. Unbounded on the same footing as the conversions it credits.\"\n },\n {\n \"pluginId\": \"redirects\",\n \"name\": \"redirects\",\n \"routeSlug\": \"redirects\",\n \"resource\": {\n \"kind\": \"redirect\",\n \"label\": \"redirects\",\n \"activityNoun\": \"redirect\",\n \"quotaKey\": \"redirectsPerHost\",\n \"entitlement\": \"redirects\",\n \"requiresPublishRole\": true,\n \"fields\": [\n \"source\",\n \"destination\",\n \"statusCode\",\n \"kind\",\n \"priority\",\n \"enabled\"\n ],\n \"externalDestination\": {\n \"field\": \"destination\",\n \"approvedByField\": \"externalDestinationApprovedBy\"\n },\n \"livePathField\": \"source\"\n }\n },\n {\n \"pluginId\": \"workflows\",\n \"name\": \"workflows\",\n \"routeSlug\": \"automation\",\n \"resource\": {\n \"kind\": \"workflow\",\n \"label\": \"workflows\",\n \"activityNoun\": \"workflow\",\n \"activityType\": \"workflow\",\n \"quotaKey\": \"workflowsPerHost\",\n \"entitlement\": \"workflows\",\n \"fields\": [\n \"name\",\n \"steps\",\n \"returnValue\",\n \"trigger\"\n ],\n \"duplicate\": {\n \"nameField\": \"name\",\n \"fields\": [\n \"steps\",\n \"returnValue\"\n ],\n \"stamps\": {\n \"trigger\": null\n }\n }\n },\n \"siteExport\": {\n \"limit\": 100,\n \"fields\": [\n \"name\",\n \"steps\",\n \"returnValue\",\n \"trigger\"\n ]\n }\n },\n {\n \"pluginId\": \"workflows\",\n \"name\": \"webhooks\",\n \"routeSlug\": \"automation\",\n \"resource\": {\n \"kind\": \"webhook\",\n \"label\": \"webhooks\",\n \"activityNoun\": \"webhook\",\n \"entitlement\": \"webhooks\",\n \"platformCap\": \"WEBHOOK_MAX_PER_HOST\",\n \"softDeletes\": true,\n \"fields\": [\n \"name\",\n \"direction\",\n \"url\",\n \"workflowName\",\n \"secret\",\n \"enabled\"\n ]\n }\n },\n {\n \"pluginId\": \"workflows\",\n \"name\": \"actions\",\n \"routeSlug\": \"automation\",\n \"resource\": {\n \"kind\": \"action\",\n \"label\": \"interactions and actions\",\n \"activityNoun\": \"action\",\n \"platformCap\": \"ACTIONS_MAX_PER_HOST\",\n \"softDeletes\": true,\n \"fields\": [\n \"name\",\n \"description\",\n \"trigger\",\n \"steps\",\n \"enabled\",\n \"frequency\",\n \"cooldownMinutes\",\n \"audience\",\n \"nodeId\",\n \"screenId\"\n ]\n },\n \"siteExport\": {\n \"limit\": 100,\n \"fields\": [\n \"name\",\n \"trigger\",\n \"steps\",\n \"enabled\",\n \"recipe\"\n ]\n }\n },\n]\n\n/**\n * Every child sitemap a first-party plugin's documents fill, declared by that\n * plugin (AGL-3080), in the order the index lists them.\n */\nexport const PLUGIN_SITEMAP_SECTIONS_DECLARED: readonly ResolvedPluginSitemapSection[] = [\n {\n \"pluginId\": \"commerce\",\n \"section\": \"products\",\n \"collection\": \"products\",\n \"where\": {\n \"field\": \"status\",\n \"equals\": \"active\"\n },\n \"enabledBy\": {\n \"doc\": \"settings/store\",\n \"field\": \"pdpScreenId\"\n },\n \"path\": \"/products/{slug}\",\n \"skipWhen\": \"deletedAt\",\n \"lastmod\": [\n \"updatedAtMs\",\n \"createdAtMs\"\n ]\n },\n {\n \"pluginId\": \"commerce\",\n \"section\": \"catalog\",\n \"collection\": \"collections\",\n \"where\": {\n \"field\": \"kind\",\n \"equals\": \"catalog\"\n },\n \"enabledBy\": {\n \"doc\": \"settings/store\",\n \"field\": \"collectionScreenId\"\n },\n \"path\": \"/collections/{slug}\",\n \"lastmod\": [\n \"updatedAt\",\n \"createdAt\"\n ]\n },\n]\n\n/**\n * Every section of the whole-site backup a first-party plugin answers for,\n * declared by that plugin (AGL-3080), in the order the bundle carries them.\n */\nexport const PLUGIN_SITE_BUNDLE_SECTIONS_DECLARED: readonly ResolvedPluginSiteBundleSectionDeclaration[] = [\n {\n \"pluginId\": \"data\",\n \"key\": \"datasets\",\n \"limit\": 50\n }\n]\n\n/**\n * Every org collection a first-party plugin owns whose documents the media\n * scan reads, declared by that plugin (AGL-3273).\n */\nexport const PLUGIN_ORG_COLLECTIONS_DECLARED: readonly ResolvedPluginOrgCollection[] = [\n {\n \"pluginId\": \"marketing\",\n \"name\": \"campaigns\",\n \"routeSlug\": \"marketing\",\n \"siteField\": \"hostId\",\n \"holdsTransferWhile\": {\n \"field\": \"status\",\n \"values\": [\n \"scheduled\",\n \"sending\"\n ]\n }\n },\n {\n \"pluginId\": \"marketing\",\n \"name\": \"emailCampaigns\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"The campaign CONTAINER — a name, a date window, the list ids it is aimed at, a topic and the sites it runs on. Distinct from `campaigns`, which holds the sends and IS scanned because a send carries the copy that went out. A container carries no copy and no asset reference: the design a send renders is a screen, and the screen is where the picker writes.\"\n },\n {\n \"pluginId\": \"workflows\",\n \"name\": \"automations\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"An org automation (AGL-3302) — a trigger, its conditions, the sites it is placed on, and a step list drawn from the server steps only: email subject and body as plain text, list, dataset and campaign ids, CRM fields and waits. No step it may hold carries a media reference, the in-page steps that could (custom HTML, popups) are refused by its save route, and it is written only by that route.\"\n },\n]\n\n/**\n * Every org capacity a first-party plugin backs, declared by that plugin\n * (AGL-3080). Core owns the money; this says what is counted and what it is\n * called.\n */\nexport const PLUGIN_ORG_CAPACITIES_DECLARED: readonly ResolvedPluginOrgCapacity[] = [\n {\n \"pluginId\": \"data\",\n \"kind\": \"datasets\",\n \"order\": 30,\n \"collection\": \"datasets\",\n \"addonKind\": \"datasets\",\n \"includedEntitlement\": \"datasetsPerOrg\",\n \"purchaseCeilingEntitlement\": \"maxDatasetsPerOrg\",\n \"nouns\": {\n \"one\": \"dataset\",\n \"many\": \"datasets\",\n \"addon\": \"extra datasets\"\n }\n },\n]\n\n/**\n * What each plan includes of every quota a first-party plugin owns, declared\n * by that plugin (AGL-3080). `PLAN_ENTITLEMENTS` composes these; core names\n * no key.\n */\nexport const PLUGIN_PLAN_QUOTAS_DECLARED: readonly ResolvedPluginPlanQuota[] = [\n {\n \"pluginId\": \"forms\",\n \"key\": \"formSubmissionsPerMonth\",\n \"label\": \"Form subs / mo\",\n \"byPlan\": {\n \"free\": 20,\n \"starter\": 200,\n \"pro\": 1000,\n \"business\": 8000,\n \"scale\": 25000,\n \"advanced\": 40000,\n \"agency\": 25000,\n \"enterprise\": 50000\n }\n },\n {\n \"pluginId\": \"marketplace\",\n \"key\": \"marketplaceFeePct\",\n \"label\": \"Marketplace fee %\",\n \"price\": true,\n \"byPlan\": {\n \"free\": 30,\n \"starter\": 20,\n \"pro\": 20,\n \"business\": 20,\n \"scale\": 20,\n \"advanced\": 20,\n \"agency\": 20,\n \"enterprise\": 20\n }\n },\n {\n \"pluginId\": \"crm\",\n \"key\": \"crmEmailsPerDay\",\n \"label\": \"One-to-one emails / day\",\n \"byPlan\": {\n \"free\": 0,\n \"starter\": 50,\n \"pro\": 150,\n \"business\": 200,\n \"scale\": 300,\n \"advanced\": 500,\n \"agency\": 1000,\n \"enterprise\": 2000\n }\n },\n {\n \"pluginId\": \"workflows\",\n \"key\": \"workflowRunsPerMonth\",\n \"label\": \"Workflow runs / mo\",\n \"byPlan\": {\n \"free\": 0,\n \"starter\": 500,\n \"pro\": 5000,\n \"business\": 50000,\n \"scale\": 150000,\n \"advanced\": 500000,\n \"agency\": 2000000,\n \"enterprise\": 4000000\n }\n },\n {\n \"pluginId\": \"ai\",\n \"key\": \"assistCreditsPerMonth\",\n \"label\": \"AI credits / mo\",\n \"byPlan\": {\n \"free\": 300,\n \"starter\": 750,\n \"pro\": 2750,\n \"business\": 7500,\n \"scale\": 10000,\n \"advanced\": 13000,\n \"agency\": 58000,\n \"enterprise\": 116000\n }\n },\n]\n\n/**\n * What each plan includes of every feature a first-party plugin owns,\n * declared by that plugin (AGL-3080).\n */\nexport const PLUGIN_PLAN_FEATURES_DECLARED: readonly ResolvedPluginPlanFeature[] = [\n {\n \"pluginId\": \"commerce\",\n \"key\": \"storefrontSubscriptions\",\n \"label\": \"Storefront subscriptions\",\n \"byPlan\": {\n \"free\": false,\n \"starter\": false,\n \"pro\": false,\n \"business\": true,\n \"scale\": true,\n \"advanced\": true,\n \"agency\": true,\n \"enterprise\": true\n }\n },\n {\n \"pluginId\": \"commerce\",\n \"key\": \"giftCards\",\n \"label\": \"Gift cards\",\n \"byPlan\": {\n \"free\": false,\n \"starter\": false,\n \"pro\": false,\n \"business\": true,\n \"scale\": true,\n \"advanced\": true,\n \"agency\": true,\n \"enterprise\": true\n }\n },\n {\n \"pluginId\": \"commerce\",\n \"key\": \"commerceAnalytics\",\n \"label\": \"Commerce analytics\",\n \"byPlan\": {\n \"free\": false,\n \"starter\": false,\n \"pro\": true,\n \"business\": true,\n \"scale\": true,\n \"advanced\": true,\n \"agency\": true,\n \"enterprise\": true\n }\n },\n {\n \"pluginId\": \"marketplace\",\n \"key\": \"marketplaceSelling\",\n \"label\": \"Sell on the marketplace\",\n \"byPlan\": {\n \"free\": false,\n \"starter\": false,\n \"pro\": true,\n \"business\": true,\n \"scale\": true,\n \"advanced\": true,\n \"agency\": true,\n \"enterprise\": true\n }\n },\n]\n\n/**\n * Every meter a first-party plugin contributes to the platform's cost model,\n * in breakdown order, declared by that plugin (AGL-3080). Core keeps the rates.\n */\nexport const PLUGIN_COST_AXES_DECLARED: readonly ResolvedPluginCostAxis[] = [\n {\n \"pluginId\": \"forms\",\n \"id\": \"formSubmissions\",\n \"order\": 30,\n \"fields\": [\n \"formSubmissions\"\n ],\n \"rate\": \"perFormSubmission\"\n },\n {\n \"pluginId\": \"crm\",\n \"id\": \"contacts\",\n \"order\": 60,\n \"fields\": [\n \"crmRecordsCount\"\n ],\n \"fallbackFields\": [\n \"contactsCount\"\n ],\n \"recordedFields\": [\n \"companiesCount\",\n \"dealsCount\"\n ],\n \"rate\": \"perContactMonth\"\n },\n {\n \"pluginId\": \"ai\",\n \"id\": \"assist\",\n \"order\": 80,\n \"fields\": [\n \"assistCostUsd\"\n ],\n \"staffFields\": [\n \"assistCredits\",\n \"assistOverageUsd\"\n ],\n \"live\": {\n \"collection\": \"assistUsage\",\n \"fields\": [\n \"providerCostUsd\",\n \"estCostUsd\"\n ]\n }\n },\n {\n \"pluginId\": \"workflows\",\n \"id\": \"runs\",\n \"order\": 90,\n \"fields\": [\n \"workflowRuns\",\n \"actionRuns\"\n ],\n \"rate\": \"perRun\"\n },\n]\n\n/**\n * Every band a first-party plugin contributes to the utilization table, in\n * column order, declared by that plugin (AGL-3080).\n */\nexport const PLUGIN_USAGE_BANDS_DECLARED: readonly ResolvedPluginUsageBand[] = [\n {\n \"pluginId\": \"forms\",\n \"id\": \"formSubmissions\",\n \"label\": \"Form submissions\",\n \"order\": 40,\n \"fields\": [\n \"formSubmissions\"\n ],\n \"entitlement\": \"formSubmissionsPerMonth\",\n \"perHost\": true,\n \"hostCounter\": \"formSubmissions\",\n \"metered\": {\n \"rate\": \"perFormSubmission\",\n \"quotedPer\": 1000,\n \"noun\": \"form submissions\",\n \"withheldUntil\": \"release_inbox\"\n }\n },\n {\n \"pluginId\": \"crm\",\n \"id\": \"contactsCount\",\n \"label\": \"CRM records\",\n \"order\": 70,\n \"fields\": [\n \"crmRecordsCount\"\n ],\n \"fallbackFields\": [\n \"contactsCount\"\n ],\n \"entitlement\": \"contactsPerHost\"\n },\n {\n \"pluginId\": \"ai\",\n \"id\": \"assistCredits\",\n \"label\": \"Assist credits\",\n \"order\": 90,\n \"fields\": [\n \"assistCostUsd\"\n ],\n \"entitlement\": \"assistCreditsPerMonth\",\n \"unitCostUsd\": 0.001\n },\n {\n \"pluginId\": \"workflows\",\n \"id\": \"workflowRuns\",\n \"label\": \"Workflow runs\",\n \"order\": 100,\n \"fields\": [\n \"workflowRuns\"\n ],\n \"entitlement\": \"workflowRunsPerMonth\",\n \"hostCounter\": \"workflowRuns\",\n \"alert\": {\n \"label\": \"monthly workflow runs\",\n \"noun\": \"workflow runs\",\n \"outcome\": \"stops\",\n \"reached\": \"Workflows pause until next month and nothing is charged — upgrade in Billing to keep them running.\",\n \"approach\": \"Nothing changes and nothing is charged — at the included amount, workflows pause until next month unless you upgrade in Billing.\"\n }\n },\n {\n \"pluginId\": \"workflows\",\n \"id\": \"actionRuns\",\n \"label\": \"Action runs\",\n \"order\": 110,\n \"fields\": [\n \"actionRuns\"\n ],\n \"entitlement\": \"actionRunsPerMonth\"\n },\n]\n\n/**\n * Every line of a workspace's monthly spend a first-party plugin contributes\n * to its usage budget, in catalog order, declared by that plugin (AGL-3080).\n */\nexport const PLUGIN_SPEND_LINES_DECLARED: readonly ResolvedPluginSpendLine[] = [\n {\n \"pluginId\": \"ai\",\n \"id\": \"assist\",\n \"label\": \"Assist\",\n \"live\": {\n \"collection\": \"assistUsage\",\n \"field\": \"estCostUsd\"\n },\n \"billedFromEnv\": \"BILL_ASSIST_TOKENS_FROM\",\n \"unit\": {\n \"costUsd\": 0.001,\n \"label\": \"Assist credits\"\n }\n },\n]\n\n/**\n * Every meter a first-party plugin measures in the monthly usage sweep, in\n * catalog order, declared by that plugin (AGL-3080). The sweep refuses to bill\n * a month while one of these is unregistered.\n */\nexport const PLUGIN_USAGE_METERS_DECLARED: readonly ResolvedPluginUsageMeter[] = [\n {\"pluginId\":\"crm\",\"id\":\"records\"},\n {\"pluginId\":\"data\",\"id\":\"dataset-storage\"},\n {\"pluginId\":\"ai\",\"id\":\"assist\"},\n]\n\n/**\n * Every top-level plugin collection a workspace erasure sweeps by the field\n * naming the organization, declared by the plugin that owns it (AGL-3080).\n */\nexport const PLUGIN_ORG_KEYED_COLLECTIONS: readonly PluginOrgKeyedCollection[] = [\n {\n \"pluginId\": \"outreach\",\n \"name\": \"outreachMailboxCredentials\",\n \"orgField\": \"orgId\"\n },\n {\n \"pluginId\": \"outreach\",\n \"name\": \"outreachLinks\",\n \"orgField\": \"orgId\"\n },\n]\n\n/**\n * The plugins whose org eraser a workspace erasure may not run without\n * (AGL-3080): each holds a record the erasure promises to destroy.\n */\nexport const PLUGIN_REQUIRED_ORG_ERASERS: readonly string[] = [\"marketplace\"]\n\n/**\n * The plugins whose sales the operator's sales tax return may not be filed\n * without (AGL-3080): each registers a tax return source, and one that did\n * not is refused rather than read as nothing sold.\n */\nexport const PLUGIN_TAX_RETURN_SOURCES: readonly string[] = [\"commerce\",\"marketplace\"]\n\n/**\n * The plugins whose earnings the operator's revenue report may not be read\n * without (AGL-3080): each registers a revenue source, and one that did not\n * is refused rather than read as nothing earned.\n */\nexport const PLUGIN_REVENUE_SOURCES: readonly string[] = [\"commerce\",\"marketplace\"]\n\n/**\n * Where published plugin versions and their kill switches are stored, declared\n * by the plugin that distributes them (AGL-3080). `null` when none does, and\n * the realm loader then resolves nothing.\n */\nexport const PLUGIN_DISTRIBUTION: PluginDistribution | null = {\n \"pluginId\": \"marketplace\",\n \"listings\": \"marketplaceListings\",\n \"versions\": \"pluginVersions\",\n \"revocations\": \"revocations\"\n}\n\n/**\n * The plugin that answers a published page's repeats, declared by that plugin\n * (AGL-3080). `null` when none does, and a repeat then renders its element\n * once, as written.\n */\nexport const PLUGIN_REPEAT_SOURCE_DECLARED: RepeatSourceDeclaration | null = {\n \"pluginId\": \"data\",\n \"id\": \"dataset\"\n}\n\n/**\n * The site documents a plugin authors in the besigner, declared by that\n * plugin (AGL-3080). Empty when none does, and the console's plugin-document\n * editor routes answer 404.\n */\nexport const PLUGIN_BESIGNER_DOCUMENTS_DECLARED: readonly ResolvedBesignerDocument[] = [\n {\n \"pluginId\": \"forms\",\n \"kind\": \"form\",\n \"segment\": \"forms\",\n \"collection\": \"forms\",\n \"noun\": \"form\",\n \"publish\": {\n \"path\": \"/api/forms/promote\",\n \"idField\": \"formId\"\n }\n },\n]\n\n/**\n * The plugin whose records a form's submission may also be filed as, declared\n * by that plugin (AGL-3080). `null` when none does, and no form writes one.\n */\nexport const PLUGIN_FORM_RECORD_TARGET_DECLARED: FormRecordTargetDeclaration | null = {\n \"pluginId\": \"data\",\n \"id\": \"dataset\"\n}\n\n/**\n * What a site's template library calls a template a plugin installed, by the\n * `source.type` that plugin stamps, declared by that plugin (AGL-3080).\n * Core names no installer.\n */\nexport const PLUGIN_TEMPLATE_SOURCES: readonly PluginTemplateSource[] = [\n {\n \"pluginId\": \"marketplace\",\n \"type\": \"marketplace\",\n \"label\": \"Marketplace\",\n \"description\": \"Installed from the marketplace\"\n },\n]\n\n/**\n * The analytics settings each provider mounts a tag for, declared by the\n * plugin that adapts the vendor (AGL-3080). Empty when none does, and then no\n * setting configures a tag.\n */\nexport const ANALYTICS_PROVIDERS_DECLARED: readonly AnalyticsProviderDeclaration[] = [\n {\n \"pluginId\": \"marketing\",\n \"settings\": [\n \"gaMeasurementId\",\n \"gtmContainerId\"\n ]\n },\n]\n\n/**\n * Every interaction step a first-party plugin offers in the interaction\n * builder, declared by that plugin (AGL-3080). Core names no plugin step.\n */\nexport const PLUGIN_INTERACTION_STEPS_DECLARED: readonly InteractionStepDeclaration[] = [\n {\n \"pluginId\": \"marketing\",\n \"type\": \"showOverlay\",\n \"label\": \"Open an overlay\",\n \"picks\": {\n \"collection\": \"overlays\",\n \"limit\": 50,\n \"idField\": \"overlayId\",\n \"nameField\": \"overlayName\",\n \"label\": \"Overlay\",\n \"missing\": \"pick an overlay\"\n }\n },\n {\n \"pluginId\": \"workflows\",\n \"type\": \"runWorkflow\",\n \"label\": \"Run a workflow\",\n \"picks\": {\n \"collection\": \"workflows\",\n \"limit\": 100,\n \"idField\": \"workflowId\",\n \"nameField\": \"workflowName\",\n \"label\": \"Workflow\",\n \"missing\": \"pick a workflow\"\n }\n },\n]\n\n/**\n * Every first-party element that runs a site function, and the prop naming\n * it, declared by that element's plugin (AGL-3393). Core names no element.\n */\nexport const FIRST_PARTY_FUNCTION_BINDINGS: FunctionBindings = {}\n\n/**\n * Every video host whose own player the Video element frames, declared by\n * the plugin that plays it (AGL-3080). Core names no host.\n */\nexport const FIRST_PARTY_VIDEO_EMBED_PROVIDERS: readonly ResolvedVideoEmbedProvider[] = [\n {\n \"pluginId\": \"mui\",\n \"id\": \"wistia\",\n \"label\": \"Wistia\",\n \"domains\": [\n \"wistia.com\",\n \"wistia.net\",\n \"wi.st\"\n ],\n \"mediaIdPaths\": [\n \"^\\\\/medias\\\\/([^/]+)(?:\\\\/manage)?\\\\/?$\",\n \"^\\\\/m\\\\/([^/]+)\\\\/?$\",\n \"^\\\\/embed\\\\/iframe\\\\/([^/]+)\\\\/?$\",\n \"^\\\\/embed\\\\/medias\\\\/([^/.]+)(?:\\\\.jsonp?)?\\\\/?$\"\n ],\n \"mediaIdPattern\": \"^[a-z0-9]{10}$\",\n \"playerOrigin\": \"https://fast.wistia.net\",\n \"playerPath\": \"/embed/iframe/{id}\",\n \"playerQuery\": [\n {\n \"param\": \"autoPlay\",\n \"option\": \"autoPlay\",\n \"on\": \"true\",\n \"off\": \"false\"\n },\n {\n \"param\": \"roundedPlayer\",\n \"value\": \"false\"\n },\n {\n \"param\": \"doNotTrack\",\n \"option\": \"doNotTrack\",\n \"on\": \"true\"\n },\n {\n \"param\": \"muted\",\n \"option\": \"muted\",\n \"on\": \"true\"\n },\n {\n \"param\": \"endVideoBehavior\",\n \"option\": \"loop\",\n \"on\": \"loop\"\n }\n ]\n },\n]\n\n/**\n * The notification categories first-party plugins add to the settings page\n * and to every recipient's preferences, declared by each plugin (AGL-3080).\n */\nexport const PLUGIN_NOTIFICATION_CATEGORIES_DECLARED: readonly NotificationCategoryDeclaration[] = [\n {\n \"pluginId\": \"marketplace\",\n \"id\": \"marketplace\",\n \"label\": \"Marketplace\",\n \"description\": \"Decisions on plugin listings you submitted for review.\",\n \"defaults\": {\n \"console\": true,\n \"email\": false\n }\n },\n]\n\n/**\n * The digests first-party plugins send on their own schedule, each with the\n * key its switch is stored under, declared by the plugin that sends it\n * (AGL-3080).\n */\nexport const PLUGIN_NOTIFICATION_DIGESTS_DECLARED: readonly NotificationDigestDeclaration[] = [\n {\n \"pluginId\": \"crm\",\n \"key\": \"crmDaily\",\n \"label\": \"Daily CRM digest\",\n \"description\": \"Each morning: your overdue and due-today tasks and the leads nobody has worked, here and by email.\"\n },\n]\n"],"names":["FIRST_PARTY_PLUGINS","PUBLISHED_SITE_IMPACT","PLUGIN_EDIT_BAR_LINKS","PLUGIN_HOST_COLLECTIONS_DECLARED","PLUGIN_SITEMAP_SECTIONS_DECLARED","PLUGIN_SITE_BUNDLE_SECTIONS_DECLARED","PLUGIN_ORG_COLLECTIONS_DECLARED","PLUGIN_ORG_CAPACITIES_DECLARED","PLUGIN_PLAN_QUOTAS_DECLARED","PLUGIN_PLAN_FEATURES_DECLARED","PLUGIN_COST_AXES_DECLARED","PLUGIN_USAGE_BANDS_DECLARED","PLUGIN_SPEND_LINES_DECLARED","PLUGIN_USAGE_METERS_DECLARED","PLUGIN_ORG_KEYED_COLLECTIONS","PLUGIN_REQUIRED_ORG_ERASERS","PLUGIN_TAX_RETURN_SOURCES","PLUGIN_REVENUE_SOURCES","PLUGIN_DISTRIBUTION","PLUGIN_REPEAT_SOURCE_DECLARED","PLUGIN_BESIGNER_DOCUMENTS_DECLARED","PLUGIN_FORM_RECORD_TARGET_DECLARED","PLUGIN_TEMPLATE_SOURCES","ANALYTICS_PROVIDERS_DECLARED","PLUGIN_INTERACTION_STEPS_DECLARED","FIRST_PARTY_FUNCTION_BINDINGS","FIRST_PARTY_VIDEO_EMBED_PROVIDERS","PLUGIN_NOTIFICATION_CATEGORIES_DECLARED","PLUGIN_NOTIFICATION_DIGESTS_DECLARED"],"mappings":"AAAA;;;;;;;CAOC,GAqBD,OAAO,MAAMA,sBAAmD;IAC9D;QACE,MAAM;QACN,SAAS;QACT,YAAY;QACZ,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,wBAAwB;QACxB,eAAe;QACf,WAAW;YACT,SAAS;YACT,SAAS;YACT,WAAW;YACX,SAAS;gBACP,WAAW;gBACX,QAAQ;YACV;QACF;IACF;IACA;QACE,MAAM;QACN,SAAS;QACT,wBAAwB;QACxB,eAAe;QACf,WAAW;YACT,SAAS;YACT,SAAS;QACX;IACF;IACA;QACE,MAAM;QACN,SAAS;QACT,wBAAwB;QACxB,eAAe;QACf,WAAW;YACT,SAAS;YACT,SAAS;QACX;IACF;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;QACf,qBAAqB;QACrB,YAAY;YACV;SACD;IACH;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;CACD,CAAA;AAED,OAAO,MAAMC,wBAAuE;IAClF,OAAO;IACP,SAAS;IACT,MAAM;IACN,iBAAiB;IACjB,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,OAAO;IACP,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,mBAAmB;IACnB,SAAS;IACT,SAAS;IACT,aAAa;IACb,aAAa;IACb,aAAa;AACf,EAAC;AAED;;;CAGC,GACD,OAAO,MAAMC,wBAAsD;IACjE;QACE,YAAY;QACZ,SAAS;QACT,SAAS;QACT,QAAQ;IACV;IACA;QACE,YAAY;QACZ,SAAS;QACT,SAAS;QACT,QAAQ;IACV;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,mCAA4E;IACvF;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,YAAY;YACZ,eAAe;YACf,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;aACD;QACH;QACA,cAAc;YACZ,SAAS;YACT,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,YAAY;YACZ,eAAe;YACf,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;aACD;YACD,UAAU;gBACR,aAAa;YACf;QACF;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,YAAY;YACZ,eAAe;YACf,UAAU;gBACR;gBACA;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;IACV;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;QACnB,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,YAAY;YACZ,eAAe;YACf,UAAU;gBACR;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;IACV;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,gBAAgB;YAChB,YAAY;YACZ,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;aACD;QACH;QACA,cAAc;YACZ,SAAS;YACT,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,gBAAgB;YAChB,YAAY;YACZ,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;aACD;QACH;QACA,cAAc;YACZ,SAAS;YACT,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,YAAY;YACZ,eAAe;YACf,uBAAuB;YACvB,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;gBACA;aACD;YACD,uBAAuB;gBACrB,SAAS;gBACT,mBAAmB;YACrB;YACA,iBAAiB;QACnB;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,gBAAgB;YAChB,YAAY;YACZ,eAAe;YACf,UAAU;gBACR;gBACA;gBACA;gBACA;aACD;YACD,aAAa;gBACX,aAAa;gBACb,UAAU;oBACR;oBACA;iBACD;gBACD,UAAU;oBACR,WAAW;gBACb;YACF;QACF;QACA,cAAc;YACZ,SAAS;YACT,UAAU;gBACR;gBACA;gBACA;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,eAAe;YACf,eAAe;YACf,eAAe;YACf,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,eAAe;YACf,eAAe;YACf,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;aACD;QACH;QACA,cAAc;YACZ,SAAS;YACT,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;aACD;QACH;IACF;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,mCAA4E;IACvF;QACE,YAAY;QACZ,WAAW;QACX,cAAc;QACd,SAAS;YACP,SAAS;YACT,UAAU;QACZ;QACA,aAAa;YACX,OAAO;YACP,SAAS;QACX;QACA,QAAQ;QACR,YAAY;QACZ,WAAW;YACT;YACA;SACD;IACH;IACA;QACE,YAAY;QACZ,WAAW;QACX,cAAc;QACd,SAAS;YACP,SAAS;YACT,UAAU;QACZ;QACA,aAAa;YACX,OAAO;YACP,SAAS;QACX;QACA,QAAQ;QACR,WAAW;YACT;YACA;SACD;IACH;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,uCAA8F;IACzG;QACE,YAAY;QACZ,OAAO;QACP,SAAS;IACX;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,kCAA0E;IACrF;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,aAAa;QACb,sBAAsB;YACpB,SAAS;YACT,UAAU;gBACR;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;CACD,CAAA;AAED;;;;CAIC,GACD,OAAO,MAAMC,iCAAuE;IAClF;QACE,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,cAAc;QACd,aAAa;QACb,uBAAuB;QACvB,8BAA8B;QAC9B,SAAS;YACP,OAAO;YACP,QAAQ;YACR,SAAS;QACX;IACF;CACD,CAAA;AAED;;;;CAIC,GACD,OAAO,MAAMC,8BAAkE;IAC7E;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;IACA;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;IACA;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;IACA;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;IACA;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,gCAAsE;IACjF;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;IACA;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;IACA;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;IACA;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,4BAA+D;IAC1E;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,UAAU;YACR;SACD;QACD,QAAQ;IACV;IACA;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,UAAU;YACR;SACD;QACD,kBAAkB;YAChB;SACD;QACD,kBAAkB;YAChB;YACA;SACD;QACD,QAAQ;IACV;IACA;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,UAAU;YACR;SACD;QACD,eAAe;YACb;YACA;SACD;QACD,QAAQ;YACN,cAAc;YACd,UAAU;gBACR;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,UAAU;YACR;YACA;SACD;QACD,QAAQ;IACV;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,8BAAkE;IAC7E;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,SAAS;QACT,UAAU;YACR;SACD;QACD,eAAe;QACf,WAAW;QACX,eAAe;QACf,WAAW;YACT,QAAQ;YACR,aAAa;YACb,QAAQ;YACR,iBAAiB;QACnB;IACF;IACA;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,SAAS;QACT,UAAU;YACR;SACD;QACD,kBAAkB;YAChB;SACD;QACD,eAAe;IACjB;IACA;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,SAAS;QACT,UAAU;YACR;SACD;QACD,eAAe;QACf,eAAe;IACjB;IACA;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,SAAS;QACT,UAAU;YACR;SACD;QACD,eAAe;QACf,eAAe;QACf,SAAS;YACP,SAAS;YACT,QAAQ;YACR,WAAW;YACX,WAAW;YACX,YAAY;QACd;IACF;IACA;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,SAAS;QACT,UAAU;YACR;SACD;QACD,eAAe;IACjB;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,8BAAkE;IAC7E;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,QAAQ;YACN,cAAc;YACd,SAAS;QACX;QACA,iBAAiB;QACjB,QAAQ;YACN,WAAW;YACX,SAAS;QACX;IACF;CACD,CAAA;AAED;;;;CAIC,GACD,OAAO,MAAMC,+BAAoE;IAC/E;QAAC,YAAW;QAAM,MAAK;IAAS;IAChC;QAAC,YAAW;QAAO,MAAK;IAAiB;IACzC;QAAC,YAAW;QAAK,MAAK;IAAQ;CAC/B,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,+BAAoE;IAC/E;QACE,YAAY;QACZ,QAAQ;QACR,YAAY;IACd;IACA;QACE,YAAY;QACZ,QAAQ;QACR,YAAY;IACd;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,8BAAiD;IAAC;CAAc,CAAA;AAE7E;;;;CAIC,GACD,OAAO,MAAMC,4BAA+C;IAAC;IAAW;CAAc,CAAA;AAEtF;;;;CAIC,GACD,OAAO,MAAMC,yBAA4C;IAAC;IAAW;CAAc,CAAA;AAEnF;;;;CAIC,GACD,OAAO,MAAMC,sBAAiD;IAC5D,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,eAAe;AACjB,EAAC;AAED;;;;CAIC,GACD,OAAO,MAAMC,gCAAgE;IAC3E,YAAY;IACZ,MAAM;AACR,EAAC;AAED;;;;CAIC,GACD,OAAO,MAAMC,qCAA0E;IACrF;QACE,YAAY;QACZ,QAAQ;QACR,WAAW;QACX,cAAc;QACd,QAAQ;QACR,WAAW;YACT,QAAQ;YACR,WAAW;QACb;IACF;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,qCAAyE;IACpF,YAAY;IACZ,MAAM;AACR,EAAC;AAED;;;;CAIC,GACD,OAAO,MAAMC,0BAA2D;IACtE;QACE,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,eAAe;IACjB;CACD,CAAA;AAED;;;;CAIC,GACD,OAAO,MAAMC,+BAAwE;IACnF;QACE,YAAY;QACZ,YAAY;YACV;YACA;SACD;IACH;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,oCAA2E;IACtF;QACE,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,SAAS;YACP,cAAc;YACd,SAAS;YACT,WAAW;YACX,aAAa;YACb,SAAS;YACT,WAAW;QACb;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,SAAS;YACP,cAAc;YACd,SAAS;YACT,WAAW;YACX,aAAa;YACb,SAAS;YACT,WAAW;QACb;IACF;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,gCAAkD,CAAC,EAAC;AAEjE;;;CAGC,GACD,OAAO,MAAMC,oCAA2E;IACtF;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,WAAW;YACT;YACA;YACA;SACD;QACD,gBAAgB;YACd;YACA;YACA;YACA;SACD;QACD,kBAAkB;QAClB,gBAAgB;QAChB,cAAc;QACd,eAAe;YACb;gBACE,SAAS;gBACT,UAAU;gBACV,MAAM;gBACN,OAAO;YACT;YACA;gBACE,SAAS;gBACT,SAAS;YACX;YACA;gBACE,SAAS;gBACT,UAAU;gBACV,MAAM;YACR;YACA;gBACE,SAAS;gBACT,UAAU;gBACV,MAAM;YACR;YACA;gBACE,SAAS;gBACT,UAAU;gBACV,MAAM;YACR;SACD;IACH;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,0CAAsF;IACjG;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,eAAe;QACf,YAAY;YACV,WAAW;YACX,SAAS;QACX;IACF;CACD,CAAA;AAED;;;;CAIC,GACD,OAAO,MAAMC,uCAAiF;IAC5F;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,eAAe;IACjB;CACD,CAAA"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/plugin-manager/first-party-plugins.generated.ts"],"sourcesContent":["/**\n * GENERATED FILE — do not edit. Regenerate with:\n * node tools/scripts/generate-plugin-manifests.mjs\n *\n * The switchboard catalog (AGL-3080): one row per plugin and capability, each\n * declared by its own `catalog` block in plugins.config.json. The core holds\n * the types and the resolvers in `enabled-plugins.ts`; it holds no row.\n */\n\nimport type { FirstPartyPlugin, PluginEditBarLink, PublishedSiteImpact } from './enabled-plugins'\nimport type { ResolvedPluginHostCollection, ResolvedPluginOrgCollection } from './plugin-host-collections'\nimport type { ResolvedPluginSitemapSection } from './plugin-sitemap-sections'\nimport type { ResolvedPluginSiteBundleSectionDeclaration } from './plugin-site-bundle'\nimport type { ResolvedPluginOrgCapacity } from './plugin-org-capacity'\nimport type { ResolvedPluginCostAxis, ResolvedPluginSpendLine, ResolvedPluginUsageBand, ResolvedPluginUsageMeter } from './plugin-usage-axes'\nimport type { ResolvedPluginPlanFeature, ResolvedPluginPlanQuota } from './plugin-plan-entitlements'\nimport type { FunctionBindings } from './plugin-contributions'\nimport type { PluginDistribution } from './plugin-distribution'\nimport type { RepeatSourceDeclaration } from './repeat-rows'\nimport type { PluginTemplateSource } from './plugin-template-sources'\nimport type { FormRecordTargetDeclaration } from './submission-record-target'\nimport type { ResolvedBesignerDocument } from './besigner-documents'\nimport type { PluginOrgKeyedCollection } from './plugin-org-erasure'\nimport type { ResolvedVideoEmbedProvider } from './video-embed-provider'\nimport type { AnalyticsProviderDeclaration } from '../app-utils/analytics-provider'\nimport type { InteractionStepDeclaration } from '../app-utils/site-interactions'\nimport type { ServerStepDeclaration } from './plugin-server-steps'\nimport type { NotificationCategoryDeclaration, NotificationDigestDeclaration } from '../app-utils/notifications'\n\nexport const FIRST_PARTY_PLUGINS: readonly FirstPartyPlugin[] = [\n {\n \"id\": \"mui\",\n \"label\": \"Components\",\n \"alwaysOn\": true,\n \"description\": \"The base component and theme library every site builds on.\"\n },\n {\n \"id\": \"forms\",\n \"label\": \"Forms\",\n \"alwaysOnForWorkspace\": true,\n \"description\": \"Forms on the site and the catalog that owns them.\",\n \"siteOff\": {\n \"stops\": \"Switching Forms off for this site stops forms rendering on its published pages, refuses every submission sent to it, and blocks publishing a form, or a page that carries one, until Forms is back on.\",\n \"keeps\": \"Submissions already received, the workspace’s form catalog and the CRM leads its forms created are kept, and forms keep working on the workspace’s other sites.\",\n \"confirm\": true,\n \"pages\": {\n \"heading\": \"These published pages carry a form. Their forms stop rendering and stop accepting submissions:\",\n \"none\": \"No published page on this site carries a form.\"\n }\n }\n },\n {\n \"id\": \"ai\",\n \"label\": \"AI\",\n \"alwaysOnForWorkspace\": true,\n \"description\": \"The assistant, generative building and automation, and the AI add-on.\",\n \"siteOff\": {\n \"stops\": \"Switching AI off for this site hides the assistant, Describe it, the AI cards and the editor’s AI controls on this site, refuses every AI request made for it, and stops its queued AI jobs without spending credits.\",\n \"keeps\": \"It does not stop the workspace’s AI add-on, credits, allotments or overage billing, and AI keeps working on the workspace’s other sites.\"\n }\n },\n {\n \"id\": \"theme-presets\",\n \"label\": \"Themes\",\n \"alwaysOnForWorkspace\": true,\n \"description\": \"Built-in themes to pick from on Setup → Theme: Bootstrap, Minimal and Material 3.\",\n \"siteOff\": {\n \"stops\": \"Switching Themes off for this site removes its built-in themes from the theme picker.\",\n \"keeps\": \"A site already using one keeps it, with every edit made to it: picking a theme copies it onto the site, so nothing on the published site changes.\"\n }\n },\n {\n \"id\": \"accounts\",\n \"label\": \"User Accounts\",\n \"description\": \"Visitor accounts on the site: the /signin, /signup and /recover pages, and the Members blocks. On for a new site; a site created before that stays off until you turn it on.\",\n \"releaseFlag\": \"release_member_accounts\",\n \"defaultOffPerSite\": true,\n \"requires\": [\n \"commerce\"\n ]\n },\n {\n \"id\": \"bookings\",\n \"label\": \"Bookings\",\n \"description\": \"Services, open slots, and paid bookings.\",\n \"releaseFlag\": \"release_bookings\"\n },\n {\n \"id\": \"commerce\",\n \"label\": \"Commerce\",\n \"description\": \"Products, carts, checkout, orders, POS.\",\n \"releaseFlag\": \"release_commerce_v2\"\n },\n {\n \"id\": \"marketplace\",\n \"label\": \"Marketplace\",\n \"description\": \"Marketplace listings, templates, and installs.\",\n \"releaseFlag\": \"release_marketplace\"\n },\n {\n \"id\": \"crm\",\n \"label\": \"CRM\",\n \"description\": \"Leads, contacts, companies, deals, tasks and reports.\",\n \"releaseFlag\": \"release_crm\"\n },\n {\n \"id\": \"outreach\",\n \"label\": \"Sequences\",\n \"description\": \"One-to-one email sequences sent from connected mailboxes.\",\n \"releaseFlag\": \"release_outreach\"\n },\n {\n \"id\": \"data\",\n \"label\": \"Data\",\n \"description\": \"Datasets, records, and CSV import/export.\",\n \"releaseFlag\": \"release_data_store\"\n },\n {\n \"id\": \"email\",\n \"label\": \"Email\",\n \"description\": \"Designed emails and campaign sending.\",\n \"releaseFlag\": \"release_email\"\n },\n {\n \"id\": \"events-calendar\",\n \"label\": \"Events Calendar\",\n \"description\": \"Event lists and calendars.\",\n \"releaseFlag\": \"release_events\"\n },\n {\n \"id\": \"inbox\",\n \"label\": \"Inbox\",\n \"description\": \"Form submissions and lead inbox.\",\n \"releaseFlag\": \"release_inbox\"\n },\n {\n \"id\": \"logic\",\n \"label\": \"Logic\",\n \"description\": \"Variables, functions, and reference health.\",\n \"releaseFlag\": \"release_logic\"\n },\n {\n \"id\": \"marketing\",\n \"label\": \"Marketing\",\n \"description\": \"Overlays, campaigns, and experiments.\",\n \"releaseFlag\": \"release_marketing\"\n },\n {\n \"id\": \"redirects\",\n \"label\": \"Redirects\",\n \"description\": \"URL redirect rules.\",\n \"releaseFlag\": \"release_redirects\"\n },\n {\n \"id\": \"workflows\",\n \"label\": \"Automation\",\n \"description\": \"Workflows, actions, webhooks, and run logs.\",\n \"releaseFlag\": \"release_workflows\"\n },\n]\n\nexport const PUBLISHED_SITE_IMPACT: Readonly<Record<string, PublishedSiteImpact>> = {\n \"mui\": \"elements\",\n \"forms\": \"elements\",\n \"ai\": \"console-only\",\n \"theme-presets\": \"console-only\",\n \"accounts\": \"routes\",\n \"bookings\": \"elements\",\n \"commerce\": \"elements\",\n \"marketplace\": \"console-only\",\n \"crm\": \"console-only\",\n \"outreach\": \"console-only\",\n \"data\": \"console-only\",\n \"email\": \"elements\",\n \"events-calendar\": \"elements\",\n \"inbox\": \"console-only\",\n \"logic\": \"console-only\",\n \"marketing\": \"elements\",\n \"redirects\": \"routes\",\n \"workflows\": \"routes\",\n}\n\n/**\n * The admin edit bar's quick links, in the order they are drawn — each\n * declared by the plugin whose console page it opens (AGL-3080).\n */\nexport const PLUGIN_EDIT_BAR_LINKS: readonly PluginEditBarLink[] = [\n {\n \"pluginId\": \"inbox\",\n \"order\": 20,\n \"label\": \"Inbox\",\n \"path\": \"/inbox\"\n },\n {\n \"pluginId\": \"commerce\",\n \"order\": 30,\n \"label\": \"Orders\",\n \"path\": \"/products/orders\"\n },\n]\n\n/**\n * Every host subcollection a first-party plugin owns, declared by that plugin\n * (AGL-3080). Core's readers ask this list; core names no collection.\n */\nexport const PLUGIN_HOST_COLLECTIONS_DECLARED: readonly ResolvedPluginHostCollection[] = [\n {\n \"pluginId\": \"forms\",\n \"name\": \"forms\",\n \"routeSlug\": \"forms\"\n },\n {\n \"pluginId\": \"bookings\",\n \"name\": \"services\",\n \"routeSlug\": \"bookings\",\n \"resource\": {\n \"kind\": \"service\",\n \"label\": \"services\",\n \"activityNoun\": \"service\",\n \"quotaKey\": \"servicesPerHost\",\n \"entitlement\": \"bookings\",\n \"fields\": [\n \"name\",\n \"description\",\n \"durationMinutes\",\n \"priceUsd\",\n \"timezone\",\n \"windows\",\n \"crmFollowUpTask\",\n \"crmMeetingActivity\"\n ]\n },\n \"siteExport\": {\n \"limit\": 50,\n \"fields\": [\n \"name\",\n \"description\",\n \"durationMinutes\",\n \"priceUsd\",\n \"timezone\",\n \"windows\",\n \"crmFollowUpTask\",\n \"crmMeetingActivity\"\n ]\n }\n },\n {\n \"pluginId\": \"bookings\",\n \"name\": \"bookings\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Booking records — a customer, a time and a service pointer. The service holds the imagery and IS scanned; a booking is the transaction against it.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"products\",\n \"routeSlug\": \"products\",\n \"resource\": {\n \"kind\": \"product\",\n \"label\": \"products\",\n \"activityNoun\": \"product\",\n \"quotaKey\": \"productsPerHost\",\n \"entitlement\": \"commerce\",\n \"fields\": [\n \"name\",\n \"slug\",\n \"description\",\n \"type\",\n \"status\",\n \"mediaUrls\",\n \"categoryIds\",\n \"tags\",\n \"options\",\n \"variants\",\n \"seo\",\n \"supplierId\",\n \"oversellPolicy\",\n \"taxExempt\",\n \"digitalFiles\",\n \"downloadLimit\",\n \"subscription\",\n \"subscriptionOptional\",\n \"gatedVideos\",\n \"relatedProductIds\",\n \"giftCard\",\n \"lowStockThreshold\",\n \"createdAtMs\",\n \"updatedAtMs\",\n \"nameLower\",\n \"nameTokens\",\n \"nameReversed\",\n \"skus\",\n \"barcodes\",\n \"priceFromCents\",\n \"soldOut\",\n \"collectionIds\",\n \"priceUsd\",\n \"inventory\",\n \"imageUrl\"\n ],\n \"stamps\": {\n \"deletedAt\": null\n }\n }\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"productCategories\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"suppliers\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"locations\",\n \"routeSlug\": \"products\",\n \"resource\": {\n \"kind\": \"location\",\n \"label\": \"inventory locations\",\n \"activityNoun\": \"inventory location\",\n \"quotaKey\": \"inventoryLocations\",\n \"entitlement\": \"commerce\",\n \"fields\": [\n \"name\",\n \"isDefault\",\n \"address\"\n ]\n }\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"coupons\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"discounts\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"reviews\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"memberPosts\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"resources\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"settings\",\n \"label\": \"Store settings\",\n \"routeSlug\": \"products\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"siteMembers\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"siteMemberCredentials\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"A site member's password hash, one document per member, read and written only by the membership routes (AGL-3308). A credential with no content field, and no client may read it.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"orders\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Completed orders. Line items COPY a product's `imageUrl` at purchase time, so these would match — and matching would be the wrong answer: an order is an immutable record of what was sold, deleting the asset changes nothing about it, and no author can edit one. A busy store also holds more of these than the whole read budget.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"carts\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Live and abandoned carts, with the same copied line-item image and the same reasoning, at higher volume — one document per shopper session.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"checkouts\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"In-flight checkout sessions. Transient buyer state carrying the same line-item snapshot as `carts`.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"reservations\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"POS and booking holds. Short-lived transaction rows pointing at a resource that is itself scanned.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"stockHolds\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Inventory holds taken during checkout. Machine-written, short-lived, and a quantity rather than content.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"subscriptions\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Site membership subscriptions: a plan pointer, a status and Stripe ids. Server-written from the billing webhook.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"registers\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"POS register allocations — a count against the register add-on, read by billing (AGL-1775). No content field at all.\",\n \"resource\": {\n \"kind\": \"register\",\n \"label\": \"POS registers\",\n \"activityNoun\": \"POS register\",\n \"quotaKey\": \"posRegisters\",\n \"entitlement\": \"pos\",\n \"fields\": [\n \"name\",\n \"locationId\"\n ]\n }\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"giftCards\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Gift card balances and redemption history. Money, not content.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"licenseKeys\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Digital-product license keys issued at fulfilment: a code, an order pointer and a revocation flag.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"inventoryAdjustments\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"The append-only stock adjustment ledger (AGL-2269). One row per manual stock edit and per cancellation release, unbounded over a store's life.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"inventoryReconciliation\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Reconciliation runs comparing counted stock against recorded stock. Machine-written totals.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"restockAlerts\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Back-in-stock requests: an email address and a product pointer, written by visitors.\"\n },\n {\n \"pluginId\": \"commerce\",\n \"name\": \"stripeTaxRates\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Cached Stripe tax rate ids, written by the tax sync. Vendor ids.\"\n },\n {\n \"pluginId\": \"marketplace\",\n \"name\": \"installs\"\n },\n {\n \"pluginId\": \"crm\",\n \"name\": \"leads\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Captured leads, on the same footing as `formSubmissions`: visitor-submitted, unbounded, and never a place an author places an asset.\"\n },\n {\n \"pluginId\": \"email\",\n \"name\": \"suppressions\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Unsubscribes, bounces and spam complaints. Email addresses and a reason.\"\n },\n {\n \"pluginId\": \"events-calendar\",\n \"name\": \"events\",\n \"routeSlug\": \"events\"\n },\n {\n \"pluginId\": \"inbox\",\n \"name\": \"formSubmissions\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"Visitor form submissions. Unbounded, PII-heavy, and a file attached to one is the visitor's upload — not a library asset an author picked, and not something deleting a library asset would break.\"\n },\n {\n \"pluginId\": \"logic\",\n \"name\": \"functions\",\n \"routeSlug\": \"logic\",\n \"resource\": {\n \"kind\": \"function\",\n \"label\": \"functions\",\n \"activityNoun\": \"function\",\n \"activityType\": \"function\",\n \"quotaKey\": \"functionsPerHost\",\n \"fields\": [\n \"name\",\n \"parameters\",\n \"variables\",\n \"operations\",\n \"returnValue\"\n ]\n },\n \"siteExport\": {\n \"limit\": 100,\n \"fields\": [\n \"name\",\n \"parameters\",\n \"variables\",\n \"operations\",\n \"returnValue\"\n ]\n }\n },\n {\n \"pluginId\": \"logic\",\n \"name\": \"variables\",\n \"routeSlug\": \"logic\",\n \"resource\": {\n \"kind\": \"variable\",\n \"label\": \"variables\",\n \"activityNoun\": \"variable\",\n \"activityType\": \"variable\",\n \"quotaKey\": \"variablesPerHost\",\n \"fields\": [\n \"name\",\n \"type\",\n \"value\",\n \"workflowId\",\n \"workflowName\"\n ]\n },\n \"siteExport\": {\n \"limit\": 100,\n \"fields\": [\n \"name\",\n \"type\",\n \"value\",\n \"workflowId\",\n \"workflowName\"\n ]\n }\n },\n {\n \"pluginId\": \"marketing\",\n \"name\": \"experiments\",\n \"routeSlug\": \"marketing\"\n },\n {\n \"pluginId\": \"marketing\",\n \"name\": \"overlays\",\n \"routeSlug\": \"marketing\"\n },\n {\n \"pluginId\": \"marketing\",\n \"name\": \"campaignAttributions\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"One row per conversion — a form submission, a lead, a contact or a booking — recording which campaign the visitor arrived from. Written only by the Admin SDK, and the whole record is three sanitized UTM strings capped at a hundred characters: there is no field an asset could occupy and no surface that could pick one into it. Unbounded on the same footing as the conversions it credits.\"\n },\n {\n \"pluginId\": \"redirects\",\n \"name\": \"redirects\",\n \"routeSlug\": \"redirects\",\n \"resource\": {\n \"kind\": \"redirect\",\n \"label\": \"redirects\",\n \"activityNoun\": \"redirect\",\n \"quotaKey\": \"redirectsPerHost\",\n \"entitlement\": \"redirects\",\n \"requiresPublishRole\": true,\n \"fields\": [\n \"source\",\n \"destination\",\n \"statusCode\",\n \"kind\",\n \"priority\",\n \"enabled\"\n ],\n \"externalDestination\": {\n \"field\": \"destination\",\n \"approvedByField\": \"externalDestinationApprovedBy\"\n },\n \"livePathField\": \"source\"\n }\n },\n {\n \"pluginId\": \"workflows\",\n \"name\": \"workflows\",\n \"routeSlug\": \"automation\",\n \"resource\": {\n \"kind\": \"workflow\",\n \"label\": \"workflows\",\n \"activityNoun\": \"workflow\",\n \"activityType\": \"workflow\",\n \"quotaKey\": \"workflowsPerHost\",\n \"entitlement\": \"workflows\",\n \"fields\": [\n \"name\",\n \"steps\",\n \"returnValue\",\n \"trigger\"\n ],\n \"duplicate\": {\n \"nameField\": \"name\",\n \"fields\": [\n \"steps\",\n \"returnValue\"\n ],\n \"stamps\": {\n \"trigger\": null\n }\n }\n },\n \"siteExport\": {\n \"limit\": 100,\n \"fields\": [\n \"name\",\n \"steps\",\n \"returnValue\",\n \"trigger\"\n ]\n }\n },\n {\n \"pluginId\": \"workflows\",\n \"name\": \"webhooks\",\n \"routeSlug\": \"automation\",\n \"resource\": {\n \"kind\": \"webhook\",\n \"label\": \"webhooks\",\n \"activityNoun\": \"webhook\",\n \"entitlement\": \"webhooks\",\n \"platformCap\": \"WEBHOOK_MAX_PER_HOST\",\n \"softDeletes\": true,\n \"fields\": [\n \"name\",\n \"direction\",\n \"url\",\n \"workflowName\",\n \"secret\",\n \"enabled\"\n ]\n }\n },\n {\n \"pluginId\": \"workflows\",\n \"name\": \"actions\",\n \"routeSlug\": \"automation\",\n \"resource\": {\n \"kind\": \"action\",\n \"label\": \"interactions and actions\",\n \"activityNoun\": \"action\",\n \"platformCap\": \"ACTIONS_MAX_PER_HOST\",\n \"softDeletes\": true,\n \"fields\": [\n \"name\",\n \"description\",\n \"trigger\",\n \"steps\",\n \"enabled\",\n \"frequency\",\n \"cooldownMinutes\",\n \"audience\",\n \"nodeId\",\n \"screenId\"\n ]\n },\n \"siteExport\": {\n \"limit\": 100,\n \"fields\": [\n \"name\",\n \"trigger\",\n \"steps\",\n \"enabled\",\n \"recipe\"\n ]\n }\n },\n]\n\n/**\n * Every child sitemap a first-party plugin's documents fill, declared by that\n * plugin (AGL-3080), in the order the index lists them.\n */\nexport const PLUGIN_SITEMAP_SECTIONS_DECLARED: readonly ResolvedPluginSitemapSection[] = [\n {\n \"pluginId\": \"commerce\",\n \"section\": \"products\",\n \"collection\": \"products\",\n \"where\": {\n \"field\": \"status\",\n \"equals\": \"active\"\n },\n \"enabledBy\": {\n \"doc\": \"settings/store\",\n \"field\": \"pdpScreenId\"\n },\n \"path\": \"/products/{slug}\",\n \"skipWhen\": \"deletedAt\",\n \"lastmod\": [\n \"updatedAtMs\",\n \"createdAtMs\"\n ]\n },\n {\n \"pluginId\": \"commerce\",\n \"section\": \"catalog\",\n \"collection\": \"collections\",\n \"where\": {\n \"field\": \"kind\",\n \"equals\": \"catalog\"\n },\n \"enabledBy\": {\n \"doc\": \"settings/store\",\n \"field\": \"collectionScreenId\"\n },\n \"path\": \"/collections/{slug}\",\n \"lastmod\": [\n \"updatedAt\",\n \"createdAt\"\n ]\n },\n]\n\n/**\n * Every section of the whole-site backup a first-party plugin answers for,\n * declared by that plugin (AGL-3080), in the order the bundle carries them.\n */\nexport const PLUGIN_SITE_BUNDLE_SECTIONS_DECLARED: readonly ResolvedPluginSiteBundleSectionDeclaration[] = [\n {\n \"pluginId\": \"data\",\n \"key\": \"datasets\",\n \"limit\": 50\n }\n]\n\n/**\n * Every org collection a first-party plugin owns whose documents the media\n * scan reads, declared by that plugin (AGL-3273).\n */\nexport const PLUGIN_ORG_COLLECTIONS_DECLARED: readonly ResolvedPluginOrgCollection[] = [\n {\n \"pluginId\": \"marketing\",\n \"name\": \"campaigns\",\n \"routeSlug\": \"marketing\",\n \"siteField\": \"hostId\",\n \"holdsTransferWhile\": {\n \"field\": \"status\",\n \"values\": [\n \"scheduled\",\n \"sending\"\n ]\n }\n },\n {\n \"pluginId\": \"marketing\",\n \"name\": \"emailCampaigns\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"The campaign CONTAINER — a name, a date window, the list ids it is aimed at, a topic and the sites it runs on. Distinct from `campaigns`, which holds the sends and IS scanned because a send carries the copy that went out. A container carries no copy and no asset reference: the design a send renders is a screen, and the screen is where the picker writes.\"\n },\n {\n \"pluginId\": \"workflows\",\n \"name\": \"automations\",\n \"mediaScan\": \"none\",\n \"mediaScanReason\": \"An org automation (AGL-3302) — a trigger, its conditions, the sites it is placed on, and a step list drawn from the server steps only: email subject and body as plain text, list, dataset and campaign ids, CRM fields and waits. No step it may hold carries a media reference, the in-page steps that could (custom HTML, popups) are refused by its save route, and it is written only by that route.\"\n },\n]\n\n/**\n * Every org capacity a first-party plugin backs, declared by that plugin\n * (AGL-3080). Core owns the money; this says what is counted and what it is\n * called.\n */\nexport const PLUGIN_ORG_CAPACITIES_DECLARED: readonly ResolvedPluginOrgCapacity[] = [\n {\n \"pluginId\": \"data\",\n \"kind\": \"datasets\",\n \"order\": 30,\n \"collection\": \"datasets\",\n \"addonKind\": \"datasets\",\n \"includedEntitlement\": \"datasetsPerOrg\",\n \"purchaseCeilingEntitlement\": \"maxDatasetsPerOrg\",\n \"nouns\": {\n \"one\": \"dataset\",\n \"many\": \"datasets\",\n \"addon\": \"extra datasets\"\n }\n },\n]\n\n/**\n * What each plan includes of every quota a first-party plugin owns, declared\n * by that plugin (AGL-3080). `PLAN_ENTITLEMENTS` composes these; core names\n * no key.\n */\nexport const PLUGIN_PLAN_QUOTAS_DECLARED: readonly ResolvedPluginPlanQuota[] = [\n {\n \"pluginId\": \"forms\",\n \"key\": \"formSubmissionsPerMonth\",\n \"label\": \"Form subs / mo\",\n \"byPlan\": {\n \"free\": 20,\n \"starter\": 200,\n \"pro\": 1000,\n \"business\": 8000,\n \"scale\": 25000,\n \"advanced\": 40000,\n \"agency\": 25000,\n \"enterprise\": 50000\n }\n },\n {\n \"pluginId\": \"marketplace\",\n \"key\": \"marketplaceFeePct\",\n \"label\": \"Marketplace fee %\",\n \"price\": true,\n \"byPlan\": {\n \"free\": 30,\n \"starter\": 20,\n \"pro\": 20,\n \"business\": 20,\n \"scale\": 20,\n \"advanced\": 20,\n \"agency\": 20,\n \"enterprise\": 20\n }\n },\n {\n \"pluginId\": \"crm\",\n \"key\": \"crmEmailsPerDay\",\n \"label\": \"One-to-one emails / day\",\n \"byPlan\": {\n \"free\": 0,\n \"starter\": 50,\n \"pro\": 150,\n \"business\": 200,\n \"scale\": 300,\n \"advanced\": 500,\n \"agency\": 1000,\n \"enterprise\": 2000\n }\n },\n {\n \"pluginId\": \"workflows\",\n \"key\": \"workflowRunsPerMonth\",\n \"label\": \"Workflow runs / mo\",\n \"byPlan\": {\n \"free\": 0,\n \"starter\": 500,\n \"pro\": 5000,\n \"business\": 50000,\n \"scale\": 150000,\n \"advanced\": 500000,\n \"agency\": 2000000,\n \"enterprise\": 4000000\n }\n },\n {\n \"pluginId\": \"ai\",\n \"key\": \"assistCreditsPerMonth\",\n \"label\": \"AI credits / mo\",\n \"byPlan\": {\n \"free\": 300,\n \"starter\": 750,\n \"pro\": 2750,\n \"business\": 7500,\n \"scale\": 10000,\n \"advanced\": 13000,\n \"agency\": 58000,\n \"enterprise\": 116000\n }\n },\n]\n\n/**\n * What each plan includes of every feature a first-party plugin owns,\n * declared by that plugin (AGL-3080).\n */\nexport const PLUGIN_PLAN_FEATURES_DECLARED: readonly ResolvedPluginPlanFeature[] = [\n {\n \"pluginId\": \"commerce\",\n \"key\": \"storefrontSubscriptions\",\n \"label\": \"Storefront subscriptions\",\n \"byPlan\": {\n \"free\": false,\n \"starter\": false,\n \"pro\": false,\n \"business\": true,\n \"scale\": true,\n \"advanced\": true,\n \"agency\": true,\n \"enterprise\": true\n }\n },\n {\n \"pluginId\": \"commerce\",\n \"key\": \"giftCards\",\n \"label\": \"Gift cards\",\n \"byPlan\": {\n \"free\": false,\n \"starter\": false,\n \"pro\": false,\n \"business\": true,\n \"scale\": true,\n \"advanced\": true,\n \"agency\": true,\n \"enterprise\": true\n }\n },\n {\n \"pluginId\": \"commerce\",\n \"key\": \"commerceAnalytics\",\n \"label\": \"Commerce analytics\",\n \"byPlan\": {\n \"free\": false,\n \"starter\": false,\n \"pro\": true,\n \"business\": true,\n \"scale\": true,\n \"advanced\": true,\n \"agency\": true,\n \"enterprise\": true\n }\n },\n {\n \"pluginId\": \"marketplace\",\n \"key\": \"marketplaceSelling\",\n \"label\": \"Sell on the marketplace\",\n \"byPlan\": {\n \"free\": false,\n \"starter\": false,\n \"pro\": true,\n \"business\": true,\n \"scale\": true,\n \"advanced\": true,\n \"agency\": true,\n \"enterprise\": true\n }\n },\n]\n\n/**\n * Every meter a first-party plugin contributes to the platform's cost model,\n * in breakdown order, declared by that plugin (AGL-3080). Core keeps the rates.\n */\nexport const PLUGIN_COST_AXES_DECLARED: readonly ResolvedPluginCostAxis[] = [\n {\n \"pluginId\": \"forms\",\n \"id\": \"formSubmissions\",\n \"order\": 30,\n \"fields\": [\n \"formSubmissions\"\n ],\n \"rate\": \"perFormSubmission\"\n },\n {\n \"pluginId\": \"crm\",\n \"id\": \"contacts\",\n \"order\": 60,\n \"fields\": [\n \"crmRecordsCount\"\n ],\n \"fallbackFields\": [\n \"contactsCount\"\n ],\n \"recordedFields\": [\n \"companiesCount\",\n \"dealsCount\"\n ],\n \"rate\": \"perContactMonth\"\n },\n {\n \"pluginId\": \"ai\",\n \"id\": \"assist\",\n \"order\": 80,\n \"fields\": [\n \"assistCostUsd\"\n ],\n \"staffFields\": [\n \"assistCredits\",\n \"assistOverageUsd\"\n ],\n \"live\": {\n \"collection\": \"assistUsage\",\n \"fields\": [\n \"providerCostUsd\",\n \"estCostUsd\"\n ]\n }\n },\n {\n \"pluginId\": \"workflows\",\n \"id\": \"runs\",\n \"order\": 90,\n \"fields\": [\n \"workflowRuns\",\n \"actionRuns\"\n ],\n \"rate\": \"perRun\"\n },\n]\n\n/**\n * Every band a first-party plugin contributes to the utilization table, in\n * column order, declared by that plugin (AGL-3080).\n */\nexport const PLUGIN_USAGE_BANDS_DECLARED: readonly ResolvedPluginUsageBand[] = [\n {\n \"pluginId\": \"forms\",\n \"id\": \"formSubmissions\",\n \"label\": \"Form submissions\",\n \"order\": 40,\n \"fields\": [\n \"formSubmissions\"\n ],\n \"entitlement\": \"formSubmissionsPerMonth\",\n \"perHost\": true,\n \"hostCounter\": \"formSubmissions\",\n \"metered\": {\n \"rate\": \"perFormSubmission\",\n \"quotedPer\": 1000,\n \"noun\": \"form submissions\",\n \"withheldUntil\": \"release_inbox\"\n }\n },\n {\n \"pluginId\": \"crm\",\n \"id\": \"contactsCount\",\n \"label\": \"CRM records\",\n \"order\": 70,\n \"fields\": [\n \"crmRecordsCount\"\n ],\n \"fallbackFields\": [\n \"contactsCount\"\n ],\n \"entitlement\": \"contactsPerHost\"\n },\n {\n \"pluginId\": \"ai\",\n \"id\": \"assistCredits\",\n \"label\": \"Assist credits\",\n \"order\": 90,\n \"fields\": [\n \"assistCostUsd\"\n ],\n \"entitlement\": \"assistCreditsPerMonth\",\n \"unitCostUsd\": 0.001\n },\n {\n \"pluginId\": \"workflows\",\n \"id\": \"workflowRuns\",\n \"label\": \"Workflow runs\",\n \"order\": 100,\n \"fields\": [\n \"workflowRuns\"\n ],\n \"entitlement\": \"workflowRunsPerMonth\",\n \"hostCounter\": \"workflowRuns\",\n \"alert\": {\n \"label\": \"monthly workflow runs\",\n \"noun\": \"workflow runs\",\n \"outcome\": \"stops\",\n \"reached\": \"Workflows pause until next month and nothing is charged — upgrade in Billing to keep them running.\",\n \"approach\": \"Nothing changes and nothing is charged — at the included amount, workflows pause until next month unless you upgrade in Billing.\"\n }\n },\n {\n \"pluginId\": \"workflows\",\n \"id\": \"actionRuns\",\n \"label\": \"Action runs\",\n \"order\": 110,\n \"fields\": [\n \"actionRuns\"\n ],\n \"entitlement\": \"actionRunsPerMonth\"\n },\n]\n\n/**\n * Every line of a workspace's monthly spend a first-party plugin contributes\n * to its usage budget, in catalog order, declared by that plugin (AGL-3080).\n */\nexport const PLUGIN_SPEND_LINES_DECLARED: readonly ResolvedPluginSpendLine[] = [\n {\n \"pluginId\": \"ai\",\n \"id\": \"assist\",\n \"label\": \"Assist\",\n \"live\": {\n \"collection\": \"assistUsage\",\n \"field\": \"estCostUsd\"\n },\n \"billedFromEnv\": \"BILL_ASSIST_TOKENS_FROM\",\n \"unit\": {\n \"costUsd\": 0.001,\n \"label\": \"Assist credits\"\n }\n },\n]\n\n/**\n * Every meter a first-party plugin measures in the monthly usage sweep, in\n * catalog order, declared by that plugin (AGL-3080). The sweep refuses to bill\n * a month while one of these is unregistered.\n */\nexport const PLUGIN_USAGE_METERS_DECLARED: readonly ResolvedPluginUsageMeter[] = [\n {\"pluginId\":\"crm\",\"id\":\"records\"},\n {\"pluginId\":\"data\",\"id\":\"dataset-storage\"},\n {\"pluginId\":\"ai\",\"id\":\"assist\"},\n]\n\n/**\n * Every top-level plugin collection a workspace erasure sweeps by the field\n * naming the organization, declared by the plugin that owns it (AGL-3080).\n */\nexport const PLUGIN_ORG_KEYED_COLLECTIONS: readonly PluginOrgKeyedCollection[] = [\n {\n \"pluginId\": \"outreach\",\n \"name\": \"outreachMailboxCredentials\",\n \"orgField\": \"orgId\"\n },\n {\n \"pluginId\": \"outreach\",\n \"name\": \"outreachLinks\",\n \"orgField\": \"orgId\"\n },\n]\n\n/**\n * The plugins whose org eraser a workspace erasure may not run without\n * (AGL-3080): each holds a record the erasure promises to destroy.\n */\nexport const PLUGIN_REQUIRED_ORG_ERASERS: readonly string[] = [\"marketplace\"]\n\n/**\n * The plugins whose sales the operator's sales tax return may not be filed\n * without (AGL-3080): each registers a tax return source, and one that did\n * not is refused rather than read as nothing sold.\n */\nexport const PLUGIN_TAX_RETURN_SOURCES: readonly string[] = [\"commerce\",\"marketplace\"]\n\n/**\n * The plugins whose earnings the operator's revenue report may not be read\n * without (AGL-3080): each registers a revenue source, and one that did not\n * is refused rather than read as nothing earned.\n */\nexport const PLUGIN_REVENUE_SOURCES: readonly string[] = [\"commerce\",\"marketplace\"]\n\n/**\n * Where published plugin versions and their kill switches are stored, declared\n * by the plugin that distributes them (AGL-3080). `null` when none does, and\n * the realm loader then resolves nothing.\n */\nexport const PLUGIN_DISTRIBUTION: PluginDistribution | null = {\n \"pluginId\": \"marketplace\",\n \"listings\": \"marketplaceListings\",\n \"versions\": \"pluginVersions\",\n \"revocations\": \"revocations\"\n}\n\n/**\n * The plugin that answers a published page's repeats, declared by that plugin\n * (AGL-3080). `null` when none does, and a repeat then renders its element\n * once, as written.\n */\nexport const PLUGIN_REPEAT_SOURCE_DECLARED: RepeatSourceDeclaration | null = {\n \"pluginId\": \"data\",\n \"id\": \"dataset\"\n}\n\n/**\n * The site documents a plugin authors in the besigner, declared by that\n * plugin (AGL-3080). Empty when none does, and the console's plugin-document\n * editor routes answer 404.\n */\nexport const PLUGIN_BESIGNER_DOCUMENTS_DECLARED: readonly ResolvedBesignerDocument[] = [\n {\n \"pluginId\": \"forms\",\n \"kind\": \"form\",\n \"segment\": \"forms\",\n \"collection\": \"forms\",\n \"noun\": \"form\",\n \"publish\": {\n \"path\": \"/api/forms/promote\",\n \"idField\": \"formId\"\n }\n },\n]\n\n/**\n * The plugin whose records a form's submission may also be filed as, declared\n * by that plugin (AGL-3080). `null` when none does, and no form writes one.\n */\nexport const PLUGIN_FORM_RECORD_TARGET_DECLARED: FormRecordTargetDeclaration | null = {\n \"pluginId\": \"data\",\n \"id\": \"dataset\"\n}\n\n/**\n * What a site's template library calls a template a plugin installed, by the\n * `source.type` that plugin stamps, declared by that plugin (AGL-3080).\n * Core names no installer.\n */\nexport const PLUGIN_TEMPLATE_SOURCES: readonly PluginTemplateSource[] = [\n {\n \"pluginId\": \"marketplace\",\n \"type\": \"marketplace\",\n \"label\": \"Marketplace\",\n \"description\": \"Installed from the marketplace\"\n },\n]\n\n/**\n * The analytics settings each provider mounts a tag for, declared by the\n * plugin that adapts the vendor (AGL-3080). Empty when none does, and then no\n * setting configures a tag.\n */\nexport const ANALYTICS_PROVIDERS_DECLARED: readonly AnalyticsProviderDeclaration[] = [\n {\n \"pluginId\": \"marketing\",\n \"settings\": [\n \"gaMeasurementId\",\n \"gtmContainerId\"\n ]\n },\n]\n\n/**\n * Every interaction step a first-party plugin offers in the interaction\n * builder, declared by that plugin (AGL-3080). Core names no plugin step.\n */\nexport const PLUGIN_INTERACTION_STEPS_DECLARED: readonly InteractionStepDeclaration[] = [\n {\n \"pluginId\": \"marketing\",\n \"type\": \"showOverlay\",\n \"label\": \"Open an overlay\",\n \"picks\": {\n \"collection\": \"overlays\",\n \"limit\": 50,\n \"idField\": \"overlayId\",\n \"nameField\": \"overlayName\",\n \"label\": \"Overlay\",\n \"missing\": \"pick an overlay\"\n }\n },\n {\n \"pluginId\": \"workflows\",\n \"type\": \"runWorkflow\",\n \"label\": \"Run a workflow\",\n \"picks\": {\n \"collection\": \"workflows\",\n \"limit\": 100,\n \"idField\": \"workflowId\",\n \"nameField\": \"workflowName\",\n \"label\": \"Workflow\",\n \"missing\": \"pick a workflow\"\n }\n },\n]\n\n/**\n * Every server step a first-party plugin runs for the automation engine,\n * declared by that plugin (AGL-3080). Core names no plugin step.\n */\nexport const PLUGIN_SERVER_STEPS_DECLARED: readonly ServerStepDeclaration[] = [\n\n]\n\n/**\n * Every first-party element that runs a site function, and the prop naming\n * it, declared by that element's plugin (AGL-3393). Core names no element.\n */\nexport const FIRST_PARTY_FUNCTION_BINDINGS: FunctionBindings = {}\n\n/**\n * Every video host whose own player the Video element frames, declared by\n * the plugin that plays it (AGL-3080). Core names no host.\n */\nexport const FIRST_PARTY_VIDEO_EMBED_PROVIDERS: readonly ResolvedVideoEmbedProvider[] = [\n {\n \"pluginId\": \"mui\",\n \"id\": \"wistia\",\n \"label\": \"Wistia\",\n \"domains\": [\n \"wistia.com\",\n \"wistia.net\",\n \"wi.st\"\n ],\n \"mediaIdPaths\": [\n \"^\\\\/medias\\\\/([^/]+)(?:\\\\/manage)?\\\\/?$\",\n \"^\\\\/m\\\\/([^/]+)\\\\/?$\",\n \"^\\\\/embed\\\\/iframe\\\\/([^/]+)\\\\/?$\",\n \"^\\\\/embed\\\\/medias\\\\/([^/.]+)(?:\\\\.jsonp?)?\\\\/?$\"\n ],\n \"mediaIdPattern\": \"^[a-z0-9]{10}$\",\n \"playerOrigin\": \"https://fast.wistia.net\",\n \"playerPath\": \"/embed/iframe/{id}\",\n \"playerQuery\": [\n {\n \"param\": \"autoPlay\",\n \"option\": \"autoPlay\",\n \"on\": \"true\",\n \"off\": \"false\"\n },\n {\n \"param\": \"roundedPlayer\",\n \"value\": \"false\"\n },\n {\n \"param\": \"doNotTrack\",\n \"option\": \"doNotTrack\",\n \"on\": \"true\"\n },\n {\n \"param\": \"muted\",\n \"option\": \"muted\",\n \"on\": \"true\"\n },\n {\n \"param\": \"endVideoBehavior\",\n \"option\": \"loop\",\n \"on\": \"loop\"\n }\n ]\n },\n]\n\n/**\n * The notification categories first-party plugins add to the settings page\n * and to every recipient's preferences, declared by each plugin (AGL-3080).\n */\nexport const PLUGIN_NOTIFICATION_CATEGORIES_DECLARED: readonly NotificationCategoryDeclaration[] = [\n {\n \"pluginId\": \"marketplace\",\n \"id\": \"marketplace\",\n \"label\": \"Marketplace\",\n \"description\": \"Decisions on plugin listings you submitted for review.\",\n \"defaults\": {\n \"console\": true,\n \"email\": false\n }\n },\n]\n\n/**\n * The digests first-party plugins send on their own schedule, each with the\n * key its switch is stored under, declared by the plugin that sends it\n * (AGL-3080).\n */\nexport const PLUGIN_NOTIFICATION_DIGESTS_DECLARED: readonly NotificationDigestDeclaration[] = [\n {\n \"pluginId\": \"crm\",\n \"key\": \"crmDaily\",\n \"label\": \"Daily CRM digest\",\n \"description\": \"Each morning: your overdue and due-today tasks and the leads nobody has worked, here and by email.\"\n },\n]\n"],"names":["FIRST_PARTY_PLUGINS","PUBLISHED_SITE_IMPACT","PLUGIN_EDIT_BAR_LINKS","PLUGIN_HOST_COLLECTIONS_DECLARED","PLUGIN_SITEMAP_SECTIONS_DECLARED","PLUGIN_SITE_BUNDLE_SECTIONS_DECLARED","PLUGIN_ORG_COLLECTIONS_DECLARED","PLUGIN_ORG_CAPACITIES_DECLARED","PLUGIN_PLAN_QUOTAS_DECLARED","PLUGIN_PLAN_FEATURES_DECLARED","PLUGIN_COST_AXES_DECLARED","PLUGIN_USAGE_BANDS_DECLARED","PLUGIN_SPEND_LINES_DECLARED","PLUGIN_USAGE_METERS_DECLARED","PLUGIN_ORG_KEYED_COLLECTIONS","PLUGIN_REQUIRED_ORG_ERASERS","PLUGIN_TAX_RETURN_SOURCES","PLUGIN_REVENUE_SOURCES","PLUGIN_DISTRIBUTION","PLUGIN_REPEAT_SOURCE_DECLARED","PLUGIN_BESIGNER_DOCUMENTS_DECLARED","PLUGIN_FORM_RECORD_TARGET_DECLARED","PLUGIN_TEMPLATE_SOURCES","ANALYTICS_PROVIDERS_DECLARED","PLUGIN_INTERACTION_STEPS_DECLARED","PLUGIN_SERVER_STEPS_DECLARED","FIRST_PARTY_FUNCTION_BINDINGS","FIRST_PARTY_VIDEO_EMBED_PROVIDERS","PLUGIN_NOTIFICATION_CATEGORIES_DECLARED","PLUGIN_NOTIFICATION_DIGESTS_DECLARED"],"mappings":"AAAA;;;;;;;CAOC,GAsBD,OAAO,MAAMA,sBAAmD;IAC9D;QACE,MAAM;QACN,SAAS;QACT,YAAY;QACZ,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,wBAAwB;QACxB,eAAe;QACf,WAAW;YACT,SAAS;YACT,SAAS;YACT,WAAW;YACX,SAAS;gBACP,WAAW;gBACX,QAAQ;YACV;QACF;IACF;IACA;QACE,MAAM;QACN,SAAS;QACT,wBAAwB;QACxB,eAAe;QACf,WAAW;YACT,SAAS;YACT,SAAS;QACX;IACF;IACA;QACE,MAAM;QACN,SAAS;QACT,wBAAwB;QACxB,eAAe;QACf,WAAW;YACT,SAAS;YACT,SAAS;QACX;IACF;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;QACf,qBAAqB;QACrB,YAAY;YACV;SACD;IACH;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;IACA;QACE,MAAM;QACN,SAAS;QACT,eAAe;QACf,eAAe;IACjB;CACD,CAAA;AAED,OAAO,MAAMC,wBAAuE;IAClF,OAAO;IACP,SAAS;IACT,MAAM;IACN,iBAAiB;IACjB,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,OAAO;IACP,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,mBAAmB;IACnB,SAAS;IACT,SAAS;IACT,aAAa;IACb,aAAa;IACb,aAAa;AACf,EAAC;AAED;;;CAGC,GACD,OAAO,MAAMC,wBAAsD;IACjE;QACE,YAAY;QACZ,SAAS;QACT,SAAS;QACT,QAAQ;IACV;IACA;QACE,YAAY;QACZ,SAAS;QACT,SAAS;QACT,QAAQ;IACV;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,mCAA4E;IACvF;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,YAAY;YACZ,eAAe;YACf,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;aACD;QACH;QACA,cAAc;YACZ,SAAS;YACT,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,YAAY;YACZ,eAAe;YACf,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;aACD;YACD,UAAU;gBACR,aAAa;YACf;QACF;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,YAAY;YACZ,eAAe;YACf,UAAU;gBACR;gBACA;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;IACV;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;QACnB,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,YAAY;YACZ,eAAe;YACf,UAAU;gBACR;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;IACV;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,gBAAgB;YAChB,YAAY;YACZ,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;aACD;QACH;QACA,cAAc;YACZ,SAAS;YACT,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,gBAAgB;YAChB,YAAY;YACZ,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;aACD;QACH;QACA,cAAc;YACZ,SAAS;YACT,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;IACf;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,YAAY;YACZ,eAAe;YACf,uBAAuB;YACvB,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;gBACA;aACD;YACD,uBAAuB;gBACrB,SAAS;gBACT,mBAAmB;YACrB;YACA,iBAAiB;QACnB;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,gBAAgB;YAChB,YAAY;YACZ,eAAe;YACf,UAAU;gBACR;gBACA;gBACA;gBACA;aACD;YACD,aAAa;gBACX,aAAa;gBACb,UAAU;oBACR;oBACA;iBACD;gBACD,UAAU;oBACR,WAAW;gBACb;YACF;QACF;QACA,cAAc;YACZ,SAAS;YACT,UAAU;gBACR;gBACA;gBACA;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,eAAe;YACf,eAAe;YACf,eAAe;YACf,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,YAAY;YACV,QAAQ;YACR,SAAS;YACT,gBAAgB;YAChB,eAAe;YACf,eAAe;YACf,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;aACD;QACH;QACA,cAAc;YACZ,SAAS;YACT,UAAU;gBACR;gBACA;gBACA;gBACA;gBACA;aACD;QACH;IACF;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,mCAA4E;IACvF;QACE,YAAY;QACZ,WAAW;QACX,cAAc;QACd,SAAS;YACP,SAAS;YACT,UAAU;QACZ;QACA,aAAa;YACX,OAAO;YACP,SAAS;QACX;QACA,QAAQ;QACR,YAAY;QACZ,WAAW;YACT;YACA;SACD;IACH;IACA;QACE,YAAY;QACZ,WAAW;QACX,cAAc;QACd,SAAS;YACP,SAAS;YACT,UAAU;QACZ;QACA,aAAa;YACX,OAAO;YACP,SAAS;QACX;QACA,QAAQ;QACR,WAAW;YACT;YACA;SACD;IACH;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,uCAA8F;IACzG;QACE,YAAY;QACZ,OAAO;QACP,SAAS;IACX;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,kCAA0E;IACrF;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,aAAa;QACb,sBAAsB;YACpB,SAAS;YACT,UAAU;gBACR;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;IACA;QACE,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;IACrB;CACD,CAAA;AAED;;;;CAIC,GACD,OAAO,MAAMC,iCAAuE;IAClF;QACE,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,cAAc;QACd,aAAa;QACb,uBAAuB;QACvB,8BAA8B;QAC9B,SAAS;YACP,OAAO;YACP,QAAQ;YACR,SAAS;QACX;IACF;CACD,CAAA;AAED;;;;CAIC,GACD,OAAO,MAAMC,8BAAkE;IAC7E;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;IACA;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;IACA;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;IACA;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;IACA;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,gCAAsE;IACjF;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;IACA;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;IACA;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;IACA;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,UAAU;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,YAAY;YACZ,SAAS;YACT,YAAY;YACZ,UAAU;YACV,cAAc;QAChB;IACF;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,4BAA+D;IAC1E;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,UAAU;YACR;SACD;QACD,QAAQ;IACV;IACA;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,UAAU;YACR;SACD;QACD,kBAAkB;YAChB;SACD;QACD,kBAAkB;YAChB;YACA;SACD;QACD,QAAQ;IACV;IACA;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,UAAU;YACR;SACD;QACD,eAAe;YACb;YACA;SACD;QACD,QAAQ;YACN,cAAc;YACd,UAAU;gBACR;gBACA;aACD;QACH;IACF;IACA;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,UAAU;YACR;YACA;SACD;QACD,QAAQ;IACV;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,8BAAkE;IAC7E;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,SAAS;QACT,UAAU;YACR;SACD;QACD,eAAe;QACf,WAAW;QACX,eAAe;QACf,WAAW;YACT,QAAQ;YACR,aAAa;YACb,QAAQ;YACR,iBAAiB;QACnB;IACF;IACA;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,SAAS;QACT,UAAU;YACR;SACD;QACD,kBAAkB;YAChB;SACD;QACD,eAAe;IACjB;IACA;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,SAAS;QACT,UAAU;YACR;SACD;QACD,eAAe;QACf,eAAe;IACjB;IACA;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,SAAS;QACT,UAAU;YACR;SACD;QACD,eAAe;QACf,eAAe;QACf,SAAS;YACP,SAAS;YACT,QAAQ;YACR,WAAW;YACX,WAAW;YACX,YAAY;QACd;IACF;IACA;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,SAAS;QACT,UAAU;YACR;SACD;QACD,eAAe;IACjB;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,8BAAkE;IAC7E;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,QAAQ;YACN,cAAc;YACd,SAAS;QACX;QACA,iBAAiB;QACjB,QAAQ;YACN,WAAW;YACX,SAAS;QACX;IACF;CACD,CAAA;AAED;;;;CAIC,GACD,OAAO,MAAMC,+BAAoE;IAC/E;QAAC,YAAW;QAAM,MAAK;IAAS;IAChC;QAAC,YAAW;QAAO,MAAK;IAAiB;IACzC;QAAC,YAAW;QAAK,MAAK;IAAQ;CAC/B,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,+BAAoE;IAC/E;QACE,YAAY;QACZ,QAAQ;QACR,YAAY;IACd;IACA;QACE,YAAY;QACZ,QAAQ;QACR,YAAY;IACd;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,8BAAiD;IAAC;CAAc,CAAA;AAE7E;;;;CAIC,GACD,OAAO,MAAMC,4BAA+C;IAAC;IAAW;CAAc,CAAA;AAEtF;;;;CAIC,GACD,OAAO,MAAMC,yBAA4C;IAAC;IAAW;CAAc,CAAA;AAEnF;;;;CAIC,GACD,OAAO,MAAMC,sBAAiD;IAC5D,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,eAAe;AACjB,EAAC;AAED;;;;CAIC,GACD,OAAO,MAAMC,gCAAgE;IAC3E,YAAY;IACZ,MAAM;AACR,EAAC;AAED;;;;CAIC,GACD,OAAO,MAAMC,qCAA0E;IACrF;QACE,YAAY;QACZ,QAAQ;QACR,WAAW;QACX,cAAc;QACd,QAAQ;QACR,WAAW;YACT,QAAQ;YACR,WAAW;QACb;IACF;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,qCAAyE;IACpF,YAAY;IACZ,MAAM;AACR,EAAC;AAED;;;;CAIC,GACD,OAAO,MAAMC,0BAA2D;IACtE;QACE,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,eAAe;IACjB;CACD,CAAA;AAED;;;;CAIC,GACD,OAAO,MAAMC,+BAAwE;IACnF;QACE,YAAY;QACZ,YAAY;YACV;YACA;SACD;IACH;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,oCAA2E;IACtF;QACE,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,SAAS;YACP,cAAc;YACd,SAAS;YACT,WAAW;YACX,aAAa;YACb,SAAS;YACT,WAAW;QACb;IACF;IACA;QACE,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,SAAS;YACP,cAAc;YACd,SAAS;YACT,WAAW;YACX,aAAa;YACb,SAAS;YACT,WAAW;QACb;IACF;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,+BAAiE,EAE7E,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,gCAAkD,CAAC,EAAC;AAEjE;;;CAGC,GACD,OAAO,MAAMC,oCAA2E;IACtF;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,WAAW;YACT;YACA;YACA;SACD;QACD,gBAAgB;YACd;YACA;YACA;YACA;SACD;QACD,kBAAkB;QAClB,gBAAgB;QAChB,cAAc;QACd,eAAe;YACb;gBACE,SAAS;gBACT,UAAU;gBACV,MAAM;gBACN,OAAO;YACT;YACA;gBACE,SAAS;gBACT,SAAS;YACX;YACA;gBACE,SAAS;gBACT,UAAU;gBACV,MAAM;YACR;YACA;gBACE,SAAS;gBACT,UAAU;gBACV,MAAM;YACR;YACA;gBACE,SAAS;gBACT,UAAU;gBACV,MAAM;YACR;SACD;IACH;CACD,CAAA;AAED;;;CAGC,GACD,OAAO,MAAMC,0CAAsF;IACjG;QACE,YAAY;QACZ,MAAM;QACN,SAAS;QACT,eAAe;QACf,YAAY;YACV,WAAW;YACX,SAAS;QACX;IACF;CACD,CAAA;AAED;;;;CAIC,GACD,OAAO,MAAMC,uCAAiF;IAC5F;QACE,YAAY;QACZ,OAAO;QACP,SAAS;QACT,eAAe;IACjB;CACD,CAAA"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* A SERVER STEP ANOTHER PLUGIN RUNS (AGL-3080).
|
|
19
|
+
*
|
|
20
|
+
* An interaction's steps are the platform's client steps plus whatever steps
|
|
21
|
+
* the plugins add (`site-interactions.ts`), and every step that is not a
|
|
22
|
+
* client step is the server's to run. The plugin that runs a server run — the
|
|
23
|
+
* automation engine — knows its own steps. A step that acts on ANOTHER
|
|
24
|
+
* plugin's records is that plugin's: writing a dataset row is the data
|
|
25
|
+
* plugin's, moving a contact's stage is the CRM's. The engine used to carry
|
|
26
|
+
* each of those writes itself, which made it the keeper of every plugin's
|
|
27
|
+
* storage.
|
|
28
|
+
*
|
|
29
|
+
* So the plugin that owns a step REGISTERS ITS EXECUTOR here, by step type,
|
|
30
|
+
* and the engine hands it the step when a run reaches one. The engine keeps
|
|
31
|
+
* what every step shares — the step's guard, the run's order, its history,
|
|
32
|
+
* the nesting cap — and the executor does the step's one write. Neither
|
|
33
|
+
* imports the other: both meet at this module, which names no plugin, so a
|
|
34
|
+
* marketplace plugin adds a step the same way a first-party one does.
|
|
35
|
+
*
|
|
36
|
+
* ## Declared, then registered — and an absent executor is refused
|
|
37
|
+
*
|
|
38
|
+
* The executor is registered from the owning plugin's `serverDeclarations`
|
|
39
|
+
* entry, which every app runs at boot. An empty registry must not read as an
|
|
40
|
+
* answer: a step whose executor never registered would otherwise fall through
|
|
41
|
+
* the engine as a step nobody runs, and a run history would say the record
|
|
42
|
+
* was written when it was not.
|
|
43
|
+
*
|
|
44
|
+
* So a first-party plugin also DECLARES the steps it runs, under
|
|
45
|
+
* `serverSteps` in `plugins.config.json`, compiled into core. The three cases
|
|
46
|
+
* are kept apart:
|
|
47
|
+
*
|
|
48
|
+
* - registered — the executor runs the step, declared or not (a marketplace
|
|
49
|
+
* plugin's steps are registered and never compiled);
|
|
50
|
+
* - declared and NOT registered — the boot failed. The app's declarations
|
|
51
|
+
* step is run again ({@link runPluginDeclarationsRepair}); if the executor
|
|
52
|
+
* is still missing, {@link pluginServerStepExecutor} THROWS
|
|
53
|
+
* {@link ServerStepUnavailableError}, which the engine records as the
|
|
54
|
+
* step's failure;
|
|
55
|
+
* - neither — no plugin runs the type, and the caller answers `null` as it
|
|
56
|
+
* would for any step it does not know.
|
|
57
|
+
*
|
|
58
|
+
* A type the engine runs itself never reaches this registry, so a
|
|
59
|
+
* registration cannot replace one of the engine's own steps.
|
|
60
|
+
*
|
|
61
|
+
* Reached by path, never through a barrel: only server code asks.
|
|
62
|
+
*/
|
|
63
|
+
/** The automation a step belongs to, as its history and its records name it. */
|
|
64
|
+
export interface ServerStepRunRef {
|
|
65
|
+
/** Which kind of automation is running — the engine's own vocabulary. */
|
|
66
|
+
kind: string;
|
|
67
|
+
/** The automation's document id. */
|
|
68
|
+
id: string;
|
|
69
|
+
/** Its name at the time of the run. */
|
|
70
|
+
name: string;
|
|
71
|
+
}
|
|
72
|
+
/** One step, handed to the plugin that runs it. */
|
|
73
|
+
export interface ServerStepRequest {
|
|
74
|
+
/** The site the run is on. Every write is scoped to what this site may see. */
|
|
75
|
+
hostId: string;
|
|
76
|
+
/**
|
|
77
|
+
* The owning organization's billing document, already read by the gate
|
|
78
|
+
* that admitted the run, and its id beside it — so an executor gating on
|
|
79
|
+
* the plan or counting against a cap pays no second read. Null when the
|
|
80
|
+
* site has no resolvable organization, which every gate reads as Free.
|
|
81
|
+
*/
|
|
82
|
+
org: unknown;
|
|
83
|
+
orgId: string | null;
|
|
84
|
+
/** The automation whose step this is. */
|
|
85
|
+
run: ServerStepRunRef;
|
|
86
|
+
/** The event the run is answering. */
|
|
87
|
+
event: string;
|
|
88
|
+
/** The event's payload: the values a step reads. */
|
|
89
|
+
payload: Record<string, unknown>;
|
|
90
|
+
/** The step exactly as it is stored. */
|
|
91
|
+
step: {
|
|
92
|
+
type: string;
|
|
93
|
+
[field: string]: unknown;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* What one step did.
|
|
98
|
+
*
|
|
99
|
+
* Nothing set is a step that did its work. `error` is a step that did not —
|
|
100
|
+
* the run records it and goes on to the next step, so an executor answers a
|
|
101
|
+
* refusal rather than throwing one; a throw is read the same way.
|
|
102
|
+
*/
|
|
103
|
+
export interface ServerStepAnswer {
|
|
104
|
+
/** Why nothing was written, when nothing was — a line of the run history. */
|
|
105
|
+
error?: string;
|
|
106
|
+
/** The one fact worth carrying into the run summary: a record's name, a status. */
|
|
107
|
+
detail?: string;
|
|
108
|
+
/**
|
|
109
|
+
* An event this step's write earned, for the ENGINE to raise. Not raised
|
|
110
|
+
* by the executor: an automation whose step causes the event it listens
|
|
111
|
+
* for would otherwise run until a meter stopped it, and only the engine
|
|
112
|
+
* holds the nesting cap that stops it first.
|
|
113
|
+
*/
|
|
114
|
+
emit?: {
|
|
115
|
+
event: string;
|
|
116
|
+
payload: Record<string, unknown>;
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/** Runs one step of the types it was registered for. */
|
|
120
|
+
export type ServerStepExecutor = (request: ServerStepRequest) => Promise<ServerStepAnswer>;
|
|
121
|
+
/** The compiled declaration: which plugin runs which step type. */
|
|
122
|
+
export interface ServerStepDeclaration {
|
|
123
|
+
pluginId: string;
|
|
124
|
+
/** The stored step `type`. */
|
|
125
|
+
type: string;
|
|
126
|
+
}
|
|
127
|
+
/** Every server step a first-party plugin declares, in `plugins.config.json` order. */
|
|
128
|
+
export declare function declaredServerSteps(): readonly ServerStepDeclaration[];
|
|
129
|
+
/** The declaration of this step type, or `null` for one no plugin declares. */
|
|
130
|
+
export declare function declaredServerStep(type: string): ServerStepDeclaration | null;
|
|
131
|
+
/** A registered executor, with the plugin it belongs to. */
|
|
132
|
+
export interface RegisteredServerStepExecutor {
|
|
133
|
+
pluginId: string;
|
|
134
|
+
run: ServerStepExecutor;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Registers the executor of one or more step types. Returns the unregister,
|
|
138
|
+
* which removes each type only while this executor still holds it.
|
|
139
|
+
*
|
|
140
|
+
* The owner is the plugin whose register fn is running, or the `pluginId`
|
|
141
|
+
* passed for a boot declaration, where the loader's marker is not set. A
|
|
142
|
+
* registration with neither is refused; so is a type another plugin declares
|
|
143
|
+
* or already holds, because two executors for one step would each write the
|
|
144
|
+
* other's records. The same plugin registering again replaces its own (a
|
|
145
|
+
* second surface, a repeated boot). Nothing is registered unless every type
|
|
146
|
+
* is accepted.
|
|
147
|
+
*/
|
|
148
|
+
export declare function registerServerStepExecutor(types: readonly string[], run: ServerStepExecutor, options?: {
|
|
149
|
+
pluginId?: string;
|
|
150
|
+
}): () => void;
|
|
151
|
+
/** The executor registered for a step type, with its owner, or `null`. Never repairs. */
|
|
152
|
+
export declare function registeredServerStepExecutor(type: string): RegisteredServerStepExecutor | null;
|
|
153
|
+
/** Only for specs: forgets every registered executor. */
|
|
154
|
+
export declare function resetServerStepExecutorsForTests(): void;
|
|
155
|
+
/**
|
|
156
|
+
* The declared step's executor was not registered, even after the app's
|
|
157
|
+
* declarations step ran again. Its message is the step's line in the run
|
|
158
|
+
* history, so it says what happened in the words a site owner reads.
|
|
159
|
+
*/
|
|
160
|
+
export declare class ServerStepUnavailableError extends Error {
|
|
161
|
+
readonly declaration: ServerStepDeclaration;
|
|
162
|
+
constructor(declaration: ServerStepDeclaration);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* The executor for a step type, for a run that has reached one. See the
|
|
166
|
+
* module note for the three cases: registered answers it, declared but
|
|
167
|
+
* missing throws after the repair has had its turn, and neither answers
|
|
168
|
+
* `null`.
|
|
169
|
+
*/
|
|
170
|
+
export declare function pluginServerStepExecutor(type: string): Promise<RegisteredServerStepExecutor | null>;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
var _globalScope_EXECUTORS_KEY;
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2026 Aglyn LLC
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/ import { getRegisteringPluginId } from "../app-utils/registering-plugin.js";
|
|
18
|
+
import { PLUGIN_SERVER_STEPS_DECLARED } from "./first-party-plugins.generated.js";
|
|
19
|
+
import { runPluginDeclarationsRepair } from "./plugin-declarations-repair.js";
|
|
20
|
+
/** Every server step a first-party plugin declares, in `plugins.config.json` order. */ export function declaredServerSteps() {
|
|
21
|
+
return PLUGIN_SERVER_STEPS_DECLARED;
|
|
22
|
+
}
|
|
23
|
+
/** The declaration of this step type, or `null` for one no plugin declares. */ export function declaredServerStep(type) {
|
|
24
|
+
var _PLUGIN_SERVER_STEPS_DECLARED_find;
|
|
25
|
+
return (_PLUGIN_SERVER_STEPS_DECLARED_find = PLUGIN_SERVER_STEPS_DECLARED.find((declaration)=>declaration.type === type)) != null ? _PLUGIN_SERVER_STEPS_DECLARED_find : null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* One table per process, on `globalThis` (AGL-3412): the app registers from
|
|
29
|
+
* `instrumentation.ts`, which Next compiles apart from the routes that run
|
|
30
|
+
* steps, and a module-scoped map would be filled in one copy and read empty
|
|
31
|
+
* in the other.
|
|
32
|
+
*/ const EXECUTORS_KEY = Symbol.for('@aglyn/aglyn:server-step-executors');
|
|
33
|
+
const globalScope = globalThis;
|
|
34
|
+
const executors = (_globalScope_EXECUTORS_KEY = globalScope[EXECUTORS_KEY]) != null ? _globalScope_EXECUTORS_KEY : globalScope[EXECUTORS_KEY] = new Map();
|
|
35
|
+
const PLAIN_TYPE = /^[a-z][A-Za-z0-9]*$/;
|
|
36
|
+
/**
|
|
37
|
+
* Registers the executor of one or more step types. Returns the unregister,
|
|
38
|
+
* which removes each type only while this executor still holds it.
|
|
39
|
+
*
|
|
40
|
+
* The owner is the plugin whose register fn is running, or the `pluginId`
|
|
41
|
+
* passed for a boot declaration, where the loader's marker is not set. A
|
|
42
|
+
* registration with neither is refused; so is a type another plugin declares
|
|
43
|
+
* or already holds, because two executors for one step would each write the
|
|
44
|
+
* other's records. The same plugin registering again replaces its own (a
|
|
45
|
+
* second surface, a repeated boot). Nothing is registered unless every type
|
|
46
|
+
* is accepted.
|
|
47
|
+
*/ export function registerServerStepExecutor(types, run, options) {
|
|
48
|
+
var _ref, _getRegisteringPluginId;
|
|
49
|
+
const pluginId = ((_ref = (_getRegisteringPluginId = getRegisteringPluginId()) != null ? _getRegisteringPluginId : options == null ? void 0 : options.pluginId) != null ? _ref : '').trim();
|
|
50
|
+
if (!pluginId) {
|
|
51
|
+
throw new Error('a server step executor was registered with no owner: pass { pluginId } ' + 'when registering outside a plugin register fn');
|
|
52
|
+
}
|
|
53
|
+
const list = [
|
|
54
|
+
...new Set(types.map((type)=>type.trim()))
|
|
55
|
+
];
|
|
56
|
+
if (!list.length) throw new Error(`"${pluginId}" registered a server step executor for no step type`);
|
|
57
|
+
for (const type of list){
|
|
58
|
+
if (!PLAIN_TYPE.test(type)) {
|
|
59
|
+
throw new Error(`"${pluginId}" registered a server step executor for "${type}", which is not a plain step type`);
|
|
60
|
+
}
|
|
61
|
+
const declared = declaredServerStep(type);
|
|
62
|
+
if (declared && declared.pluginId !== pluginId) {
|
|
63
|
+
throw new Error(`server step "${type}" is declared by "${declared.pluginId}"; refused an executor from "${pluginId}"`);
|
|
64
|
+
}
|
|
65
|
+
const held = executors.get(type);
|
|
66
|
+
if (held && held.pluginId !== pluginId) {
|
|
67
|
+
throw new Error(`server step "${type}" already has an executor from "${held.pluginId}"; refused "${pluginId}"`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const entry = {
|
|
71
|
+
pluginId,
|
|
72
|
+
run
|
|
73
|
+
};
|
|
74
|
+
for (const type of list)executors.set(type, entry);
|
|
75
|
+
return ()=>{
|
|
76
|
+
for (const type of list)if (executors.get(type) === entry) executors.delete(type);
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/** The executor registered for a step type, with its owner, or `null`. Never repairs. */ export function registeredServerStepExecutor(type) {
|
|
80
|
+
var _executors_get;
|
|
81
|
+
return (_executors_get = executors.get(type)) != null ? _executors_get : null;
|
|
82
|
+
}
|
|
83
|
+
/** Only for specs: forgets every registered executor. */ export function resetServerStepExecutorsForTests() {
|
|
84
|
+
executors.clear();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The declared step's executor was not registered, even after the app's
|
|
88
|
+
* declarations step ran again. Its message is the step's line in the run
|
|
89
|
+
* history, so it says what happened in the words a site owner reads.
|
|
90
|
+
*/ export class ServerStepUnavailableError extends Error {
|
|
91
|
+
constructor(declaration){
|
|
92
|
+
super(`the "${declaration.type}" step did not run: the plugin that runs it ` + `("${declaration.pluginId}") is not loaded on this server`), this.declaration = declaration;
|
|
93
|
+
this.name = 'ServerStepUnavailableError';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The executor for a step type, for a run that has reached one. See the
|
|
98
|
+
* module note for the three cases: registered answers it, declared but
|
|
99
|
+
* missing throws after the repair has had its turn, and neither answers
|
|
100
|
+
* `null`.
|
|
101
|
+
*/ export async function pluginServerStepExecutor(type) {
|
|
102
|
+
const registered = executors.get(type);
|
|
103
|
+
if (registered) return registered;
|
|
104
|
+
const declared = declaredServerStep(type);
|
|
105
|
+
if (!declared) return null;
|
|
106
|
+
try {
|
|
107
|
+
await runPluginDeclarationsRepair();
|
|
108
|
+
} catch (error) {
|
|
109
|
+
console.error('[server-steps] the declarations repair failed', error);
|
|
110
|
+
}
|
|
111
|
+
const repaired = executors.get(type);
|
|
112
|
+
if (!repaired) throw new ServerStepUnavailableError(declared);
|
|
113
|
+
return repaired;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
//# sourceMappingURL=plugin-server-steps.js.map
|