@aglyn/aglyn 1.0.0-beta.269 → 1.0.0-beta.271

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/package.json +11 -11
  2. package/src/lib/app-utils/account-preferences.d.ts +248 -0
  3. package/src/lib/app-utils/account-preferences.js +434 -0
  4. package/src/lib/app-utils/account-preferences.js.map +1 -0
  5. package/src/lib/app-utils/activity-labels.js +2 -0
  6. package/src/lib/app-utils/activity-labels.js.map +1 -1
  7. package/src/lib/app-utils/analytics-events.d.ts +13 -0
  8. package/src/lib/app-utils/analytics-events.js +2 -0
  9. package/src/lib/app-utils/analytics-events.js.map +1 -1
  10. package/src/lib/app-utils/append-only-history.d.ts +94 -0
  11. package/src/lib/app-utils/append-only-history.js +73 -0
  12. package/src/lib/app-utils/append-only-history.js.map +1 -0
  13. package/src/lib/app-utils/bundle-intent.d.ts +186 -0
  14. package/src/lib/app-utils/bundle-intent.js +386 -0
  15. package/src/lib/app-utils/bundle-intent.js.map +1 -0
  16. package/src/lib/app-utils/client-build.d.ts +204 -0
  17. package/src/lib/app-utils/client-build.js +237 -0
  18. package/src/lib/app-utils/client-build.js.map +1 -0
  19. package/src/lib/app-utils/console-routes.d.ts +4 -0
  20. package/src/lib/app-utils/console-routes.js +2 -0
  21. package/src/lib/app-utils/console-routes.js.map +1 -1
  22. package/src/lib/app-utils/country-options.d.ts +27 -0
  23. package/src/lib/app-utils/country-options.js +96 -0
  24. package/src/lib/app-utils/country-options.js.map +1 -0
  25. package/src/lib/app-utils/docs-help-sections.generated.js +7 -5
  26. package/src/lib/app-utils/docs-help-sections.generated.js.map +1 -1
  27. package/src/lib/app-utils/docs-help.generated.d.ts +11 -5
  28. package/src/lib/app-utils/docs-help.generated.js +22 -2
  29. package/src/lib/app-utils/docs-help.generated.js.map +1 -1
  30. package/src/lib/app-utils/docs-index.generated.js +116 -39
  31. package/src/lib/app-utils/docs-index.generated.js.map +1 -1
  32. package/src/lib/app-utils/margin-utilization.js +6 -4
  33. package/src/lib/app-utils/margin-utilization.js.map +1 -1
  34. package/src/lib/app-utils/media-filter.d.ts +26 -0
  35. package/src/lib/app-utils/media-filter.js +32 -0
  36. package/src/lib/app-utils/media-filter.js.map +1 -1
  37. package/src/lib/app-utils/mobile-push.d.ts +8 -0
  38. package/src/lib/app-utils/mobile-push.js +4 -1
  39. package/src/lib/app-utils/mobile-push.js.map +1 -1
  40. package/src/lib/app-utils/native-app-association.d.ts +3 -2
  41. package/src/lib/app-utils/native-app-association.js +4 -2
  42. package/src/lib/app-utils/native-app-association.js.map +1 -1
  43. package/src/lib/app-utils/native-nav.d.ts +265 -0
  44. package/src/lib/app-utils/native-nav.js +741 -0
  45. package/src/lib/app-utils/native-nav.js.map +1 -0
  46. package/src/lib/app-utils/native-themes.d.ts +249 -0
  47. package/src/lib/app-utils/native-themes.js +732 -0
  48. package/src/lib/app-utils/native-themes.js.map +1 -0
  49. package/src/lib/app-utils/notifications.d.ts +1 -1
  50. package/src/lib/app-utils/notifications.js +10 -0
  51. package/src/lib/app-utils/notifications.js.map +1 -1
  52. package/src/lib/app-utils/onboarding-deep-link.d.ts +36 -2
  53. package/src/lib/app-utils/onboarding-deep-link.js +48 -5
  54. package/src/lib/app-utils/onboarding-deep-link.js.map +1 -1
  55. package/src/lib/app-utils/one-box-search.d.ts +108 -0
  56. package/src/lib/app-utils/one-box-search.js +167 -0
  57. package/src/lib/app-utils/one-box-search.js.map +1 -0
  58. package/src/lib/app-utils/operator-alerts.js +21 -0
  59. package/src/lib/app-utils/operator-alerts.js.map +1 -1
  60. package/src/lib/app-utils/org-permissions.js +10 -61
  61. package/src/lib/app-utils/org-permissions.js.map +1 -1
  62. package/src/lib/app-utils/org-role-grants.d.ts +95 -0
  63. package/src/lib/app-utils/org-role-grants.js +193 -0
  64. package/src/lib/app-utils/org-role-grants.js.map +1 -0
  65. package/src/lib/app-utils/owner-approval-record.d.ts +102 -0
  66. package/src/lib/app-utils/owner-approval-record.js +148 -0
  67. package/src/lib/app-utils/owner-approval-record.js.map +1 -0
  68. package/src/lib/app-utils/plan-entitlements.d.ts +224 -68
  69. package/src/lib/app-utils/plan-entitlements.js +278 -61
  70. package/src/lib/app-utils/plan-entitlements.js.map +1 -1
  71. package/src/lib/app-utils/release-flags.d.ts +1 -1
  72. package/src/lib/app-utils/release-flags.js +10 -0
  73. package/src/lib/app-utils/release-flags.js.map +1 -1
  74. package/src/lib/app-utils/server.d.ts +4 -0
  75. package/src/lib/app-utils/server.js +7 -0
  76. package/src/lib/app-utils/server.js.map +1 -1
  77. package/src/lib/app-utils/site-care-project.d.ts +227 -0
  78. package/src/lib/app-utils/site-care-project.js +423 -0
  79. package/src/lib/app-utils/site-care-project.js.map +1 -0
  80. package/src/lib/app-utils/site-care.d.ts +268 -0
  81. package/src/lib/app-utils/site-care.js +283 -0
  82. package/src/lib/app-utils/site-care.js.map +1 -0
  83. package/src/lib/app-utils/tenant-dns-targets.d.ts +62 -0
  84. package/src/lib/app-utils/tenant-dns-targets.js +80 -0
  85. package/src/lib/app-utils/tenant-dns-targets.js.map +1 -0
  86. package/src/lib/app-utils/upgrade-proposal.d.ts +29 -4
  87. package/src/lib/app-utils/upgrade-proposal.js +60 -9
  88. package/src/lib/app-utils/upgrade-proposal.js.map +1 -1
  89. package/src/lib/foundation/definitions/org-billing.types.d.ts +54 -10
  90. package/src/lib/foundation/definitions/org-billing.types.js.map +1 -1
  91. package/src/lib/foundation/definitions/organization.types.d.ts +3 -1
  92. package/src/lib/foundation/definitions/organization.types.js.map +1 -1
  93. package/src/lib/foundation/definitions/platform.types.d.ts +9 -0
  94. package/src/lib/foundation/definitions/platform.types.js.map +1 -1
  95. package/src/lib/foundation/index.d.ts +1 -1
  96. package/src/lib/foundation/index.js.map +1 -1
  97. package/src/lib/plugin-manager/feature-plugins.d.ts +86 -0
  98. package/src/lib/plugin-manager/feature-plugins.js +20 -0
  99. package/src/lib/plugin-manager/feature-plugins.js.map +1 -1
  100. package/src/lib/plugin-manager/first-party-plugins.generated.js +22 -1
  101. package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -1
  102. package/src/lib/plugin-manager/plugin-ai-capabilities.d.ts +19 -0
  103. package/src/lib/plugin-manager/plugin-ai-capabilities.js.map +1 -1
  104. package/src/lib/plugin-manager/plugin-domain-events.d.ts +4 -3
  105. package/src/lib/plugin-manager/plugin-domain-events.js.map +1 -1
  106. package/src/lib/plugin-manager/plugin-domain-search.d.ts +81 -0
  107. package/src/lib/plugin-manager/plugin-domain-search.js +63 -0
  108. package/src/lib/plugin-manager/plugin-domain-search.js.map +1 -0
  109. package/src/lib/plugin-manager/plugin-entitlements.d.ts +23 -5
  110. package/src/lib/plugin-manager/plugin-entitlements.js +10 -0
  111. package/src/lib/plugin-manager/plugin-entitlements.js.map +1 -1
  112. package/src/lib/plugin-manager/plugin-media-ingest.d.ts +25 -0
  113. package/src/lib/plugin-manager/plugin-media-ingest.js.map +1 -1
  114. package/src/lib/plugin-manager/plugin-search-sources.d.ts +85 -0
  115. package/src/lib/plugin-manager/plugin-search-sources.js +91 -0
  116. package/src/lib/plugin-manager/plugin-search-sources.js.map +1 -0
  117. package/src/lib/plugin-manager/plugin-services.js +6 -0
  118. package/src/lib/plugin-manager/plugin-services.js.map +1 -1
  119. package/src/lib/plugin-manager/purchase-gate-preclearance.d.ts +61 -0
  120. package/src/lib/plugin-manager/purchase-gate-preclearance.js +102 -0
  121. package/src/lib/plugin-manager/purchase-gate-preclearance.js.map +1 -0
