@burdenoff/microfe-coolandlovely 2026.1101.6 → 2026.1101.7

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 (35) hide show
  1. package/dist/coolandlovely/CoolAndLovelyRoot.d.ts.map +1 -1
  2. package/dist/coolandlovely/CoolAndLovelyRoot.js +18 -23
  3. package/dist/coolandlovely/CoolAndLovelyRoot.js.map +1 -1
  4. package/dist/coolandlovely/context/QueryScope.d.ts +5 -0
  5. package/dist/coolandlovely/context/QueryScope.d.ts.map +1 -0
  6. package/dist/coolandlovely/context/QueryScope.js +18 -0
  7. package/dist/coolandlovely/context/QueryScope.js.map +1 -0
  8. package/dist/coolandlovely/context/queryScopeKey.d.ts +5 -0
  9. package/dist/coolandlovely/context/queryScopeKey.d.ts.map +1 -0
  10. package/dist/coolandlovely/context/queryScopeKey.js +14 -0
  11. package/dist/coolandlovely/context/queryScopeKey.js.map +1 -0
  12. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.d.ts +1 -1
  13. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.d.ts.map +1 -1
  14. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js +7 -6
  15. package/dist/coolandlovely/hooks/useCoolAndLovelyApi.js.map +1 -1
  16. package/dist/coolandlovely/hooks/useCreatorAnalytics.d.ts +19 -0
  17. package/dist/coolandlovely/hooks/useCreatorAnalytics.d.ts.map +1 -0
  18. package/dist/coolandlovely/hooks/useCreatorAnalytics.js +24 -0
  19. package/dist/coolandlovely/hooks/useCreatorAnalytics.js.map +1 -0
  20. package/dist/coolandlovely/pages/commerce/CreatorAnalyticsSection.d.ts +2 -0
  21. package/dist/coolandlovely/pages/commerce/CreatorAnalyticsSection.d.ts.map +1 -0
  22. package/dist/coolandlovely/pages/commerce/CreatorAnalyticsSection.js +184 -0
  23. package/dist/coolandlovely/pages/commerce/CreatorAnalyticsSection.js.map +1 -0
  24. package/dist/coolandlovely/pages/commerce/CreatorEarningsPage.d.ts.map +1 -1
  25. package/dist/coolandlovely/pages/commerce/CreatorEarningsPage.js +125 -123
  26. package/dist/coolandlovely/pages/commerce/CreatorEarningsPage.js.map +1 -1
  27. package/dist/generated/global-types.d.ts +787 -51
  28. package/dist/generated/global-types.d.ts.map +1 -1
  29. package/dist/generated/wspace-operations.d.ts +56 -1
  30. package/dist/generated/wspace-operations.d.ts.map +1 -1
  31. package/dist/generated/wspace-operations.js +27 -0
  32. package/dist/generated/wspace-operations.js.map +1 -0
  33. package/dist/generated/wspace-types.d.ts +20845 -2889
  34. package/dist/generated/wspace-types.d.ts.map +1 -1
  35. package/package.json +17 -15
