@burdenoff/microfe-store 2026.1013.3 → 2026.1028.1

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.
@@ -408,6 +408,8 @@ export type Addon = {
408
408
  isActive?: Maybe<Scalars['Boolean']['output']>;
409
409
  /** The name of the addon (e.g., 'Extra Bots', 'Additional Storage'). */
410
410
  name?: Maybe<Scalars['String']['output']>;
411
+ /** Apple App Store / Google Play SKU for this addon. */
412
+ nativeProductId?: Maybe<Scalars['String']['output']>;
411
413
  /** The price of the addon. */
412
414
  price?: Maybe<Scalars['Float']['output']>;
413
415
  /** Historical record of price changes for this addon */
@@ -746,6 +748,8 @@ export declare enum AgentStatus {
746
748
  /** Per-model LLM token prices (USD per 1M tokens) used to weight AI-credit charges. */
747
749
  export type AiModelPrice = {
748
750
  __typename?: 'AiModelPrice';
751
+ cacheReadMultiplier: Scalars['Float']['output'];
752
+ cacheWriteMultiplier: Scalars['Float']['output'];
749
753
  inputPer1M: Scalars['Float']['output'];
750
754
  isActive: Scalars['Boolean']['output'];
751
755
  model: Scalars['String']['output'];
@@ -1361,6 +1365,20 @@ export type AssignedQuota = {
1361
1365
  scope: QuotaScope;
1362
1366
  workspaceId?: Maybe<Scalars['ID']['output']>;
1363
1367
  };
1368
+ export type AssistantAccountBudget = {
1369
+ __typename?: 'AssistantAccountBudget';
1370
+ billingAccountId: Scalars['ID']['output'];
1371
+ dailyMicroUsd: Scalars['Int']['output'];
1372
+ dailyTokens: Scalars['Int']['output'];
1373
+ enabled: Scalars['Boolean']['output'];
1374
+ };
1375
+ export type AssistantBudgetReceipt = {
1376
+ __typename?: 'AssistantBudgetReceipt';
1377
+ heldMicroUsd: Scalars['Int']['output'];
1378
+ heldTokens: Scalars['Int']['output'];
1379
+ id: Scalars['ID']['output'];
1380
+ status: Scalars['String']['output'];
1381
+ };
1364
1382
  export type AttachMediaToStepInput = {
1365
1383
  /** Operation context for scoping (workspaceId, userId, productId, moduleId, etc.) */
1366
1384
  context?: InputMaybe<ContextInput>;
@@ -1550,6 +1568,82 @@ export type AutomationSubscriber = {
1550
1568
  status: AutomationStatus;
1551
1569
  subscriberId: Scalars['String']['output'];
1552
1570
  };
1571
+ /** A workspace's avatar credits, in one person's view when actorId is given (contract v2). Whole credits, 0 or more. */
1572
+ export type AvatarMinutesBalance = {
1573
+ __typename?: 'AvatarMinutesBalance';
1574
+ /** Credits left for this person now: carried + free within the person's ceiling + plan. */
1575
+ availableMinutes: Scalars['Int']['output'];
1576
+ /** Carried credits left. */
1577
+ carriedRemaining: Scalars['Int']['output'];
1578
+ /** Always 2. */
1579
+ contractVersion: Scalars['Int']['output'];
1580
+ /** The counted free row's amount; 0 without one. */
1581
+ freeMinutesPerMonth: Scalars['Int']['output'];
1582
+ /** Free credits left in this workspace this month, before the person's ceiling. */
1583
+ freeRemaining: Scalars['Int']['output'];
1584
+ /** This person's own open holds that block them; null without actorId. */
1585
+ heldByActorMinutes?: Maybe<Scalars['Int']['output']>;
1586
+ /** Credits reserved by open sessions in this workspace. */
1587
+ heldMinutes: Scalars['Int']['output'];
1588
+ /** Whether a plan with more credits exists for the product. Display only, never an entitlement. */
1589
+ morePlanCreditsAvailable: Scalars['Boolean']['output'];
1590
+ /** The per-person free ceiling; null when off. */
1591
+ personFreeCeiling?: Maybe<Scalars['Int']['output']>;
1592
+ /** The person's free credits left this UTC month; null when the ceiling is off or without actorId. */
1593
+ personFreeRemaining?: Maybe<Scalars['Int']['output']>;
1594
+ /** The counted plans' amounts, summed. */
1595
+ planMinutesPerMonth: Scalars['Int']['output'];
1596
+ /** Plan credits left in this workspace this month. */
1597
+ planRemaining: Scalars['Int']['output'];
1598
+ reason?: Maybe<AvatarMinutesReason>;
1599
+ /** The next 1st, 00:00 UTC (ISO-8601 with milliseconds). */
1600
+ resetsAt: Scalars['String']['output'];
1601
+ state: AvatarMinutesState;
1602
+ };
1603
+ export declare enum AvatarMinutesEndClass {
1604
+ Exact = "EXACT",
1605
+ None = "NONE",
1606
+ Uncertain = "UNCERTAIN"
1607
+ }
1608
+ export declare enum AvatarMinutesMode {
1609
+ Enforce = "ENFORCE",
1610
+ Observe = "OBSERVE"
1611
+ }
1612
+ export declare enum AvatarMinutesReason {
1613
+ FreeCeiling = "FREE_CEILING",
1614
+ NotIncluded = "NOT_INCLUDED",
1615
+ OwnSession = "OWN_SESSION",
1616
+ ZeroSessionLimit = "ZERO_SESSION_LIMIT"
1617
+ }
1618
+ export type AvatarMinutesReservation = {
1619
+ __typename?: 'AvatarMinutesReservation';
1620
+ chargedMinutes?: Maybe<Scalars['Int']['output']>;
1621
+ /** AVATAR, SWEEPER or SUPERSEDE. */
1622
+ closedBy?: Maybe<Scalars['String']['output']>;
1623
+ reservedMinutes: Scalars['Int']['output'];
1624
+ sessionId: Scalars['ID']['output'];
1625
+ /** RESERVED, ACTIVE, SETTLED, RELEASED or EXPIRED. */
1626
+ state: Scalars['String']['output'];
1627
+ };
1628
+ /** HMAC-SHA256 envelope of a signed avatar-minutes call (DESIGN 3.7): the key id (environment-prefixed), the signing instant (strict ISO-8601 UTC with milliseconds) and the MAC (64 lowercase hex). */
1629
+ export type AvatarMinutesSignature = {
1630
+ issuedAt: Scalars['String']['input'];
1631
+ kid: Scalars['String']['input'];
1632
+ value: Scalars['String']['input'];
1633
+ };
1634
+ export declare enum AvatarMinutesState {
1635
+ Available = "AVAILABLE",
1636
+ Exhausted = "EXHAUSTED",
1637
+ InUse = "IN_USE"
1638
+ }
1639
+ /** The provider's session status at settle, noted once on the SETTLED reservation (P-27). */
1640
+ export declare enum AvatarProviderSessionStatus {
1641
+ Canceled = "CANCELED",
1642
+ Ended = "ENDED",
1643
+ Ending = "ENDING",
1644
+ Failed = "FAILED",
1645
+ Other = "OTHER"
1646
+ }
1553
1647
  export declare enum BackoffStrategy {
1554
1648
  Exponential = "EXPONENTIAL",
1555
1649
  ExponentialWithJitter = "EXPONENTIAL_WITH_JITTER",
@@ -1781,13 +1875,17 @@ export type BillingSubscription = {
1781
1875
  };
1782
1876
  export type BillingWebhookLog = {
1783
1877
  __typename?: 'BillingWebhookLog';
1878
+ attemptCount: Scalars['Int']['output'];
1784
1879
  context?: Maybe<Scalars['JSON']['output']>;
1785
1880
  createdAt: Scalars['DateTime']['output'];
1881
+ deadLetteredAt?: Maybe<Scalars['DateTime']['output']>;
1786
1882
  error?: Maybe<Scalars['String']['output']>;
1787
1883
  event: Scalars['String']['output'];
1788
1884
  id: Scalars['ID']['output'];
1885
+ nextAttemptAt?: Maybe<Scalars['DateTime']['output']>;
1789
1886
  payload: Scalars['JSON']['output'];
1790
1887
  processed: Scalars['Boolean']['output'];
1888
+ processingStartedAt?: Maybe<Scalars['DateTime']['output']>;
1791
1889
  provider: Scalars['String']['output'];
1792
1890
  };
1793
1891
  /** Paginated page of BillingWebhookLog rows, for the admin webhook-log viewer — unlike getUnprocessedFailedWebhooks, not restricted to the payment-succeeded event types eligible for refund creation. */
@@ -2904,6 +3002,20 @@ export declare enum CircuitState {
2904
3002
  HalfOpen = "HALF_OPEN",
2905
3003
  Open = "OPEN"
2906
3004
  }
3005
+ export type CloseAvatarMinutesInput = {
3006
+ /** The decider's wall-clock time; audit only. */
3007
+ decidedAt: Scalars['String']['input'];
3008
+ endClass: AvatarMinutesEndClass;
3009
+ /** Sets the rounding by the exhaustive table in DESIGN 3.1. */
3010
+ endReason: Scalars['String']['input'];
3011
+ ownerDecided: Scalars['Boolean']['input'];
3012
+ /** Anchors the lease; absent for a failed start. */
3013
+ readyAt?: InputMaybe<Scalars['String']['input']>;
3014
+ sessionId: Scalars['ID']['input'];
3015
+ /** The decision's span (DESIGN 3.1), whole milliseconds; 0 when not confirmed. */
3016
+ spanMs: Scalars['Int']['input'];
3017
+ workspaceId: Scalars['ID']['input'];
3018
+ };
2907
3019
  export type ComplaintStats = {
2908
3020
  __typename?: 'ComplaintStats';
2909
3021
  complaintRate: Scalars['Float']['output'];
@@ -2921,6 +3033,10 @@ export type ComplianceAuditLogEntry = {
2921
3033
  /** Input for configuring tenant settings */
2922
3034
  export type ConfigureTenantInput = {
2923
3035
  complianceRegion?: InputMaybe<Scalars['String']['input']>;
3036
+ /**
3037
+ * Ignored and never stored. Burdenoff does no white-labelling: every product keeps its own brand.
3038
+ * @deprecated No white-labelling — products keep their own brand. This setting is ignored.
3039
+ */
2924
3040
  customBranding?: InputMaybe<Scalars['JSON']['input']>;
2925
3041
  dataResidency?: InputMaybe<Scalars['String']['input']>;
2926
3042
  features?: InputMaybe<Scalars['JSON']['input']>;
@@ -3142,6 +3258,10 @@ export type ContextWidgetConversationPayload = {
3142
3258
  };
3143
3259
  export type Coupon = {
3144
3260
  __typename?: 'Coupon';
3261
+ /** Purchase flows (PLAN / ADD_ON / STORE) this coupon may be redeemed against. Empty = all entity types. */
3262
+ applicableEntityTypes: Array<CouponEntityType>;
3263
+ /** Product slugs (e.g. "vibecontrols", "fluidgrids") this coupon may be redeemed against. Empty = all products. */
3264
+ applicableProductIds: Array<Scalars['String']['output']>;
3145
3265
  applicableProducts: Array<Scalars['String']['output']>;
3146
3266
  applicableServices: Array<Scalars['String']['output']>;
3147
3267
  campaignId?: Maybe<Scalars['String']['output']>;
@@ -3172,6 +3292,12 @@ export type Coupon = {
3172
3292
  validUntil?: Maybe<Scalars['DateTime']['output']>;
3173
3293
  value: Scalars['Float']['output'];
3174
3294
  };
3295
+ /** Which purchase flow a coupon may be redeemed against (BOFF-7391). */
3296
+ export declare enum CouponEntityType {
3297
+ AddOn = "ADD_ON",
3298
+ Plan = "PLAN",
3299
+ Store = "STORE"
3300
+ }
3175
3301
  export type CouponFilterInput = {
3176
3302
  campaignId?: InputMaybe<Scalars['String']['input']>;
3177
3303
  scope?: InputMaybe<CouponScope>;
@@ -3457,6 +3583,8 @@ export type CreateContentPageInput = {
3457
3583
  visibility?: InputMaybe<ContentVisibility>;
3458
3584
  };
3459
3585
  export type CreateCouponInput = {
3586
+ applicableEntityTypes?: InputMaybe<Array<CouponEntityType>>;
3587
+ applicableProductIds?: InputMaybe<Array<Scalars['String']['input']>>;
3460
3588
  applicableProducts?: InputMaybe<Array<Scalars['String']['input']>>;
3461
3589
  applicableServices?: InputMaybe<Array<Scalars['String']['input']>>;
3462
3590
  campaignId?: InputMaybe<Scalars['String']['input']>;
@@ -5646,6 +5774,25 @@ export type EraseResult = {
5646
5774
  retainedForLegalReason?: Maybe<Scalars['String']['output']>;
5647
5775
  service: Scalars['String']['output'];
5648
5776
  };
5777
+ /** A visitor asking for a human, on a conversation they are already in. Anonymous like the rest of explore: the conversation token is the only proof of ownership, and the only thing we ask the visitor for is where to reply. */
5778
+ export type EscalateExploreConversationInput = {
5779
+ /** Bearer secret for the conversation being handed over. */
5780
+ conversationToken: Scalars['String']['input'];
5781
+ /** Where the reply should go. Validated server-side and stored lower-cased; an address we cannot deliver to is refused with `INVALID_EMAIL` rather than accepted into a ticket nobody can answer. */
5782
+ email: Scalars['String']['input'];
5783
+ /** Anything the visitor wants to add in their own words. Optional — the point of the handover is that the conversation already says what the problem is. Capped server-side; the server truncates rather than rejecting. */
5784
+ note?: InputMaybe<Scalars['String']['input']>;
5785
+ /** `PlatformProduct` id of the site the visitor is on, so the handover reaches that product's support inbox instead of the default one. */
5786
+ productId?: InputMaybe<Scalars['String']['input']>;
5787
+ /** reCAPTCHA v3 token — required only when `exploreCatalog.captchaRequired`, and minted with the SAME action as a chat message. */
5788
+ recaptchaToken?: InputMaybe<Scalars['String']['input']>;
5789
+ };
5790
+ export type EscalateExploreConversationResult = {
5791
+ __typename?: 'EscalateExploreConversationResult';
5792
+ /** False when this submit found a handover that already existed — the double-clicked button, the retried request, the reloaded page. Not an error: the conversation is with a human either way. */
5793
+ created: Scalars['Boolean']['output'];
5794
+ escalation: ExploreEscalation;
5795
+ };
5649
5796
  export type EvaluateFeatureFlagsInput = {
5650
5797
  /** Specific flag keys to evaluate. If empty, evaluates ALL active flags. */
5651
5798
  keys?: InputMaybe<Array<Scalars['String']['input']>>;
@@ -5653,6 +5800,10 @@ export type EvaluateFeatureFlagsInput = {
5653
5800
  productSlug?: InputMaybe<Scalars['String']['input']>;
5654
5801
  workspaceId: Scalars['String']['input'];
5655
5802
  };
5803
+ export type ExchangeOwnDelegationInput = {
5804
+ delegationId: Scalars['ID']['input'];
5805
+ scopes?: InputMaybe<Array<Scalars['String']['input']>>;
5806
+ };
5656
5807
  export type ExchangeTokenInput = {
5657
5808
  appId: Scalars['String']['input'];
5658
5809
  scopes?: InputMaybe<Array<Scalars['String']['input']>>;
@@ -5715,6 +5866,8 @@ export type ExploreAdminFilter = {
5715
5866
  from?: InputMaybe<Scalars['DateTime']['input']>;
5716
5867
  /** Salted IP hash, to group one visitor's sessions. */
5717
5868
  ipHash?: InputMaybe<Scalars['String']['input']>;
5869
+ /** Only conversations containing an answer a visitor marked NOT helpful. */
5870
+ notHelpfulOnly?: InputMaybe<Scalars['Boolean']['input']>;
5718
5871
  /** Match conversations that started on this product's website. */
5719
5872
  productSlug?: InputMaybe<Scalars['String']['input']>;
5720
5873
  /** Free-text match against message content. */
@@ -5735,6 +5888,8 @@ export type ExploreAdminMessage = {
5735
5888
  createdAt: Scalars['DateTime']['output'];
5736
5889
  ctas: Array<ExploreCta>;
5737
5890
  errorCode?: Maybe<Scalars['String']['output']>;
5891
+ /** What the visitor said about this answer — rating, reason and comment — or null when they said nothing, which is the ordinary case. `answered` is our own machine verdict on whether we could ground a reply; this is the visitor's, and it is the only one of the two that can say an answer was confidently wrong. */
5892
+ feedback?: Maybe<ExploreFeedback>;
5738
5893
  followUps: Array<Scalars['String']['output']>;
5739
5894
  id: Scalars['ID']['output'];
5740
5895
  references: Array<ExploreReference>;
@@ -5761,7 +5916,11 @@ export type ExploreAdminStats = {
5761
5916
  byProduct: Array<ExploreAdminProductStat>;
5762
5917
  clicks: Scalars['Int']['output'];
5763
5918
  conversations: Scalars['Int']['output'];
5919
+ /** Answers a visitor marked helpful. */
5920
+ helpful: Scalars['Int']['output'];
5764
5921
  messages: Scalars['Int']['output'];
5922
+ /** Answers a visitor marked NOT helpful. Read against `unanswered`: those are the gaps we already know about, these are the ones we thought we had covered. */
5923
+ notHelpful: Scalars['Int']['output'];
5765
5924
  /** Assistant answers the corpus could not ground. */
5766
5925
  unanswered: Scalars['Int']['output'];
5767
5926
  };
@@ -5774,8 +5933,20 @@ export type ExploreAgentActivity = {
5774
5933
  export type ExploreAgentCatalog = {
5775
5934
  __typename?: 'ExploreAgentCatalog';
5776
5935
  builtAt: Scalars['DateTime']['output'];
5936
+ /** At most one highlight per product, product-slug ordered, identical on every replica. Empty when the corpus carries no concept pages — never null, never an error. */
5937
+ conceptHighlights: Array<ExploreAgentConcept>;
5777
5938
  products: Array<ExploreAgentProduct>;
5778
5939
  };
5940
+ /** One product's concept page and the illustration that stands for it — what `/explore` offers a visitor who has not asked anything yet. `imageUrl` is absolute, on the product's own published origin, and drawn from the same allow-list an answer's images come from; `alt` is the illustration's own published alt text. */
5941
+ export type ExploreAgentConcept = {
5942
+ __typename?: 'ExploreAgentConcept';
5943
+ alt: Scalars['String']['output'];
5944
+ imageUrl: Scalars['String']['output'];
5945
+ product: Scalars['String']['output'];
5946
+ productName: Scalars['String']['output'];
5947
+ title: Scalars['String']['output'];
5948
+ url: Scalars['String']['output'];
5949
+ };
5779
5950
  export type ExploreAgentCtaSuggestion = {
5780
5951
  __typename?: 'ExploreAgentCtaSuggestion';
5781
5952
  label: Scalars['String']['output'];
@@ -5878,6 +6049,8 @@ export type ExploreAttachmentInput = {
5878
6049
  export type ExploreCatalog = {
5879
6050
  __typename?: 'ExploreCatalog';
5880
6051
  captchaRequired: Scalars['Boolean']['output'];
6052
+ /** Illustrations for the welcome screen, at most 8. The focused product's highlight (see `exploreCatalog(productSlug:)`) comes first. Empty is ORDINARY, not an error: these are fetched from the agent in a separate best-effort query precisely so that an agent which does not serve them yet — or at all — costs the catalog nothing. A page must render the rest of the catalog unchanged when this is empty, and must never read it as a signal that explore is unavailable. That is `enabled`. */
6053
+ conceptHighlights: Array<ExploreConceptHighlight>;
5881
6054
  enabled: Scalars['Boolean']['output'];
5882
6055
  examplePrompts: Array<Scalars['String']['output']>;
5883
6056
  limits: ExploreLimits;
@@ -5886,6 +6059,17 @@ export type ExploreCatalog = {
5886
6059
  welcomeBody: Scalars['String']['output'];
5887
6060
  welcomeTitle: Scalars['String']['output'];
5888
6061
  };
6062
+ /** One product's concept illustration, passed through from the agent's concept index so the welcome screen has something to SHOW before the first message. `imageUrl` is a mockup, not a screenshot of a running product — the same illustrations the answer path embeds, and the UI must label them the same way. `url` is the concept page the illustration belongs to, which is where a visitor who clicks it should land. At most one per product upstream, so the list reads as a gallery of the fleet rather than as several views of whichever product happened to sort first. */
6063
+ export type ExploreConceptHighlight = {
6064
+ __typename?: 'ExploreConceptHighlight';
6065
+ alt: Scalars['String']['output'];
6066
+ imageUrl: Scalars['String']['output'];
6067
+ /** Product slug, matching `ExploreProduct.slug`. */
6068
+ product: Scalars['String']['output'];
6069
+ productName: Scalars['String']['output'];
6070
+ title: Scalars['String']['output'];
6071
+ url: Scalars['String']['output'];
6072
+ };
5889
6073
  /** An explore conversation. `token` is the bearer secret for every subsequent call and is returned ONLY on the request that minted it (or echoed back to the caller that already holds it) — it is never read back out of storage. */
5890
6074
  export type ExploreConversation = {
5891
6075
  __typename?: 'ExploreConversation';
@@ -5903,6 +6087,26 @@ export type ExploreCta = {
5903
6087
  product?: Maybe<Scalars['String']['output']>;
5904
6088
  url: Scalars['String']['output'];
5905
6089
  };
6090
+ /** What became of the handover. */
6091
+ export type ExploreEscalation = {
6092
+ __typename?: 'ExploreEscalation';
6093
+ createdAt: Scalars['DateTime']['output'];
6094
+ /** The address a human will reply to, as stored. Echoed back so the UI shows the server's view rather than what was typed — and, on a repeat submit, the address the FIRST handover used, which is where the answer is actually going. */
6095
+ email: Scalars['String']['output'];
6096
+ };
6097
+ /** What one visitor thought of one answer. The signal `/explore` did not have. Every question got an answer, so "we answer 100% of questions" was true and told us nothing; this is the only record that a specific answer was wrong, thin or off-topic. At most one per message — a visitor may change their mind, and the new verdict replaces the old one. */
6098
+ export type ExploreFeedback = {
6099
+ __typename?: 'ExploreFeedback';
6100
+ comment?: Maybe<Scalars['String']['output']>;
6101
+ createdAt: Scalars['DateTime']['output'];
6102
+ rating: ExploreFeedbackRating;
6103
+ /** One of INACCURATE INCOMPLETE OFF_TOPIC HARD_TO_FOLLOW OTHER. Null for HELPFUL. */
6104
+ reason?: Maybe<Scalars['String']['output']>;
6105
+ };
6106
+ export declare enum ExploreFeedbackRating {
6107
+ Helpful = "HELPFUL",
6108
+ NotHelpful = "NOT_HELPFUL"
6109
+ }
5906
6110
  /** Server-enforced limits, surfaced so the UI can pre-validate instead of discovering them through an error. */
5907
6111
  export type ExploreLimits = {
5908
6112
  __typename?: 'ExploreLimits';
@@ -5927,6 +6131,8 @@ export type ExploreMessage = {
5927
6131
  createdAt: Scalars['DateTime']['output'];
5928
6132
  ctas: Array<ExploreCta>;
5929
6133
  errorCode?: Maybe<Scalars['String']['output']>;
6134
+ /** What this visitor said about this answer, or null if they said nothing — which is the ordinary case. Never populated for a USER message or for an answer that has not completed: neither is a thing anyone can rate. */
6135
+ feedback?: Maybe<ExploreFeedback>;
5930
6136
  /** Suggested next questions, derived from what this answer actually covered. Empty until the turn completes, and empty when nothing useful can be derived. */
5931
6137
  followUps: Array<Scalars['String']['output']>;
5932
6138
  id: Scalars['ID']['output'];
@@ -6132,6 +6338,12 @@ export type ExternalOidcConfigurationInput = {
6132
6338
  redirectUri?: InputMaybe<Scalars['String']['input']>;
6133
6339
  scopes?: InputMaybe<Array<Scalars['String']['input']>>;
6134
6340
  };
6341
+ export type ExternalRefundResult = {
6342
+ __typename?: 'ExternalRefundResult';
6343
+ alreadyRecorded: Scalars['Boolean']['output'];
6344
+ chargeId: Scalars['ID']['output'];
6345
+ refundId: Scalars['ID']['output'];
6346
+ };
6135
6347
  export type ExternalSettlementResult = {
6136
6348
  __typename?: 'ExternalSettlementResult';
6137
6349
  /** True when the externalRef already had a settlement (idempotent replay). */
@@ -6384,6 +6596,10 @@ export type GetStoreProductTagsInput = {
6384
6596
  export type GrantAppDelegationInternalInput = {
6385
6597
  /** Client ID of the first-party system app (e.g. burdenoff_integration_core). */
6386
6598
  clientId: Scalars['String']['input'];
6599
+ /** 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
+ retainedScopes?: InputMaybe<Array<Scalars['String']['input']>>;
6601
+ /** 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). */
6602
+ retainedWorkspaceIds?: InputMaybe<Array<Scalars['String']['input']>>;
6387
6603
  /** Scopes to grant — must be a subset of the app's scopes. */
6388
6604
  scopes: Array<Scalars['String']['input']>;
6389
6605
  /** The user granting (and target of) the self-delegation. */
@@ -6393,6 +6609,8 @@ export type GrantAppDelegationInternalInput = {
6393
6609
  };
6394
6610
  export type GrantAppWorkspaceAccessInput = {
6395
6611
  appId: Scalars['ID']['input'];
6612
+ /** Restore a REVOKED authorization only if its revokedReason is exactly this value (one conditional write); otherwise behave as create-only. Lets an automated provisioner undo its own withdrawal but never an operator's revocation. Takes precedence over reactivateRevoked. */
6613
+ reactivateIfRevokedReason?: InputMaybe<Scalars['String']['input']>;
6396
6614
  /** Whether an existing REVOKED authorization may be restored. Defaults to true for explicit administrative grants. Automated provisioning should pass false so an operator revocation remains durable. */
6397
6615
  reactivateRevoked?: InputMaybe<Scalars['Boolean']['input']>;
6398
6616
  /** Optional subset of the app's global scopes. Empty array means the authorization inherits the app's full scope list. */
@@ -6718,6 +6936,8 @@ export type InitiatePaymentInput = {
6718
6936
  quantity?: InputMaybe<Scalars['Int']['input']>;
6719
6937
  /** Whether to save the card for future purchases (only for new card payments) */
6720
6938
  saveCard?: InputMaybe<Scalars['Boolean']['input']>;
6939
+ /** For PLAN purchase of a PER_SEAT plan: the number of seats to charge for. Clamped server-side to [plan.minSeats, plan.maxSeats]; defaults to plan.minSeats (or 1) when omitted. Ignored for FLAT_RATE plans. */
6940
+ seatCount?: InputMaybe<Scalars['Int']['input']>;
6721
6941
  /** For ADDON purchase: subscription ID to attach addon to. Required if billing account has multiple active subscriptions. If only one active subscription exists, it will be auto-selected. */
6722
6942
  subscriptionId?: InputMaybe<Scalars['ID']['input']>;
6723
6943
  /** For PLAN upgrade: the subscription ID being upgraded from. If provided, this is an upgrade - old quotas will be moved to new subscription. */
@@ -7114,6 +7334,8 @@ export type IssueAppAsUserTokenInternalInput = {
7114
7334
  scopes?: InputMaybe<Array<Scalars['String']['input']>>;
7115
7335
  /** The user the app will act on behalf of (must have an active delegation). */
7116
7336
  targetUserId: Scalars['String']['input'];
7337
+ /** Bind the token to this one workspace instead of every workspace the delegation covers. The delegation must cover it. Callers minting for a single workspace (an integration connection) should always pass it. */
7338
+ workspaceId?: InputMaybe<Scalars['String']['input']>;
7117
7339
  };
7118
7340
  export type ItemOrder = {
7119
7341
  __typename?: 'ItemOrder';
@@ -7923,6 +8145,8 @@ export type Mutation = {
7923
8145
  /** Accept an organization invite (must be logged in as the invited user) */
7924
8146
  acceptOrganizationInvite: OrganizationMember;
7925
8147
  acceptSourcingOffer: SourcingOrderSummary;
8148
+ /** Signed (DESIGN 3.7). The provider is ready: RESERVED to ACTIVE. */
8149
+ activateAvatarMinutes: AvatarMinutesReservation;
7926
8150
  /** Activate a channel */
7927
8151
  activateChannel: Channel;
7928
8152
  /** Activate a connection */
@@ -8099,6 +8323,8 @@ export type Mutation = {
8099
8323
  /** Clear all items from the cart */
8100
8324
  clearCart: CartPayload;
8101
8325
  cloneSchedule: ScheduledJob;
8326
+ /** Signed (DESIGN 3.7). The avatar's end decision: SETTLED with the charge, or RELEASED. */
8327
+ closeAvatarMinutes: AvatarMinutesReservation;
8102
8328
  closeSupportTicket: SupportTicket;
8103
8329
  /** Complete the OAuth flow after the user returns from the developer's OAuth page. Exchanges the authorization code for tokens and activates the integration connection. */
8104
8330
  completeAppOAuth: AppInstallation;
@@ -8109,6 +8335,8 @@ export type Mutation = {
8109
8335
  completeSupportAttachmentUpload: SupportAttachmentFile;
8110
8336
  /** Mark a tour as completed for a user */
8111
8337
  completeTour: TourUserProgress;
8338
+ configureAssistantAccountBudget: AssistantAccountBudget;
8339
+ configureAssistantModelPrice: AiModelPrice;
8112
8340
  configureEntitlementSeats: ProductEntitlement;
8113
8341
  /** Configure Kerberos authentication for a tenant */
8114
8342
  configureKerberos: KerberosConfig;
@@ -8309,6 +8537,8 @@ export type Mutation = {
8309
8537
  deactivateResource: Scalars['Boolean']['output'];
8310
8538
  /** Deactivate a tour schedule */
8311
8539
  deactivateTourSchedule: TourSchedule;
8540
+ /** Stops a subject from firing webhooks. The row is kept so a later registration reactivates it. Same ownership rule as registration. */
8541
+ deactivateWebhookEventSubject: WebhookEventSubject;
8312
8542
  /** Pure quota decrement — called by wspace-activity-svc after writing a UsageRecord. Only decrements QuotaAssignment.limits.value. Does NOT write back to activity-svc. Requires the quotaAssignmentId already resolved by checkQuotaExhausted. */
8313
8543
  decrementQuota: Scalars['Boolean']['output'];
8314
8544
  /** Delete current user's account permanently Requires password confirmation */
@@ -8463,6 +8693,7 @@ export type Mutation = {
8463
8693
  /** Detach media from a tour step */
8464
8694
  detachMediaFromStep: Scalars['Boolean']['output'];
8465
8695
  disableAuthMethod: Scalars['Boolean']['output'];
8696
+ /** Disable every MFA method of the caller. When `code` is given (a current TOTP code, or one of the caller's unused backup codes) it must verify against an enabled method before anything is disabled. */
8466
8697
  disableMFA: Scalars['Boolean']['output'];
8467
8698
  disableMaintenanceMode: MaintenanceModeStatus;
8468
8699
  disableSchedule: ScheduledJob;
@@ -8478,13 +8709,16 @@ export type Mutation = {
8478
8709
  enableMFA: Scalars['Boolean']['output'];
8479
8710
  enableMaintenanceMode: MaintenanceModeStatus;
8480
8711
  enrollSubscriberInAutomation: AutomationSubscriber;
8481
- /** Idempotently ensure a user is an organization member, primarily for the workspace-invite-accept flow where an invitee gains a workspace inside an org they're not yet a member of. Unlike `addOrganizationMember`: * Returns `OrganizationMember` whether the row was inserted or already existed — no CONFLICT on repeat calls (case 1: already a member). * Does NOT overwrite the existing `role` column on a pre-existing row (case 2: don't demote). * Triggers a real-role assignment in global-rbac-svc at scope = orgId only when the actor has NO existing role assignment at that scope (case 3: real role comes from RBAC, not the data-layer string). The `role` arg defaults to `GUEST` — the most restrictive enum value — because invitees arriving via a workspace invite should not gain first-class org membership. The data-layer string column is a coarse classifier; the authoritative permission decision is evaluated by global-rbac-svc against `actor_role_assignments`. See BOFF-2649 + the RBAC guide at `dev/platform/context/rbac/RBAC_GUIDE_FOR_AI_TOOLS.md`. Called from wspace-workspace-svc::acceptInvitation via service-context (`X-Actor-Type: service`), which bypasses the workspace-admin check inside the resolver. Best-effort from the caller's side — failures must NOT block the upstream invite acceptance. */
8712
+ /** Idempotently ensure a user is an organization member, primarily for the workspace-invite-accept flow where an invitee gains a workspace inside an org they're not yet a member of. Unlike `addOrganizationMember`: * Returns `OrganizationMember` whether the row was inserted or already existed — no CONFLICT on repeat calls (case 1: already a member). * Does NOT overwrite the existing `role` column on a pre-existing row (case 2: don't demote). * Triggers a real-role assignment in global-rbac-svc at scope = orgId only when the actor has NO existing role assignment at that scope (case 3: real role comes from RBAC, not the data-layer string). The `role` arg defaults to `GUEST` — the most restrictive enum value — because invitees arriving via a workspace invite should not gain first-class org membership. The data-layer string column is a coarse classifier; the authoritative permission decision is evaluated by global-rbac-svc against `actor_role_assignments`. See BOFF-2649 + the RBAC guide at `dev/platform/context/identity/rbac/RBAC_GUIDE_FOR_AI_TOOLS.md`. Called from wspace-workspace-svc::acceptInvitation via service-context (`X-Actor-Type: service`), which bypasses the workspace-admin check inside the resolver. Best-effort from the caller's side — failures must NOT block the upstream invite acceptance. */
8482
8713
  ensureOrganizationMember: EnsureOrganizationMemberResult;
8483
8714
  /** Ensure a billing order exists for a store order. Called from the checkout frontend when no billingOrderId is present (e.g. the buyer had no billing account at order-creation time). Creates the billing order server-side so the correct callbackGraphQL endpoint is registered and the billing service can call back after payment to confirm the store order. */
8484
8715
  ensureStoreOrderBillingOrder: EnsureStoreOrderBillingOrderResponse;
8485
8716
  /** Anonymise the subject on the billing layer. With dryRun=true, returns what would change without mutating. Financial records (Transaction, Invoice, Payment) are RETAINED for the statutory 7-year window. */
8486
8717
  eraseSubject: EraseResult;
8718
+ /** Hand this conversation to a person, with its transcript attached. The agent answers only from a baked corpus, so the questions it cannot answer are exactly the ones worth a person's time. This turns the dead end into a handover: it files the conversation as a contact inquiry — the same record the website contact form writes, in the same console, with the same emails — so nobody has to ask the visitor to type their problem out a second time. Requires the conversation token and nothing else. A token that does not own a conversation is reported as NOT_FOUND, never FORBIDDEN, exactly as every other token-scoped call reports it: FORBIDDEN would confirm the conversation exists. Unlike `submitExploreFeedback` this is NOT fire-and-forget — it throws rather than reporting a handover that did not happen, because the visitor is about to be told that someone will get back to them. Rate-limited on the same per-IP budget as sending a message and gated by the same reCAPTCHA, because it is the same anonymous visitor making another public write. Idempotent: one handover per conversation, so a double-clicked button returns the first one rather than putting a second ticket in front of support. */
8719
+ escalateExploreConversation: EscalateExploreConversationResult;
8487
8720
  escalateSupportTicket: SupportTicket;
8721
+ exchangeOwnDelegation: AppAsUserTokenResponse;
8488
8722
  /** Exchange app token for app-as-user token (Token Exchange flow) */
8489
8723
  exchangeToken: AppAsUserTokenResponse;
8490
8724
  executeJobNow: JobExecution;
@@ -8566,7 +8800,7 @@ export type Mutation = {
8566
8800
  initiateNTLMChallenge: NtlmChallengeResult;
8567
8801
  /** Initiate a payment for credits, plans, or addons This creates a Stripe PaymentIntent or Razorpay Order with tax included Returns client secret (Stripe) or order ID (Razorpay) for frontend to complete payment */
8568
8802
  initiatePayment: InitiatePaymentResponse;
8569
- /** Install an application */
8803
+ /** Install an application. For a workspace-private custom node, installing a newer version published to the organization over an active installation updates it (BOFF-9766); the previous version stays installed in the workspace so workflows pinned to it keep running, and uninstall removes every version. */
8570
8804
  installApp: AppInstallation;
8571
8805
  /** Install a purchased app to a workspace. Validates that the product was purchased before allowing installation. If orderId is not provided, will find the most recent processed order for this product. version: optional specific version to install (e.g. "1.2.0"), resolved against the linked devportal Application's published/deprecated versions. Omit to install the product's current latest version (default behavior). */
8572
8806
  installPurchasedApp: InstallPurchasedAppResult;
@@ -8613,6 +8847,8 @@ export type Mutation = {
8613
8847
  newsletterEraseSubject: NewsletterEraseResult;
8614
8848
  /** Export the subject's newsletter data: subscriber rows, per-list memberships, consent ledger entries, automation enrolments, waitlist entries. */
8615
8849
  newsletterExportSubject: Scalars['JSON']['output'];
8850
+ /** Signed (P-27). The settle owner's provider-status note for the fault list; writes no credits. */
8851
+ noteAvatarSessionProviderStatus: Scalars['Boolean']['output'];
8616
8852
  /** Notify candidates who have more than one application on file (and so may have received more than one take-home assignment email as a result of a since-fixed missing duplicate-email check) that they only need to complete ONE of the assignments they received (admin). Grouped by email address — sends exactly one notice per unique candidate email, never one per duplicate application/round, and re-running this is safe: an email already notified is skipped unless `force` is set. */
8617
8853
  notifyDuplicateApplicants: DuplicateNoticeResult;
8618
8854
  openCircuitBreaker: CircuitBreakerState;
@@ -8624,6 +8860,8 @@ export type Mutation = {
8624
8860
  payInvoice: Invoice;
8625
8861
  permanentlyDeleteSchedule: Scalars['Boolean']['output'];
8626
8862
  placeLegalHold: LegalHold;
8863
+ /** Internal-only: polls "Deploy Devportal Node" GitHub Actions run history and records the result in NodeSandboxBuildCheck — see services/nodeSandboxBuildPoll.ts. Invoked on a schedule by global-scheduler-svc's INTERNAL_API executor; also callable from the admin build-log UI for an on-demand refresh. Returns `skipped: true` (not an error) when NODE_SANDBOX_DISPATCH_TOKEN is unset OR the GitHub call itself fails (e.g. the token lacks Actions:read) — callers must check `skipped` rather than assume a non-error response means it actually polled. */
8864
+ pollNodeSandboxBuildChecks: NodeSandboxBuildPollResult;
8627
8865
  prepareSupportAttachmentUpload: SupportAttachmentUploadSession;
8628
8866
  /** Process a refund for an app sale. Privileged financial mutation: reverses money to a buyer and adjusts the org's pending balance. Gated on `devportal-sale:manage` (the same permission as `retrySaleCreditSync`), with an in-resolver org-ADMIN check as defense-in-depth. */
8629
8867
  processAppSaleRefund: DeveloperOrgSale;
@@ -8643,6 +8881,8 @@ export type Mutation = {
8643
8881
  publishApplication: Application;
8644
8882
  /** Developer action: submit a draft (or rejected) version for platform review. Status becomes pending_review. The store is NOT updated until an admin approves. */
8645
8883
  publishApplicationVersion: ApplicationVersion;
8884
+ /** Developer-organization admin action (BOFF-9657): publish a draft (or rejected) version of a PRIVATE NODE application straight to the workspaces of your organization, without platform review. The version must carry a package whose validation passed, a READY sandbox image and no failed or running operation smoke test. `workspaceId` is a workspace you administer; its organization becomes the node's owning organization on the first publish, and every later publish must come from that organization. The version is never listed in the public Node Store; it is installable only into workspaces of the owning organization. Authorization is enforced in the resolver: the caller must be an OWNER or ADMIN of the application's developer organization (or own a personal application) and an admin of `workspaceId`. The gateway's organization scope cannot evaluate this today because user sessions carry no verified organization claim, so the directive declares the permission and authenticates the caller. */
8885
+ publishApplicationVersionToOrganization: ApplicationVersion;
8646
8886
  /** Publish ONE curated catalog node version (from the fluidgrids-nodes repo) to every enabled sandbox provider — the same PublishOrchestrator the devportal path uses, so the two cannot drift. That drift is not hypothetical: the catalog previously had no publish trigger at all, so nodes were built and pinned by hand and 14 of 31 prod-bound nodes ended up running code older than fluidgrids-nodes main. One entrypoint, two triggers (devportal publish, catalog CI) is the fix. NOT actor-authenticated: the caller is CI, not a platform user or app, so this verifies a shared secret in the resolver (checked against DEVPORTAL_CALLBACK_SECRET, or CALLBACK_SECRET as shipped by the Secrets Manager bundle) exactly as reportNodeSandboxBuildStatus does. Sent as an argument rather than a header because global-public-gateway forwards only a fixed header allowlist to subgraphs. `zipUrl` must be fetchable by this service — CI uploads the packaged node and passes a presigned URL. `isFirstPublish` tells the orchestrator whether this node type has ever been built before, which is what lets it annotate a provider that cannot self-onboard (Cloudflare) instead of reporting a mystery failure. Defaults to false: a catalog node already running on Cloudflare has a Durable Object class, so only a genuinely new node should pass true. Returns a JSON array of per-provider outcomes so CI can log them and fail the job when nothing could build. */
8647
8887
  publishCatalogNodeVersion: Scalars['JSON']['output'];
8648
8888
  publishFAQ: Faq;
@@ -8682,6 +8922,8 @@ export type Mutation = {
8682
8922
  recordEarningEntry: EarningsEntry;
8683
8923
  /** Record that a visitor followed a link the answer offered. Fire-and-forget from the browser: a click must never be blocked or delayed by analytics, so this reports `recorded: false` rather than throwing when the click cannot be attributed. */
8684
8924
  recordExploreClick: RecordExploreClickResult;
8925
+ /** Record a completed external refund without invoking a payment provider. */
8926
+ recordExternalRefund: ExternalRefundResult;
8685
8927
  /** Record a SETTLED (or pending/failed) external/manual Charge + Transaction on behalf of a workspace/org by explicit id. Service/super_admin only — routed through the internal gateway. Bypasses the Stripe/Razorpay sync path. */
8686
8928
  recordExternalSettlement: ExternalSettlementResult;
8687
8929
  recordFAQView: Faq;
@@ -8714,6 +8956,8 @@ export type Mutation = {
8714
8956
  /** Register a resource with custom RBAC configurations. */
8715
8957
  registerResource: Resource;
8716
8958
  registerSupportAttachmentPart: Scalars['Boolean']['output'];
8959
+ /** 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
+ registerWebhookEventSubjects: Array<WebhookEventSubject>;
8717
8961
  reinstatePublisher: Publisher;
8718
8962
  rejectApplication: Application;
8719
8963
  /** Platform admin only: reject a pending_review version with a reason. The developer can fix their submission and re-submit. */
@@ -8794,6 +9038,8 @@ export type Mutation = {
8794
9038
  replaceChannelTags: Array<ChannelTagAssignment>;
8795
9039
  /** Replace all tags on a store product */
8796
9040
  replaceStoreProductTags: Array<StoreProductTagAssignment>;
9041
+ /** Replay one dead-lettered provider webhook through the durable worker. */
9042
+ replayBillingWebhook?: Maybe<BillingWebhookLog>;
8797
9043
  /** Send an email reply to a contact inquiry. The reply is sent via the notification pipeline (notification-svc → channel-svc → email provider). Auto-updates status to REVIEWED. */
8798
9044
  replyToContactInquiry: ContactInquiryReplyResult;
8799
9045
  /** Send a branded email reply to an applicant (admin). Delivered to the applicant's email via the notification pipeline. Does not change status — the admin controls status explicitly. `message` is rich-text HTML from the admin's editor; it is sanitized to an allowlist before it reaches the email. */
@@ -8831,6 +9077,9 @@ export type Mutation = {
8831
9077
  resendOrganizationInvite: OrganizationInvite;
8832
9078
  resendSurvey: CustomerSatisfactionSurvey;
8833
9079
  resendVerificationEmail: ResendVerificationResult;
9080
+ reserveAssistantAccountBudget: AssistantBudgetReceipt;
9081
+ /** Signed (DESIGN 3.7). Reserves credits for a session (ENFORCE) or records its shadow (OBSERVE). */
9082
+ reserveAvatarMinutes: AvatarMinutesReservation;
8834
9083
  resetCircuitBreaker: CircuitBreakerState;
8835
9084
  /** Reset password using token from email */
8836
9085
  resetPassword: Scalars['Boolean']['output'];
@@ -8852,6 +9101,8 @@ export type Mutation = {
8852
9101
  restoreChannel: Channel;
8853
9102
  restoreScheduleVersion: ScheduledJob;
8854
9103
  restoreTemplateVersion: NewsletterTemplate;
9104
+ /** Service-trusted internal REDUCTION of a first-party self-delegation, keyed by the app's client id and the user: used when one of several integration connections that share it is deleted or revoked. It never creates, re-enables or widens a delegation: it returns null when there is none (never granted, or erased), a REVOKED or EXPIRED one unchanged, and otherwise the delegation cut down to the requested scopes and workspaces it already held (REVOKED if none are left). Not blocked by a deactivated app: withdrawing access is always permitted. Gated to internal service / super_admin callers and restricted to first-party system apps. */
9105
+ restrictAppDelegationInternal?: Maybe<AppUserDelegation>;
8855
9106
  /** Public endpoint — no authentication required. Email is normalized (trimmed, lowercased) and validated in the provider. Returns NOT_FOUND when no matching unsubscribed record exists; does not leak which side of the check failed. */
8856
9107
  resubscribe: NewsletterSubscriber;
8857
9108
  /** Resume a paused subscription */
@@ -8869,6 +9120,8 @@ export type Mutation = {
8869
9120
  /** Retry invoice generation for a successful transaction that never got an invoice recorded (a transient Zoho Books/Stripe Invoicing failure at payment time). transactionId is the transaction that has no invoiceNumber in its metadata yet — surfaced via getTransactionsByBillingAccount / getTransaction, not the invoice list (which only shows transactions that already have an invoice). */
8870
9121
  retryInvoiceGeneration: Invoice;
8871
9122
  retryJobExecution: JobExecution;
9123
+ /** Platform admin only: re-dispatch the sandbox image build for a NODE version whose build never completed (stuck PENDING) or failed (FAILED / DISPATCH_FAILED / UNSUPPORTED). Calls the exact same dispatch path a fresh publish uses — it does not create a new version or touch review status, it only re-attempts the build for the existing one. */
9124
+ retryNodeSandboxBuild: Scalars['Boolean']['output'];
8872
9125
  /** Retry a failed payout */
8873
9126
  retryPayout: DeveloperOrgPayout;
8874
9127
  /** Retry a failed refund */
@@ -8881,7 +9134,9 @@ export type Mutation = {
8881
9134
  revokeAPIKey: Scalars['Boolean']['output'];
8882
9135
  /** Revoke all sessions except the current one. Returns the number of sessions that were revoked. */
8883
9136
  revokeAllSessions: RevokeAllSessionsResult;
8884
- /** Revoke an app's access to a workspace. Returns false if the row was already REVOKED or never existed. */
9137
+ /** Service-trusted internal revoke of a first-party self-delegation, keyed by the app's client id and the user — the counterpart of grantAppDelegationInternal, used when the last integration connection that needed it is deleted or revoked. Idempotent: returns true when an ACTIVE delegation was revoked and false when there was none (never granted, already revoked or expired). Gated to internal service / super_admin callers and restricted to first-party system apps. */
9138
+ revokeAppDelegationInternal: Scalars['Boolean']['output'];
9139
+ /** Revoke an app's access to a workspace. Returns false if the row was already REVOKED or never existed. An owner or super_admin revoking an already-REVOKED row replaces the revocation on record (reason, actor, time). */
8885
9140
  revokeAppWorkspaceAccess: Scalars['Boolean']['output'];
8886
9141
  revokeConsent: NewsletterConsent;
8887
9142
  revokeDelegation: Scalars['Boolean']['output'];
@@ -8907,7 +9162,7 @@ export type Mutation = {
8907
9162
  rotateConnectionCredentials: ChannelConnection;
8908
9163
  /** Run health check on a channel */
8909
9164
  runChannelHealthCheck: ChannelHealthCheck;
8910
- /** Admin/service-initiated DSAR for an arbitrary subject (e.g. a support-filed or regulator-filed request, or a same-layer service driving the flow on a subject's behalf). Restricted to super_admin and service actors only — never reachable by a regular user for another person's data. */
9165
+ /** Admin/service-initiated DSAR for an arbitrary subject (e.g. a support-filed or regulator-filed request, or a same-layer service driving the flow on a subject's behalf). Restricted to super_admin and service actors only — never reachable by a regular user for another person's data. `subjectEmail` is optional and additive: it lets the fan-out also reach records that are keyed by email only (e.g. a guest contact-inquiry or a newsletter signup with no account), such as `ContactInquiry`, `NewsletterWaitlist`, and `NewsletterSuppression`. Omit it for a subject who only has account-linked records. */
8911
9166
  runDsarRequestForSubject: DsarOrchestrationResult;
8912
9167
  runMonthlyPayouts: PayoutRunLog;
8913
9168
  /** Self-service DSAR: export or erase the CALLING actor's own data across every fan-out target. Self-scoped (Type-A pattern) — subjectId is always the calling actor's own id; there is no identity argument, so this can never be used to act on someone else's data. */
@@ -8921,6 +9176,8 @@ export type Mutation = {
8921
9176
  scheduleNotification: ScheduledNotification;
8922
9177
  /** Overwrite the built-in AthleteBridge user-facing tours from the service-owned seed file. */
8923
9178
  seedAtheleteBridgeUserTours: SeedAtheleteBridgeUserToursResult;
9179
+ /** Overwrite the service-owned BigConsole onboarding tours. Repeated calls update the same slugs. */
9180
+ seedBigconsoleUserTours: SeedBigconsoleUserToursResult;
8924
9181
  /** Overwrite the built-in Buildmyiq user-facing dashboard tour from the service-owned seed file. */
8925
9182
  seedBuildmyiqUserTours: SeedBuildmyiqUserToursResult;
8926
9183
  /** Overwrite the built-in CollabKin user-facing dashboard tour from the service-owned seed file. */
@@ -8963,6 +9220,8 @@ export type Mutation = {
8963
9220
  serviceResolvePayoutAccount: PayoutAccount;
8964
9221
  /** 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. */
8965
9222
  serviceSyncPayoutStatus?: Maybe<DeveloperOrgPayout>;
9223
+ /** 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. */
9224
+ serviceUpsertExternalListing: StoreProduct;
8966
9225
  setAgentAway: AgentProfile;
8967
9226
  setAgentOffline: AgentProfile;
8968
9227
  setAgentOnline: AgentProfile;
@@ -8992,6 +9251,7 @@ export type Mutation = {
8992
9251
  setUserLanguagePreference: UserLanguagePreference;
8993
9252
  /** Set workspace-level override for a feature flag (super admin or workspace admin). RBAC is scoped to the target workspace via `input.workspaceId`. */
8994
9253
  setWorkspaceFeatureFlagOverride: WorkspaceFeatureFlagOverride;
9254
+ settleAssistantAccountBudget: AssistantBudgetReceipt;
8995
9255
  setupMFA: MfaSetupResult;
8996
9256
  /** Share a WORKFLOW-type application as a public link by setting its visibility to UNLISTED. Only the developer who owns the app can call this. The app must have a manifest (workflow definition) set. */
8997
9257
  shareWorkflow: Application;
@@ -9019,6 +9279,8 @@ export type Mutation = {
9019
9279
  submitAssignmentResponse: SubmitAssignmentResponsePayload;
9020
9280
  /** Submit a contact inquiry from a public website (no authentication required). Validates reCAPTCHA token server-side using the product's secret key fetched from the tenant service via internal gateway. */
9021
9281
  submitContactInquiry: SubmitContactInquiryResult;
9282
+ /** Rate one answer. Same fire-and-forget posture as `recordExploreClick`: a rating that cannot be attributed — an unfinished answer, a USER turn, a token that does not own the message — comes back `recorded: false` rather than as an error, and never as FORBIDDEN, which would confirm that a message id exists. Submitting again REPLACES the previous rating for that message, so changing your mind is an ordinary action rather than a duplicate or a failure. */
9283
+ submitExploreFeedback: SubmitExploreFeedbackResult;
9022
9284
  /** Submit feedback for an interview round (admin). */
9023
9285
  submitInterviewFeedback: InterviewFeedback;
9024
9286
  /** Submit a job application from a public website (no authentication required). Validates reCAPTCHA, stores the resume in private storage, and notifies the applicant + careers inbox. */
@@ -9049,6 +9311,8 @@ export type Mutation = {
9049
9311
  syncStoreSubmissionStatus: Scalars['Boolean']['output'];
9050
9312
  /** Sync tour steps (smart update in ONE call) Send all desired steps, backend handles: update existing, create new, delete removed */
9051
9313
  syncTourSteps: Array<TourStep>;
9314
+ /** Mirror a workspace deletion from the workspace layer to the global layer. Called by wspace-workspace-svc after its deleteWorkspace soft-deletes the workspace, so the global registry (myWorkspaces, the context switcher, routing) stops listing it as ACTIVE. Marks the global row DELETED and keeps it for audit. Idempotent: an unknown or already-deleted workspace succeeds without changes. */
9315
+ syncWorkspaceDeletionFromWspace: SyncWorkspaceFromWspaceResponse;
9052
9316
  /** Sync workspace metadata from workspace layer to global layer. Called by wspace-workspace-svc when a workspace is created directly via workspace layer. This is the reverse of syncFromGlobal - it syncs global ← wspace. Creates workspace metadata + owner membership in global-tenant-svc. */
9053
9317
  syncWorkspaceFromWspace: SyncWorkspaceFromWspaceResponse;
9054
9318
  tagChannel: ChannelTagAssignment;
@@ -9303,7 +9567,6 @@ export type Mutation = {
9303
9567
  /** M2M: create or update a ShippingAddress for an EXPLICIT user, on behalf of a calling service. Product backends (e.g. Kadaikodi) call this through the INTERNAL gateway so a user's address lives in the canonical store owner rather than a per-product copy. Pass `input.id` to update an existing row (must belong to `input.userId`); omit it to create. Service-actor only. */
9304
9568
  upsertUserShippingAddress: ShippingAddress;
9305
9569
  useCannedResponse: CannedResponse;
9306
- validateApiKey: TokenValidationResponse;
9307
9570
  /** Validate an HMAC signature */
9308
9571
  validateHMACSignature: HmacValidationResult;
9309
9572
  /** Validate a signed cookie */
@@ -9344,6 +9607,13 @@ export type MutationAcceptSourcingOfferArgs = {
9344
9607
  offerId: Scalars['ID']['input'];
9345
9608
  };
9346
9609
  /** Root mutation type */
9610
+ export type MutationActivateAvatarMinutesArgs = {
9611
+ readyAt: Scalars['String']['input'];
9612
+ sessionId: Scalars['ID']['input'];
9613
+ signature: AvatarMinutesSignature;
9614
+ workspaceId: Scalars['ID']['input'];
9615
+ };
9616
+ /** Root mutation type */
9347
9617
  export type MutationActivateChannelArgs = {
9348
9618
  id: Scalars['ID']['input'];
9349
9619
  };
@@ -9634,10 +9904,12 @@ export type MutationAttachMediaToStepArgs = {
9634
9904
  /** Root mutation type */
9635
9905
  export type MutationAuthEraseSubjectArgs = {
9636
9906
  dryRun?: InputMaybe<Scalars['Boolean']['input']>;
9907
+ subjectEmail?: InputMaybe<Scalars['String']['input']>;
9637
9908
  subjectId: Scalars['ID']['input'];
9638
9909
  };
9639
9910
  /** Root mutation type */
9640
9911
  export type MutationAuthExportSubjectArgs = {
9912
+ subjectEmail?: InputMaybe<Scalars['String']['input']>;
9641
9913
  subjectId: Scalars['ID']['input'];
9642
9914
  };
9643
9915
  /** Root mutation type */
@@ -9855,6 +10127,11 @@ export type MutationCloneScheduleArgs = {
9855
10127
  sourceId: Scalars['ID']['input'];
9856
10128
  };
9857
10129
  /** Root mutation type */
10130
+ export type MutationCloseAvatarMinutesArgs = {
10131
+ input: CloseAvatarMinutesInput;
10132
+ signature: AvatarMinutesSignature;
10133
+ };
10134
+ /** Root mutation type */
9858
10135
  export type MutationCloseSupportTicketArgs = {
9859
10136
  id: Scalars['ID']['input'];
9860
10137
  };
@@ -9888,6 +10165,19 @@ export type MutationCompleteTourArgs = {
9888
10165
  userId: Scalars['ID']['input'];
9889
10166
  };
9890
10167
  /** Root mutation type */
10168
+ export type MutationConfigureAssistantAccountBudgetArgs = {
10169
+ billingAccountId: Scalars['ID']['input'];
10170
+ dailyMicroUsd: Scalars['Int']['input'];
10171
+ dailyTokens: Scalars['Int']['input'];
10172
+ enabled: Scalars['Boolean']['input'];
10173
+ };
10174
+ /** Root mutation type */
10175
+ export type MutationConfigureAssistantModelPriceArgs = {
10176
+ inputPer1M: Scalars['String']['input'];
10177
+ model: Scalars['String']['input'];
10178
+ outputPer1M: Scalars['String']['input'];
10179
+ };
10180
+ /** Root mutation type */
9891
10181
  export type MutationConfigureEntitlementSeatsArgs = {
9892
10182
  entitlementId: Scalars['ID']['input'];
9893
10183
  maxSeats: Scalars['Int']['input'];
@@ -10450,6 +10740,10 @@ export type MutationDeactivateTourScheduleArgs = {
10450
10740
  id: Scalars['ID']['input'];
10451
10741
  };
10452
10742
  /** Root mutation type */
10743
+ export type MutationDeactivateWebhookEventSubjectArgs = {
10744
+ subject: Scalars['String']['input'];
10745
+ };
10746
+ /** Root mutation type */
10453
10747
  export type MutationDecrementQuotaArgs = {
10454
10748
  amount: Scalars['Int']['input'];
10455
10749
  billingAccountId: Scalars['ID']['input'];
@@ -10848,6 +11142,10 @@ export type MutationDisableAuthMethodArgs = {
10848
11142
  authType: AuthType;
10849
11143
  };
10850
11144
  /** Root mutation type */
11145
+ export type MutationDisableMfaArgs = {
11146
+ code?: InputMaybe<Scalars['String']['input']>;
11147
+ };
11148
+ /** Root mutation type */
10851
11149
  export type MutationDisableScheduleArgs = {
10852
11150
  id: Scalars['ID']['input'];
10853
11151
  reason?: InputMaybe<Scalars['String']['input']>;
@@ -10910,15 +11208,24 @@ export type MutationEnsureStoreOrderBillingOrderArgs = {
10910
11208
  /** Root mutation type */
10911
11209
  export type MutationEraseSubjectArgs = {
10912
11210
  dryRun?: InputMaybe<Scalars['Boolean']['input']>;
11211
+ subjectEmail?: InputMaybe<Scalars['String']['input']>;
10913
11212
  subjectId: Scalars['ID']['input'];
10914
11213
  };
10915
11214
  /** Root mutation type */
11215
+ export type MutationEscalateExploreConversationArgs = {
11216
+ input: EscalateExploreConversationInput;
11217
+ };
11218
+ /** Root mutation type */
10916
11219
  export type MutationEscalateSupportTicketArgs = {
10917
11220
  escalateTo?: InputMaybe<Scalars['String']['input']>;
10918
11221
  id: Scalars['ID']['input'];
10919
11222
  reason: Scalars['String']['input'];
10920
11223
  };
10921
11224
  /** Root mutation type */
11225
+ export type MutationExchangeOwnDelegationArgs = {
11226
+ input: ExchangeOwnDelegationInput;
11227
+ };
11228
+ /** Root mutation type */
10922
11229
  export type MutationExchangeTokenArgs = {
10923
11230
  input: ExchangeTokenInput;
10924
11231
  };
@@ -10967,6 +11274,7 @@ export type MutationExportRevenueArgs = {
10967
11274
  };
10968
11275
  /** Root mutation type */
10969
11276
  export type MutationExportSubjectArgs = {
11277
+ subjectEmail?: InputMaybe<Scalars['String']['input']>;
10970
11278
  subjectId: Scalars['ID']['input'];
10971
11279
  };
10972
11280
  /** Root mutation type */
@@ -11254,6 +11562,12 @@ export type MutationNewsletterExportSubjectArgs = {
11254
11562
  subjectId: Scalars['ID']['input'];
11255
11563
  };
11256
11564
  /** Root mutation type */
11565
+ export type MutationNoteAvatarSessionProviderStatusArgs = {
11566
+ sessionId: Scalars['ID']['input'];
11567
+ signature: AvatarMinutesSignature;
11568
+ status: AvatarProviderSessionStatus;
11569
+ };
11570
+ /** Root mutation type */
11257
11571
  export type MutationNotifyDuplicateApplicantsArgs = {
11258
11572
  input: NotifyDuplicateApplicantsInput;
11259
11573
  };
@@ -11338,6 +11652,11 @@ export type MutationPublishApplicationVersionArgs = {
11338
11652
  id: Scalars['ID']['input'];
11339
11653
  };
11340
11654
  /** Root mutation type */
11655
+ export type MutationPublishApplicationVersionToOrganizationArgs = {
11656
+ id: Scalars['ID']['input'];
11657
+ workspaceId: Scalars['ID']['input'];
11658
+ };
11659
+ /** Root mutation type */
11341
11660
  export type MutationPublishCatalogNodeVersionArgs = {
11342
11661
  isFirstPublish?: InputMaybe<Scalars['Boolean']['input']>;
11343
11662
  nodeType: Scalars['String']['input'];
@@ -11469,6 +11788,10 @@ export type MutationRecordExploreClickArgs = {
11469
11788
  input: RecordExploreClickInput;
11470
11789
  };
11471
11790
  /** Root mutation type */
11791
+ export type MutationRecordExternalRefundArgs = {
11792
+ input: RecordExternalRefundInput;
11793
+ };
11794
+ /** Root mutation type */
11472
11795
  export type MutationRecordExternalSettlementArgs = {
11473
11796
  input: RecordExternalSettlementInput;
11474
11797
  };
@@ -11556,6 +11879,10 @@ export type MutationRegisterSupportAttachmentPartArgs = {
11556
11879
  input: RegisterSupportAttachmentPartInput;
11557
11880
  };
11558
11881
  /** Root mutation type */
11882
+ export type MutationRegisterWebhookEventSubjectsArgs = {
11883
+ input: RegisterWebhookEventSubjectsInput;
11884
+ };
11885
+ /** Root mutation type */
11559
11886
  export type MutationReinstatePublisherArgs = {
11560
11887
  id: Scalars['ID']['input'];
11561
11888
  };
@@ -11778,6 +12105,10 @@ export type MutationReplaceStoreProductTagsArgs = {
11778
12105
  input: ReplaceStoreProductTagsInput;
11779
12106
  };
11780
12107
  /** Root mutation type */
12108
+ export type MutationReplayBillingWebhookArgs = {
12109
+ logId: Scalars['ID']['input'];
12110
+ };
12111
+ /** Root mutation type */
11781
12112
  export type MutationReplyToContactInquiryArgs = {
11782
12113
  id: Scalars['ID']['input'];
11783
12114
  message: Scalars['String']['input'];
@@ -11877,6 +12208,15 @@ export type MutationResendVerificationEmailArgs = {
11877
12208
  email: Scalars['String']['input'];
11878
12209
  };
11879
12210
  /** Root mutation type */
12211
+ export type MutationReserveAssistantAccountBudgetArgs = {
12212
+ input: ReserveAssistantBudgetInput;
12213
+ };
12214
+ /** Root mutation type */
12215
+ export type MutationReserveAvatarMinutesArgs = {
12216
+ input: ReserveAvatarMinutesInput;
12217
+ signature: AvatarMinutesSignature;
12218
+ };
12219
+ /** Root mutation type */
11880
12220
  export type MutationResetCircuitBreakerArgs = {
11881
12221
  scope: Scalars['String']['input'];
11882
12222
  scopeValue: Scalars['String']['input'];
@@ -11943,6 +12283,10 @@ export type MutationRestoreTemplateVersionArgs = {
11943
12283
  version: Scalars['Int']['input'];
11944
12284
  };
11945
12285
  /** Root mutation type */
12286
+ export type MutationRestrictAppDelegationInternalArgs = {
12287
+ input: RestrictAppDelegationInternalInput;
12288
+ };
12289
+ /** Root mutation type */
11946
12290
  export type MutationResubscribeArgs = {
11947
12291
  email: Scalars['String']['input'];
11948
12292
  platformProductId?: InputMaybe<Scalars['String']['input']>;
@@ -11992,6 +12336,10 @@ export type MutationRetryJobExecutionArgs = {
11992
12336
  executionId: Scalars['ID']['input'];
11993
12337
  };
11994
12338
  /** Root mutation type */
12339
+ export type MutationRetryNodeSandboxBuildArgs = {
12340
+ id: Scalars['ID']['input'];
12341
+ };
12342
+ /** Root mutation type */
11995
12343
  export type MutationRetryPayoutArgs = {
11996
12344
  id: Scalars['ID']['input'];
11997
12345
  };
@@ -12021,6 +12369,10 @@ export type MutationRevokeApiKeyArgs = {
12021
12369
  keyId: Scalars['String']['input'];
12022
12370
  };
12023
12371
  /** Root mutation type */
12372
+ export type MutationRevokeAppDelegationInternalArgs = {
12373
+ input: RevokeAppDelegationInternalInput;
12374
+ };
12375
+ /** Root mutation type */
12024
12376
  export type MutationRevokeAppWorkspaceAccessArgs = {
12025
12377
  input: RevokeAppWorkspaceAccessInput;
12026
12378
  };
@@ -12098,6 +12450,7 @@ export type MutationRunChannelHealthCheckArgs = {
12098
12450
  export type MutationRunDsarRequestForSubjectArgs = {
12099
12451
  dryRun?: InputMaybe<Scalars['Boolean']['input']>;
12100
12452
  mode: DsarMode;
12453
+ subjectEmail?: InputMaybe<Scalars['String']['input']>;
12101
12454
  subjectId: Scalars['ID']['input'];
12102
12455
  };
12103
12456
  /** Root mutation type */
@@ -12195,6 +12548,10 @@ export type MutationServiceSyncPayoutStatusArgs = {
12195
12548
  input: ServiceSyncPayoutStatusInput;
12196
12549
  };
12197
12550
  /** Root mutation type */
12551
+ export type MutationServiceUpsertExternalListingArgs = {
12552
+ input: ServiceUpsertExternalListingInput;
12553
+ };
12554
+ /** Root mutation type */
12198
12555
  export type MutationSetAgentAwayArgs = {
12199
12556
  message?: InputMaybe<Scalars['String']['input']>;
12200
12557
  };
@@ -12263,6 +12620,13 @@ export type MutationSetWorkspaceFeatureFlagOverrideArgs = {
12263
12620
  input: SetWorkspaceFeatureFlagOverrideInput;
12264
12621
  };
12265
12622
  /** Root mutation type */
12623
+ export type MutationSettleAssistantAccountBudgetArgs = {
12624
+ id: Scalars['ID']['input'];
12625
+ inputTokens: Scalars['Int']['input'];
12626
+ outputTokens: Scalars['Int']['input'];
12627
+ workspaceId: Scalars['ID']['input'];
12628
+ };
12629
+ /** Root mutation type */
12266
12630
  export type MutationSetupMfaArgs = {
12267
12631
  method: MfaMethod;
12268
12632
  };
@@ -12340,6 +12704,10 @@ export type MutationSubmitContactInquiryArgs = {
12340
12704
  input: SubmitContactInquiryInput;
12341
12705
  };
12342
12706
  /** Root mutation type */
12707
+ export type MutationSubmitExploreFeedbackArgs = {
12708
+ input: SubmitExploreFeedbackInput;
12709
+ };
12710
+ /** Root mutation type */
12343
12711
  export type MutationSubmitInterviewFeedbackArgs = {
12344
12712
  input: SubmitInterviewFeedbackInput;
12345
12713
  };
@@ -12371,10 +12739,12 @@ export type MutationSubscribeToStoreArgs = {
12371
12739
  /** Root mutation type */
12372
12740
  export type MutationSupportEraseSubjectArgs = {
12373
12741
  dryRun?: InputMaybe<Scalars['Boolean']['input']>;
12742
+ subjectEmail?: InputMaybe<Scalars['String']['input']>;
12374
12743
  subjectId: Scalars['ID']['input'];
12375
12744
  };
12376
12745
  /** Root mutation type */
12377
12746
  export type MutationSupportExportSubjectArgs = {
12747
+ subjectEmail?: InputMaybe<Scalars['String']['input']>;
12378
12748
  subjectId: Scalars['ID']['input'];
12379
12749
  };
12380
12750
  /** Root mutation type */
@@ -12418,6 +12788,10 @@ export type MutationSyncTourStepsArgs = {
12418
12788
  tourId: Scalars['ID']['input'];
12419
12789
  };
12420
12790
  /** Root mutation type */
12791
+ export type MutationSyncWorkspaceDeletionFromWspaceArgs = {
12792
+ workspaceId: Scalars['ID']['input'];
12793
+ };
12794
+ /** Root mutation type */
12421
12795
  export type MutationSyncWorkspaceFromWspaceArgs = {
12422
12796
  input: SyncWorkspaceFromWspaceInput;
12423
12797
  };
@@ -13215,10 +13589,6 @@ export type MutationUseCannedResponseArgs = {
13215
13589
  id: Scalars['ID']['input'];
13216
13590
  };
13217
13591
  /** Root mutation type */
13218
- export type MutationValidateApiKeyArgs = {
13219
- apiKey: Scalars['String']['input'];
13220
- };
13221
- /** Root mutation type */
13222
13592
  export type MutationValidateHmacSignatureArgs = {
13223
13593
  algorithm?: InputMaybe<Scalars['String']['input']>;
13224
13594
  appId: Scalars['ID']['input'];
@@ -13655,6 +14025,39 @@ export declare enum NewsletterWaitlistStatus {
13655
14025
  Pending = "PENDING",
13656
14026
  Rejected = "REJECTED"
13657
14027
  }
14028
+ /** One observed run of the "Deploy Devportal Node" GitHub Actions workflow, polled from run history rather than pushed via callback — see workers/nodeSandboxBuildPoll.ts. applicationVersionId/slug/version are best-effort, parsed from the run's title; null on runs from before the workflow embedded them, or a title that didn't parse. */
14029
+ export type NodeSandboxBuildCheck = {
14030
+ __typename?: 'NodeSandboxBuildCheck';
14031
+ applicationVersionId?: Maybe<Scalars['String']['output']>;
14032
+ checkedAt: Scalars['DateTime']['output'];
14033
+ failureStep?: Maybe<Scalars['String']['output']>;
14034
+ id: Scalars['ID']['output'];
14035
+ runConclusion?: Maybe<Scalars['String']['output']>;
14036
+ runId: Scalars['String']['output'];
14037
+ runStartedAt?: Maybe<Scalars['DateTime']['output']>;
14038
+ runStatus: Scalars['String']['output'];
14039
+ runUpdatedAt?: Maybe<Scalars['DateTime']['output']>;
14040
+ runUrl: Scalars['String']['output'];
14041
+ slug?: Maybe<Scalars['String']['output']>;
14042
+ version?: Maybe<Scalars['String']['output']>;
14043
+ };
14044
+ export type NodeSandboxBuildCheckConnection = {
14045
+ __typename?: 'NodeSandboxBuildCheckConnection';
14046
+ edges: Array<NodeSandboxBuildCheckEdge>;
14047
+ pageInfo: PageInfo;
14048
+ totalCount: Scalars['Int']['output'];
14049
+ };
14050
+ export type NodeSandboxBuildCheckEdge = {
14051
+ __typename?: 'NodeSandboxBuildCheckEdge';
14052
+ cursor: Scalars['String']['output'];
14053
+ node: NodeSandboxBuildCheck;
14054
+ };
14055
+ /** Result of a pollNodeSandboxBuildChecks call. `skipped: true` means no GitHub Actions run history was fetched this call (token unset or the GitHub API call failed) — `recorded` is only meaningful when `skipped` is false. */
14056
+ export type NodeSandboxBuildPollResult = {
14057
+ __typename?: 'NodeSandboxBuildPollResult';
14058
+ recorded: Scalars['Int']['output'];
14059
+ skipped: Scalars['Boolean']['output'];
14060
+ };
13658
14061
  export type Notification = {
13659
14062
  __typename?: 'Notification';
13660
14063
  actions: Array<NotificationAction>;
@@ -13939,6 +14342,14 @@ export type NotificationReadFilterInput = {
13939
14342
  type?: InputMaybe<NotificationType>;
13940
14343
  userId: Scalars['ID']['input'];
13941
14344
  };
14345
+ /** Sender-owned processing status only; provider acknowledgement is not delivery certification. */
14346
+ export type NotificationSendStatus = {
14347
+ __typename?: 'NotificationSendStatus';
14348
+ deliveryStatus?: Maybe<NotificationDeliveryStatus>;
14349
+ id: Scalars['ID']['output'];
14350
+ status: NotificationStatus;
14351
+ triggerStatus: TriggerStatus;
14352
+ };
13942
14353
  export type NotificationStats = {
13943
14354
  __typename?: 'NotificationStats';
13944
14355
  byChannel: Scalars['JSON']['output'];
@@ -14436,6 +14847,41 @@ export type OrganizationMemberList = {
14436
14847
  offset: Scalars['Int']['output'];
14437
14848
  total: Scalars['Int']['output'];
14438
14849
  };
14850
+ /** A workspace-private custom node of a workspace's organization (BOFF-9766). */
14851
+ export type OrganizationPrivateNode = {
14852
+ __typename?: 'OrganizationPrivateNode';
14853
+ applicationId: Scalars['ID']['output'];
14854
+ iconUrl?: Maybe<Scalars['String']['output']>;
14855
+ /** This workspace's active installation. Pass it to uninstallApp to remove the node. */
14856
+ installationId?: Maybe<Scalars['ID']['output']>;
14857
+ /** True when this workspace has an active installation of the node. */
14858
+ installed: Scalars['Boolean']['output'];
14859
+ /** The version this workspace has installed, when installed. */
14860
+ installedVersion?: Maybe<Scalars['String']['output']>;
14861
+ name: Scalars['String']['output'];
14862
+ /** Workflow node type from the version's manifest, e.g. custom/word_counter. */
14863
+ nodeType?: Maybe<Scalars['String']['output']>;
14864
+ nodeVersion?: Maybe<Scalars['String']['output']>;
14865
+ publishedAt?: Maybe<Scalars['DateTime']['output']>;
14866
+ shortDescription?: Maybe<Scalars['String']['output']>;
14867
+ slug: Scalars['String']['output'];
14868
+ /** Installed, and the organization has since published a newer version. */
14869
+ updateAvailable: Scalars['Boolean']['output'];
14870
+ /** Latest version published to the organization. Pass it to installApp. */
14871
+ version: Scalars['String']['output'];
14872
+ /** Id of the latest version published to the organization. */
14873
+ versionId: Scalars['ID']['output'];
14874
+ };
14875
+ /** The private custom nodes a workspace's organization has published, as seen from one workspace (BOFF-9766). */
14876
+ export type OrganizationPrivateNodeListing = {
14877
+ __typename?: 'OrganizationPrivateNodeListing';
14878
+ /** True when the caller administers the workspace and so may install or uninstall. */
14879
+ canManage: Scalars['Boolean']['output'];
14880
+ nodes: Array<OrganizationPrivateNode>;
14881
+ /** Organization the workspace belongs to; null when the caller is not a member or the workspace has no organization. */
14882
+ organizationId?: Maybe<Scalars['ID']['output']>;
14883
+ workspaceId: Scalars['ID']['output'];
14884
+ };
14439
14885
  export type OrganizationScheduleQuotas = {
14440
14886
  __typename?: 'OrganizationScheduleQuotas';
14441
14887
  currentActiveSchedules: Scalars['Int']['output'];
@@ -14694,6 +15140,8 @@ export declare enum PaymentMethodType {
14694
15140
  Crypto = "CRYPTO",
14695
15141
  DebitCard = "DEBIT_CARD",
14696
15142
  Netbanking = "NETBANKING",
15143
+ /** Zero-total purchases (e.g. a 100%-off coupon) — no gateway/method involved. */
15144
+ None = "NONE",
14697
15145
  Paypal = "PAYPAL",
14698
15146
  Wallet = "WALLET"
14699
15147
  }
@@ -14985,6 +15433,8 @@ export type Plan = {
14985
15433
  minSeats?: Maybe<Scalars['Int']['output']>;
14986
15434
  /** The name of the plan (e.g., 'Basic', 'Pro', 'Enterprise'). */
14987
15435
  name?: Maybe<Scalars['String']['output']>;
15436
+ /** Apple App Store / Google Play SKU for this plan. */
15437
+ nativeProductId?: Maybe<Scalars['String']['output']>;
14988
15438
  /** The price of the plan. */
14989
15439
  price?: Maybe<Scalars['Float']['output']>;
14990
15440
  /** Historical record of price changes for this plan */
@@ -15914,6 +16364,8 @@ export type Query = {
15914
16364
  agentProfile?: Maybe<AgentProfile>;
15915
16365
  agentProfileByUserId?: Maybe<AgentProfile>;
15916
16366
  agentProfiles: AgentProfileConnection;
16367
+ /** Schema capability for optional cache counts. Older callers keep input/output-only pricing. */
16368
+ aiCacheTokenPricingSupported: Scalars['Boolean']['output'];
15917
16369
  /** Active per-model LLM token prices (USD per 1M tokens) used for AI-credit weighting. */
15918
16370
  aiModelPrices: Array<AiModelPrice>;
15919
16371
  /** Admin query: list all organizations in the platform (optionally filtered). Requires global 'organization:read' permission — super admins and platform admins only. For end-user "my orgs" access use myOrganizations instead. */
@@ -15963,6 +16415,8 @@ export type Query = {
15963
16415
  availableAuthMethods: Array<AuthMethod>;
15964
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. */
15965
16417
  availableFeaturePreviews: Array<FeatureFlag>;
16418
+ /** Signed (DESIGN 3.7). The workspace's balance, in the person's view when actorId is given. */
16419
+ avatarMinutesForService: AvatarMinutesBalance;
15966
16420
  bounceStats: BounceStats;
15967
16421
  /** Browse store products with unified filtering, sorting, and pagination. Search is treated as a filter - all filters combine with AND logic. Example usage: ```graphql query { browseStore(input: { filter: { search: "ai notification" type: NODE pricingModel: FREE minRating: 4.0 compatibleWith: "workspaces" } sortBy: RELEVANCE pagination: { limit: 20, offset: 0 } }) { products { id name rating downloads } totalCount hasMore facets { categories { value count } } } } ``` */
15968
16422
  browseStore: BrowseStoreResult;
@@ -16348,6 +16802,8 @@ export type Query = {
16348
16802
  /** Public listing of an application's installable versions (published or deprecated only — draft/pending_review/rejected versions are never returned here, to avoid exposing unreviewed versions). Used by the Store to let buyers pick a specific version at install time, and by global-store-svc (service actor) to resolve a chosen version's manifest when installing. */
16349
16803
  installableApplicationVersions: Array<ApplicationVersion>;
16350
16804
  installationPermissions?: Maybe<Scalars['JSON']['output']>;
16805
+ /** Runtime routing metadata for an active node installation in the gateway-authenticated workspace. Candidate node types are ordered, with the requested spelling before compatibility aliases. Legacy installation versions are not treated as node runtime versions. */
16806
+ installedStoreNodeRuntime?: Maybe<StoreInstalledNodeRuntime>;
16351
16807
  /** Get a single interview round by ID (admin). */
16352
16808
  interviewRound?: Maybe<InterviewRound>;
16353
16809
  /** Get a single interviewer by ID (admin). */
@@ -16441,6 +16897,8 @@ export type Query = {
16441
16897
  myNotificationCountsByApp: Scalars['JSON']['output'];
16442
16898
  /** Get notification counts by channel for authenticated user */
16443
16899
  myNotificationCountsByChannel: NotificationChannelCounts;
16900
+ /** Status of a notification created by the authenticated sender in the current tenant. */
16901
+ myNotificationSendStatus: NotificationSendStatus;
16444
16902
  /** Get all orders for the authenticated user */
16445
16903
  myOrders: Array<StoreOrder>;
16446
16904
  /** Get a SINGLE invite addressed to the current authenticated user, by id. Backs the per-invite acceptance page reached from the invite email link. Self-scoped: the resolver only returns an invite addressed to the caller's own email (or already resolved to their userId); otherwise it returns NOT_FOUND (existence of another account's invite is never revealed). */
@@ -16504,6 +16962,8 @@ export type Query = {
16504
16962
  newsletterVariant?: Maybe<NewsletterVariant>;
16505
16963
  newsletterVariants: Array<NewsletterVariant>;
16506
16964
  newsletters: Array<Newsletter>;
16965
+ /** Platform admin only: recent observed runs of the node-sandbox build workflow, newest first — see workers/nodeSandboxBuildPoll.ts. Optionally filtered to one version's runs. */
16966
+ nodeSandboxBuildChecks: NodeSandboxBuildCheckConnection;
16507
16967
  /** Get a single notification by ID */
16508
16968
  notification?: Maybe<Notification>;
16509
16969
  /** Get notification events/history for a specific notification */
@@ -16556,6 +17016,8 @@ export type Query = {
16556
17016
  organizationMembers: OrganizationMemberList;
16557
17017
  /** M2M lookup for global-store-svc's shipping-cost quote pipeline: the org's active pickup postal code — the default DeveloperOrgPickupAddress's postalCode, falling back to the legacy pickupPostalCode scalar for orgs that set one before DeveloperOrgPickupAddress existed, then null (caller falls back to the linked billing account's address, then a platform-wide default). */
16558
17018
  organizationPickupPostalCode?: Maybe<Scalars['String']['output']>;
17019
+ /** The workspace-private custom nodes of a workspace's organization (BOFF-9766): every PRIVATE NODE application bound to the organization the workspace belongs to, with its latest version published to that organization and whether this workspace has it installed. Feeds the "Your organization" section of the FluidGrids Node Store, where a workspace admin installs or updates one with `installApp` and removes it with `uninstallApp`. Self-scoped (Type B): the gateway only authenticates the caller. The resolver lists nothing unless the caller is a member of `workspaceId`, and it only ever lists applications bound to that workspace's own organization, so a workspace of another organization sees none of them. */
17020
+ organizationPrivateNodes: OrganizationPrivateNodeListing;
16559
17021
  organizationScheduleQuotas: OrganizationScheduleQuotas;
16560
17022
  payoutRunHistory: Array<PayoutRunLog>;
16561
17023
  pendingDeveloperOrganizationVerifications: DeveloperOrganizationConnection;
@@ -16822,6 +17284,10 @@ export type Query = {
16822
17284
  webhook?: Maybe<Webhook>;
16823
17285
  webhookDeliveries: WebhookDeliveryConnection;
16824
17286
  webhookDelivery?: Maybe<WebhookDelivery>;
17287
+ /** Every webhook event type currently deliverable, for the webhook event picker. Optionally narrowed to one product. */
17288
+ webhookEventCatalog: Array<WebhookEventCatalogEntry>;
17289
+ /** Registered subject mappings. Platform services and super admins only. */
17290
+ webhookEventSubjects: Array<WebhookEventSubject>;
16825
17291
  webhooks: Array<Webhook>;
16826
17292
  /** Get a single workspace by ID */
16827
17293
  workspace?: Maybe<Workspace>;
@@ -17124,6 +17590,13 @@ export type QueryAvailableFeaturePreviewsArgs = {
17124
17590
  workspaceId: Scalars['String']['input'];
17125
17591
  };
17126
17592
  /** Root query type */
17593
+ export type QueryAvatarMinutesForServiceArgs = {
17594
+ actorId?: InputMaybe<Scalars['ID']['input']>;
17595
+ productId: Scalars['String']['input'];
17596
+ signature: AvatarMinutesSignature;
17597
+ workspaceId: Scalars['ID']['input'];
17598
+ };
17599
+ /** Root query type */
17127
17600
  export type QueryBounceStatsArgs = {
17128
17601
  campaignId: Scalars['ID']['input'];
17129
17602
  };
@@ -18189,6 +18662,11 @@ export type QueryInstallationPermissionsArgs = {
18189
18662
  installationId: Scalars['ID']['input'];
18190
18663
  };
18191
18664
  /** Root query type */
18665
+ export type QueryInstalledStoreNodeRuntimeArgs = {
18666
+ nodeTypes: Array<Scalars['String']['input']>;
18667
+ nodeVersion?: InputMaybe<Scalars['String']['input']>;
18668
+ };
18669
+ /** Root query type */
18192
18670
  export type QueryInterviewRoundArgs = {
18193
18671
  id: Scalars['ID']['input'];
18194
18672
  };
@@ -18435,6 +18913,10 @@ export type QueryMyEntitlementsArgs = {
18435
18913
  offset?: InputMaybe<Scalars['Int']['input']>;
18436
18914
  };
18437
18915
  /** Root query type */
18916
+ export type QueryMyNotificationSendStatusArgs = {
18917
+ id: Scalars['ID']['input'];
18918
+ };
18919
+ /** Root query type */
18438
18920
  export type QueryMyOrdersArgs = {
18439
18921
  limit?: InputMaybe<Scalars['Int']['input']>;
18440
18922
  offset?: InputMaybe<Scalars['Int']['input']>;
@@ -18608,6 +19090,12 @@ export type QueryNewslettersArgs = {
18608
19090
  offset?: InputMaybe<Scalars['Int']['input']>;
18609
19091
  };
18610
19092
  /** Root query type */
19093
+ export type QueryNodeSandboxBuildChecksArgs = {
19094
+ applicationVersionId?: InputMaybe<Scalars['ID']['input']>;
19095
+ limit?: InputMaybe<Scalars['Int']['input']>;
19096
+ offset?: InputMaybe<Scalars['Int']['input']>;
19097
+ };
19098
+ /** Root query type */
18611
19099
  export type QueryNotificationArgs = {
18612
19100
  id: Scalars['ID']['input'];
18613
19101
  };
@@ -18741,6 +19229,10 @@ export type QueryOrganizationPickupPostalCodeArgs = {
18741
19229
  id: Scalars['ID']['input'];
18742
19230
  };
18743
19231
  /** Root query type */
19232
+ export type QueryOrganizationPrivateNodesArgs = {
19233
+ workspaceId: Scalars['ID']['input'];
19234
+ };
19235
+ /** Root query type */
18744
19236
  export type QueryPendingDeveloperOrganizationVerificationsArgs = {
18745
19237
  limit?: InputMaybe<Scalars['Int']['input']>;
18746
19238
  offset?: InputMaybe<Scalars['Int']['input']>;
@@ -18970,6 +19462,8 @@ export type QueryPushDevicesForUserInternalArgs = {
18970
19462
  };
18971
19463
  /** Root query type */
18972
19464
  export type QueryQuoteAiCreditsArgs = {
19465
+ cacheReadTokens?: InputMaybe<Scalars['Int']['input']>;
19466
+ cacheWriteTokens?: InputMaybe<Scalars['Int']['input']>;
18973
19467
  inputTokens: Scalars['Int']['input'];
18974
19468
  model: Scalars['String']['input'];
18975
19469
  outputTokens: Scalars['Int']['input'];
@@ -19553,6 +20047,15 @@ export type QueryWebhookDeliveryArgs = {
19553
20047
  id: Scalars['ID']['input'];
19554
20048
  };
19555
20049
  /** Root query type */
20050
+ export type QueryWebhookEventCatalogArgs = {
20051
+ productSlug?: InputMaybe<Scalars['String']['input']>;
20052
+ };
20053
+ /** Root query type */
20054
+ export type QueryWebhookEventSubjectsArgs = {
20055
+ includeInactive?: InputMaybe<Scalars['Boolean']['input']>;
20056
+ productSlug?: InputMaybe<Scalars['String']['input']>;
20057
+ };
20058
+ /** Root query type */
19556
20059
  export type QueryWebhooksArgs = {
19557
20060
  applicationId: Scalars['ID']['input'];
19558
20061
  };
@@ -20026,6 +20529,15 @@ export type RecordExploreClickResult = {
20026
20529
  __typename?: 'RecordExploreClickResult';
20027
20530
  recorded: Scalars['Boolean']['output'];
20028
20531
  };
20532
+ export type RecordExternalRefundInput = {
20533
+ amount: Scalars['Float']['input'];
20534
+ chargeId: Scalars['ID']['input'];
20535
+ currency: Scalars['String']['input'];
20536
+ externalRef: Scalars['String']['input'];
20537
+ orgId: Scalars['ID']['input'];
20538
+ reason?: InputMaybe<Scalars['String']['input']>;
20539
+ workspaceId?: InputMaybe<Scalars['ID']['input']>;
20540
+ };
20029
20541
  export type RecordExternalSettlementInput = {
20030
20542
  /** Settlement amount in whole currency units (must be > 0). */
20031
20543
  amount: Scalars['Float']['input'];
@@ -20357,6 +20869,12 @@ export type RegisterSupportAttachmentPartInput = {
20357
20869
  sessionId: Scalars['ID']['input'];
20358
20870
  ticketId: Scalars['ID']['input'];
20359
20871
  };
20872
+ export type RegisterWebhookEventSubjectsInput = {
20873
+ /** Product slug that owns the subjects (e.g. `vibecontrols`, `fluidgrids`). */
20874
+ productSlug: Scalars['String']['input'];
20875
+ /** Mappings to create or update (at most 100 per call). */
20876
+ subjects: Array<WebhookEventSubjectInput>;
20877
+ };
20360
20878
  export type RejectWaitlistInput = {
20361
20879
  id: Scalars['ID']['input'];
20362
20880
  reason?: InputMaybe<Scalars['String']['input']>;
@@ -20448,6 +20966,24 @@ export type ResendVerificationResult = {
20448
20966
  message: Scalars['String']['output'];
20449
20967
  success: Scalars['Boolean']['output'];
20450
20968
  };
20969
+ export type ReserveAssistantBudgetInput = {
20970
+ id: Scalars['ID']['input'];
20971
+ inputTokens: Scalars['Int']['input'];
20972
+ model: Scalars['String']['input'];
20973
+ outputTokens: Scalars['Int']['input'];
20974
+ workspaceId: Scalars['ID']['input'];
20975
+ };
20976
+ export type ReserveAvatarMinutesInput = {
20977
+ actorId: Scalars['ID']['input'];
20978
+ mode: AvatarMinutesMode;
20979
+ productId: Scalars['String']['input'];
20980
+ /** 1 to 60; billing reserves min(available, requested, AVATAR_MINUTES_MAX_PER_SESSION). */
20981
+ requestedMinutes: Scalars['Int']['input'];
20982
+ sessionId: Scalars['ID']['input'];
20983
+ supersedesSessionId?: InputMaybe<Scalars['ID']['input']>;
20984
+ surface: Scalars['String']['input'];
20985
+ workspaceId: Scalars['ID']['input'];
20986
+ };
20451
20987
  /** Input for resolving (or creating) the default billing account for a user/org. At least one of `orgId` or `ownerUserId` MUST be supplied: - `orgId` present → resolve-or-create the org's default billing account. - `ownerUserId` only → resolve an EXISTING billing account already associated with that user's earnings/payout accounts. Creation requires an `orgId` anchor because a billing account is always org-scoped. */
20452
20988
  export type ResolveBillingAccountInput = {
20453
20989
  /** Opaque org id that anchors the billing account. When present the org's default billing account is resolved-or-created. */
@@ -20495,6 +21031,17 @@ export type ResourceTypeProductInfo = {
20495
21031
  products: Array<Scalars['String']['output']>;
20496
21032
  resourceType: Scalars['String']['output'];
20497
21033
  };
21034
+ /** Input for the service-trusted internal reduction of a first-party self-delegation. */
21035
+ export type RestrictAppDelegationInternalInput = {
21036
+ /** Client ID of the first-party system app (e.g. burdenoff_integration_core). */
21037
+ clientId: Scalars['String']['input'];
21038
+ /** The most the delegation may keep: it keeps only those of these scopes it already holds (and the app still allows), and is revoked if none are left. */
21039
+ scopes: Array<Scalars['String']['input']>;
21040
+ /** The user whose delegation to the app is reduced. */
21041
+ userId: Scalars['String']['input'];
21042
+ /** The most workspaces the delegation may keep: it keeps only those of these it already covers, and is revoked if none are left. Empty = leave the workspaces as they are. */
21043
+ workspaceIds: Array<Scalars['String']['input']>;
21044
+ };
20498
21045
  export type RetryBillingOrderCallbackResponse = {
20499
21046
  __typename?: 'RetryBillingOrderCallbackResponse';
20500
21047
  error?: Maybe<Scalars['String']['output']>;
@@ -20551,8 +21098,19 @@ export type RevokeAllSessionsResult = {
20551
21098
  revokedCount: Scalars['Int']['output'];
20552
21099
  success: Scalars['Boolean']['output'];
20553
21100
  };
21101
+ /** Input for the service-trusted internal revoke of a first-party self-delegation. */
21102
+ export type RevokeAppDelegationInternalInput = {
21103
+ /** Client ID of the first-party system app (e.g. burdenoff_integration_core). */
21104
+ clientId: Scalars['String']['input'];
21105
+ /** Recorded on the delegation and in the audit log. */
21106
+ reason?: InputMaybe<Scalars['String']['input']>;
21107
+ /** The user whose delegation to the app is revoked. */
21108
+ userId: Scalars['String']['input'];
21109
+ };
20554
21110
  export type RevokeAppWorkspaceAccessInput = {
20555
21111
  appId: Scalars['ID']['input'];
21112
+ /** Withdraw only the calling actor's own grant. The authorization is revoked (true) only when the caller is its sole grantor; when others granted it too, only the caller's share is released and it stays ACTIVE (false); one the caller never granted is left untouched (false). An automated provisioner withdrawing its own grant sets this, so it never revokes access an owner or an app installation gave the app, whichever granted first. */
21113
+ onlyIfGrantedByCaller?: InputMaybe<Scalars['Boolean']['input']>;
20556
21114
  reason?: InputMaybe<Scalars['String']['input']>;
20557
21115
  workspaceId: Scalars['ID']['input'];
20558
21116
  };
@@ -21089,6 +21647,15 @@ export type SeedAtheleteBridgeUserToursResult = {
21089
21647
  updatedCount: Scalars['Int']['output'];
21090
21648
  workspaceId: Scalars['String']['output'];
21091
21649
  };
21650
+ export type SeedBigconsoleUserToursResult = {
21651
+ __typename?: 'SeedBigconsoleUserToursResult';
21652
+ createdCount: Scalars['Int']['output'];
21653
+ productId: Scalars['String']['output'];
21654
+ totalCount: Scalars['Int']['output'];
21655
+ tours: Array<SeededUserTourResult>;
21656
+ updatedCount: Scalars['Int']['output'];
21657
+ workspaceId: Scalars['String']['output'];
21658
+ };
21092
21659
  export type SeedBuildmyiqUserToursResult = {
21093
21660
  __typename?: 'SeedBuildmyiqUserToursResult';
21094
21661
  createdCount: Scalars['Int']['output'];
@@ -21301,6 +21868,31 @@ export type ServiceSyncPayoutStatusInput = {
21301
21868
  /** The billing PayoutRequestStatus after the change (e.g. APPROVED, REJECTED, PAID, FAILED). */
21302
21869
  status: Scalars['String']['input'];
21303
21870
  };
21871
+ /** Input for serviceUpsertExternalListing (BOFF-3430). */
21872
+ export type ServiceUpsertExternalListingInput = {
21873
+ /** Brand or maker shown on the listing. */
21874
+ brand?: InputMaybe<Scalars['String']['input']>;
21875
+ category?: InputMaybe<Scalars['String']['input']>;
21876
+ /** ISO 4217 currency code, upper case. */
21877
+ currency: Scalars['String']['input'];
21878
+ description?: InputMaybe<Scalars['String']['input']>;
21879
+ /** The item's id in the calling service. Together with the caller's service identity it identifies the listing. */
21880
+ externalId: Scalars['String']['input'];
21881
+ /** Absolute https URL of the item's page in the owning product. */
21882
+ externalUrl: Scalars['String']['input'];
21883
+ metadata?: InputMaybe<Scalars['JSON']['input']>;
21884
+ name: Scalars['String']['input'];
21885
+ price: Scalars['Float']['input'];
21886
+ /** Platform product key of the caller (for example "coolandlovely"). Used as the listing's compatible product and as its slug prefix. */
21887
+ productKey: Scalars['String']['input'];
21888
+ /** Display name for the caller's publisher profile, created on its first listing. */
21889
+ publisherName: Scalars['String']['input'];
21890
+ /** PUBLISHED (shown in discovery), UNLISTED (kept but hidden) or ARCHIVED (taken down). */
21891
+ status: ProductStatus;
21892
+ tags?: InputMaybe<Array<Scalars['String']['input']>>;
21893
+ /** A physical product type (MERCHANDISE, HARDWARE, ACCESSORY, BOOK, EQUIPMENT, APPAREL, COLLECTIBLE or CONSUMABLE). */
21894
+ type: ProductType;
21895
+ };
21304
21896
  /** An active user session (login instance) */
21305
21897
  export type Session = {
21306
21898
  __typename?: 'Session';
@@ -21868,6 +22460,12 @@ export declare enum StoreInstallationStatus {
21868
22460
  Pending = "PENDING",
21869
22461
  Uninstalled = "UNINSTALLED"
21870
22462
  }
22463
+ export type StoreInstalledNodeRuntime = {
22464
+ __typename?: 'StoreInstalledNodeRuntime';
22465
+ endpointUrl: Scalars['String']['output'];
22466
+ nodeType: Scalars['String']['output'];
22467
+ nodeVersion?: Maybe<Scalars['String']['output']>;
22468
+ };
21871
22469
  /** StoreItem entity reference. The actual StoreItem is defined in the Store service. In Federation 2 setup, this will be marked with @key directive. For now, this is a reference type that returns the itemId for the Gateway to resolve. */
21872
22470
  export type StoreItem = {
21873
22471
  __typename?: 'StoreItem';
@@ -21999,6 +22597,12 @@ export type StoreProduct = {
21999
22597
  documentationUrl?: Maybe<Scalars['String']['output']>;
22000
22598
  downloads: Scalars['Int']['output'];
22001
22599
  entitlements: Array<ProductEntitlement>;
22600
+ /** The item's id in the owning product backend (only set with externalService). */
22601
+ externalId?: Maybe<Scalars['String']['output']>;
22602
+ /** Service identity of the product backend that owns this listing when the item is sold by that product's own checkout (for example wspace-coolandlovely-svc). Null for products the store sells itself. Such a listing cannot be added to a store cart or ordered here; send buyers to externalUrl instead. */
22603
+ externalService?: Maybe<Scalars['String']['output']>;
22604
+ /** Page in the owning product where the item can be viewed and bought (only set with externalService). */
22605
+ externalUrl?: Maybe<Scalars['String']['output']>;
22002
22606
  featured: Scalars['Boolean']['output'];
22003
22607
  /** Product height (physical products) */
22004
22608
  height?: Maybe<Scalars['Float']['output']>;
@@ -22240,6 +22844,24 @@ export type SubmitContactInquiryResult = {
22240
22844
  /** Whether the submission was successful */
22241
22845
  success: Scalars['Boolean']['output'];
22242
22846
  };
22847
+ /** One visitor's verdict on one answer. Anonymous like the rest of explore: the conversation token is the only proof of ownership, and the visitor is recorded as an `ipHash`, never an IP. */
22848
+ export type SubmitExploreFeedbackInput = {
22849
+ /** Optional free text. Capped server-side; the server truncates rather than rejecting, because a rating is never worth failing over its comment. */
22850
+ comment?: InputMaybe<Scalars['String']['input']>;
22851
+ /** Bearer secret for the conversation the answer belongs to. */
22852
+ conversationToken: Scalars['String']['input'];
22853
+ /** The assistant message being rated. Must be COMPLETED. */
22854
+ messageId: Scalars['ID']['input'];
22855
+ rating: ExploreFeedbackRating;
22856
+ /** Why it was not helpful: one of INACCURATE INCOMPLETE OFF_TOPIC HARD_TO_FOLLOW OTHER. Ignored — and stored as null — for HELPFUL, because "what was wrong with it" is not a question a positive rating answers. */
22857
+ reason?: InputMaybe<Scalars['String']['input']>;
22858
+ };
22859
+ export type SubmitExploreFeedbackResult = {
22860
+ __typename?: 'SubmitExploreFeedbackResult';
22861
+ /** What was actually stored — echoed back so the UI renders the server's view rather than assuming its optimistic one was accepted. Null when `recorded` is false. */
22862
+ feedback?: Maybe<ExploreFeedback>;
22863
+ recorded: Scalars['Boolean']['output'];
22864
+ };
22243
22865
  export type SubmitInterviewFeedbackInput = {
22244
22866
  internalNotes?: InputMaybe<Scalars['String']['input']>;
22245
22867
  interviewerId: Scalars['ID']['input'];
@@ -23161,10 +23783,14 @@ export type Tenant = {
23161
23783
  /** Workspaces belonging to this tenant */
23162
23784
  workspaces: Array<Workspace>;
23163
23785
  };
23164
- /** Tenant configuration for regional settings, branding, and features */
23786
+ /** Tenant configuration for regional settings, data residency, and features */
23165
23787
  export type TenantConfig = {
23166
23788
  __typename?: 'TenantConfig';
23167
23789
  complianceRegion?: Maybe<Scalars['String']['output']>;
23790
+ /**
23791
+ * Always null. Burdenoff does no white-labelling: every product keeps its own brand, so tenants cannot set a custom logo, colour or favicon.
23792
+ * @deprecated No white-labelling — products keep their own brand. This setting is ignored.
23793
+ */
23168
23794
  customBranding?: Maybe<Scalars['JSON']['output']>;
23169
23795
  dataResidency?: Maybe<Scalars['String']['output']>;
23170
23796
  features?: Maybe<Scalars['JSON']['output']>;
@@ -24210,6 +24836,8 @@ export type UpdateContentPageInput = {
24210
24836
  visibility?: InputMaybe<ContentVisibility>;
24211
24837
  };
24212
24838
  export type UpdateCouponInput = {
24839
+ applicableEntityTypes?: InputMaybe<Array<CouponEntityType>>;
24840
+ applicableProductIds?: InputMaybe<Array<Scalars['String']['input']>>;
24213
24841
  description?: InputMaybe<Scalars['String']['input']>;
24214
24842
  maxTotalUses?: InputMaybe<Scalars['Int']['input']>;
24215
24843
  maxUsesPerUser?: InputMaybe<Scalars['Int']['input']>;
@@ -25545,12 +26173,16 @@ export type UserWishlist = {
25545
26173
  userId: Scalars['String']['output'];
25546
26174
  };
25547
26175
  export type ValidateCouponInput = {
26176
+ /** Addon being purchased — same purpose as planId, for addon purchases. */
26177
+ addonId?: InputMaybe<Scalars['ID']['input']>;
25548
26178
  /** Order amount before discount */
25549
26179
  amount: Scalars['Float']['input'];
25550
26180
  /** Coupon code to validate */
25551
26181
  code: Scalars['String']['input'];
25552
26182
  /** Currency */
25553
26183
  currency: Scalars['String']['input'];
26184
+ /** Plan being purchased — used to resolve product/entity-type scoping (applicableProductIds/applicableEntityTypes) from the Plan record itself, not from a client-asserted product/entity string. */
26185
+ planId?: InputMaybe<Scalars['ID']['input']>;
25554
26186
  /** Optional: product IDs being purchased */
25555
26187
  productIds?: InputMaybe<Array<Scalars['String']['input']>>;
25556
26188
  /** Optional: service IDs being purchased */
@@ -25826,6 +26458,16 @@ export type WebhookEvent = {
25826
26458
  /** Last update timestamp */
25827
26459
  updatedAt: Scalars['DateTime']['output'];
25828
26460
  };
26461
+ /** A webhook event type a developer application can subscribe a webhook to. */
26462
+ export type WebhookEventCatalogEntry = {
26463
+ __typename?: 'WebhookEventCatalogEntry';
26464
+ description?: Maybe<Scalars['String']['output']>;
26465
+ /** Event type, sent as the X-Event-Type header and the payload `event` field. */
26466
+ eventType: Scalars['String']['output'];
26467
+ /** Product that emits the event (`devportal` for portal lifecycle events). */
26468
+ productSlug: Scalars['String']['output'];
26469
+ source: WebhookEventSource;
26470
+ };
25829
26471
  /** Paginated list of webhook events with cursor support. Pass `nextCursor` from a previous response as `cursor` in the next call. */
25830
26472
  export type WebhookEventList = {
25831
26473
  __typename?: 'WebhookEventList';
@@ -25834,6 +26476,33 @@ export type WebhookEventList = {
25834
26476
  nextCursor?: Maybe<Scalars['String']['output']>;
25835
26477
  total: Scalars['Int']['output'];
25836
26478
  };
26479
+ /** Where a webhook event type originates. */
26480
+ export declare enum WebhookEventSource {
26481
+ /** Fired by the developer portal itself (application and installation lifecycle). */
26482
+ Devportal = "DEVPORTAL",
26483
+ /** Fired from a workspace entity change, through a registered subject mapping. */
26484
+ Workspace = "WORKSPACE"
26485
+ }
26486
+ /** Maps a workspace graph-event subject to the webhook event type it fires. */
26487
+ export type WebhookEventSubject = {
26488
+ __typename?: 'WebhookEventSubject';
26489
+ createdAt: Scalars['DateTime']['output'];
26490
+ description?: Maybe<Scalars['String']['output']>;
26491
+ eventType: Scalars['String']['output'];
26492
+ id: Scalars['ID']['output'];
26493
+ isActive: Scalars['Boolean']['output'];
26494
+ productSlug: Scalars['String']['output'];
26495
+ /** Graph-event subject, `graph.<module>.<Entity>.<action>`. */
26496
+ subject: Scalars['String']['output'];
26497
+ updatedAt: Scalars['DateTime']['output'];
26498
+ };
26499
+ export type WebhookEventSubjectInput = {
26500
+ description?: InputMaybe<Scalars['String']['input']>;
26501
+ /** Dotted lower-case event type, e.g. `vibe.created`. The `application.` and `installation.` namespaces are reserved for the developer portal. */
26502
+ eventType: Scalars['String']['input'];
26503
+ /** Graph-event subject, `graph.<module>.<Entity>.<action>`. */
26504
+ subject: Scalars['String']['input'];
26505
+ };
25837
26506
  /** Webhook processing result */
25838
26507
  export type WebhookProcessingResult = {
25839
26508
  __typename?: 'WebhookProcessingResult';