@@ -14,7 +14,7 @@
14
14
  * See the License for the specific language governing permissions and
15
15
  * limitations under the License.
16
16
  */
17
- import type { AglynOrgBilling, CoreOrgEntitlements, CoreOrgFeatureFlags, OrgDiscount, OrgFeatureFlags, OrgPlan, OrgSeatAddons } from '../foundation';
17
+ import type { AglynOrgBilling, AiTierId, CoreOrgEntitlements, CoreOrgFeatureFlags, OrgDiscount, OrgFeatureFlags, OrgPlan, OrgSeatAddons } from '../foundation';
18
18
  import type { PluginOrgFeatures, PluginOrgQuotas } from '../plugin-manager/plugin-entitlement-keys';
19
19
  import { type OrgOverrideReasonCode } from './org-override-reason';
20
20
  import type { ResolvedBrandingProfile } from './platform-brand';
@@ -220,6 +220,14 @@ export declare const SELF_SERVE_PLANS: OrgPlan[];
220
220
  * "free". Revenue for such an org comes from `subscription.customMonthlyUsd`.
221
221
  */
222
222
  export declare function isCustomPricedPlan(plan: OrgPlan | undefined | null): boolean;
223
+ /**
224
+ * Whether a plan sells the Site Care add-on (AGL-3954): every paid self-serve
225
+ * plan, never `free` (no subscription to bill it on) and never a
226
+ * custom-priced plan (Enterprise names it in the agreement instead). An
227
+ * unknown plan string sells nothing. The ONE reading of that rule — the
228
+ * add-on ceiling, the checkout refusal and the Billing card all ask it.
229
+ */
230
+ export declare function planSellsSiteCare(plan: OrgPlan | string | undefined | null): boolean;
223
231
  /** Human plan names — the ONE source every plan badge/label reads. */