@@ -172,6 +172,10 @@ export declare enum ActivityAction {
172
172
  export type ActivityFilterInput = {
173
173
  action?: InputMaybe<Scalars['String']['input']>;
174
174
  actorId?: InputMaybe<Scalars['String']['input']>;
175
+ /** Only rows made by this kind of actor origin (BOFF-9649). The only recorded origin is `ai_assistant`: a change an AI assistant session made for its owner. */
176
+ actorOrigin?: InputMaybe<Scalars['String']['input']>;
177
+ /** Only rows made by this AI assistant session (BOFF-9649). */
178
+ assistantSessionId?: InputMaybe<Scalars['String']['input']>;
175
179
  endDate?: InputMaybe<Scalars['DateTime']['input']>;
176
180
  resource?: InputMaybe<Scalars['String']['input']>;
177
181
  resourceId?: InputMaybe<Scalars['String']['input']>;
@@ -185,6 +189,12 @@ export type ActivityLog = {
185
189
  __typename?: 'ActivityLog';
186
190
  action: Scalars['String']['output'];
187
191
  actorId?: Maybe<Scalars['String']['output']>;
192
+ /** `ai_assistant` when an AI assistant session made the change; null for a human-made change. */
193
+ actorOrigin?: Maybe<Scalars['String']['output']>;
194
+ /** Proposal / idempotency key the assistant mutation ran under, when it had one. */
195
+ assistantCorrelationId?: Maybe<Scalars['String']['output']>;
196
+ /** Relay session (assistant sandbox) that made the change, when an assistant made it. */
197
+ assistantSessionId?: Maybe<Scalars['String']['output']>;
188
198
  createdAt: Scalars['DateTime']['output'];
189
199
  description?: Maybe<Scalars['String']['output']>;
190
200
  id: Scalars['ID']['output'];
@@ -416,9 +426,22 @@ export type Addon = {
416
426
  priceHistory: Array<AddonPriceHistory>;
417
427
  /** Product ID the addon belongs to (reference to product microservice) */
418
428
  productID?: Maybe<Scalars['String']['output']>;
429
+ /** Whether buying this add-on requires a paid subscription to its product (the catalogs' "Free tier exclusion" rule, BOFF-9889). False for items sold to Free users on purpose. */
430
+ requiresPaidSubscription?: Maybe<Scalars['Boolean']['output']>;
419
431
  /** The timestamp when the addon was last updated. */
420
432
  updatedAt?: Maybe<Scalars['DateTime']['output']>;
421
433
  };
434
+ /** Why an add-on can or cannot be bought by the caller's billing account(s). */
435
+ export declare enum AddonEligibilityReason {
436
+ /** The add-on can be bought. */
437
+ Eligible = "ELIGIBLE",
438
+ /** No add-on with this id exists. */
439
+ NotFound = "NOT_FOUND",
440
+ /** The add-on requires a paid subscription to its product and none is active. */
441
+ PaidSubscriptionRequired = "PAID_SUBSCRIPTION_REQUIRED",
442
+ /** The chosen subscription is not a paid plan of the add-on's product. */
443
+ SubscriptionNotEligible = "SUBSCRIPTION_NOT_ELIGIBLE"
444
+ }
422
445
  /** Tracks historical price changes for an Addon. A new record is created whenever an addon's price is updated. */
423
446
  export type AddonPriceHistory = {
424
447
  __typename?: 'AddonPriceHistory';
@@ -439,6 +462,17 @@ export type AddonPriceHistory = {
439
462
  /** Optional reason for the price change */
440
463
  reason?: Maybe<Scalars['String']['output']>;
441
464
  };
465
+ /** Purchase eligibility of one add-on (BOFF-9889). */
466
+ export type AddonPurchaseEligibility = {
467
+ __typename?: 'AddonPurchaseEligibility';
468
+ addonId: Scalars['ID']['output'];
469
+ eligible: Scalars['Boolean']['output'];
470
+ /** Active paid subscriptions of the add-on's product the add-on may be attached to. */
471
+ eligibleSubscriptionIds: Array<Scalars['ID']['output']>;
472
+ productId?: Maybe<Scalars['String']['output']>;
473
+ reason: AddonEligibilityReason;
474
+ requiresPaidSubscription: Scalars['Boolean']['output'];
475
+ };
442
476
  export type AddonSubscription = {
443
477
  __typename?: 'AddonSubscription';
444
478
  /** The addon linked to this subscription. */
@@ -754,6 +788,8 @@ export type AiModelPrice = {
754
788
  isActive: Scalars['Boolean']['output'];
755
789
  model: Scalars['String']['output'];
756
790
  outputPer1M: Scalars['Float']['output'];
791
+ /** When this price row last changed. Ledger cost estimates cite it in their pricing reference (wspace-prompts-svc, BOFF-9935) so a cost stays traceable to the exact price version that produced it. */
792
+ updatedAt: Scalars['DateTime']['output'];
757
793
  };
758
794
  /** Amount range filter for queries */
759
795
  export type AmountRangeInput = {
@@ -3566,6 +3602,8 @@ export type CreateContentPageInput = {
3566
3602
  category?: InputMaybe<Scalars['String']['input']>;
3567
3603
  content: Scalars['String']['input'];
3568
3604
  contentFormat?: InputMaybe<Scalars['String']['input']>;
3605
+ /** Customer approval for a case study. All three fields are required, and signedAt may not be in the future. */
3606
+ customerSignOff?: InputMaybe<CustomerSignOffInput>;
3569
3607
  excerpt?: InputMaybe<Scalars['String']['input']>;
3570
3608
  featured?: InputMaybe<Scalars['Boolean']['input']>;
3571
3609
  isPublished?: InputMaybe<Scalars['Boolean']['input']>;
@@ -4771,6 +4809,22 @@ export type CustomerSatisfactionSurveyFilterInput = {
4771
4809
  startDate?: InputMaybe<Scalars['DateTime']['input']>;
4772
4810
  ticketId?: InputMaybe<Scalars['String']['input']>;
4773
4811
  };
4812
+ /** Who at the customer approved a case study, when, and where the written approval is kept. Never invent one: it is the only thing that lets a case study appear on a public website. */
4813
+ export type CustomerSignOff = {
4814
+ __typename?: 'CustomerSignOff';
4815
+ /** Reference to the stored written approval (document id, ticket or file URL). Only returned to callers who manage content pages; null for public visitors. */
4816
+ documentRef?: Maybe<Scalars['String']['output']>;
4817
+ /** When the customer approved the story */
4818
+ signedAt: Scalars['DateTime']['output'];
4819
+ /** Name and role of the approving person at the customer. Only returned to callers who manage content pages; null for public visitors. */
4820
+ signedBy?: Maybe<Scalars['String']['output']>;
4821
+ };
4822
+ /** Customer approval for a case study (see CustomerSignOff) */
4823
+ export type CustomerSignOffInput = {
4824
+ documentRef: Scalars['String']['input'];
4825
+ signedAt: Scalars['DateTime']['input'];
4826
+ signedBy: Scalars['String']['input'];
4827
+ };
4774
4828
  export declare enum DlqStatus {
4775
4829
  Discarded = "DISCARDED",
4776
4830
  Investigating = "INVESTIGATING",
@@ -5542,6 +5596,19 @@ export declare enum DimensionUnit {
5542
5596
  Inch = "INCH",
5543
5597
  Meter = "METER"
5544
5598
  }
5599
+ /** Input for the M2M dispatchWebhookEvent mutation */
5600
+ export type DispatchWebhookEventInput = {
5601
+ /** Caller-supplied event ID; enables idempotent redispatch per subscription */
5602
+ eventId?: InputMaybe<Scalars['String']['input']>;
5603
+ /** Event type being dispatched */
5604
+ eventType: Scalars['String']['input'];
5605
+ /** Owner identifier of the event stream (e.g. platform product id) */
5606
+ ownerId: Scalars['String']['input'];
5607
+ /** Owner namespace of the event stream (e.g. "newsletter-product") */
5608
+ ownerType: Scalars['String']['input'];
5609
+ /** Event payload; wrapped in the signed envelope as `data` */
5610
+ payload: Scalars['JSON']['input'];
5611
+ };
5545
5612
  /** DSAR mode — GDPR Art. 15 (access/export) or Art. 17 (erasure). */
5546
5613
  export declare enum DsarMode {
5547
5614
  Erase = "ERASE",
@@ -5595,6 +5662,15 @@ export type EarnCreditsInput = {
5595
5662
  productId?: InputMaybe<Scalars['String']['input']>;
5596
5663
  sourceReferenceId?: InputMaybe<Scalars['String']['input']>;
5597
5664
  };
5665
+ /** Outcome of serviceReverseEarning. */
5666
+ export declare enum EarningReversalOutcome {
5667
+ /** An earlier call already reversed the entry (idempotent replay). */
5668
+ AlreadyReversed = "ALREADY_REVERSED",
5669
+ /** The entry is RESERVED for, or PAID by, a payout and was left unchanged. */
5670
+ NotReversible = "NOT_REVERSIBLE",
5671
+ /** The entry was AVAILABLE and is now REVERSED. */
5672
+ Reversed = "REVERSED"
5673
+ }
5598
5674
  export declare enum EarningUnitType {
5599
5675
  Credits = "CREDITS",
5600
5676
  Money = "MONEY"
@@ -5620,6 +5696,9 @@ export type EarningsEntry = {
5620
5696
  paidAt?: Maybe<Scalars['DateTime']['output']>;
5621
5697
  payoutRequestId?: Maybe<Scalars['ID']['output']>;
5622
5698
  reservedAt?: Maybe<Scalars['DateTime']['output']>;
5699
+ reversalReason?: Maybe<Scalars['String']['output']>;
5700
+ /** When the entry was reversed (its source sale was refunded), if it was. */
5701
+ reversedAt?: Maybe<Scalars['DateTime']['output']>;
5623
5702
  sourceCategory: EarningsSourceCategory;
5624
5703
  sourceEventId?: Maybe<Scalars['String']['output']>;
5625
5704
  sourceReferenceId?: Maybe<Scalars['String']['output']>;
@@ -5654,13 +5733,18 @@ export declare enum EarningsSourceCategory {
5654
5733
  }
5655
5734
  export type EarningsSummary = {
5656
5735
  __typename?: 'EarningsSummary';
5736
+ /** Earned, past its hold window and not yet reserved for a payout. */
5657
5737
  availableAmount: Scalars['Float']['output'];
5658
5738
  categoryBreakdown: Array<EarningsCategoryBreakdown>;
5659
5739
  creditsAmount: Scalars['Float']['output'];
5660
5740
  moneyAmount: Scalars['Float']['output'];
5661
5741
  paidAmount: Scalars['Float']['output'];
5742
+ /** Earned but still inside its hold window (availableAt in the future), so not payable yet. */
5662
5743
  pendingAmount: Scalars['Float']['output'];
5663
5744
  reservedAmount: Scalars['Float']['output'];
5745
+ /** Entries reversed because their source sale was refunded. Not part of any other total. */
5746
+ reversedAmount: Scalars['Float']['output'];
5747
+ /** Everything earned, excluding reversed entries. */
5664
5748
  totalLifetimeAmount: Scalars['Float']['output'];
5665
5749
  };
5666
5750
  export type EditorialCollection = {
@@ -6079,6 +6163,17 @@ export type ExploreConversation = {
6079
6163
  token: Scalars['String']['output'];
6080
6164
  turnCount: Scalars['Int']['output'];
6081
6165
  };
6166
+ /** What a conversation token reveals about its own conversation, and nothing more. Deliberately a separate type from `ExploreConversation`: that one carries the bearer secret and is only ever handed to the caller that already holds it, while this one is a plain read. It has no token, no IP hash and no stored metadata, and it can never describe a conversation other than the one the caller's token owns. */
6167
+ export type ExploreConversationInfo = {
6168
+ __typename?: 'ExploreConversationInfo';
6169
+ createdAt: Scalars['DateTime']['output'];
6170
+ /** The visitor's language: one of `en` `zh` `hi` `es` `ar` `ta`, or null. Null when none was sent, when it was not one of those, and for a conversation stored before the value was checked — never a raw string. */
6171
+ locale?: Maybe<Scalars['String']['output']>;
6172
+ /** Every message the conversation holds, whatever its status. Compare it with the length of an `exploreConversationMessages` read (which is capped at 100) to know whether that read was the whole thread. */
6173
+ messageCount: Scalars['Int']['output'];
6174
+ /** Slug of the product website the conversation started on, as stored. Null when the visitor did not say. */
6175
+ productSlug?: Maybe<Scalars['String']['output']>;
6176
+ };
6082
6177
  /** A call-to-action button derived from a cited link. `kind` is one of: CONTACT PARTNERS PRICING SERVICES WAITLIST STORE APP DOCS OTHER. */
6083
6178
  export type ExploreCta = {
6084
6179
  __typename?: 'ExploreCta';
@@ -6596,6 +6691,8 @@ export type GetStoreProductTagsInput = {
6596
6691
  export type GrantAppDelegationInternalInput = {
6597
6692
  /** Client ID of the first-party system app (e.g. burdenoff_integration_core). */
6598
6693
  clientId: Scalars['String']['input'];
6694
+ /** When the delegation lapses (BOFF-9962). Must be in the future. Omit for a delegation without an expiry; a re-grant without it keeps no expiry. */
6695
+ expiresAt?: InputMaybe<Scalars['DateTime']['input']>;
6599
6696
  /** Scopes the delegation must keep for other grants that share it (e.g. the user's other integration connections). A retained scope is kept only while the existing delegation is ACTIVE and already holds it, and only while the app still allows it; otherwise it is dropped, never rejected. A grant therefore never restores or adds a scope beyond the requested scopes. */
6600
6697
  retainedScopes?: InputMaybe<Array<Scalars['String']['input']>>;
6601
6698
  /** Workspaces the delegation must keep for other grants that share it. Kept only while the existing delegation is ACTIVE and already covers them: restoring a REVOKED or EXPIRED delegation covers only workspaceIds. Ignored when workspaceIds is empty (unrestricted). */
@@ -6958,6 +7055,8 @@ export type InitiatePaymentResponse = {
6958
7055
  discountType?: Maybe<Scalars['String']['output']>;
6959
7056
  /** Error message if failed */
6960
7057
  error?: Maybe<Scalars['String']['output']>;
7058
+ /** Machine-readable error code when the initiation failed, e.g. PAID_SUBSCRIPTION_REQUIRED when an add-on needs a paid plan (BOFF-9889). */
7059
+ errorCode?: Maybe<Scalars['String']['output']>;
6961
7060
  /** Tax jurisdiction */
6962
7061
  jurisdiction: Scalars['String']['output'];
6963
7062
  /** Razorpay order ID (for Razorpay payments) */
@@ -8213,6 +8312,8 @@ export type Mutation = {
8213
8312
  approveReview: ProductReview;
8214
8313
  approveTranslation: Translation;
8215
8314
  approveWaitlist: NewsletterWaitlist;
8315
+ /** Admin approves a pending template revision: it becomes the live version of the template (the version goes up) and the revision is removed. */
8316
+ approveWorkflowTemplateRevision: WorkflowTemplateSubmission;
8216
8317
  /** Soft archive a billing account. Financial history is preserved and the account is removed from active billing operations. */
8217
8318
  archiveBillingAccount: BillingAccount;
8218
8319
  /** Archive a channel */
@@ -8287,7 +8388,7 @@ export type Mutation = {
8287
8388
  bulkSendCustomEmail: BulkCustomEmailResult;
8288
8389
  /** Send the same free-text message to multiple candidate rounds at once (admin). Each item is processed independently — a round already messaged is skipped unless `force` is set, and one item failing does not abort the rest. */
8289
8390
  bulkSendRoundMessage: BulkSendResult;
8290
- /** Bulk set user's opt-in/out preference for multiple feature flags. RBAC is scoped to the target workspace via `input.workspaceId`. */
8391
+ /** Bulk set the calling user's opt-in/out preference for multiple feature flags. Self-scoped: rows are keyed by the caller's user id and the resolver requires membership of `input.workspaceId`. */
8291
8392
  bulkSetUserFeatureFlagPreferences: Array<UserFeatureFlagPreference>;
8292
8393
  /** Update status for a batch of applications at once (admin) — e.g. marking everyone a bulk email just went to as EMAIL_SENT so a later bulk-send doesn't re-email the same people, then moving them back to whatever status applies once the outcome is decided. One item failing (e.g. a deleted application) does not abort the rest. */
8293
8394
  bulkUpdateApplicationStatus: BulkUpdateApplicationStatusResult;
@@ -8678,6 +8779,8 @@ export type Mutation = {
8678
8779
  /** M2M: delete a ShippingAddress owned by an explicit user, on behalf of a calling service. Returns false when no matching row exists for that user. Service-actor only. */
8679
8780
  deleteUserShippingAddress: Scalars['Boolean']['output'];
8680
8781
  deleteWebhook: Scalars['Boolean']['output'];
8782
+ /** Delete a webhook subscription and its delivery log */
8783
+ deleteWebhookSubscription: Scalars['Boolean']['output'];
8681
8784
  /** Admin delists a published product — removes it from store discovery for new users while preserving access for anyone who already installed it. */
8682
8785
  delistProduct: StoreProduct;
8683
8786
  /** Deliver the same notification to multiple recipients in bulk. More efficient than multiple single calls for broadcast scenarios. */
@@ -8700,6 +8803,8 @@ export type Mutation = {
8700
8803
  discardDLQEntry: Scalars['Boolean']['output'];
8701
8804
  /** Dismiss a tour for a user (with option to dismiss permanently) */
8702
8805
  dismissTour: TourUserProgress;
8806
+ /** Dispatch an event to every matching webhook subscription of an owner. M2M only — service / super_admin actors; called by the owning service over the internal gateway. Delivery is HMAC-SHA256 signed with retry/backoff and idempotent per caller-supplied eventId. */
8807
+ dispatchWebhookEvent: WebhookDispatchSummary;
8703
8808
  duplicateNewsletter: Newsletter;
8704
8809
  /** Duplicate a tour with all its steps */
8705
8810
  duplicateTour: Tour;
@@ -8772,7 +8877,15 @@ export type Mutation = {
8772
8877
  /** Generate challenge message for wallet signature */
8773
8878
  generateWalletChallenge: WalletChallengeResult;
8774
8879
  getSupportAttachmentPartUploadUrls: Array<SupportAttachmentPresignedPart>;
8775
- /** Service-trusted internal grant of a first-party self-delegation, keyed by the app's client id. Lets a trusted backend record the consent created when a user adds a first-party integration, without the workspace-admin gate that the public grantDelegation enforces. Gated to internal service / super_admin callers and restricted to first-party system apps. */
8880
+ /** Discard a reply draft without sending it. */
8881
+ globalDiscardTicketReplyDraft: Scalars['Boolean']['output'];
8882
+ /** Draft a reply from published knowledge-base articles, FAQs and canned responses, with citations. Saved as an internal draft, never sent. Fails with GROUNDING_INSUFFICIENT when no article or FAQ covers the ticket. */
8883
+ globalDraftTicketReply: SupportMessage;
8884
+ /** Send a reply draft to the customer as an agent reply, optionally edited. This is the only way a draft reaches a customer. */
8885
+ globalSendTicketReplyDraft: SupportMessage;
8886
+ /** Triage a ticket now: fill an empty category, raise the priority if the evidence calls for it, select the SLA policy and suggest an agent. */
8887
+ globalTriageTicket: SupportTriageDecision;
8888
+ /** Service-trusted internal grant of a first-party self-delegation, keyed by the app's client id. Lets a trusted backend record the consent created when a user adds a first-party integration, without the workspace-admin gate that the public grantDelegation enforces. Gated to internal service / super_admin callers and restricted to first-party system apps, or to service-managed apps for their managing service (BOFF-9962). */
8776
8889
  grantAppDelegationInternal: AppUserDelegation;
8777
8890
  /** Grant an app access to act on a specific workspace. Idempotent: re-granting an ACTIVE authorization updates its scopes; re-granting a REVOKED one flips it back to ACTIVE and clears the revoke fields. */
8778
8891
  grantAppWorkspaceAccess: AppWorkspaceAuthorization;
@@ -8808,7 +8921,7 @@ export type Mutation = {
8808
8921
  inviteDeveloperOrgMember: DeveloperOrgInvitationCreated;
8809
8922
  /** Invite a user to an organization by email */
8810
8923
  inviteOrganizationMember: OrganizationInvite;
8811
- /** Service-trusted internal mint of an app-as-user token for a named first-party app. Lets a trusted backend (e.g. wspace-integrations-svc) mint a token for a secret-less system app without holding client credentials. Gated to internal service / super_admin callers; still requires an ACTIVE AppUserDelegation for (clientId, targetUserId), so a user must have granted access first. */
8924
+ /** Service-trusted internal mint of an app-as-user token for a named first-party app. Lets a trusted backend (e.g. wspace-integrations-svc) mint a token for a secret-less system app without holding client credentials. Gated to internal service / super_admin callers; still requires an ACTIVE AppUserDelegation for (clientId, targetUserId), so a user must have granted access first. A service-managed app (BOFF-9962) is minted only by its managing service, always bound to one workspace, for at most 15 minutes and never past the grant. */
8812
8925
  issueAppAsUserTokenInternal: AppAsUserTokenResponse;
8813
8926
  /** Public endpoint — no authentication required. Email is normalized (trimmed, lowercased). Must be protected by API gateway rate limiting (recommended: 5 req/min per IP). */
8814
8927
  joinWaitlist: NewsletterWaitlist;
@@ -8876,6 +8989,8 @@ export type Mutation = {
8876
8989
  provisionDedicatedTenant: Tenant;
8877
8990
  /** Provision Free-tier WORKSPACE-scoped quota assignments for a specific workspace (BOFF-5656). Service-to-service only — called by wspace-layer services' workspace.created event consumers (Redis Streams do not cross the wspace/global layer network boundary, so the wspace-side consumer calls this mutation cross-layer instead of billing consuming the event directly). Reuses the org's existing (or lazily-created) default billing account and every active Free ($0, isActive) subscription on it. Idempotent — safe to call repeatedly for the same workspace. Never creates a Plan/Subscription for a product with no registered Free plan; such products are silently skipped, not errored. */
8878
8991
  provisionFreeTierForWorkspace: ProvisionFreeTierForWorkspaceResult;
8992
+ /** Provision a service-managed app (BOFF-9962): an app a backend service owns for a principal of its own, such as a FluidGrids agent. The calling service becomes the app's manager and owner. The app has no usable client secret, so the only way to act as it is issueAppAsUserTokenInternal, by its managing service, for a user who granted it a delegation. Service actors only. */
8993
+ provisionManagedAppInternal: App;
8879
8994
  /** Public unsubscribe via HMAC-signed token from email link. No authentication required. */
8880
8995
  publicUnsubscribeByToken: Scalars['Boolean']['output'];
8881
8996
  publishApplication: Application;
@@ -8958,6 +9073,8 @@ export type Mutation = {
8958
9073
  registerSupportAttachmentPart: Scalars['Boolean']['output'];
8959
9074
  /** Creates or updates subject mappings for a product. Idempotent: a product's service can call it on every deploy. An existing mapping can only be changed by the actor that registered it, or by a super admin. */
8960
9075
  registerWebhookEventSubjects: Array<WebhookEventSubject>;
9076
+ /** Register an outbound webhook endpoint for an owner */
9077
+ registerWebhookSubscription: WebhookSubscription;
8961
9078
  reinstatePublisher: Publisher;
8962
9079
  rejectApplication: Application;
8963
9080
  /** Platform admin only: reject a pending_review version with a reason. The developer can fix their submission and re-submit. */
@@ -8973,6 +9090,8 @@ export type Mutation = {
8973
9090
  rejectPublisher: Publisher;
8974
9091
  rejectReview: ProductReview;
8975
9092
  rejectWaitlist: NewsletterWaitlist;
9093
+ /** Admin rejects a pending template revision with a reason the author sees. The live version stays listed unchanged. */
9094
+ rejectWorkflowTemplateRevision: WorkflowTemplateRevision;
8976
9095
  releaseLegalHold: LegalHold;
8977
9096
  releaseSuppression: SuppressionEntry;
8978
9097
  removeAgentSkills: AgentProfile;
@@ -9012,7 +9131,7 @@ export type Mutation = {
9012
9131
  /** Revoke a previously-granted tenant-member row. Idempotent on the missing row (returns false). Cascade-removing the user's existing org/workspace memberships under the tenant is NOT performed here — those rows survive and would need to be removed separately if the intent is full ejection. (BOFF-2652) */
9013
9132
  removeTenantMember: Scalars['Boolean']['output'];
9014
9133
  removeTicketTags: SupportTicket;
9015
- /** Remove user's preference for a feature flag (reverts to default). RBAC is scoped to the target workspace. */
9134
+ /** Remove the calling user's preference for a feature flag (reverts to default). Self-scoped: the row is keyed by the caller's user id and the resolver requires membership of `workspaceId`. */
9016
9135
  removeUserFeatureFlagPreference: Scalars['Boolean']['output'];
9017
9136
  /** Remove a visibility rule */
9018
9137
  removeVisibilityRule: Scalars['Boolean']['output'];
@@ -9109,6 +9228,8 @@ export type Mutation = {
9109
9228
  resumeDeveloperOrgSubscription: DeveloperOrgSubscription;
9110
9229
  resumeSLA: SupportTicket;
9111
9230
  resumeScheduledJob: ScheduledJob;
9231
+ /** Retire a service-managed app (BOFF-9962): mark it REVOKED and withdraw every delegation it holds. Only its managing service may call it. Idempotent: returns false when the app was already retired. */
9232
+ retireManagedAppInternal: Scalars['Boolean']['output'];
9112
9233
  /** Retire one push registration the transport has reported permanently dead. Called by global-channel-svc after a send fails with a code that means the token itself is gone: FCM's `UNREGISTERED`, or an `INVALID_ARGUMENT` whose message names the registration token. Without it the registry accumulates tokens no push can ever reach, and every later fan-out keeps paying for uninstalled apps. Keyed on the token — that is what the transport rejected, it is unique in this registry, and a service acting on a transport report has no calling actor to scope by. That is precisely why this is service-gated rather than `scopeType: "self"`. `errorCode` is recorded for traceability; the delivery side owns the policy of which codes are terminal (a routing or credential fault must never retire a device — retiring one hides the misconfiguration and destroys the evidence). Returns true if a registration was removed. */
9113
9234
  retirePushDeviceInternal: Scalars['Boolean']['output'];
9114
9235
  retireSubprocessor: Subprocessor;
@@ -9178,7 +9299,7 @@ export type Mutation = {
9178
9299
  seedAtheleteBridgeUserTours: SeedAtheleteBridgeUserToursResult;
9179
9300
  /** Overwrite the service-owned BigConsole onboarding tours. Repeated calls update the same slugs. */
9180
9301
  seedBigconsoleUserTours: SeedBigconsoleUserToursResult;
9181
- /** Overwrite the built-in Buildmyiq user-facing dashboard tour from the service-owned seed file. */
9302
+ /** Overwrite the built-in Buildmyiq user-facing tours (dashboard with the getting-started checklist, authoring, and my learning) from the service-owned seed file. */
9182
9303
  seedBuildmyiqUserTours: SeedBuildmyiqUserToursResult;
9183
9304
  /** Overwrite the built-in CollabKin user-facing dashboard tour from the service-owned seed file. */
9184
9305
  seedCollabkinUserTours: SeedCollabkinUserToursResult;
@@ -9190,8 +9311,12 @@ export type Mutation = {
9190
9311
  seedDefaultShortcuts: Scalars['Int']['output'];
9191
9312
  /** Overwrite the built-in FluidGrids user-facing workflow-builder tour from the service-owned seed file. */
9192
9313
  seedFluidgridsUserTours: SeedFluidgridsUserToursResult;
9314
+ /** Overwrite the built-in HookMovies user-facing tours (overview with the getting-started checklist, catalog, productions and auditions) from the service-owned seed file. */
9315
+ seedHookmoviesUserTours: SeedHookmoviesUserToursResult;
9193
9316
  /** Overwrite the built-in IntelWatchtower user-facing tours for the intelligence workflow. */
9194
9317
  seedIntelWatchtowerUserTours: SeedIntelWatchtowerUserToursResult;
9318
+ /** Overwrite the built-in SemanticFed user-facing tours (first-login getting started, empty workspace, query console and policies) from the service-owned seed file. */
9319
+ seedSemanticFedUserTours: SeedSemanticFedUserToursResult;
9195
9320
  /** Overwrite the built-in TheCulturePost user-facing tours from the service-owned seed file. */
9196
9321
  seedTheCulturePostUserTours: SeedTheCulturePostUserToursResult;
9197
9322
  /** Overwrite the built-in VibeControls user-facing tours for Support, Notifications, and Conversations from the service-owned seed file. */
@@ -9214,10 +9339,14 @@ export type Mutation = {
9214
9339
  sendTestNewsletter: TestNewsletterResult;
9215
9340
  /** Record an EarningsEntry on behalf of an org/user by explicit billingAccountId. Service/super_admin only — internal gateway. */
9216
9341
  serviceRecordEarning: EarningsEntry;
9342
+ /** Refund all or part of a payment on behalf of the service that charged it. Idempotent per sourceIdempotencyKey. Service/super_admin only. */
9343
+ serviceRefundPayment: ServiceRefundPaymentResult;
9217
9344
  /** Request a payout drawn from a user's AVAILABLE earnings on an explicit billing account. Reserves matching earnings and creates a PayoutRequest that the existing approval/processing workflow drives to completion. Service/super_admin only — internal gateway. */
9218
9345
  serviceRequestPayout: PayoutRequest;
9219
9346
  /** Resolve (or create) a canonical default PayoutAccount for a publisher/org owner so a service caller can obtain a `payoutAccountId` for `serviceRequestPayout` without the user-only `addPayoutAccount` path. Idempotent / self-healing: repeated calls return the SAME account (no duplicates). Prefers an existing user-registered account; otherwise creates a placeholder that can be referenced but against which NO money moves until the user completes real payment setup. Service/super_admin only — internal gateway. */
9220
9347
  serviceResolvePayoutAccount: PayoutAccount;
9348
+ /** Reverse an earnings entry (by the source key it was recorded with) whose source sale was refunded. Only an AVAILABLE entry (not reserved for, or paid by, a payout) is reversed; the outcome says what happened. Idempotent. Service/super_admin only — internal gateway. */
9349
+ serviceReverseEarning: ServiceEarningReversal;
9221
9350
  /** Mirror a billing PayoutRequest status change back onto the DeveloperOrgPayout it originated from (BOFF-7192). Billing owns the payout system-of-record and is where admins approve/reject/mark-paid; this keeps devportal's own payout history in sync so it doesn't stay stuck showing a stale status forever. Looked up by sourceIdempotencyKey ("devportal:payout:<id>", set when the request was originally mirrored to billing) — a no-op if the key isn't a devportal-originated one, or no matching local payout exists. Service/super_admin only — internal gateway. */
9222
9351
  serviceSyncPayoutStatus?: Maybe<DeveloperOrgPayout>;
9223
9352
  /** M2M: create or update the calling service's catalogue listing for an item that service sells through its own checkout (BOFF-3430), for cross-product discovery. Idempotent on (calling service identity, input.externalId): call it on every change of the source item. The owning service is always the verified service identity of the caller, never an input field. Set status ARCHIVED to take the listing down. A listing an admin has delisted or rejected stays off display until an admin restores it. Service-actor only. */
@@ -9246,7 +9375,7 @@ export type Mutation = {
9246
9375
  setStoreOrderShipping: StoreOrder;
9247
9376
  /** Set or update the endpoint URL for a DEDICATED tenant. Transitions PROVISIONING → ACTIVE when endpoint is set. */
9248
9377
  setTenantEndpoint: Tenant;
9249
- /** Set user's opt-in/out preference for a previewable feature flag. RBAC is scoped to the target workspace via `input.workspaceId`. */
9378
+ /** Set the calling user's opt-in/out preference for a previewable feature flag. Self-scoped: the row is keyed by the caller's user id and the resolver requires membership of `input.workspaceId`. */
9250
9379
  setUserFeatureFlagPreference: UserFeatureFlagPreference;
9251
9380
  setUserLanguagePreference: UserLanguagePreference;
9252
9381
  /** Set workspace-level override for a feature flag (super admin or workspace admin). RBAC is scoped to the target workspace via `input.workspaceId`. */
@@ -9289,6 +9418,8 @@ export type Mutation = {
9289
9418
  submitProduct: StoreProduct;
9290
9419
  submitPublisherVerification: Publisher;
9291
9420
  submitSatisfactionSurvey: CustomerSatisfactionSurvey;
9421
+ /** Publish a workflow as a community template (or resubmit one of yours after a rejection). The template is reviewed by a store admin before it is listed. */
9422
+ submitWorkflowTemplate: WorkflowTemplateSubmission;
9292
9423
  /** Public endpoint — no authentication required for website newsletter signup. Email is normalized (trimmed, lowercased) and validated in the provider. Protected by rate limiting (5 req/min per IP) and optional reCAPTCHA at the resolver. */
9293
9424
  subscribe: NewsletterSubscriber;
9294
9425
  subscribeToStore: UserStoreSubscription;
@@ -9326,6 +9457,8 @@ export type Mutation = {
9326
9457
  /** Test RADIUS connection */
9327
9458
  testRADIUSConnection: Scalars['Boolean']['output'];
9328
9459
  testWebhook: WebhookTestResult;
9460
+ /** Send a synthetic test event to a webhook subscription and report the result */
9461
+ testWebhookSubscription: WebhookDispatchResult;
9329
9462
  toggleAddOn: Scalars['Boolean']['output'];
9330
9463
  /** Toggle the featured state of a store product (admin) */
9331
9464
  toggleFeatured: Scalars['Boolean']['output'];
@@ -9494,8 +9627,6 @@ export type Mutation = {
9494
9627
  updatePromotion: Promotion;
9495
9628
  updatePublisher: Publisher;
9496
9629
  updateQuota: Scalars['Boolean']['output'];
9497
- /** Update RBAC configuration for a scope */
9498
- updateRbacConfig: RbacConfig;
9499
9630
  updateRecurringBillingPlan: RecurringBillingPlan;
9500
9631
  /** Update a registered resource */
9501
9632
  updateResource: Resource;
@@ -9546,6 +9677,8 @@ export type Mutation = {
9546
9677
  updateUserPlatformConnectionNotifications: UserPlatformConnection;
9547
9678
  updateVariantStats: NewsletterVariant;
9548
9679
  updateWebhook: Webhook;
9680
+ /** Update a webhook subscription (URL, secret, events, enabled, description) */
9681
+ updateWebhookSubscription: WebhookSubscription;
9549
9682
  /** Update an existing workspace */
9550
9683
  updateWorkspace: Workspace;
9551
9684
  /** Update a workspace member's role */
@@ -9592,6 +9725,10 @@ export type Mutation = {
9592
9725
  /** Vote on a review (helpful/not helpful) */
9593
9726
  voteOnAppReview: AppReviewVote;
9594
9727
  withdrawConsent: ConsentRecord;
9728
+ /** Withdraw the pending (or rejected) new version of one of your published templates. The live version is not affected. Takes the template's product id. */
9729
+ withdrawWorkflowTemplateRevision: WorkflowTemplateSubmission;
9730
+ /** Withdraw one of your templates. A published template is taken off the store first; anything not live is deleted. */
9731
+ withdrawWorkflowTemplateSubmission: WithdrawWorkflowTemplateSubmissionResult;
9595
9732
  };
9596
9733
  /** Root mutation type */
9597
9734
  export type MutationAcceptDeveloperOrgInvitationArgs = {
@@ -9818,6 +9955,11 @@ export type MutationApproveWaitlistArgs = {
9818
9955
  input: ApproveWaitlistInput;
9819
9956
  };
9820
9957
  /** Root mutation type */
9958
+ export type MutationApproveWorkflowTemplateRevisionArgs = {
9959
+ id: Scalars['ID']['input'];
9960
+ notes?: InputMaybe<Scalars['String']['input']>;
9961
+ };
9962
+ /** Root mutation type */
9821
9963
  export type MutationArchiveBillingAccountArgs = {
9822
9964
  id: Scalars['ID']['input'];
9823
9965
  reason?: InputMaybe<Scalars['String']['input']>;
@@ -11103,6 +11245,10 @@ export type MutationDeleteWebhookArgs = {
11103
11245
  id: Scalars['ID']['input'];
11104
11246
  };
11105
11247
  /** Root mutation type */
11248
+ export type MutationDeleteWebhookSubscriptionArgs = {
11249
+ id: Scalars['ID']['input'];
11250
+ };
11251
+ /** Root mutation type */
11106
11252
  export type MutationDelistProductArgs = {
11107
11253
  id: Scalars['ID']['input'];
11108
11254
  reason?: InputMaybe<Scalars['String']['input']>;
@@ -11162,6 +11308,10 @@ export type MutationDismissTourArgs = {
11162
11308
  userId: Scalars['ID']['input'];
11163
11309
  };
11164
11310
  /** Root mutation type */
11311
+ export type MutationDispatchWebhookEventArgs = {
11312
+ input: DispatchWebhookEventInput;
11313
+ };
11314
+ /** Root mutation type */
11165
11315
  export type MutationDuplicateNewsletterArgs = {
11166
11316
  id: Scalars['ID']['input'];
11167
11317
  newSlug: Scalars['String']['input'];
@@ -11372,6 +11522,23 @@ export type MutationGetSupportAttachmentPartUploadUrlsArgs = {
11372
11522
  ticketId: Scalars['ID']['input'];
11373
11523
  };
11374
11524
  /** Root mutation type */
11525
+ export type MutationGlobalDiscardTicketReplyDraftArgs = {
11526
+ id: Scalars['ID']['input'];
11527
+ };
11528
+ /** Root mutation type */
11529
+ export type MutationGlobalDraftTicketReplyArgs = {
11530
+ ticketId: Scalars['ID']['input'];
11531
+ };
11532
+ /** Root mutation type */
11533
+ export type MutationGlobalSendTicketReplyDraftArgs = {
11534
+ id: Scalars['ID']['input'];
11535
+ message?: InputMaybe<Scalars['String']['input']>;
11536
+ };
11537
+ /** Root mutation type */
11538
+ export type MutationGlobalTriageTicketArgs = {
11539
+ id: Scalars['ID']['input'];
11540
+ };
11541
+ /** Root mutation type */
11375
11542
  export type MutationGrantAppDelegationInternalArgs = {
11376
11543
  input: GrantAppDelegationInternalInput;
11377
11544
  };
@@ -11640,6 +11807,10 @@ export type MutationProvisionFreeTierForWorkspaceArgs = {
11640
11807
  workspaceId: Scalars['ID']['input'];
11641
11808
  };
11642
11809
  /** Root mutation type */
11810
+ export type MutationProvisionManagedAppInternalArgs = {
11811
+ input: ProvisionManagedAppInternalInput;
11812
+ };
11813
+ /** Root mutation type */
11643
11814
  export type MutationPublicUnsubscribeByTokenArgs = {
11644
11815
  token: Scalars['String']['input'];
11645
11816
  };
@@ -11883,6 +12054,10 @@ export type MutationRegisterWebhookEventSubjectsArgs = {
11883
12054
  input: RegisterWebhookEventSubjectsInput;
11884
12055
  };
11885
12056
  /** Root mutation type */
12057
+ export type MutationRegisterWebhookSubscriptionArgs = {
12058
+ input: RegisterWebhookSubscriptionInput;
12059
+ };
12060
+ /** Root mutation type */
11886
12061
  export type MutationReinstatePublisherArgs = {
11887
12062
  id: Scalars['ID']['input'];
11888
12063
  };
@@ -11934,6 +12109,11 @@ export type MutationRejectWaitlistArgs = {
11934
12109
  input: RejectWaitlistInput;
11935
12110
  };
11936
12111
  /** Root mutation type */
12112
+ export type MutationRejectWorkflowTemplateRevisionArgs = {
12113
+ id: Scalars['ID']['input'];
12114
+ reason: Scalars['String']['input'];
12115
+ };
12116
+ /** Root mutation type */
11937
12117
  export type MutationReleaseLegalHoldArgs = {
11938
12118
  id: Scalars['ID']['input'];
11939
12119
  };
@@ -12304,6 +12484,11 @@ export type MutationResumeScheduledJobArgs = {
12304
12484
  id: Scalars['ID']['input'];
12305
12485
  };
12306
12486
  /** Root mutation type */
12487
+ export type MutationRetireManagedAppInternalArgs = {
12488
+ clientId: Scalars['String']['input'];
12489
+ reason?: InputMaybe<Scalars['String']['input']>;
12490
+ };
12491
+ /** Root mutation type */
12307
12492
  export type MutationRetirePushDeviceInternalArgs = {
12308
12493
  errorCode: Scalars['String']['input'];
12309
12494
  token: Scalars['String']['input'];
@@ -12536,6 +12721,10 @@ export type MutationServiceRecordEarningArgs = {
12536
12721
  input: ServiceRecordEarningInput;
12537
12722
  };
12538
12723
  /** Root mutation type */
12724
+ export type MutationServiceRefundPaymentArgs = {
12725
+ input: ServiceRefundPaymentInput;
12726
+ };
12727
+ /** Root mutation type */
12539
12728
  export type MutationServiceRequestPayoutArgs = {
12540
12729
  input: ServiceRequestPayoutInput;
12541
12730
  };
@@ -12544,6 +12733,10 @@ export type MutationServiceResolvePayoutAccountArgs = {
12544
12733
  input: ServiceResolvePayoutAccountInput;
12545
12734
  };
12546
12735
  /** Root mutation type */
12736
+ export type MutationServiceReverseEarningArgs = {
12737
+ input: ServiceReverseEarningInput;
12738
+ };
12739
+ /** Root mutation type */
12547
12740
  export type MutationServiceSyncPayoutStatusArgs = {
12548
12741
  input: ServiceSyncPayoutStatusInput;
12549
12742
  };
@@ -12729,6 +12922,10 @@ export type MutationSubmitSatisfactionSurveyArgs = {
12729
12922
  input: SubmitSatisfactionSurveyInput;
12730
12923
  };
12731
12924
  /** Root mutation type */
12925
+ export type MutationSubmitWorkflowTemplateArgs = {
12926
+ input: SubmitWorkflowTemplateInput;
12927
+ };
12928
+ /** Root mutation type */
12732
12929
  export type MutationSubscribeArgs = {
12733
12930
  input: SubscribeInput;
12734
12931
  };
@@ -12825,6 +13022,10 @@ export type MutationTestWebhookArgs = {
12825
13022
  id: Scalars['ID']['input'];
12826
13023
  };
12827
13024
  /** Root mutation type */
13025
+ export type MutationTestWebhookSubscriptionArgs = {
13026
+ id: Scalars['ID']['input'];
13027
+ };
13028
+ /** Root mutation type */
12828
13029
  export type MutationToggleAddOnArgs = {
12829
13030
  id: Scalars['ID']['input'];
12830
13031
  status: Scalars['Boolean']['input'];
@@ -13337,10 +13538,6 @@ export type MutationUpdateQuotaArgs = {
13337
13538
  input: UpdateQuotaInput;
13338
13539
  };
13339
13540
  /** Root mutation type */
13340
- export type MutationUpdateRbacConfigArgs = {
13341
- input: UpdateRbacConfigInput;
13342
- };
13343
- /** Root mutation type */
13344
13541
  export type MutationUpdateRecurringBillingPlanArgs = {
13345
13542
  input: UpdateRecurringBillingInput;
13346
13543
  };
@@ -13532,6 +13729,11 @@ export type MutationUpdateWebhookArgs = {
13532
13729
  input: UpdateWebhookInput;
13533
13730
  };
13534
13731
  /** Root mutation type */
13732
+ export type MutationUpdateWebhookSubscriptionArgs = {
13733
+ id: Scalars['ID']['input'];
13734
+ input: UpdateWebhookSubscriptionInput;
13735
+ };
13736
+ /** Root mutation type */
13535
13737
  export type MutationUpdateWorkspaceArgs = {
13536
13738
  id: Scalars['ID']['input'];
13537
13739
  input: UpdateWorkspaceInput;
@@ -13666,6 +13868,14 @@ export type MutationVoteOnAppReviewArgs = {
13666
13868
  export type MutationWithdrawConsentArgs = {
13667
13869
  input: WithdrawConsentInput;
13668
13870
  };
13871
+ /** Root mutation type */
13872
+ export type MutationWithdrawWorkflowTemplateRevisionArgs = {
13873
+ productId: Scalars['ID']['input'];
13874
+ };
13875
+ /** Root mutation type */
13876
+ export type MutationWithdrawWorkflowTemplateSubmissionArgs = {
13877
+ id: Scalars['ID']['input'];
13878
+ };
13669
13879
  /** Filter inputs for `myContactInquiries`. Search and email-filter are deliberately not exposed — the query is already scoped to the caller's email, so a full-text search across `name`/`subject` would only surface inquiries the caller already owns. */
13670
13880
  export type MyContactInquiryFilterInput = {
13671
13881
  /** Filter by inquiry category (exact match against the stored string). */
@@ -15790,6 +16000,8 @@ export type ProductContentPage = {
15790
16000
  content: Scalars['String']['output'];
15791
16001
  contentFormat: Scalars['String']['output'];
15792
16002
  createdAt: Scalars['DateTime']['output'];
16003
+ /** The customer's written approval of a case study and its numbers. A page tagged "case-study" is returned by the public content-page queries only when this is set. Null for every other page and for unapproved case studies. */
16004
+ customerSignOff?: Maybe<CustomerSignOff>;
15793
16005
  /** Blog/article fields */
15794
16006
  excerpt?: Maybe<Scalars['String']['output']>;
15795
16007
  featured: Scalars['Boolean']['output'];
@@ -16126,6 +16338,19 @@ export type ProvisionFreeTierForWorkspaceResult = {
16126
16338
  hasBillingAccount: Scalars['Boolean']['output'];
16127
16339
  /** Product IDs the assigned quotas belong to. */
16128
16340
  productIds: Array<Scalars['String']['output']>;
16341
+ /** Free-plan product IDs this workspace received no quotas from because every active free subscription for that product is already activated on plan.maxWorkspaces other workspaces of the org. Empty when nothing was capped. A non-empty list explains an assignedQuotas of 0: activate a plan with spare workspace capacity (activateSubscriptionForWorkspace) or upgrade the plan. */
16342
+ skippedAtCapProductIds: Array<Scalars['String']['output']>;
16343
+ };
16344
+ /** Input for a service-managed app (BOFF-9962). */
16345
+ export type ProvisionManagedAppInternalInput = {
16346
+ description?: InputMaybe<Scalars['String']['input']>;
16347
+ /** Display name, 1 to 200 characters. */
16348
+ name: Scalars['String']['input'];
16349
+ /** Scopes a delegation to the app may carry; at least one. */
16350
+ scopes: Array<Scalars['String']['input']>;
16351
+ tenantId?: InputMaybe<Scalars['String']['input']>;
16352
+ /** BOT (default), ASSISTANT, AUTOMATION or WORKFLOW. */
16353
+ type?: InputMaybe<AppType>;
16129
16354
  };
16130
16355
  /** Response for createUserTenantStructure mutation */
16131
16356
  export declare enum ProvisioningStatus {
@@ -16349,6 +16574,8 @@ export type Query = {
16349
16574
  actorRoleAssignments: Array<ActorRoleAssignment>;
16350
16575
  /** List actors with RBAC context in a scope */
16351
16576
  actors: Array<ActorRbacSummary>;
16577
+ /** Whether the caller's organization can buy each add-on (BOFF-9889: add-ons require a paid subscription to their product unless flagged otherwise). With billingAccountId, only that billing account is checked (it must belong to the caller's organization) and subscriptionId, when given, must be one of its paid subscriptions of the add-on's product. Without it, every active billing account of the organization counts. Organization-scoped like getAllAddOns. */
16578
+ addonPurchaseEligibility: Array<AddonPurchaseEligibility>;
16352
16579
  adminAffiliateAnalytics: AffiliateAdminAnalytics;
16353
16580
  adminPayoutRequests: PayoutRequestConnection;
16354
16581
  adminPayoutSummary: PayoutAdminSummary;
@@ -16413,7 +16640,7 @@ export type Query = {
16413
16640
  automationSubscribers: Array<AutomationSubscriber>;
16414
16641
  availableAgents: Array<AgentProfile>;
16415
16642
  availableAuthMethods: Array<AuthMethod>;
16416
- /** Get available preview features the user can opt-in to within a workspace. Returns only flags that are previewable, active, and allowed by workspace admin. When `productSlug` is provided (each product app shell passes its own slug), the result is scoped to that product's previewable flags PLUS platform-wide previewable flags — so a product's Feature Previews page never surfaces other products' flags. Omit `productSlug` to get every available preview. Bounded by limit/offset to avoid unbounded fetches. */
16643
+ /** Get available preview features the user can opt-in to within a workspace. Returns only flags that are previewable, active, and allowed by workspace admin. When `productSlug` is provided (each product app shell passes its own slug), the result is scoped to that product's previewable flags PLUS platform-wide previewable flags — so a product's Feature Previews page never surfaces other products' flags. Omit `productSlug` to get every available preview. Self-scoped: every workspace member loads this, so the gateway only requires an authenticated actor and the resolver requires membership of `workspaceId`. Bounded by limit/offset to avoid unbounded fetches. */
16417
16644
  availableFeaturePreviews: Array<FeatureFlag>;
16418
16645
  /** Signed (DESIGN 3.7). The workspace's balance, in the person's view when actorId is given. */
16419
16646
  avatarMinutesForService: AvatarMinutesBalance;
@@ -16549,7 +16776,7 @@ export type Query = {
16549
16776
  estimateNewsletterRecipients: NewsletterRecipientEstimate;
16550
16777
  /** Estimate shipping for an order with a specific method */
16551
16778
  estimateOrderShipping: OrderShippingEstimate;
16552
- /** Evaluate feature flags for the current actor in a workspace context. Used by frontend providers for bulk flag evaluation. Returns OpenFeature-compatible ResolutionDetails for each flag. RBAC is scoped to the target workspace via `input.workspaceId`. */
16779
+ /** Evaluate feature flags for the current actor in a workspace context. Used by frontend providers for bulk flag evaluation. Returns OpenFeature-compatible ResolutionDetails for each flag. Self-scoped: every page evaluates flags, so the gateway only requires an authenticated actor and the resolver requires membership of `input.workspaceId`. */
16553
16780
  evaluateFeatureFlags: FeatureFlagBulkEvaluation;
16554
16781
  /** One conversation with its full transcript, references, CTAs and clicks. Superadmin only. */
16555
16782
  exploreAdminConversation?: Maybe<ExploreAdminConversation>;
@@ -16563,6 +16790,8 @@ export type Query = {
16563
16790
  exploreAgentJob?: Maybe<ExploreAgentJob>;
16564
16791
  /** Products, example prompts, welcome copy and limits for the `/explore` page. Never throws — an unreachable agent yields `enabled: false`. */
16565
16792
  exploreCatalog: ExploreCatalog;
16793
+ /** Product site, language and size of the conversation the token owns. Scoped exactly like `exploreConversationMessages`: a token that owns nothing, or that owns a different conversation, is reported as NOT_FOUND, never FORBIDDEN. */
16794
+ exploreConversationInfo: ExploreConversationInfo;
16566
16795
  /** The conversation's messages, oldest first. */
16567
16796
  exploreConversationMessages: Array<ExploreMessage>;
16568
16797
  /** Poll one message. Scoped by `conversationToken`; a token that does not own the message is reported as NOT_FOUND, never FORBIDDEN. */
@@ -16598,6 +16827,7 @@ export type Query = {
16598
16827
  /** Browse the plan catalog (e.g. the upgrade-subscription flow). Self-scoped — any authenticated actor may read it; the catalog itself isn't actor-owned data, so there's nothing further to scope. Previously scopeType "global", which no regular user role is ever assigned at (only Authenticated User — billing:NONE — and Platform Superadmin hold a global-scoped role), so this field was unreachable for every non-superadmin user (BOFF-6512). */
16599
16828
  getAllPlans: Array<Plan>;
16600
16829
  getAllQuotas: Array<Quota>;
16830
+ /** List account quotas. Date bounds are inclusive on assignment createdAt; amount bounds are inclusive on activity-backed currentUsageSum, before pagination. Status uses remaining limits (WARNING >=75%, CRITICAL >=90%, EXHAUSTED <=0); expired assignments are INACTIVE and non-numeric unlimited quotas are HEALTHY. Both number and legacy numeric limit types are finite. Percentage thresholds use originalValue; when absent, the remaining value is the fallback baseline. Empty status lists apply no status filter. Pages are capped at 100 rows. Amount-filtered requests fail explicitly above 1000 usage lookups; narrow searchQuery or createdAt bounds rather than relying on partial counts. Derived-filter scans also fail above 10000 assignments, without partial counts. */
16601
16831
  getAllQuotasAssignment: PaginatedQuotaAssignments;
16602
16832
  getAllQuotasOfSub: Array<QuotaAssignment>;
16603
16833
  getAllRecurringBillingPlans: Array<RecurringBillingPlan>;
@@ -16732,7 +16962,7 @@ export type Query = {
16732
16962
  getPromotion?: Maybe<Promotion>;
16733
16963
  /** Get usage analytics for a specific quota assignment */
16734
16964
  getQuotaAnalytics: QuotaUsageAnalytics;
16735
- /** Enhanced quota assignment query with analytics, pagination and filtering */
16965
+ /** The same status, inclusive createdAt and currentUsageSum filters as getAllQuotasAssignment, with analytics for the filtered page. */
16736
16966
  getQuotaAssignmentsWithAnalytics: PaginatedQuotaAssignmentsWithAnalytics;
16737
16967
  getQuotaUsageAndLimit: QuotaUsageAndLimit;
16738
16968
  getQuotaUsageDetails?: Maybe<PaginatedUsages>;
@@ -16783,6 +17013,8 @@ export type Query = {
16783
17013
  getWebhookEvent?: Maybe<WebhookEvent>;
16784
17014
  /** Get webhook statistics for a channel */
16785
17015
  getWebhookStats: WebhookStats;
17016
+ /** Measure the triage engine against historical human categorisation. Support admins see their tenant; super admins see every tenant. Read-only. */
17017
+ globalTriageEvaluation: SupportTriageEvaluation;
16786
17018
  /** Health check endpoint */
16787
17019
  health: HealthStatus;
16788
17020
  /** Get grouped products for homepage. Optionally filter by compatible product (e.g., "bigconsole", "fluidgrids"). */
@@ -16865,6 +17097,8 @@ export type Query = {
16865
17097
  listUserShippingAddresses: Array<ShippingAddress>;
16866
17098
  lookupAffiliateCode?: Maybe<AffiliateCodeLookup>;
16867
17099
  lowStockProducts: Array<LowStockProduct>;
17100
+ /** ACTIVE delegations of a service-managed app (BOFF-9962). Only the service that provisioned the app may list them; any other caller gets NOT_FOUND. */
17101
+ managedAppDelegationsInternal: Array<AppUserDelegation>;
16868
17102
  /** Returns products the current user can access based on their actor type, email domain, and waitlist approval status. Used by app shells for nav. */
16869
17103
  myAccessibleProducts: PlatformProductList;
16870
17104
  myActivityLogs: ActivityLogConnection;
@@ -16947,6 +17181,8 @@ export type Query = {
16947
17181
  /** List user's linked wallets */
16948
17182
  myWallets: Array<WalletInfo>;
16949
17183
  myWishlist: Array<UserWishlist>;
17184
+ /** Your own community workflow templates, newest first. */
17185
+ myWorkflowTemplateSubmissions: WorkflowTemplateSubmissionList;
16950
17186
  /** Get workspaces where the current user is a member (owned + added to). Membership-scoped: the resolver filters by actorId, so the returned set IS the access list. Any authenticated user may call this; no RBAC permission is checked. */
16951
17187
  myWorkspaces: WorkspaceList;
16952
17188
  newsletter?: Maybe<Newsletter>;
@@ -17028,6 +17264,8 @@ export type Query = {
17028
17264
  /** Get pending scheduled notifications that are due for triggering */
17029
17265
  pendingScheduledNotifications: Array<ScheduledNotification>;
17030
17266
  pendingSurveys: CustomerSatisfactionSurveyConnection;
17267
+ /** Admin queue: new versions of published templates, oldest first. */
17268
+ pendingWorkflowTemplateRevisions: WorkflowTemplateRevisionList;
17031
17269
  /** Get permission check audit log */
17032
17270
  permissionAuditLog: Array<PermissionAuditLog>;
17033
17271
  /** Get a single platform product by ID (admin/catalog read). Returns the full PlatformProduct including DRAFT products and internal operational metrics, so it is gated as a global-scope catalog read. Unauthenticated/marketing callers must use publicProduct(slug), which filters to ACTIVE/WAITLIST/COMING_SOON and strips internal fields. */
@@ -17098,10 +17336,6 @@ export type Query = {
17098
17336
  rbacAnalytics: RbacAnalytics;
17099
17337
  /** Get RBAC configuration change history */
17100
17338
  rbacChangeHistory: Array<RbacChangeLog>;
17101
- /** Get RBAC configuration for a scope */
17102
- rbacConfig: Array<RbacConfig>;
17103
- /** Get a specific RBAC configuration value */
17104
- rbacConfigValue?: Maybe<RbacConfig>;
17105
17339
  recentArticles: Array<KnowledgeBaseArticle>;
17106
17340
  releaseAuditEvents: Array<ProductReleaseAuditEvent>;
17107
17341
  releaseTracks: Array<ReleaseTrack>;
@@ -17259,7 +17493,7 @@ export type Query = {
17259
17493
  userBillingPlan: UserBillingPlan;
17260
17494
  /** Get total count of users (for analytics) */
17261
17495
  userCount: Scalars['Int']['output'];
17262
- /** Get a user's feature flag preferences in a workspace. Bounded by limit/offset to avoid unbounded fetches. */
17496
+ /** Get the calling user's own feature flag preferences in a workspace. Self-scoped: the resolver filters rows by the caller's user id, so the result is the access control. Bounded by limit/offset to avoid unbounded fetches. */
17263
17497
  userFeatureFlagPreferences: Array<UserFeatureFlagPreference>;
17264
17498
  userLanguagePreference?: Maybe<UserLanguagePreference>;
17265
17499
  /** Check if the current user has reviewed a specific product */
@@ -17288,6 +17522,10 @@ export type Query = {
17288
17522
  webhookEventCatalog: Array<WebhookEventCatalogEntry>;
17289
17523
  /** Registered subject mappings. Platform services and super admins only. */
17290
17524
  webhookEventSubjects: Array<WebhookEventSubject>;
17525
+ /** Fetch a single webhook subscription by ID */
17526
+ webhookSubscription?: Maybe<WebhookSubscription>;
17527
+ /** List webhook subscriptions for an owner (newest first) */
17528
+ webhookSubscriptions: Array<WebhookSubscription>;
17291
17529
  webhooks: Array<Webhook>;
17292
17530
  /** Get a single workspace by ID */
17293
17531
  workspace?: Maybe<Workspace>;
@@ -17358,6 +17596,12 @@ export type QueryActorsArgs = {
17358
17596
  scopeId: Scalars['String']['input'];
17359
17597
  };
17360
17598
  /** Root query type */
17599
+ export type QueryAddonPurchaseEligibilityArgs = {
17600
+ addonIds: Array<Scalars['ID']['input']>;
17601
+ billingAccountId?: InputMaybe<Scalars['ID']['input']>;
17602
+ subscriptionId?: InputMaybe<Scalars['ID']['input']>;
17603
+ };
17604
+ /** Root query type */
17361
17605
  export type QueryAdminAffiliateAnalyticsArgs = {
17362
17606
  filter?: InputMaybe<AffiliateAnalyticsFilterInput>;
17363
17607
  };
@@ -18022,6 +18266,10 @@ export type QueryExploreCatalogArgs = {
18022
18266
  productSlug?: InputMaybe<Scalars['String']['input']>;
18023
18267
  };
18024
18268
  /** Root query type */
18269
+ export type QueryExploreConversationInfoArgs = {
18270
+ conversationToken: Scalars['String']['input'];
18271
+ };
18272
+ /** Root query type */
18025
18273
  export type QueryExploreConversationMessagesArgs = {
18026
18274
  conversationToken: Scalars['String']['input'];
18027
18275
  limit?: InputMaybe<Scalars['Int']['input']>;
@@ -18598,6 +18846,10 @@ export type QueryGetWebhookStatsArgs = {
18598
18846
  startDate?: InputMaybe<Scalars['DateTime']['input']>;
18599
18847
  };
18600
18848
  /** Root query type */
18849
+ export type QueryGlobalTriageEvaluationArgs = {
18850
+ sampleSize?: InputMaybe<Scalars['Int']['input']>;
18851
+ };
18852
+ /** Root query type */
18601
18853
  export type QueryHomeGroupedProductsArgs = {
18602
18854
  compatibleWith?: InputMaybe<Scalars['String']['input']>;
18603
18855
  };
@@ -18855,6 +19107,10 @@ export type QueryLowStockProductsArgs = {
18855
19107
  storeId?: InputMaybe<Scalars['ID']['input']>;
18856
19108
  };
18857
19109
  /** Root query type */
19110
+ export type QueryManagedAppDelegationsInternalArgs = {
19111
+ clientId: Scalars['String']['input'];
19112
+ };
19113
+ /** Root query type */
18858
19114
  export type QueryMyAccessibleProductsArgs = {
18859
19115
  limit?: InputMaybe<Scalars['Int']['input']>;
18860
19116
  offset?: InputMaybe<Scalars['Int']['input']>;
@@ -19028,6 +19284,12 @@ export type QueryMyWalletsArgs = {
19028
19284
  pagination?: InputMaybe<PaginationInput>;
19029
19285
  };
19030
19286
  /** Root query type */
19287
+ export type QueryMyWorkflowTemplateSubmissionsArgs = {
19288
+ limit?: InputMaybe<Scalars['Int']['input']>;
19289
+ offset?: InputMaybe<Scalars['Int']['input']>;
19290
+ status?: InputMaybe<ProductStatus>;
19291
+ };
19292
+ /** Root query type */
19031
19293
  export type QueryMyWorkspacesArgs = {
19032
19294
  limit?: InputMaybe<Scalars['Int']['input']>;
19033
19295
  offset?: InputMaybe<Scalars['Int']['input']>;
@@ -19259,6 +19521,12 @@ export type QueryPendingSurveysArgs = {
19259
19521
  offset?: InputMaybe<Scalars['Int']['input']>;
19260
19522
  };
19261
19523
  /** Root query type */
19524
+ export type QueryPendingWorkflowTemplateRevisionsArgs = {
19525
+ limit?: InputMaybe<Scalars['Int']['input']>;
19526
+ offset?: InputMaybe<Scalars['Int']['input']>;
19527
+ status?: InputMaybe<WorkflowTemplateRevisionStatus>;
19528
+ };
19529
+ /** Root query type */
19262
19530
  export type QueryPermissionAuditLogArgs = {
19263
19531
  filter?: InputMaybe<AuditLogFilterInput>;
19264
19532
  pagination?: InputMaybe<PaginationInput>;
@@ -19480,15 +19748,6 @@ export type QueryRbacChangeHistoryArgs = {
19480
19748
  scopeId: Scalars['String']['input'];
19481
19749
  };
19482
19750
  /** Root query type */
19483
- export type QueryRbacConfigArgs = {
19484
- scopeId: Scalars['String']['input'];
19485
- };
19486
- /** Root query type */
19487
- export type QueryRbacConfigValueArgs = {
19488
- key: Scalars['String']['input'];
19489
- scopeId: Scalars['String']['input'];
19490
- };
19491
- /** Root query type */
19492
19751
  export type QueryRecentArticlesArgs = {
19493
19752
  limit?: InputMaybe<Scalars['Int']['input']>;
19494
19753
  offset?: InputMaybe<Scalars['Int']['input']>;
@@ -20056,6 +20315,15 @@ export type QueryWebhookEventSubjectsArgs = {
20056
20315
  productSlug?: InputMaybe<Scalars['String']['input']>;
20057
20316
  };
20058
20317
  /** Root query type */
20318
+ export type QueryWebhookSubscriptionArgs = {
20319
+ id: Scalars['ID']['input'];
20320
+ };
20321
+ /** Root query type */
20322
+ export type QueryWebhookSubscriptionsArgs = {
20323
+ ownerId?: InputMaybe<Scalars['String']['input']>;
20324
+ ownerType: Scalars['String']['input'];
20325
+ };
20326
+ /** Root query type */
20059
20327
  export type QueryWebhooksArgs = {
20060
20328
  applicationId: Scalars['ID']['input'];
20061
20329
  };
@@ -20377,18 +20645,6 @@ export declare enum RbacChangeType {
20377
20645
  VisibilityRuleRemoved = "VISIBILITY_RULE_REMOVED",
20378
20646
  VisibilityRuleUpdated = "VISIBILITY_RULE_UPDATED"
20379
20647
  }
20380
- /** RBAC configuration key-value pair */
20381
- export type RbacConfig = {
20382
- __typename?: 'RbacConfig';
20383
- createdAt: Scalars['DateTime']['output'];
20384
- description?: Maybe<Scalars['String']['output']>;
20385
- id: Scalars['ID']['output'];
20386
- key: Scalars['String']['output'];
20387
- scopeId: Scalars['String']['output'];
20388
- updatedAt: Scalars['DateTime']['output'];
20389
- value: Scalars['String']['output'];
20390
- valueType: Scalars['String']['output'];
20391
- };
20392
20648
  /** Delivery result for a single recipient within a platform delivery */
20393
20649
  export type RecipientDeliveryResult = {
20394
20650
  __typename?: 'RecipientDeliveryResult';
@@ -20421,6 +20677,12 @@ export type RecipientInput = {
20421
20677
  export type RecordActivityInput = {
20422
20678
  action: Scalars['String']['input'];
20423
20679
  actorId?: InputMaybe<Scalars['String']['input']>;
20680
+ /** `ai_assistant` when an AI assistant session made the change (BOFF-9649). Honoured only from a service caller relaying a gateway-verified assistant-session marker (the be-sdk tracker); ignored for any other caller, so a user cannot tag or untag their own rows. */
20681
+ actorOrigin?: InputMaybe<Scalars['String']['input']>;
20682
+ /** Proposal / idempotency key the assistant mutation ran under. Same trust rule as actorOrigin. */
20683
+ assistantCorrelationId?: InputMaybe<Scalars['String']['input']>;
20684
+ /** Relay session (assistant sandbox) that made the change. Same trust rule as actorOrigin. */
20685
+ assistantSessionId?: InputMaybe<Scalars['String']['input']>;
20424
20686
  /** Optional idempotency key for backfill/import (audit phase-2). Derive a STABLE key from the source row (e.g. `global_auth_audit:<rowId>`). When set, the write UPSERTs on this key: if a row with the same `dedupeKey` already exists it is returned unchanged (no duplicate, no double-count), so a service can replay ALL of its historical audit rows any number of times and converge to exactly one activity_logs row each — including rows already dual-written in phase-1 (give the dual-write the SAME key so backfill and dual-write converge). When null, behaves exactly as before (plain insert). */
20425
20687
  dedupeKey?: InputMaybe<Scalars['String']['input']>;
20426
20688
  description?: InputMaybe<Scalars['String']['input']>;
@@ -20875,6 +21137,23 @@ export type RegisterWebhookEventSubjectsInput = {
20875
21137
  /** Mappings to create or update (at most 100 per call). */
20876
21138
  subjects: Array<WebhookEventSubjectInput>;
20877
21139
  };
21140
+ /** Input for registerWebhookSubscription */
21141
+ export type RegisterWebhookSubscriptionInput = {
21142
+ /** Operator-facing description */
21143
+ description?: InputMaybe<Scalars['String']['input']>;
21144
+ /** Whether delivery is active (default true) */
21145
+ enabled?: InputMaybe<Scalars['Boolean']['input']>;
21146
+ /** Event types to receive; empty = all events for the owner */
21147
+ events: Array<Scalars['String']['input']>;
21148
+ /** Owner identifier of the event stream (e.g. platform product id) */
21149
+ ownerId: Scalars['String']['input'];
21150
+ /** Owner namespace of the event stream (e.g. "newsletter-product") */
21151
+ ownerType: Scalars['String']['input'];
21152
+ /** HMAC-SHA256 signing secret (write-only, never returned) */
21153
+ secret: Scalars['String']['input'];
21154
+ /** Delivery URL (HTTPS in production) */
21155
+ url: Scalars['String']['input'];
21156
+ };
20878
21157
  export type RejectWaitlistInput = {
20879
21158
  id: Scalars['ID']['input'];
20880
21159
  reason?: InputMaybe<Scalars['String']['input']>;
@@ -21692,6 +21971,15 @@ export type SeedFluidgridsUserToursResult = {
21692
21971
  updatedCount: Scalars['Int']['output'];
21693
21972
  workspaceId: Scalars['String']['output'];
21694
21973
  };
21974
+ export type SeedHookmoviesUserToursResult = {
21975
+ __typename?: 'SeedHookmoviesUserToursResult';
21976
+ createdCount: Scalars['Int']['output'];
21977
+ productId: Scalars['String']['output'];
21978
+ totalCount: Scalars['Int']['output'];
21979
+ tours: Array<SeededUserTourResult>;
21980
+ updatedCount: Scalars['Int']['output'];
21981
+ workspaceId: Scalars['String']['output'];
21982
+ };
21695
21983
  export type SeedIntelWatchtowerUserToursResult = {
21696
21984
  __typename?: 'SeedIntelWatchtowerUserToursResult';
21697
21985
  createdCount: Scalars['Int']['output'];
@@ -21701,6 +21989,15 @@ export type SeedIntelWatchtowerUserToursResult = {
21701
21989
  updatedCount: Scalars['Int']['output'];
21702
21990
  workspaceId: Scalars['String']['output'];
21703
21991
  };
21992
+ export type SeedSemanticFedUserToursResult = {
21993
+ __typename?: 'SeedSemanticFedUserToursResult';
21994
+ createdCount: Scalars['Int']['output'];
21995
+ productId: Scalars['String']['output'];
21996
+ totalCount: Scalars['Int']['output'];
21997
+ tours: Array<SeededUserTourResult>;
21998
+ updatedCount: Scalars['Int']['output'];
21999
+ workspaceId: Scalars['String']['output'];
22000
+ };
21704
22001
  export type SeedTheCulturePostUserToursResult = {
21705
22002
  __typename?: 'SeedTheCulturePostUserToursResult';
21706
22003
  createdCount: Scalars['Int']['output'];
@@ -21754,7 +22051,7 @@ export type SendExploreMessageInput = {
21754
22051
  attachments?: InputMaybe<Array<ExploreAttachmentInput>>;
21755
22052
  /** Omit to start a new conversation. The result's `conversation.token` is the secret to send back on every following turn. */
21756
22053
  conversationToken?: InputMaybe<Scalars['String']['input']>;
21757
- /** BCP-47 locale of the page (e.g. "en-US"). */
22054
+ /** BCP-47 locale of the page (e.g. "en-US"). Only the language is kept, and only if it is one of `en` `zh` `hi` `es` `ar` `ta` (any case, with or without region or script subtags such as `en-US` or `zh-Hans-CN`). Anything else is treated as not sent — never an error, so a page with an unexpected locale still gets its answer. */
21758
22055
  locale?: InputMaybe<Scalars['String']['input']>;
21759
22056
  /** The visitor's question. */
21760
22057
  message: Scalars['String']['input'];
@@ -21799,6 +22096,11 @@ export type SendRoundMessageToCandidateInput = {
21799
22096
  message: Scalars['String']['input'];
21800
22097
  roundId: Scalars['ID']['input'];
21801
22098
  };
22099
+ export type ServiceEarningReversal = {
22100
+ __typename?: 'ServiceEarningReversal';
22101
+ entry: EarningsEntry;
22102
+ outcome: EarningReversalOutcome;
22103
+ };
21802
22104
  /** Consolidated earnings + payout-request status for a billing account, optionally scoped to a single earnings owner. Lets a delegating service poll the outcome of money-movement it handed to billing. */
21803
22105
  export type ServicePayoutStatus = {
21804
22106
  __typename?: 'ServicePayoutStatus';
@@ -21832,6 +22134,37 @@ export type ServiceRecordEarningInput = {
21832
22134
  sourceSubcategory?: InputMaybe<Scalars['String']['input']>;
21833
22135
  unitType?: InputMaybe<EarningUnitType>;
21834
22136
  };
22137
+ export type ServiceRefundPaymentInput = {
22138
+ /** Amount to refund in whole currency units. Partial refunds are allowed; the sum of a payment's refunds can never exceed the captured amount. */
22139
+ amount: Scalars['Float']['input'];
22140
+ /** Billing account the payment was charged on (through its BillingOrder or subscription). */
22141
+ billingAccountId: Scalars['ID']['input'];
22142
+ /** Optional; must match the payment currency when given. */
22143
+ currency?: InputMaybe<Scalars['String']['input']>;
22144
+ metadata?: InputMaybe<Scalars['JSON']['input']>;
22145
+ /** Billing Payment id (not the provider's payment id). */
22146
+ paymentId: Scalars['ID']['input'];
22147
+ reason: Scalars['String']['input'];
22148
+ /** Caller-owned idempotency key (e.g. "coolandlovely:refund:<orderId>:<brandId>"), unique per billing account. A replay returns the existing refund; a failed one is retried. */
22149
+ sourceIdempotencyKey: Scalars['String']['input'];
22150
+ };
22151
+ export type ServiceRefundPaymentResult = {
22152
+ __typename?: 'ServiceRefundPaymentResult';
22153
+ /** True when the key already had a refund and this call did not process it again. */
22154
+ alreadyProcessed: Scalars['Boolean']['output'];
22155
+ amount: Scalars['Float']['output'];
22156
+ currency: Scalars['String']['output'];
22157
+ error?: Maybe<Scalars['String']['output']>;
22158
+ gatewayRefundId?: Maybe<Scalars['String']['output']>;
22159
+ refundId: Scalars['ID']['output'];
22160
+ /** What is still refundable on the payment after this call. */
22161
+ refundableRemaining: Scalars['Float']['output'];
22162
+ /** Sum of the payment's pending, processing and completed refunds after this call. */
22163
+ refundedTotal: Scalars['Float']['output'];
22164
+ status: RefundRecordStatus;
22165
+ /** True when the provider accepted the refund (now or on an earlier call with the same key). */
22166
+ success: Scalars['Boolean']['output'];
22167
+ };
21835
22168
  export type ServiceRequestPayoutInput = {
21836
22169
  amount: Scalars['Float']['input'];
21837
22170
  /** Explicit billing account the payout is drawn from. */
@@ -21860,6 +22193,14 @@ export type ServiceResolvePayoutAccountInput = {
21860
22193
  /** Destination type for a newly-created placeholder account (defaults to BANK_ACCOUNT). */
21861
22194
  type?: InputMaybe<PayoutAccountType>;
21862
22195
  };
22196
+ export type ServiceReverseEarningInput = {
22197
+ /** Billing account the earning was recorded on. */
22198
+ billingAccountId: Scalars['ID']['input'];
22199
+ /** Why the earning is reversed (e.g. "Order COO-20261024-7F3A9C refunded"). */
22200
+ reason: Scalars['String']['input'];
22201
+ /** The sourceIdempotencyKey the earning was recorded with (serviceRecordEarning). */
22202
+ sourceIdempotencyKey: Scalars['String']['input'];
22203
+ };
21863
22204
  export type ServiceSyncPayoutStatusInput = {
21864
22205
  externalReference?: InputMaybe<Scalars['String']['input']>;
21865
22206
  failureReason?: InputMaybe<Scalars['String']['input']>;
@@ -22686,6 +23027,8 @@ export type StoreProduct = {
22686
23027
  weightUnit?: Maybe<WeightUnit>;
22687
23028
  /** Product width (physical products) */
22688
23029
  width?: Maybe<Scalars['Float']['output']>;
23030
+ /** For a WORKFLOW template: its nodes, required inputs and credentials and the cleaning report recorded at submission. Null for other products. */
23031
+ workflowTemplatePreview?: Maybe<WorkflowTemplatePreview>;
22689
23032
  zipFileUrl?: Maybe<Scalars['String']['output']>;
22690
23033
  };
22691
23034
  /** Input for fetching store product details */
@@ -22917,6 +23260,37 @@ export type SubmitSatisfactionSurveyInput = {
22917
23260
  rating: Scalars['Int']['input'];
22918
23261
  surveyId: Scalars['ID']['input'];
22919
23262
  };
23263
+ /** Publish a workspace workflow to the public store as a community template. */
23264
+ export type SubmitWorkflowTemplateInput = {
23265
+ /** Author name shown on the template. Required for your first template, when it also names your publisher profile; defaults to your publisher name afterwards. */
23266
+ authorName?: InputMaybe<Scalars['String']['input']>;
23267
+ /** Store category: automation, integration, data-processing, ai-ml, communication, devops, marketing, sales, support, productivity or finance. */
23268
+ category: Scalars['String']['input'];
23269
+ /** The workflow definition (definitionJson) to publish. Connection bindings, pinned run data and literal secrets are removed before it is stored. */
23270
+ definitionJson: Scalars['JSON']['input'];
23271
+ /** One-line summary shown on the template card (at most 500 characters). */
23272
+ description: Scalars['String']['input'];
23273
+ /** easy, medium or hard. */
23274
+ difficultyLevel?: InputMaybe<Scalars['String']['input']>;
23275
+ /** Estimated minutes to set the template up (1 to 1440). */
23276
+ estimatedTimeMinutes?: InputMaybe<Scalars['Int']['input']>;
23277
+ /** Iconify icon name, for example mdi:robot. */
23278
+ icon?: InputMaybe<Scalars['String']['input']>;
23279
+ /** Longer description (markdown) shown on the template page. */
23280
+ longDescription?: InputMaybe<Scalars['String']['input']>;
23281
+ /** Template name shown in the store (at most 120 characters). */
23282
+ name: Scalars['String']['input'];
23283
+ /** A note for the store reviewer. */
23284
+ notes?: InputMaybe<Scalars['String']['input']>;
23285
+ /** Resubmit one of your own templates instead of creating a new one. A DRAFT, REJECTED or UNLISTED template is replaced and goes back into review. A PUBLISHED template stays listed unchanged: the submission is kept as its pending revision and replaces the live version only when a reviewer approves it. Either way the template keeps its id and slug and its version goes up by one. */
23286
+ productId?: InputMaybe<Scalars['ID']['input']>;
23287
+ /** Workflow key the template was published from (lineage). */
23288
+ sourceWorkflowKey?: InputMaybe<Scalars['String']['input']>;
23289
+ /** Workflow version the template was published from (lineage). */
23290
+ sourceWorkflowVersion?: InputMaybe<Scalars['String']['input']>;
23291
+ /** Up to 10 search tags. */
23292
+ tags?: InputMaybe<Array<Scalars['String']['input']>>;
23293
+ };
22920
23294
  export type Subprocessor = {
22921
23295
  __typename?: 'Subprocessor';
22922
23296
  activatedAt?: Maybe<Scalars['DateTime']['output']>;
@@ -23385,6 +23759,19 @@ export type SupportContextInput = {
23385
23759
  userId?: InputMaybe<Scalars['ID']['input']>;
23386
23760
  workspaceId?: InputMaybe<Scalars['ID']['input']>;
23387
23761
  };
23762
+ /** A knowledge row a reply draft was built from. */
23763
+ export type SupportDraftCitation = {
23764
+ __typename?: 'SupportDraftCitation';
23765
+ id: Scalars['ID']['output'];
23766
+ kind: SupportDraftCitationKind;
23767
+ score: Scalars['Float']['output'];
23768
+ title: Scalars['String']['output'];
23769
+ };
23770
+ export declare enum SupportDraftCitationKind {
23771
+ CannedResponse = "CANNED_RESPONSE",
23772
+ Faq = "FAQ",
23773
+ KnowledgeBaseArticle = "KNOWLEDGE_BASE_ARTICLE"
23774
+ }
23388
23775
  export type SupportEraseResult = {
23389
23776
  __typename?: 'SupportEraseResult';
23390
23777
  anonymised: Scalars['Int']['output'];
@@ -23411,7 +23798,15 @@ export type SupportMessage = {
23411
23798
  /** Contextual IDs for filtering and scoping (workspaceId, userId, projectId, etc.) */
23412
23799
  context?: Maybe<SupportContext>;
23413
23800
  createdAt: Scalars['DateTime']['output'];
23414
- id: Scalars['ID']['output'];
23801
+ /** The knowledge-base articles, FAQs and canned responses a draft was built from. Empty for every message that is not a draft. */
23802
+ draftCitations: Array<SupportDraftCitation>;
23803
+ /** When the draft was sent or discarded. */
23804
+ draftResolvedAt?: Maybe<Scalars['DateTime']['output']>;
23805
+ /** The agent reply that was sent from this draft, once sent. */
23806
+ draftSentMessageId?: Maybe<Scalars['String']['output']>;
23807
+ id: Scalars['ID']['output'];
23808
+ /** True for a reply drafted from the knowledge base that waits for an agent (BOFF-3646). Drafts are always internal and are never sent on their own. */
23809
+ isDraft: Scalars['Boolean']['output'];
23415
23810
  isInternal: Scalars['Boolean']['output'];
23416
23811
  message: Scalars['String']['output'];
23417
23812
  ticket: SupportTicket;
@@ -23460,6 +23855,8 @@ export type SupportTicket = {
23460
23855
  metadata?: Maybe<Scalars['JSON']['output']>;
23461
23856
  priority: SupportTicketPriority;
23462
23857
  reopenedAt?: Maybe<Scalars['DateTime']['output']>;
23858
+ /** The open reply draft for this ticket, if any. Support staff only. */
23859
+ replyDraft?: Maybe<SupportMessage>;
23463
23860
  resolutionDue?: Maybe<Scalars['DateTime']['output']>;
23464
23861
  resolvedAt?: Maybe<Scalars['DateTime']['output']>;
23465
23862
  slaBreachStatus: SlaBreachStatus;
@@ -23475,6 +23872,8 @@ export type SupportTicket = {
23475
23872
  tenantId?: Maybe<Scalars['String']['output']>;
23476
23873
  ticketCategory?: Maybe<TicketCategory>;
23477
23874
  ticketNumber: Scalars['String']['output'];
23875
+ /** The triage engine's latest decision for this ticket, with its evidence (BOFF-3646). Null when the ticket was never triaged, and always null for viewers who cannot read internal notes — the evidence names other tickets. */
23876
+ triageDecision?: Maybe<SupportTriageDecision>;
23478
23877
  updatedAt: Scalars['DateTime']['output'];
23479
23878
  user: User;
23480
23879
  userId: Scalars['String']['output'];
@@ -23525,6 +23924,99 @@ export declare enum SupportTicketStatus {
23525
23924
  Resolved = "RESOLVED",
23526
23925
  WaitingCustomer = "WAITING_CUSTOMER"
23527
23926
  }
23927
+ /** An agent the engine suggests for the ticket. A suggestion only: triage never assigns. */
23928
+ export type SupportTriageAssigneeSuggestion = {
23929
+ __typename?: 'SupportTriageAssigneeSuggestion';
23930
+ agentProfileId: Scalars['ID']['output'];
23931
+ /** Current tickets divided by the agent's ticket capacity. */
23932
+ load: Scalars['Float']['output'];
23933
+ /** Agent skills that matched the ticket's category and tags. */
23934
+ matchedSkills: Array<Scalars['String']['output']>;
23935
+ userId: Scalars['String']['output'];
23936
+ };
23937
+ /** One triage decision, with what it replaced so a person can see and undo it. The engine only fills an empty category and only raises a priority. */
23938
+ export type SupportTriageDecision = {
23939
+ __typename?: 'SupportTriageDecision';
23940
+ category: SupportTicketCategory;
23941
+ /** True when triage set the category. */
23942
+ categoryApplied: Scalars['Boolean']['output'];
23943
+ /** Share of the evidence weight behind the proposed category (0–1). */
23944
+ categoryConfidence: Scalars['Float']['output'];
23945
+ /** Category the ticket has after triage. */
23946
+ categoryId?: Maybe<Scalars['String']['output']>;
23947
+ decidedAt: Scalars['DateTime']['output'];
23948
+ /** Actor who ran it; system:support-triage for automatic runs. */
23949
+ decidedBy: Scalars['String']['output'];
23950
+ /** Engine name and version that made the decision. */
23951
+ engine: Scalars['String']['output'];
23952
+ evidence: Array<SupportTriageEvidence>;
23953
+ /** Plain-language reasons for anything the engine left alone. */
23954
+ notes: Array<Scalars['String']['output']>;
23955
+ previousCategory: SupportTicketCategory;
23956
+ previousCategoryId?: Maybe<Scalars['String']['output']>;
23957
+ previousPriority: SupportTicketPriority;
23958
+ previousSlaPolicyId?: Maybe<Scalars['String']['output']>;
23959
+ priority: SupportTicketPriority;
23960
+ /** Phrases and similar-ticket votes that set the priority. */
23961
+ prioritySignals: Array<Scalars['String']['output']>;
23962
+ /** Category the evidence pointed to, applied or not. */
23963
+ proposedCategoryId?: Maybe<Scalars['String']['output']>;
23964
+ /** True when triage changed the SLA policy. */
23965
+ slaApplied: Scalars['Boolean']['output'];
23966
+ slaPolicyId?: Maybe<Scalars['String']['output']>;
23967
+ suggestedAssignee?: Maybe<SupportTriageAssigneeSuggestion>;
23968
+ trigger: SupportTriageTrigger;
23969
+ };
23970
+ /** The engine replayed over recent tickets people categorised and resolved, using only older tickets as evidence for each. */
23971
+ export type SupportTriageEvaluation = {
23972
+ __typename?: 'SupportTriageEvaluation';
23973
+ cases: Array<SupportTriageEvaluationCase>;
23974
+ /** Share of cases where the engine would apply a category. */
23975
+ categoryCoverage: Scalars['Float']['output'];
23976
+ /** Share of applied categories that match the person's choice. */
23977
+ categoryPrecision: Scalars['Float']['output'];
23978
+ correctCount: Scalars['Int']['output'];
23979
+ decidedCount: Scalars['Int']['output'];
23980
+ engine: Scalars['String']['output'];
23981
+ /** Share of cases where the engine's priority matches the final priority. */
23982
+ priorityAgreement: Scalars['Float']['output'];
23983
+ sampleSize: Scalars['Int']['output'];
23984
+ };
23985
+ /** One replayed ticket in a triage evaluation. */
23986
+ export type SupportTriageEvaluationCase = {
23987
+ __typename?: 'SupportTriageEvaluationCase';
23988
+ confidence: Scalars['Float']['output'];
23989
+ correct: Scalars['Boolean']['output'];
23990
+ decided: Scalars['Boolean']['output'];
23991
+ /** The category a person gave the ticket. */
23992
+ expectedCategoryId: Scalars['String']['output'];
23993
+ expectedPriority: SupportTicketPriority;
23994
+ /** The category the engine would have applied, or null when it would abstain. */
23995
+ predictedCategoryId?: Maybe<Scalars['String']['output']>;
23996
+ predictedPriority: SupportTicketPriority;
23997
+ ticketId: Scalars['ID']['output'];
23998
+ ticketNumber: Scalars['String']['output'];
23999
+ };
24000
+ /** A row the triage engine weighed: a similar resolved ticket or a published knowledge-base article. */
24001
+ export type SupportTriageEvidence = {
24002
+ __typename?: 'SupportTriageEvidence';
24003
+ id: Scalars['ID']['output'];
24004
+ kind: SupportTriageEvidenceKind;
24005
+ /** Ticket number for tickets, title for articles. */
24006
+ label: Scalars['String']['output'];
24007
+ /** Full-text relevance score (Postgres ts_rank). */
24008
+ score: Scalars['Float']['output'];
24009
+ };
24010
+ export declare enum SupportTriageEvidenceKind {
24011
+ KnowledgeBaseArticle = "KNOWLEDGE_BASE_ARTICLE",
24012
+ Ticket = "TICKET"
24013
+ }
24014
+ export declare enum SupportTriageTrigger {
24015
+ /** Run on demand by a support agent. */
24016
+ Manual = "MANUAL",
24017
+ /** Run automatically when the ticket was created. */
24018
+ TicketCreated = "TICKET_CREATED"
24019
+ }
23528
24020
  export type SuppressIdentifierInput = {
23529
24021
  channel: SuppressionChannel;
23530
24022
  expiresAt?: InputMaybe<Scalars['DateTime']['input']>;
@@ -24821,6 +25313,8 @@ export type UpdateContentPageInput = {
24821
25313
  category?: InputMaybe<Scalars['String']['input']>;
24822
25314
  content?: InputMaybe<Scalars['String']['input']>;
24823
25315
  contentFormat?: InputMaybe<Scalars['String']['input']>;
25316
+ /** Set, replace or (with null) withdraw the customer approval. Withdrawing it removes a case study from the public queries. */
25317
+ customerSignOff?: InputMaybe<CustomerSignOffInput>;
24824
25318
  excerpt?: InputMaybe<Scalars['String']['input']>;
24825
25319
  featured?: InputMaybe<Scalars['Boolean']['input']>;
24826
25320
  isPublished?: InputMaybe<Scalars['Boolean']['input']>;
@@ -25323,14 +25817,6 @@ export type UpdatePublisherInput = {
25323
25817
  organizationId?: InputMaybe<Scalars['ID']['input']>;
25324
25818
  websiteUrl?: InputMaybe<Scalars['String']['input']>;
25325
25819
  };
25326
- /** Input for updating RBAC configuration */
25327
- export type UpdateRbacConfigInput = {
25328
- description?: InputMaybe<Scalars['String']['input']>;
25329
- key: Scalars['String']['input'];
25330
- scopeId: Scalars['String']['input'];
25331
- value: Scalars['String']['input'];
25332
- valueType?: InputMaybe<Scalars['String']['input']>;
25333
- };
25334
25820
  export type UpdateRecurringBillingInput = {
25335
25821
  description?: InputMaybe<Scalars['String']['input']>;
25336
25822
  id: Scalars['ID']['input'];
@@ -25671,6 +26157,19 @@ export type UpdateWebhookInput = {
25671
26157
  retryEnabled?: InputMaybe<Scalars['Boolean']['input']>;
25672
26158
  url?: InputMaybe<Scalars['String']['input']>;
25673
26159
  };
26160
+ /** Input for updateWebhookSubscription — all fields optional, omitted fields unchanged */
26161
+ export type UpdateWebhookSubscriptionInput = {
26162
+ /** Operator-facing description */
26163
+ description?: InputMaybe<Scalars['String']['input']>;
26164
+ /** Whether delivery is active */
26165
+ enabled?: InputMaybe<Scalars['Boolean']['input']>;
26166
+ /** Event types to receive; empty = all events for the owner */
26167
+ events?: InputMaybe<Array<Scalars['String']['input']>>;
26168
+ /** HMAC-SHA256 signing secret (write-only, never returned) */
26169
+ secret?: InputMaybe<Scalars['String']['input']>;
26170
+ /** Delivery URL (HTTPS in production) */
26171
+ url?: InputMaybe<Scalars['String']['input']>;
26172
+ };
25674
26173
  /** Input for updating an existing workspace */
25675
26174
  export type UpdateWorkspaceInput = {
25676
26175
  metadata?: InputMaybe<Scalars['JSON']['input']>;
@@ -26415,6 +26914,30 @@ export type WebhookDeliveryEdge = {
26415
26914
  cursor: Scalars['String']['output'];
26416
26915
  node: WebhookDelivery;
26417
26916
  };
26917
+ /** One delivery attempt recorded for a WebhookSubscription. At most one row exists per (subscription, eventId) — a redispatched event updates the row instead of double-delivering. */
26918
+ export type WebhookDeliveryLog = {
26919
+ __typename?: 'WebhookDeliveryLog';
26920
+ /** Number of attempts made */
26921
+ attemptCount: Scalars['Int']['output'];
26922
+ /** When the final attempt finished */
26923
+ deliveredAt: Scalars['DateTime']['output'];
26924
+ /** Error message of the final attempt (null on success) */
26925
+ error?: Maybe<Scalars['String']['output']>;
26926
+ /** Caller-supplied event ID (idempotency key) */
26927
+ eventId: Scalars['String']['output'];
26928
+ /** Event type that was dispatched */
26929
+ eventType: Scalars['String']['output'];
26930
+ /** Unique log row ID */
26931
+ id: Scalars['ID']['output'];
26932
+ /** Envelope payload that was signed and posted */
26933
+ payload: Scalars['JSON']['output'];
26934
+ /** HTTP status code of the final attempt (null on transport error) */
26935
+ statusCode?: Maybe<Scalars['Int']['output']>;
26936
+ /** Owning subscription ID */
26937
+ subscriptionId: Scalars['ID']['output'];
26938
+ /** Whether the final attempt succeeded */
26939
+ success: Scalars['Boolean']['output'];
26940
+ };
26418
26941
  export declare enum WebhookDeliveryStatus {
26419
26942
  Delivered = "DELIVERED",
26420
26943
  Delivering = "DELIVERING",
@@ -26422,6 +26945,30 @@ export declare enum WebhookDeliveryStatus {
26422
26945
  Pending = "PENDING",
26423
26946
  Retrying = "RETRYING"
26424
26947
  }
26948
+ /** Result of a single test delivery */
26949
+ export type WebhookDispatchResult = {
26950
+ __typename?: 'WebhookDispatchResult';
26951
+ /** Number of attempts made */
26952
+ attemptCount: Scalars['Int']['output'];
26953
+ /** Error message of the final attempt (null on success) */
26954
+ error?: Maybe<Scalars['String']['output']>;
26955
+ /** HTTP status code of the final attempt (null on transport error) */
26956
+ statusCode?: Maybe<Scalars['Int']['output']>;
26957
+ /** Whether the delivery succeeded */
26958
+ success: Scalars['Boolean']['output'];
26959
+ };
26960
+ /** Summary returned by the M2M dispatchWebhookEvent mutation */
26961
+ export type WebhookDispatchSummary = {
26962
+ __typename?: 'WebhookDispatchSummary';
26963
+ /** Subscriptions skipped because the event was already delivered (idempotent redispatch) */
26964
+ deduplicated: Scalars['Int']['output'];
26965
+ /** Subscriptions delivered successfully */
26966
+ delivered: Scalars['Int']['output'];
26967
+ /** Subscriptions that failed after all retry attempts */
26968
+ failed: Scalars['Int']['output'];
26969
+ /** Enabled subscriptions matched for the owner + event type */
26970
+ matched: Scalars['Int']['output'];
26971
+ };
26425
26972
  /** WebhookEvent represents a received webhook (transient, 7-day TTL) Used for debugging and monitoring only */
26426
26973
  export type WebhookEvent = {
26427
26974
  __typename?: 'WebhookEvent';
@@ -26568,6 +27115,34 @@ export declare enum WebhookStatus {
26568
27115
  Failed = "FAILED",
26569
27116
  Paused = "PAUSED"
26570
27117
  }
27118
+ /** A registered outbound webhook endpoint owned by a product or operator. `ownerType` namespaces the event stream (e.g. "newsletter-product"); `ownerId` scopes it (e.g. the platform product id). An empty `events` list means the endpoint receives every event dispatched for the owner. */
27119
+ export type WebhookSubscription = {
27120
+ __typename?: 'WebhookSubscription';
27121
+ /** Creation timestamp */
27122
+ createdAt: Scalars['DateTime']['output'];
27123
+ /** Delivery audit trail (most recent first) */
27124
+ deliveries: Array<WebhookDeliveryLog>;
27125
+ /** Operator-facing description */
27126
+ description?: Maybe<Scalars['String']['output']>;
27127
+ /** Whether delivery is active */
27128
+ enabled: Scalars['Boolean']['output'];
27129
+ /** Event types this endpoint receives; empty = all events for the owner */
27130
+ events: Array<Scalars['String']['output']>;
27131
+ /** Unique subscription ID */
27132
+ id: Scalars['ID']['output'];
27133
+ /** Owner identifier of the event stream (e.g. platform product id) */
27134
+ ownerId: Scalars['String']['output'];
27135
+ /** Owner namespace of the event stream (e.g. "newsletter-product") */
27136
+ ownerType: Scalars['String']['output'];
27137
+ /** Last update timestamp */
27138
+ updatedAt: Scalars['DateTime']['output'];
27139
+ /** Delivery URL (HTTPS in production) */
27140
+ url: Scalars['String']['output'];
27141
+ };
27142
+ /** A registered outbound webhook endpoint owned by a product or operator. `ownerType` namespaces the event stream (e.g. "newsletter-product"); `ownerId` scopes it (e.g. the platform product id). An empty `events` list means the endpoint receives every event dispatched for the owner. */
27143
+ export type WebhookSubscriptionDeliveriesArgs = {
27144
+ limit?: InputMaybe<Scalars['Int']['input']>;
27145
+ };
26571
27146
  export type WebhookTestResult = {
26572
27147
  __typename?: 'WebhookTestResult';
26573
27148
  error?: Maybe<Scalars['String']['output']>;
@@ -26610,6 +27185,163 @@ export type WithdrawConsentInput = {
26610
27185
  subjectId: Scalars['ID']['input'];
26611
27186
  subjectType: Scalars['String']['input'];
26612
27187
  };
27188
+ /** Result of withdrawing a template. */
27189
+ export type WithdrawWorkflowTemplateSubmissionResult = {
27190
+ __typename?: 'WithdrawWorkflowTemplateSubmissionResult';
27191
+ id: Scalars['ID']['output'];
27192
+ /** True when the template was deleted; false when it was only taken off the store. */
27193
+ removed: Scalars['Boolean']['output'];
27194
+ /** The template's status when it was kept (UNLISTED), null when removed. */
27195
+ status?: Maybe<ProductStatus>;
27196
+ };
27197
+ /** What was removed from the author's workflow before it was stored. */
27198
+ export type WorkflowTemplateCleaningReport = {
27199
+ __typename?: 'WorkflowTemplateCleaningReport';
27200
+ /** Where each cleared connection was (up to 200). */
27201
+ clearedConnections: Array<WorkflowTemplateFieldRef>;
27202
+ connectionsCleared: Scalars['Int']['output'];
27203
+ pinnedDataRemoved: Scalars['Boolean']['output'];
27204
+ /** Where each removed secret was (up to 200). */
27205
+ removedSecrets: Array<WorkflowTemplateFieldRef>;
27206
+ secretsRemoved: Scalars['Int']['output'];
27207
+ };
27208
+ /** Where in a template a cleared connection or removed secret was. */
27209
+ export type WorkflowTemplateFieldRef = {
27210
+ __typename?: 'WorkflowTemplateFieldRef';
27211
+ /** Path of the field inside the node, for example data.parameters.apiKey. */
27212
+ field: Scalars['String']['output'];
27213
+ nodeId?: Maybe<Scalars['String']['output']>;
27214
+ nodeLabel?: Maybe<Scalars['String']['output']>;
27215
+ nodeType?: Maybe<Scalars['String']['output']>;
27216
+ };
27217
+ /** A node type a template uses. */
27218
+ export type WorkflowTemplateNodeType = {
27219
+ __typename?: 'WorkflowTemplateNodeType';
27220
+ displayName: Scalars['String']['output'];
27221
+ nodeType: Scalars['String']['output'];
27222
+ nodeVersion: Scalars['String']['output'];
27223
+ /** BUILTIN or STORE. */
27224
+ publishType: Scalars['String']['output'];
27225
+ };
27226
+ /** What a reviewer sees about a workflow template before approving it. */
27227
+ export type WorkflowTemplatePreview = {
27228
+ __typename?: 'WorkflowTemplatePreview';
27229
+ /** Recorded at submission; null for templates stored before reports were kept. */
27230
+ cleaningReport?: Maybe<WorkflowTemplateCleaningReport>;
27231
+ /** The cleaned definition importers receive. */
27232
+ definitionJson?: Maybe<Scalars['JSON']['output']>;
27233
+ edgeCount: Scalars['Int']['output'];
27234
+ /** Nodes in the definition (all of them, not just distinct types). */
27235
+ nodeCount: Scalars['Int']['output'];
27236
+ nodeTypes: Array<WorkflowTemplateNodeType>;
27237
+ requiredCredentials: Array<WorkflowTemplateRequiredCredential>;
27238
+ requiredInputs: Array<WorkflowTemplateRequiredInput>;
27239
+ };
27240
+ /** A credential someone importing the template must connect. */
27241
+ export type WorkflowTemplateRequiredCredential = {
27242
+ __typename?: 'WorkflowTemplateRequiredCredential';
27243
+ /** connection: the node was bound to the author's saved connection, which was cleared at submission. reference: the template reads ${credentials.<name>}. */
27244
+ kind: Scalars['String']['output'];
27245
+ name: Scalars['String']['output'];
27246
+ nodeId?: Maybe<Scalars['String']['output']>;
27247
+ nodeLabel?: Maybe<Scalars['String']['output']>;
27248
+ nodeType?: Maybe<Scalars['String']['output']>;
27249
+ };
27250
+ /** A value someone importing the template must supply (a ${name} variable it reads). */
27251
+ export type WorkflowTemplateRequiredInput = {
27252
+ __typename?: 'WorkflowTemplateRequiredInput';
27253
+ label: Scalars['String']['output'];
27254
+ name: Scalars['String']['output'];
27255
+ required: Scalars['Boolean']['output'];
27256
+ /** secret when it fills a secret field (API key, token, ...), else string. */
27257
+ type: Scalars['String']['output'];
27258
+ /** Nodes that read it. */
27259
+ usedBy: Array<Scalars['String']['output']>;
27260
+ };
27261
+ /** A new version of a PUBLISHED template, kept apart from the live version while it is reviewed. Approval makes it the live version; rejection leaves the live version untouched. */
27262
+ export type WorkflowTemplateRevision = {
27263
+ __typename?: 'WorkflowTemplateRevision';
27264
+ authorName?: Maybe<Scalars['String']['output']>;
27265
+ category: Scalars['String']['output'];
27266
+ createdAt: Scalars['DateTime']['output'];
27267
+ description: Scalars['String']['output'];
27268
+ icon?: Maybe<Scalars['String']['output']>;
27269
+ id: Scalars['ID']['output'];
27270
+ /** Version currently live in the store. */
27271
+ liveVersion: Scalars['String']['output'];
27272
+ name: Scalars['String']['output'];
27273
+ /** Number of distinct node types the revision uses. */
27274
+ nodeCount: Scalars['Int']['output'];
27275
+ /** The author's note for the reviewer. */
27276
+ notes?: Maybe<Scalars['String']['output']>;
27277
+ /** What the revision does: nodes, required inputs and credentials, cleaning report. */
27278
+ preview?: Maybe<WorkflowTemplatePreview>;
27279
+ /** Store product id of the template it revises. */
27280
+ productId: Scalars['ID']['output'];
27281
+ productSlug: Scalars['String']['output'];
27282
+ /** Publisher profile name of the author. */
27283
+ publisherName?: Maybe<Scalars['String']['output']>;
27284
+ rejectedReason?: Maybe<Scalars['String']['output']>;
27285
+ reviewedAt?: Maybe<Scalars['DateTime']['output']>;
27286
+ revision: Scalars['Int']['output'];
27287
+ status: WorkflowTemplateRevisionStatus;
27288
+ submittedAt: Scalars['DateTime']['output'];
27289
+ /** Actor id of the author who submitted it. */
27290
+ submittedBy: Scalars['String']['output'];
27291
+ tags: Array<Scalars['String']['output']>;
27292
+ updatedAt: Scalars['DateTime']['output'];
27293
+ /** Version this revision becomes when approved. */
27294
+ version: Scalars['String']['output'];
27295
+ };
27296
+ export type WorkflowTemplateRevisionList = {
27297
+ __typename?: 'WorkflowTemplateRevisionList';
27298
+ items: Array<WorkflowTemplateRevision>;
27299
+ totalCount: Scalars['Int']['output'];
27300
+ };
27301
+ /** PENDING_REVIEW while a store admin reviews it; REJECTED with a reason. */
27302
+ export declare enum WorkflowTemplateRevisionStatus {
27303
+ PendingReview = "PENDING_REVIEW",
27304
+ Rejected = "REJECTED"
27305
+ }
27306
+ /** One of your community workflow templates and where it is in review. */
27307
+ export type WorkflowTemplateSubmission = {
27308
+ __typename?: 'WorkflowTemplateSubmission';
27309
+ authorName?: Maybe<Scalars['String']['output']>;
27310
+ category?: Maybe<Scalars['String']['output']>;
27311
+ createdAt: Scalars['DateTime']['output'];
27312
+ description?: Maybe<Scalars['String']['output']>;
27313
+ /** Times the template has been imported. */
27314
+ downloads: Scalars['Int']['output'];
27315
+ icon?: Maybe<Scalars['String']['output']>;
27316
+ /** Store product id of the template. */
27317
+ id: Scalars['ID']['output'];
27318
+ name: Scalars['String']['output'];
27319
+ /** Number of distinct node types the template uses. */
27320
+ nodeCount: Scalars['Int']['output'];
27321
+ /** The new version of this published template that is waiting for review, or that a reviewer rejected (with the reason). Null when there is none. */
27322
+ pendingRevision?: Maybe<WorkflowTemplateRevision>;
27323
+ publishedAt?: Maybe<Scalars['DateTime']['output']>;
27324
+ rejectedReason?: Maybe<Scalars['String']['output']>;
27325
+ reviewNotes?: Maybe<Scalars['String']['output']>;
27326
+ reviewedAt?: Maybe<Scalars['DateTime']['output']>;
27327
+ /** How many times the template has been submitted. */
27328
+ revision: Scalars['Int']['output'];
27329
+ slug: Scalars['String']['output'];
27330
+ sourceWorkflowKey?: Maybe<Scalars['String']['output']>;
27331
+ sourceWorkflowVersion?: Maybe<Scalars['String']['output']>;
27332
+ /** PENDING_REVIEW while a store admin reviews it, PUBLISHED once approved, REJECTED with a reason, UNLISTED once taken off the store. */
27333
+ status: ProductStatus;
27334
+ submittedAt?: Maybe<Scalars['DateTime']['output']>;
27335
+ tags: Array<Scalars['String']['output']>;
27336
+ updatedAt: Scalars['DateTime']['output'];
27337
+ /** Template version (1.0.0 for the first submission, 1.1.0 for the second, ...). */
27338
+ version: Scalars['String']['output'];
27339
+ };
27340
+ export type WorkflowTemplateSubmissionList = {
27341
+ __typename?: 'WorkflowTemplateSubmissionList';
27342
+ items: Array<WorkflowTemplateSubmission>;
27343
+ totalCount: Scalars['Int']['output'];
27344
+ };
26613
27345
  /** Workspace type stub - represents a workspace entity from the workspace service This service doesn't own the Workspace model, but references it */
26614
27346
  export type Workspace = {
26615
27347
  __typename?: 'Workspace';
@@ -26765,6 +27497,8 @@ export type CreateAddOnsInput = {
26765
27497
  price: Scalars['Float']['input'];
26766
27498
  productId: Scalars['String']['input'];
26767
27499
  quotas: Array<AddonQuotaInput>;
27500
+ /** Whether buying this add-on requires a paid subscription to its product. Defaults to true; set false only for items sold to Free users on purpose. */
27501
+ requiresPaidSubscription?: InputMaybe<Scalars['Boolean']['input']>;
26768
27502
  };
26769
27503
  export type CreatePlanInput = {
26770
27504
  currency?: InputMaybe<Scalars['String']['input']>;
@@ -26803,6 +27537,8 @@ export type UpdateAddOnsInput = {
26803
27537
  name?: InputMaybe<Scalars['String']['input']>;
26804
27538
  price?: InputMaybe<Scalars['Float']['input']>;
26805
27539
  quotas: Array<AddonQuotaInput>;
27540
+ /** Whether buying this add-on requires a paid subscription to its product. Omit to leave unchanged. */
27541
+ requiresPaidSubscription?: InputMaybe<Scalars['Boolean']['input']>;
26806
27542
  };
26807
27543
  export type UpdatePlanInput = {
26808
27544
  /** Immutable once set — see `price`. Throws CURRENCY_CHANGE_NOT_ALLOWED on an actual change. */