224
232
  export declare const PLAN_LABELS: Record<OrgPlan, string>;
225
233
  /**
@@ -235,6 +243,59 @@ export declare const PLAN_LABELS: Record<OrgPlan, string>;
235
243
  * The marketing copy on /pricing is written against that behaviour.
236
244
  */
237
245
  export declare const EVENT_CALENDAR_ADDON_MONTHLY_USD = 9;
246
+ /**
247
+ * Site Care add-on (AGL-3954): $49/mo per organization, the managed-website
248
+ * service. It buys staff time, not capacity: small changes to the owner's
249
+ * existing site (hours, prices, photos, a staff member, a seasonal banner, a
250
+ * section on an existing page), up to about one hour of work a month, done
251
+ * within two business days, minutes logged and no rollover. New pages, new
252
+ * forms, redesigns, brand work, photography, whole-site copy and ads are
253
+ * quoted separately, and it never raises a plan limit — a 26th page or a
254
+ * second site is still an upgrade.
255
+ *
256
+ * Flat across plans, like the Event Calendar, because the work it pays for
257
+ * is the same hour whichever tier the site is on; the yearly price is ×12
258
+ * with no discount, as every add-on's is. Sold on every paid self-serve plan
259
+ * and never on Free (no subscription to carry it) or Enterprise (quoted per
260
+ * deal) — `planSellsSiteCare` is that rule. `resolveOrgEntitlements` flips
261
+ * the org-wide `features.siteCare` from any purchased quantity >= 1.
262
+ */
263
+ export declare const SITE_CARE_ADDON_MONTHLY_USD = 49;
264
+ /**
265
+ * Site Care's included time (AGL-3959): about an hour of staff work a month,
266
+ * no rollover. `SITE_CARE_INCLUDED_BLOCK_MINUTES` is the step each request is
267
+ * counted against it in, always rounded up — a 10-minute change uses one
268
+ * 15-minute block. The timer's actual minutes are still logged beside it.
269
+ */
270
+ export declare const SITE_CARE_INCLUDED_MINUTES = 60;
271
+ /** The block a request counts against the included hour in (AGL-3959). */
272
+ export declare const SITE_CARE_INCLUDED_BLOCK_MINUTES = 15;
273
+ /**
274
+ * Site Care extra time (AGL-3959): $79 per STARTED hour past the included
275
+ * hour in a month. Billed in whole hours, rounded up — any part of an hour is
276
+ * the full rate — and never less than the hours the owner approved. Only with
277
+ * the owner's recorded yes, as an invoice item on the next subscription
278
+ * invoice; never recurring. `site-care.ts` holds the arithmetic.
279
+ */
280
+ export declare const SITE_CARE_EXTRA_HOUR_USD = 79;
281
+ /**
282
+ * Site Care projects (AGL-3970): work that adds a page, a form, a design or
283
+ * a campaign is a flat quote, never hourly. The quote is the estimated hours
284
+ * × `SITE_CARE_EXTRA_HOUR_USD`, rounded up to the whole hour, and never below
285
+ * the published starting price of the kind of project it is. These three are
286
+ * those starting prices, as `/pricing` publishes them.
287
+ */
288
+ export declare const SITE_CARE_PROJECT_LANDING_PAGE_FROM_USD = 249;
289
+ /** A redesign's published starting price (AGL-3970). */
290
+ export declare const SITE_CARE_PROJECT_REDESIGN_FROM_USD = 749;
291
+ /** A logo or brand kit's published starting price (AGL-3970). */
292
+ export declare const SITE_CARE_PROJECT_BRAND_KIT_FROM_USD = 349;
293
+ /**
294
+ * A project priced ABOVE this is billed half up front and half at launch, on
295
+ * two invoices from the same record; at or below it, in full up front
296
+ * (AGL-3970). `site-care-project.ts` holds the arithmetic.
297
+ */
298
+ export declare const SITE_CARE_PROJECT_SPLIT_ABOVE_USD = 500;
238
299
  /**
239
300
  * POS Pro register add-on (AGL-329): $89/mo per extra register/location
240
301
  * (Shopify POS Pro parity). Purchased add-ons land as a per-org
@@ -243,37 +304,105 @@ export declare const EVENT_CALENDAR_ADDON_MONTHLY_USD = 9;
243
304
  */
244
305
  export declare const POS_REGISTER_ADDON_MONTHLY_USD = 89;
245
306
  /**
246
- * The Aglyn AI add-on's credit band (AGL-2896): the credits a month the
247
- * add-on ADDS to the plan's `assistCreditsPerMonth` when
248
- * `seatAddons.aiAddon` is set. One pool and one meter — the add-on widens
249
- * the band the assist meter already draws on rather than opening a second
250
- * one, so `resolveAssistCreditBudget`, the overage price and the hard-cap
251
- * switch all see one number.
252
- *
253
- * ## Sized against the add-on's own price
254
- *
255
- * A credit is `ASSIST_CREDIT_COST_USD` of provider spend, so each band is a
256
- * cost figure: 1,000 credits are $1.00. Every band here costs at most 50% of
257
- * `PlanPricing.aiAddonMonthlyUsd` at full consumption — Starter $4 of $9,
258
- * Pro $9 of $19, Business $19 of $39, Scale $34 of $69, Advanced $49 of
259
- * $99, Agency $149 of $299 — which is the same line-margin floor
260
- * (`ASSIST_CREDIT_MIN_MARGIN_PCT`) every retail assist rate clears.
261
- * `tier-margin-floor.spec.ts` holds the whole tier non-negative with the
262
- * add-on band at 100% and the add-on's revenue counted, and pins each band's
263
- * share of its price.
264
- *
265
- * ## Free and Enterprise
266
- *
267
- * Free is 0: the plan sells no add-on (`aiAddonMonthlyUsd` is null), so a
268
- * quantity written onto a Free org adds nothing. Enterprise is finite at
269
- * twice Agency's, the rule every Enterprise fallback follows since the
270
- * 2026-09-07 decision (AGL-2654) — never `UNLIMITED`, for the reason
271
- * `ENTERPRISE_ASSIST_CREDITS_PER_MONTH` gives: an unbounded band reads back
272
- * as zero off the wire. Enterprise carries `aiGenerative` in the agreement
273
- * and its price is null too, so this figure is what a contract that names
274
- * the add-on starts from before its own number is written.
275
- */
276
- export declare const AI_ADDON_CREDITS_PER_MONTH: Record<OrgPlan, number>;
307
+ * The Aglyn AI tiers (AGL-3965): credits sold on their own, to ANY paid
308
+ * plan, on top of what the plan includes.
309
+ *
310
+ * ## One pool
311
+ *
312
+ * Every plan's `assistCreditsPerMonth` pays for ALL of Aglyn AI — the
313
+ * assistant and generation alike — and `features.aiGenerative` is on for
314
+ * every plan. A tier ADDS `credits` to that same band in
315
+ * `resolveOrgEntitlements`, so `resolveAssistCreditBudget`, the overage
316
+ * price and the hard-cap switch all still see one number. Past the pool the
317
+ * plan's `extraAssistCreditsUsdPer1k` bills per 1,000 credits unless the
318
+ * owner turned on `assistOverage.hardCap`; a tier changes neither.
319
+ *
320
+ * ## Sized against the tier's own price
321
+ *
322
+ * A credit is `ASSIST_CREDIT_COST_USD` of provider spend, so `credits` is a
323
+ * cost figure: 1,000 credits are $1.00. Every tier costs at most 50% of its
324
+ * price at full consumption — Spark $4 of $9, Boost $9 of $19, Plus $19 of
325
+ * $39, Max $34 of $69, Ultra $49 of $99, Studio $149 of $299 — the same
326
+ * line-margin floor (`ASSIST_CREDIT_MIN_MARGIN_PCT`) every retail assist
327
+ * rate clears. The plan's included band is priced at 100% burn on its own
328
+ * tier, so a tier's margin never leans on the plan's; that is what
329
+ * `tier-margin-floor.spec.ts` holds, per tier.
330
+ *
331
+ * These are the six price/credit pairs the add-on was sold at per plan
332
+ * before AGL-3965 (Starter's $9 / 4,000 through Agency's $299 / 149,000),
333
+ * now chosen independently of the plan. `LEGACY_AI_ADDON_TIER_BY_PLAN` maps
334
+ * each old per-plan add-on to the tier with its price and band.
335
+ *
336
+ * Yearly is ×12 with no discount, as every add-on is. Studio is the top;
337
+ * more is an Enterprise contract. Free sells none (`planSellsAiTiers`).
338
+ */
339
+ export interface AiTier {
340
+ /** The tier's name as a person sees it, after the product name. */
341
+ label: string;
342
+ monthlyUsd: number;
343
+ yearlyUsd: number;
344
+ /** Credits a month the tier adds to the plan's included band. */
345
+ credits: number;
346
+ }
347
+ /** The tiers, smallest first — the order every picker lists them in. */
348
+ export declare const AI_TIER_IDS: readonly AiTierId[];
349
+ export declare const AI_TIERS: Readonly<Record<AiTierId, AiTier>>;
350
+ /**
351
+ * The tier an add-on bought before AGL-3965 is (AGL-3965): the one with the
352
+ * same price and the same band the plan sold it at, so a workspace that
353
+ * held "the Pro add-on" holds Boost — $19, 9,000 credits — and neither its
354
+ * bill nor its credits move. Read when `aiTier` is absent and to classify a
355
+ * per-plan `STRIPE_PRICE_{PLAN}_AI_ADDON` item still on a subscription.
356
+ */
357
+ export declare const LEGACY_AI_ADDON_TIER_BY_PLAN: Readonly<Partial<Record<OrgPlan, AiTierId>>>;
358
+ /**
359
+ * The tier a purchase that names a plan and no tier means (AGL-3965): a
360
+ * `?plan=pro&ai=1` deep link, a checkout posting `aiAddon: true` alone. The
361
+ * tier with that plan's old price and band, so a link published before tiers
362
+ * existed still sells what it quoted. Null where the plan sells no tier.
363
+ */
364
+ export declare function defaultAiTierForPlan(plan: OrgPlan | string | null | undefined): AiTierId | null;
365
+ /** Whether a value is one of the tier ids. */
366
+ export declare function isAiTierId(value: unknown): value is AiTierId;
367
+ /**
368
+ * The add-on key an Aglyn AI tier travels under outside the billing routes
369
+ * (AGL-3965): `ai:<tier>`, e.g. `ai:boost`. The ONE spelling a bundle
370
+ * checkout link (AGL-3955) and a hand-off proposal's add-on list (AGL-3956)
371
+ * name a tier by, parsed and listed here, beside the tiers, so neither
372
+ * restates the ids.
373
+ */
374
+ export type AiTierAddonKey = `ai:${AiTierId}`;
375
+ /** `ai:<tier>` for a tier. */
376
+ export declare function aiTierAddonKey(tier: AiTierId): AiTierAddonKey;
377
+ /**
378
+ * The tier an `ai:<tier>` key names, or null for anything else — another
379
+ * add-on's key, a bare `ai`, an unknown tier, a non-string. Exact and
380
+ * case-sensitive: a key is read off a link, and guessing is the expensive
381
+ * direction to be wrong in (`parseOnboardingPlanIntent` reads `?ai=` the
382
+ * same way).
383
+ */
384
+ export declare function parseAiTierAddonKey(key: unknown): AiTierId | null;
385
+ /** One tier as an add-on a bundle or a proposal can carry. */
386
+ export interface AiTierAddonOption {
387
+ key: AiTierAddonKey;
388
+ tier: AiTierId;
389
+ label: string;
390
+ monthlyUsd: number;
391
+ yearlyUsd: number;
392
+ credits: number;
393
+ }
394
+ /**
395
+ * Every tier as an `ai:<tier>` add-on, smallest first — what a picker that
396
+ * offers "Aglyn AI" beside the other add-ons lists. Empty for a plan that
397
+ * sells no tier (Free, Enterprise) when a plan is given.
398
+ */
399
+ export declare function listAiTierAddons(plan?: OrgPlan | string | null): AiTierAddonOption[];
400
+ /**
401
+ * Whether a plan may buy an Aglyn AI tier (AGL-3965): every paid self-serve
402
+ * plan. Not Free, which has no subscription to carry it, and not Enterprise,
403
+ * whose AI is in the agreement.
404
+ */
405
+ export declare function planSellsAiTiers(plan: OrgPlan | string | undefined | null): boolean;
277
406
  /**
278
407
  * The generative add-on's name as a person sees it (AGL-2896): the brand,
279
408
  * then "AI". Read from the platform brand by default and from the org's
@@ -437,41 +566,6 @@ export interface PlanPricing {
437
566
  * no unrefusable assist traffic to absorb.
438
567
  */
439
568
  extraAssistCreditsUsdPer1k: number | null;
440
- /**
441
- * The Aglyn AI add-on, flat per organization per month (AGL-2896); null
442
- * when the plan does not sell it.
443
- *
444
- * ## What it buys
445
- *
446
- * `features.aiGenerative` — generative building and automation, the rung
447
- * no self-serve tier includes — plus `AI_ADDON_CREDITS_PER_MONTH[plan]`
448
- * added to the plan's assist band. It also switches `aiAssist` on, so on
449
- * Starter it brings the two rungs the tier does not carry — the copy
450
- * assist and the generative one — on top of the 750 credits the plan
451
- * already includes (AGL-3203). It ADDS to that band; it does not replace
452
- * it, on Starter or on any tier.
453
- *
454
- * ## Where the ladder sits
455
- *
456
- * Priced as an uplift on the plan rather than on its own cost: the field
457
- * charges roughly 30% of the base price for an AI tier (Zylo's 2025
458
- * survey puts the AI uplift at 20–37% across SaaS; aissist.io's benchmark
459
- * and the Framer, Webflow and HubSpot credit add-ons sit in the same
460
- * band), and the share DESCENDS with the tier — 36% of Starter's $25, 34%
461
- * of Pro's, 28% of Business's, 28% of Scale's, 25% of Advanced's, 23% of
462
- * Agency's — because the larger the plan the more of its price is already
463
- * carrying the bands the assistant builds against.
464
- *
465
- * Annual is x12 of this with no discount, as every other add-on is
466
- * (`orgListPriceMonthlyUsd`). The band it funds costs at most 50% of it in
467
- * provider spend, the `ASSIST_CREDIT_MIN_MARGIN_PCT` floor every retail
468
- * assist figure holds.
469
- *
470
- * Null on Free, which sells no add-on of any kind, and on Enterprise,
471
- * where every figure is the "not for sale" sentinel and generative
472
- * building is in the agreement.
473
- */
474
- aiAddonMonthlyUsd: number | null;
475
569
  /**
476
570
  * Metered overage per 1,000 CRM records beyond `contactsPerHost` (AGL-890,
477
571
  * widened to contacts + companies + deals in AGL-2611): audience bands,
@@ -762,6 +856,12 @@ export declare function orgListPriceMonthlyUsd(org: Partial<AglynOrgBilling> | n
762
856
  * `NaN` or a negative is none.
763
857
  */
764
858
  export declare function aiAddonUnits(addons: OrgSeatAddons | null | undefined): 0 | 1;
859
+ /**
860
+ * How many Site Care add-ons a purchase map counts as: 0 or 1 (AGL-3954).
861
+ * Org-wide like the Aglyn AI add-on, so a quantity above one is one
862
+ * purchase, and a non-number, `NaN` or a negative is none.
863
+ */
864
+ export declare function siteCareUnits(addons: OrgSeatAddons | null | undefined): 0 | 1;
765
865
  /**
766
866
  * A list price net of a discount (AGL-1105). Percentage discounts scale the
767
867
  * whole bill; fixed discounts subtract a flat USD amount. Never below 0, and
@@ -1458,6 +1558,62 @@ export declare function resolveEffectivePlan(org: Partial<AglynOrgBilling> | nul
1458
1558
  * together rather than leaving a rate on a band that has gone.
1459
1559
  */
1460
1560
  export declare function hasAiAddon(org: Partial<AglynOrgBilling> | null | undefined): boolean;
1561
+ /**
1562
+ * Which Aglyn AI tier the org's purchase map holds (AGL-3965), whether or
1563
+ * not the subscription is still paying for it — `resolveAiTier` is the
1564
+ * reading that drops a dead one. `org.aiTier` when it names a tier;
1565
+ * otherwise, for an add-on bought before tiers existed, the tier with that
1566
+ * plan's old price and band (`LEGACY_AI_ADDON_TIER_BY_PLAN`). Null when no
1567
+ * add-on is held or the plan sells no tier (Free, Enterprise).
1568
+ */
1569
+ export declare function aiTierOfPurchase(org: Partial<AglynOrgBilling> | null | undefined): AiTierId | null;
1570
+ /**
1571
+ * The Aglyn AI tier that currently applies (AGL-3965): bought, on a
1572
+ * subscription still paying for it, on a plan that sells tiers. The ONE
1573
+ * reading every surface that shows or counts a tier goes through.
1574
+ */
1575
+ export declare function resolveAiTier(org: Partial<AglynOrgBilling> | null | undefined): AiTierId | null;
1576
+ /**
1577
+ * What `seatAddons.aiAddon` adds on an Enterprise org (AGL-2896, kept by
1578
+ * AGL-3965): twice Studio's band, the figure the per-plan table carried as
1579
+ * twice Agency's (the rule every Enterprise fallback follows since AGL-2654),
1580
+ * and still what a contract that names the add-on starts from before its own
1581
+ * number is written. Enterprise buys no tier — its AI is in the agreement —
1582
+ * so this is the contract figure kept, not a price; finite, never
1583
+ * `UNLIMITED`, for the reason `ENTERPRISE_ASSIST_CREDITS_PER_MONTH` gives.
1584
+ */
1585
+ export declare const ENTERPRISE_AI_ADDON_CREDITS_PER_MONTH: number;
1586
+ /**
1587
+ * The Aglyn AI add-on's per-unit quota as `resolveOrgEntitlements` folds it
1588
+ * (AGL-3965): the purchased tier's credits, on a plan that sells tiers;
1589
+ * Enterprise's contract figure (`ENTERPRISE_AI_ADDON_CREDITS_PER_MONTH`);
1590
+ * else 0 (Free). The AI plugin declares its seat add-on with this as
1591
+ * `quota.perUnit`.
1592
+ */
1593
+ export declare function aiTierQuotaPerUnit(org: Partial<AglynOrgBilling> | null | undefined, plan: OrgPlan): number;
1594
+ /**
1595
+ * The credits a month the org's Aglyn AI add-on adds to its plan's included
1596
+ * band (AGL-3965) — 0 with none held. The SAME figure `resolveOrgEntitlements`
1597
+ * folds into `assistCreditsPerMonth` (`aiTierQuotaPerUnit`), so a surface
1598
+ * quoting "your tier adds" and the meter agree.
1599
+ */
1600
+ export declare function aiTierCreditsPerMonth(org: Partial<AglynOrgBilling> | null | undefined): number;
1601
+ /**
1602
+ * Whether this org can buy or change an Aglyn AI tier itself (AGL-3965): a
1603
+ * plan that sells tiers, and not one a staff comp grants — a comp has no
1604
+ * subscription to put the tier on (`compPricing`).
1605
+ */
1606
+ export declare function orgCanBuyAiTier(org: Partial<AglynOrgBilling> | null | undefined): boolean;
1607
+ /** "Aglyn AI Boost": the product name, then the tier's. */
1608
+ export declare const aiTierName: (tier: AiTierId, brand?: string) => string;
1609
+ /**
1610
+ * Whether the org's Site Care add-on currently applies (AGL-3954): bought,
1611
+ * and on a subscription that is still paying for it, so a dead subscription
1612
+ * reads false here exactly as it drops `features.siteCare`. The reader for
1613
+ * surfaces that ask about the purchase rather than the resolved feature —
1614
+ * the staff org page's chip, the request intake.
1615
+ */
1616
+ export declare function hasSiteCare(org: Partial<AglynOrgBilling> | null | undefined): boolean;
1461
1617
  /**
1462
1618
  * Numeric entitlement keys that were REMOVED from `PLAN_ENTITLEMENTS` and
1463
1619
  * must never be resolved again from a stored override (AGL-2133).
@@ -1504,7 +1660,7 @@ export declare const PRICE_ENTITLEMENT_KEYS: ReadonlySet<string>;
1504
1660
  * per-key overrides applied (features merge key-by-key too), then
1505
1661
  * purchased add-ons stacked on top (AGL-524): `seatAddons.hosts` raises
1506
1662
  * `hostLimit`, `seatAddons.eventCalendar` switches the `eventCalendar`
1507
- * feature on, and every seat add-on a plugin declared through
1663
+ * feature on, `seatAddons.siteCare` switches `siteCare` on, and every seat add-on a plugin declared through
1508
1664
  * `registerPluginEntitlements` (AGL-2940) widens the quota it names by its
1509
1665
  * per-plan figure per unit and switches its features on — the Aglyn AI
1510
1666
  * add-on (AGL-2896) is the first such declaration. (Seat/dataset add-ons