@burdenoff/microfe-store 2026.1013.2 → 2026.1014.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 */
@@ -1361,6 +1363,20 @@ export type AssignedQuota = {
1361
1363
  scope: QuotaScope;
1362
1364
  workspaceId?: Maybe<Scalars['ID']['output']>;
1363
1365
  };
1366
+ export type AssistantAccountBudget = {
1367
+ __typename?: 'AssistantAccountBudget';
1368
+ billingAccountId: Scalars['ID']['output'];
1369
+ dailyMicroUsd: Scalars['Int']['output'];
1370
+ dailyTokens: Scalars['Int']['output'];
1371
+ enabled: Scalars['Boolean']['output'];
1372
+ };
1373
+ export type AssistantBudgetReceipt = {
1374
+ __typename?: 'AssistantBudgetReceipt';
1375
+ heldMicroUsd: Scalars['Int']['output'];
1376
+ heldTokens: Scalars['Int']['output'];
1377
+ id: Scalars['ID']['output'];
1378
+ status: Scalars['String']['output'];
1379
+ };
1364
1380
  export type AttachMediaToStepInput = {
1365
1381
  /** Operation context for scoping (workspaceId, userId, productId, moduleId, etc.) */
1366
1382
  context?: InputMaybe<ContextInput>;
@@ -2921,6 +2937,10 @@ export type ComplianceAuditLogEntry = {
2921
2937
  /** Input for configuring tenant settings */
2922
2938
  export type ConfigureTenantInput = {
2923
2939
  complianceRegion?: InputMaybe<Scalars['String']['input']>;
2940
+ /**
2941
+ * Ignored and never stored. Burdenoff does no white-labelling: every product keeps its own brand.
2942
+ * @deprecated No white-labelling — products keep their own brand. This setting is ignored.
2943
+ */
2924
2944
  customBranding?: InputMaybe<Scalars['JSON']['input']>;
2925
2945
  dataResidency?: InputMaybe<Scalars['String']['input']>;
2926
2946
  features?: InputMaybe<Scalars['JSON']['input']>;
@@ -3142,6 +3162,10 @@ export type ContextWidgetConversationPayload = {
3142
3162
  };
3143
3163
  export type Coupon = {
3144
3164
  __typename?: 'Coupon';
3165
+ /** Purchase flows (PLAN / ADD_ON / STORE) this coupon may be redeemed against. Empty = all entity types. */
3166
+ applicableEntityTypes: Array<CouponEntityType>;
3167
+ /** Product slugs (e.g. "vibecontrols", "fluidgrids") this coupon may be redeemed against. Empty = all products. */
3168
+ applicableProductIds: Array<Scalars['String']['output']>;
3145
3169
  applicableProducts: Array<Scalars['String']['output']>;
3146
3170
  applicableServices: Array<Scalars['String']['output']>;
3147
3171
  campaignId?: Maybe<Scalars['String']['output']>;
@@ -3172,6 +3196,12 @@ export type Coupon = {
3172
3196
  validUntil?: Maybe<Scalars['DateTime']['output']>;
3173
3197
  value: Scalars['Float']['output'];
3174
3198
  };
3199
+ /** Which purchase flow a coupon may be redeemed against (BOFF-7391). */
3200
+ export declare enum CouponEntityType {
3201
+ AddOn = "ADD_ON",
3202
+ Plan = "PLAN",
3203
+ Store = "STORE"
3204
+ }
3175
3205
  export type CouponFilterInput = {
3176
3206
  campaignId?: InputMaybe<Scalars['String']['input']>;
3177
3207
  scope?: InputMaybe<CouponScope>;
@@ -3457,6 +3487,8 @@ export type CreateContentPageInput = {
3457
3487
  visibility?: InputMaybe<ContentVisibility>;
3458
3488
  };
3459
3489
  export type CreateCouponInput = {
3490
+ applicableEntityTypes?: InputMaybe<Array<CouponEntityType>>;
3491
+ applicableProductIds?: InputMaybe<Array<Scalars['String']['input']>>;
3460
3492
  applicableProducts?: InputMaybe<Array<Scalars['String']['input']>>;
3461
3493
  applicableServices?: InputMaybe<Array<Scalars['String']['input']>>;
3462
3494
  campaignId?: InputMaybe<Scalars['String']['input']>;
@@ -5646,6 +5678,25 @@ export type EraseResult = {
5646
5678
  retainedForLegalReason?: Maybe<Scalars['String']['output']>;
5647
5679
  service: Scalars['String']['output'];
5648
5680
  };
5681
+ /** 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. */
5682
+ export type EscalateExploreConversationInput = {
5683
+ /** Bearer secret for the conversation being handed over. */
5684
+ conversationToken: Scalars['String']['input'];
5685
+ /** 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. */
5686
+ email: Scalars['String']['input'];
5687
+ /** 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. */
5688
+ note?: InputMaybe<Scalars['String']['input']>;
5689
+ /** `PlatformProduct` id of the site the visitor is on, so the handover reaches that product's support inbox instead of the default one. */
5690
+ productId?: InputMaybe<Scalars['String']['input']>;
5691
+ /** reCAPTCHA v3 token — required only when `exploreCatalog.captchaRequired`, and minted with the SAME action as a chat message. */
5692
+ recaptchaToken?: InputMaybe<Scalars['String']['input']>;
5693
+ };
5694
+ export type EscalateExploreConversationResult = {
5695
+ __typename?: 'EscalateExploreConversationResult';
5696
+ /** 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. */
5697
+ created: Scalars['Boolean']['output'];
5698
+ escalation: ExploreEscalation;
5699
+ };
5649
5700
  export type EvaluateFeatureFlagsInput = {
5650
5701
  /** Specific flag keys to evaluate. If empty, evaluates ALL active flags. */
5651
5702
  keys?: InputMaybe<Array<Scalars['String']['input']>>;
@@ -5653,6 +5704,10 @@ export type EvaluateFeatureFlagsInput = {
5653
5704
  productSlug?: InputMaybe<Scalars['String']['input']>;
5654
5705
  workspaceId: Scalars['String']['input'];
5655
5706
  };
5707
+ export type ExchangeOwnDelegationInput = {
5708
+ delegationId: Scalars['ID']['input'];
5709
+ scopes?: InputMaybe<Array<Scalars['String']['input']>>;
5710
+ };
5656
5711
  export type ExchangeTokenInput = {
5657
5712
  appId: Scalars['String']['input'];
5658
5713
  scopes?: InputMaybe<Array<Scalars['String']['input']>>;
@@ -5715,6 +5770,8 @@ export type ExploreAdminFilter = {
5715
5770
  from?: InputMaybe<Scalars['DateTime']['input']>;
5716
5771
  /** Salted IP hash, to group one visitor's sessions. */
5717
5772
  ipHash?: InputMaybe<Scalars['String']['input']>;
5773
+ /** Only conversations containing an answer a visitor marked NOT helpful. */
5774
+ notHelpfulOnly?: InputMaybe<Scalars['Boolean']['input']>;
5718
5775
  /** Match conversations that started on this product's website. */
5719
5776
  productSlug?: InputMaybe<Scalars['String']['input']>;
5720
5777
  /** Free-text match against message content. */
@@ -5735,6 +5792,8 @@ export type ExploreAdminMessage = {
5735
5792
  createdAt: Scalars['DateTime']['output'];
5736
5793
  ctas: Array<ExploreCta>;
5737
5794
  errorCode?: Maybe<Scalars['String']['output']>;
5795
+ /** 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. */
5796
+ feedback?: Maybe<ExploreFeedback>;
5738
5797
  followUps: Array<Scalars['String']['output']>;
5739
5798
  id: Scalars['ID']['output'];
5740
5799
  references: Array<ExploreReference>;
@@ -5761,7 +5820,11 @@ export type ExploreAdminStats = {
5761
5820
  byProduct: Array<ExploreAdminProductStat>;
5762
5821
  clicks: Scalars['Int']['output'];
5763
5822
  conversations: Scalars['Int']['output'];
5823
+ /** Answers a visitor marked helpful. */
5824
+ helpful: Scalars['Int']['output'];
5764
5825
  messages: Scalars['Int']['output'];
5826
+ /** 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. */
5827
+ notHelpful: Scalars['Int']['output'];
5765
5828
  /** Assistant answers the corpus could not ground. */
5766
5829
  unanswered: Scalars['Int']['output'];
5767
5830
  };
@@ -5774,8 +5837,20 @@ export type ExploreAgentActivity = {
5774
5837
  export type ExploreAgentCatalog = {
5775
5838
  __typename?: 'ExploreAgentCatalog';
5776
5839
  builtAt: Scalars['DateTime']['output'];
5840
+ /** 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. */
5841
+ conceptHighlights: Array<ExploreAgentConcept>;
5777
5842
  products: Array<ExploreAgentProduct>;
5778
5843
  };
5844
+ /** 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. */
5845
+ export type ExploreAgentConcept = {
5846
+ __typename?: 'ExploreAgentConcept';
5847
+ alt: Scalars['String']['output'];
5848
+ imageUrl: Scalars['String']['output'];
5849
+ product: Scalars['String']['output'];
5850
+ productName: Scalars['String']['output'];
5851
+ title: Scalars['String']['output'];
5852
+ url: Scalars['String']['output'];
5853
+ };
5779
5854
  export type ExploreAgentCtaSuggestion = {
5780
5855
  __typename?: 'ExploreAgentCtaSuggestion';
5781
5856
  label: Scalars['String']['output'];
@@ -5878,6 +5953,8 @@ export type ExploreAttachmentInput = {
5878
5953
  export type ExploreCatalog = {
5879
5954
  __typename?: 'ExploreCatalog';
5880
5955
  captchaRequired: Scalars['Boolean']['output'];
5956
+ /** 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`. */
5957
+ conceptHighlights: Array<ExploreConceptHighlight>;
5881
5958
  enabled: Scalars['Boolean']['output'];
5882
5959
  examplePrompts: Array<Scalars['String']['output']>;
5883
5960
  limits: ExploreLimits;
@@ -5886,6 +5963,17 @@ export type ExploreCatalog = {
5886
5963
  welcomeBody: Scalars['String']['output'];
5887
5964
  welcomeTitle: Scalars['String']['output'];
5888
5965
  };
5966
+ /** 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. */
5967
+ export type ExploreConceptHighlight = {
5968
+ __typename?: 'ExploreConceptHighlight';
5969
+ alt: Scalars['String']['output'];
5970
+ imageUrl: Scalars['String']['output'];
5971
+ /** Product slug, matching `ExploreProduct.slug`. */
5972
+ product: Scalars['String']['output'];
5973
+ productName: Scalars['String']['output'];
5974
+ title: Scalars['String']['output'];
5975
+ url: Scalars['String']['output'];
5976
+ };
5889
5977
  /** 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
5978
  export type ExploreConversation = {
5891
5979
  __typename?: 'ExploreConversation';
@@ -5903,6 +5991,26 @@ export type ExploreCta = {
5903
5991
  product?: Maybe<Scalars['String']['output']>;
5904
5992
  url: Scalars['String']['output'];
5905
5993
  };
5994
+ /** What became of the handover. */
5995
+ export type ExploreEscalation = {
5996
+ __typename?: 'ExploreEscalation';
5997
+ createdAt: Scalars['DateTime']['output'];
5998
+ /** 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. */
5999
+ email: Scalars['String']['output'];
6000
+ };
6001
+ /** 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. */
6002
+ export type ExploreFeedback = {
6003
+ __typename?: 'ExploreFeedback';
6004
+ comment?: Maybe<Scalars['String']['output']>;
6005
+ createdAt: Scalars['DateTime']['output'];
6006
+ rating: ExploreFeedbackRating;
6007
+ /** One of INACCURATE INCOMPLETE OFF_TOPIC HARD_TO_FOLLOW OTHER. Null for HELPFUL. */
6008
+ reason?: Maybe<Scalars['String']['output']>;
6009
+ };
6010
+ export declare enum ExploreFeedbackRating {
6011
+ Helpful = "HELPFUL",
6012
+ NotHelpful = "NOT_HELPFUL"
6013
+ }
5906
6014
  /** Server-enforced limits, surfaced so the UI can pre-validate instead of discovering them through an error. */
5907
6015
  export type ExploreLimits = {
5908
6016
  __typename?: 'ExploreLimits';
@@ -5927,6 +6035,8 @@ export type ExploreMessage = {
5927
6035
  createdAt: Scalars['DateTime']['output'];
5928
6036
  ctas: Array<ExploreCta>;
5929
6037
  errorCode?: Maybe<Scalars['String']['output']>;
6038
+ /** 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. */
6039
+ feedback?: Maybe<ExploreFeedback>;
5930
6040
  /** Suggested next questions, derived from what this answer actually covered. Empty until the turn completes, and empty when nothing useful can be derived. */
5931
6041
  followUps: Array<Scalars['String']['output']>;
5932
6042
  id: Scalars['ID']['output'];
@@ -6384,6 +6494,10 @@ export type GetStoreProductTagsInput = {
6384
6494
  export type GrantAppDelegationInternalInput = {
6385
6495
  /** Client ID of the first-party system app (e.g. burdenoff_integration_core). */
6386
6496
  clientId: Scalars['String']['input'];
6497
+ /** 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. */
6498
+ retainedScopes?: InputMaybe<Array<Scalars['String']['input']>>;
6499
+ /** 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). */
6500
+ retainedWorkspaceIds?: InputMaybe<Array<Scalars['String']['input']>>;
6387
6501
  /** Scopes to grant — must be a subset of the app's scopes. */
6388
6502
  scopes: Array<Scalars['String']['input']>;
6389
6503
  /** The user granting (and target of) the self-delegation. */
@@ -6393,6 +6507,8 @@ export type GrantAppDelegationInternalInput = {
6393
6507
  };
6394
6508
  export type GrantAppWorkspaceAccessInput = {
6395
6509
  appId: Scalars['ID']['input'];
6510
+ /** 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. */
6511
+ reactivateIfRevokedReason?: InputMaybe<Scalars['String']['input']>;
6396
6512
  /** 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
6513
  reactivateRevoked?: InputMaybe<Scalars['Boolean']['input']>;
6398
6514
  /** Optional subset of the app's global scopes. Empty array means the authorization inherits the app's full scope list. */
@@ -7114,6 +7230,8 @@ export type IssueAppAsUserTokenInternalInput = {
7114
7230
  scopes?: InputMaybe<Array<Scalars['String']['input']>>;
7115
7231
  /** The user the app will act on behalf of (must have an active delegation). */
7116
7232
  targetUserId: Scalars['String']['input'];
7233
+ /** 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. */
7234
+ workspaceId?: InputMaybe<Scalars['String']['input']>;
7117
7235
  };
7118
7236
  export type ItemOrder = {
7119
7237
  __typename?: 'ItemOrder';
@@ -8109,6 +8227,8 @@ export type Mutation = {
8109
8227
  completeSupportAttachmentUpload: SupportAttachmentFile;
8110
8228
  /** Mark a tour as completed for a user */
8111
8229
  completeTour: TourUserProgress;
8230
+ configureAssistantAccountBudget: AssistantAccountBudget;
8231
+ configureAssistantModelPrice: AiModelPrice;
8112
8232
  configureEntitlementSeats: ProductEntitlement;
8113
8233
  /** Configure Kerberos authentication for a tenant */
8114
8234
  configureKerberos: KerberosConfig;
@@ -8463,6 +8583,7 @@ export type Mutation = {
8463
8583
  /** Detach media from a tour step */
8464
8584
  detachMediaFromStep: Scalars['Boolean']['output'];
8465
8585
  disableAuthMethod: Scalars['Boolean']['output'];
8586
+ /** 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
8587
  disableMFA: Scalars['Boolean']['output'];
8467
8588
  disableMaintenanceMode: MaintenanceModeStatus;
8468
8589
  disableSchedule: ScheduledJob;
@@ -8478,13 +8599,16 @@ export type Mutation = {
8478
8599
  enableMFA: Scalars['Boolean']['output'];
8479
8600
  enableMaintenanceMode: MaintenanceModeStatus;
8480
8601
  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. */
8602
+ /** 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
8603
  ensureOrganizationMember: EnsureOrganizationMemberResult;
8483
8604
  /** 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
8605
  ensureStoreOrderBillingOrder: EnsureStoreOrderBillingOrderResponse;
8485
8606
  /** 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
8607
  eraseSubject: EraseResult;
8608
+ /** 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. */
8609
+ escalateExploreConversation: EscalateExploreConversationResult;
8487
8610
  escalateSupportTicket: SupportTicket;
8611
+ exchangeOwnDelegation: AppAsUserTokenResponse;
8488
8612
  /** Exchange app token for app-as-user token (Token Exchange flow) */
8489
8613
  exchangeToken: AppAsUserTokenResponse;
8490
8614
  executeJobNow: JobExecution;
@@ -8624,6 +8748,8 @@ export type Mutation = {
8624
8748
  payInvoice: Invoice;
8625
8749
  permanentlyDeleteSchedule: Scalars['Boolean']['output'];
8626
8750
  placeLegalHold: LegalHold;
8751
+ /** 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. */
8752
+ pollNodeSandboxBuildChecks: NodeSandboxBuildPollResult;
8627
8753
  prepareSupportAttachmentUpload: SupportAttachmentUploadSession;
8628
8754
  /** 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
8755
  processAppSaleRefund: DeveloperOrgSale;
@@ -8831,6 +8957,7 @@ export type Mutation = {
8831
8957
  resendOrganizationInvite: OrganizationInvite;
8832
8958
  resendSurvey: CustomerSatisfactionSurvey;
8833
8959
  resendVerificationEmail: ResendVerificationResult;
8960
+ reserveAssistantAccountBudget: AssistantBudgetReceipt;
8834
8961
  resetCircuitBreaker: CircuitBreakerState;
8835
8962
  /** Reset password using token from email */
8836
8963
  resetPassword: Scalars['Boolean']['output'];
@@ -8852,6 +8979,8 @@ export type Mutation = {
8852
8979
  restoreChannel: Channel;
8853
8980
  restoreScheduleVersion: ScheduledJob;
8854
8981
  restoreTemplateVersion: NewsletterTemplate;
8982
+ /** 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. */
8983
+ restrictAppDelegationInternal?: Maybe<AppUserDelegation>;
8855
8984
  /** 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
8985
  resubscribe: NewsletterSubscriber;
8857
8986
  /** Resume a paused subscription */
@@ -8869,6 +8998,8 @@ export type Mutation = {
8869
8998
  /** 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
8999
  retryInvoiceGeneration: Invoice;
8871
9000
  retryJobExecution: JobExecution;
9001
+ /** 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. */
9002
+ retryNodeSandboxBuild: Scalars['Boolean']['output'];
8872
9003
  /** Retry a failed payout */
8873
9004
  retryPayout: DeveloperOrgPayout;
8874
9005
  /** Retry a failed refund */
@@ -8881,7 +9012,9 @@ export type Mutation = {
8881
9012
  revokeAPIKey: Scalars['Boolean']['output'];
8882
9013
  /** Revoke all sessions except the current one. Returns the number of sessions that were revoked. */
8883
9014
  revokeAllSessions: RevokeAllSessionsResult;
8884
- /** Revoke an app's access to a workspace. Returns false if the row was already REVOKED or never existed. */
9015
+ /** 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. */
9016
+ revokeAppDelegationInternal: Scalars['Boolean']['output'];
9017
+ /** 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
9018
  revokeAppWorkspaceAccess: Scalars['Boolean']['output'];
8886
9019
  revokeConsent: NewsletterConsent;
8887
9020
  revokeDelegation: Scalars['Boolean']['output'];
@@ -8921,6 +9054,8 @@ export type Mutation = {
8921
9054
  scheduleNotification: ScheduledNotification;
8922
9055
  /** Overwrite the built-in AthleteBridge user-facing tours from the service-owned seed file. */
8923
9056
  seedAtheleteBridgeUserTours: SeedAtheleteBridgeUserToursResult;
9057
+ /** Overwrite the service-owned BigConsole onboarding tours. Repeated calls update the same slugs. */
9058
+ seedBigconsoleUserTours: SeedBigconsoleUserToursResult;
8924
9059
  /** Overwrite the built-in Buildmyiq user-facing dashboard tour from the service-owned seed file. */
8925
9060
  seedBuildmyiqUserTours: SeedBuildmyiqUserToursResult;
8926
9061
  /** Overwrite the built-in CollabKin user-facing dashboard tour from the service-owned seed file. */
@@ -8992,6 +9127,7 @@ export type Mutation = {
8992
9127
  setUserLanguagePreference: UserLanguagePreference;
8993
9128
  /** Set workspace-level override for a feature flag (super admin or workspace admin). RBAC is scoped to the target workspace via `input.workspaceId`. */
8994
9129
  setWorkspaceFeatureFlagOverride: WorkspaceFeatureFlagOverride;
9130
+ settleAssistantAccountBudget: AssistantBudgetReceipt;
8995
9131
  setupMFA: MfaSetupResult;
8996
9132
  /** 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
9133
  shareWorkflow: Application;
@@ -9019,6 +9155,8 @@ export type Mutation = {
9019
9155
  submitAssignmentResponse: SubmitAssignmentResponsePayload;
9020
9156
  /** 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
9157
  submitContactInquiry: SubmitContactInquiryResult;
9158
+ /** 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. */
9159
+ submitExploreFeedback: SubmitExploreFeedbackResult;
9022
9160
  /** Submit feedback for an interview round (admin). */
9023
9161
  submitInterviewFeedback: InterviewFeedback;
9024
9162
  /** 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. */
@@ -9303,7 +9441,6 @@ export type Mutation = {
9303
9441
  /** 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
9442
  upsertUserShippingAddress: ShippingAddress;
9305
9443
  useCannedResponse: CannedResponse;
9306
- validateApiKey: TokenValidationResponse;
9307
9444
  /** Validate an HMAC signature */
9308
9445
  validateHMACSignature: HmacValidationResult;
9309
9446
  /** Validate a signed cookie */
@@ -9888,6 +10025,19 @@ export type MutationCompleteTourArgs = {
9888
10025
  userId: Scalars['ID']['input'];
9889
10026
  };
9890
10027
  /** Root mutation type */
10028
+ export type MutationConfigureAssistantAccountBudgetArgs = {
10029
+ billingAccountId: Scalars['ID']['input'];
10030
+ dailyMicroUsd: Scalars['Int']['input'];
10031
+ dailyTokens: Scalars['Int']['input'];
10032
+ enabled: Scalars['Boolean']['input'];
10033
+ };
10034
+ /** Root mutation type */
10035
+ export type MutationConfigureAssistantModelPriceArgs = {
10036
+ inputPer1M: Scalars['String']['input'];
10037
+ model: Scalars['String']['input'];
10038
+ outputPer1M: Scalars['String']['input'];
10039
+ };
10040
+ /** Root mutation type */
9891
10041
  export type MutationConfigureEntitlementSeatsArgs = {
9892
10042
  entitlementId: Scalars['ID']['input'];
9893
10043
  maxSeats: Scalars['Int']['input'];
@@ -10848,6 +10998,10 @@ export type MutationDisableAuthMethodArgs = {
10848
10998
  authType: AuthType;
10849
10999
  };
10850
11000
  /** Root mutation type */
11001
+ export type MutationDisableMfaArgs = {
11002
+ code?: InputMaybe<Scalars['String']['input']>;
11003
+ };
11004
+ /** Root mutation type */
10851
11005
  export type MutationDisableScheduleArgs = {
10852
11006
  id: Scalars['ID']['input'];
10853
11007
  reason?: InputMaybe<Scalars['String']['input']>;
@@ -10913,12 +11067,20 @@ export type MutationEraseSubjectArgs = {
10913
11067
  subjectId: Scalars['ID']['input'];
10914
11068
  };
10915
11069
  /** Root mutation type */
11070
+ export type MutationEscalateExploreConversationArgs = {
11071
+ input: EscalateExploreConversationInput;
11072
+ };
11073
+ /** Root mutation type */
10916
11074
  export type MutationEscalateSupportTicketArgs = {
10917
11075
  escalateTo?: InputMaybe<Scalars['String']['input']>;
10918
11076
  id: Scalars['ID']['input'];
10919
11077
  reason: Scalars['String']['input'];
10920
11078
  };
10921
11079
  /** Root mutation type */
11080
+ export type MutationExchangeOwnDelegationArgs = {
11081
+ input: ExchangeOwnDelegationInput;
11082
+ };
11083
+ /** Root mutation type */
10922
11084
  export type MutationExchangeTokenArgs = {
10923
11085
  input: ExchangeTokenInput;
10924
11086
  };
@@ -11877,6 +12039,10 @@ export type MutationResendVerificationEmailArgs = {
11877
12039
  email: Scalars['String']['input'];
11878
12040
  };
11879
12041
  /** Root mutation type */
12042
+ export type MutationReserveAssistantAccountBudgetArgs = {
12043
+ input: ReserveAssistantBudgetInput;
12044
+ };
12045
+ /** Root mutation type */
11880
12046
  export type MutationResetCircuitBreakerArgs = {
11881
12047
  scope: Scalars['String']['input'];
11882
12048
  scopeValue: Scalars['String']['input'];
@@ -11943,6 +12109,10 @@ export type MutationRestoreTemplateVersionArgs = {
11943
12109
  version: Scalars['Int']['input'];
11944
12110
  };
11945
12111
  /** Root mutation type */
12112
+ export type MutationRestrictAppDelegationInternalArgs = {
12113
+ input: RestrictAppDelegationInternalInput;
12114
+ };
12115
+ /** Root mutation type */
11946
12116
  export type MutationResubscribeArgs = {
11947
12117
  email: Scalars['String']['input'];
11948
12118
  platformProductId?: InputMaybe<Scalars['String']['input']>;
@@ -11992,6 +12162,10 @@ export type MutationRetryJobExecutionArgs = {
11992
12162
  executionId: Scalars['ID']['input'];
11993
12163
  };
11994
12164
  /** Root mutation type */
12165
+ export type MutationRetryNodeSandboxBuildArgs = {
12166
+ id: Scalars['ID']['input'];
12167
+ };
12168
+ /** Root mutation type */
11995
12169
  export type MutationRetryPayoutArgs = {
11996
12170
  id: Scalars['ID']['input'];
11997
12171
  };
@@ -12021,6 +12195,10 @@ export type MutationRevokeApiKeyArgs = {
12021
12195
  keyId: Scalars['String']['input'];
12022
12196
  };
12023
12197
  /** Root mutation type */
12198
+ export type MutationRevokeAppDelegationInternalArgs = {
12199
+ input: RevokeAppDelegationInternalInput;
12200
+ };
12201
+ /** Root mutation type */
12024
12202
  export type MutationRevokeAppWorkspaceAccessArgs = {
12025
12203
  input: RevokeAppWorkspaceAccessInput;
12026
12204
  };
@@ -12263,6 +12441,13 @@ export type MutationSetWorkspaceFeatureFlagOverrideArgs = {
12263
12441
  input: SetWorkspaceFeatureFlagOverrideInput;
12264
12442
  };
12265
12443
  /** Root mutation type */
12444
+ export type MutationSettleAssistantAccountBudgetArgs = {
12445
+ id: Scalars['ID']['input'];
12446
+ inputTokens: Scalars['Int']['input'];
12447
+ outputTokens: Scalars['Int']['input'];
12448
+ workspaceId: Scalars['ID']['input'];
12449
+ };
12450
+ /** Root mutation type */
12266
12451
  export type MutationSetupMfaArgs = {
12267
12452
  method: MfaMethod;
12268
12453
  };
@@ -12340,6 +12525,10 @@ export type MutationSubmitContactInquiryArgs = {
12340
12525
  input: SubmitContactInquiryInput;
12341
12526
  };
12342
12527
  /** Root mutation type */
12528
+ export type MutationSubmitExploreFeedbackArgs = {
12529
+ input: SubmitExploreFeedbackInput;
12530
+ };
12531
+ /** Root mutation type */
12343
12532
  export type MutationSubmitInterviewFeedbackArgs = {
12344
12533
  input: SubmitInterviewFeedbackInput;
12345
12534
  };
@@ -13215,10 +13404,6 @@ export type MutationUseCannedResponseArgs = {
13215
13404
  id: Scalars['ID']['input'];
13216
13405
  };
13217
13406
  /** Root mutation type */
13218
- export type MutationValidateApiKeyArgs = {
13219
- apiKey: Scalars['String']['input'];
13220
- };
13221
- /** Root mutation type */
13222
13407
  export type MutationValidateHmacSignatureArgs = {
13223
13408
  algorithm?: InputMaybe<Scalars['String']['input']>;
13224
13409
  appId: Scalars['ID']['input'];
@@ -13655,6 +13840,39 @@ export declare enum NewsletterWaitlistStatus {
13655
13840
  Pending = "PENDING",
13656
13841
  Rejected = "REJECTED"
13657
13842
  }
13843
+ /** 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. */
13844
+ export type NodeSandboxBuildCheck = {
13845
+ __typename?: 'NodeSandboxBuildCheck';
13846
+ applicationVersionId?: Maybe<Scalars['String']['output']>;
13847
+ checkedAt: Scalars['DateTime']['output'];
13848
+ failureStep?: Maybe<Scalars['String']['output']>;
13849
+ id: Scalars['ID']['output'];
13850
+ runConclusion?: Maybe<Scalars['String']['output']>;
13851
+ runId: Scalars['String']['output'];
13852
+ runStartedAt?: Maybe<Scalars['DateTime']['output']>;
13853
+ runStatus: Scalars['String']['output'];
13854
+ runUpdatedAt?: Maybe<Scalars['DateTime']['output']>;
13855
+ runUrl: Scalars['String']['output'];
13856
+ slug?: Maybe<Scalars['String']['output']>;
13857
+ version?: Maybe<Scalars['String']['output']>;
13858
+ };
13859
+ export type NodeSandboxBuildCheckConnection = {
13860
+ __typename?: 'NodeSandboxBuildCheckConnection';
13861
+ edges: Array<NodeSandboxBuildCheckEdge>;
13862
+ pageInfo: PageInfo;
13863
+ totalCount: Scalars['Int']['output'];
13864
+ };
13865
+ export type NodeSandboxBuildCheckEdge = {
13866
+ __typename?: 'NodeSandboxBuildCheckEdge';
13867
+ cursor: Scalars['String']['output'];
13868
+ node: NodeSandboxBuildCheck;
13869
+ };
13870
+ /** 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. */
13871
+ export type NodeSandboxBuildPollResult = {
13872
+ __typename?: 'NodeSandboxBuildPollResult';
13873
+ recorded: Scalars['Int']['output'];
13874
+ skipped: Scalars['Boolean']['output'];
13875
+ };
13658
13876
  export type Notification = {
13659
13877
  __typename?: 'Notification';
13660
13878
  actions: Array<NotificationAction>;
@@ -14694,6 +14912,8 @@ export declare enum PaymentMethodType {
14694
14912
  Crypto = "CRYPTO",
14695
14913
  DebitCard = "DEBIT_CARD",
14696
14914
  Netbanking = "NETBANKING",
14915
+ /** Zero-total purchases (e.g. a 100%-off coupon) — no gateway/method involved. */
14916
+ None = "NONE",
14697
14917
  Paypal = "PAYPAL",
14698
14918
  Wallet = "WALLET"
14699
14919
  }
@@ -14985,6 +15205,8 @@ export type Plan = {
14985
15205
  minSeats?: Maybe<Scalars['Int']['output']>;
14986
15206
  /** The name of the plan (e.g., 'Basic', 'Pro', 'Enterprise'). */
14987
15207
  name?: Maybe<Scalars['String']['output']>;
15208
+ /** Apple App Store / Google Play SKU for this plan. */
15209
+ nativeProductId?: Maybe<Scalars['String']['output']>;
14988
15210
  /** The price of the plan. */
14989
15211
  price?: Maybe<Scalars['Float']['output']>;
14990
15212
  /** Historical record of price changes for this plan */
@@ -16504,6 +16726,8 @@ export type Query = {
16504
16726
  newsletterVariant?: Maybe<NewsletterVariant>;
16505
16727
  newsletterVariants: Array<NewsletterVariant>;
16506
16728
  newsletters: Array<Newsletter>;
16729
+ /** 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. */
16730
+ nodeSandboxBuildChecks: NodeSandboxBuildCheckConnection;
16507
16731
  /** Get a single notification by ID */
16508
16732
  notification?: Maybe<Notification>;
16509
16733
  /** Get notification events/history for a specific notification */
@@ -18608,6 +18832,12 @@ export type QueryNewslettersArgs = {
18608
18832
  offset?: InputMaybe<Scalars['Int']['input']>;
18609
18833
  };
18610
18834
  /** Root query type */
18835
+ export type QueryNodeSandboxBuildChecksArgs = {
18836
+ applicationVersionId?: InputMaybe<Scalars['ID']['input']>;
18837
+ limit?: InputMaybe<Scalars['Int']['input']>;
18838
+ offset?: InputMaybe<Scalars['Int']['input']>;
18839
+ };
18840
+ /** Root query type */
18611
18841
  export type QueryNotificationArgs = {
18612
18842
  id: Scalars['ID']['input'];
18613
18843
  };
@@ -20448,6 +20678,13 @@ export type ResendVerificationResult = {
20448
20678
  message: Scalars['String']['output'];
20449
20679
  success: Scalars['Boolean']['output'];
20450
20680
  };
20681
+ export type ReserveAssistantBudgetInput = {
20682
+ id: Scalars['ID']['input'];
20683
+ inputTokens: Scalars['Int']['input'];
20684
+ model: Scalars['String']['input'];
20685
+ outputTokens: Scalars['Int']['input'];
20686
+ workspaceId: Scalars['ID']['input'];
20687
+ };
20451
20688
  /** 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
20689
  export type ResolveBillingAccountInput = {
20453
20690
  /** Opaque org id that anchors the billing account. When present the org's default billing account is resolved-or-created. */
@@ -20495,6 +20732,17 @@ export type ResourceTypeProductInfo = {
20495
20732
  products: Array<Scalars['String']['output']>;
20496
20733
  resourceType: Scalars['String']['output'];
20497
20734
  };
20735
+ /** Input for the service-trusted internal reduction of a first-party self-delegation. */
20736
+ export type RestrictAppDelegationInternalInput = {
20737
+ /** Client ID of the first-party system app (e.g. burdenoff_integration_core). */
20738
+ clientId: Scalars['String']['input'];
20739
+ /** 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. */
20740
+ scopes: Array<Scalars['String']['input']>;
20741
+ /** The user whose delegation to the app is reduced. */
20742
+ userId: Scalars['String']['input'];
20743
+ /** 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. */
20744
+ workspaceIds: Array<Scalars['String']['input']>;
20745
+ };
20498
20746
  export type RetryBillingOrderCallbackResponse = {
20499
20747
  __typename?: 'RetryBillingOrderCallbackResponse';
20500
20748
  error?: Maybe<Scalars['String']['output']>;
@@ -20551,8 +20799,19 @@ export type RevokeAllSessionsResult = {
20551
20799
  revokedCount: Scalars['Int']['output'];
20552
20800
  success: Scalars['Boolean']['output'];
20553
20801
  };
20802
+ /** Input for the service-trusted internal revoke of a first-party self-delegation. */
20803
+ export type RevokeAppDelegationInternalInput = {
20804
+ /** Client ID of the first-party system app (e.g. burdenoff_integration_core). */
20805
+ clientId: Scalars['String']['input'];
20806
+ /** Recorded on the delegation and in the audit log. */
20807
+ reason?: InputMaybe<Scalars['String']['input']>;
20808
+ /** The user whose delegation to the app is revoked. */
20809
+ userId: Scalars['String']['input'];
20810
+ };
20554
20811
  export type RevokeAppWorkspaceAccessInput = {
20555
20812
  appId: Scalars['ID']['input'];
20813
+ /** 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. */
20814
+ onlyIfGrantedByCaller?: InputMaybe<Scalars['Boolean']['input']>;
20556
20815
  reason?: InputMaybe<Scalars['String']['input']>;
20557
20816
  workspaceId: Scalars['ID']['input'];
20558
20817
  };
@@ -21089,6 +21348,15 @@ export type SeedAtheleteBridgeUserToursResult = {
21089
21348
  updatedCount: Scalars['Int']['output'];
21090
21349
  workspaceId: Scalars['String']['output'];
21091
21350
  };
21351
+ export type SeedBigconsoleUserToursResult = {
21352
+ __typename?: 'SeedBigconsoleUserToursResult';
21353
+ createdCount: Scalars['Int']['output'];
21354
+ productId: Scalars['String']['output'];
21355
+ totalCount: Scalars['Int']['output'];
21356
+ tours: Array<SeededUserTourResult>;
21357
+ updatedCount: Scalars['Int']['output'];
21358
+ workspaceId: Scalars['String']['output'];
21359
+ };
21092
21360
  export type SeedBuildmyiqUserToursResult = {
21093
21361
  __typename?: 'SeedBuildmyiqUserToursResult';
21094
21362
  createdCount: Scalars['Int']['output'];
@@ -22240,6 +22508,24 @@ export type SubmitContactInquiryResult = {
22240
22508
  /** Whether the submission was successful */
22241
22509
  success: Scalars['Boolean']['output'];
22242
22510
  };
22511
+ /** 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. */
22512
+ export type SubmitExploreFeedbackInput = {
22513
+ /** Optional free text. Capped server-side; the server truncates rather than rejecting, because a rating is never worth failing over its comment. */
22514
+ comment?: InputMaybe<Scalars['String']['input']>;
22515
+ /** Bearer secret for the conversation the answer belongs to. */
22516
+ conversationToken: Scalars['String']['input'];
22517
+ /** The assistant message being rated. Must be COMPLETED. */
22518
+ messageId: Scalars['ID']['input'];
22519
+ rating: ExploreFeedbackRating;
22520
+ /** 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. */
22521
+ reason?: InputMaybe<Scalars['String']['input']>;
22522
+ };
22523
+ export type SubmitExploreFeedbackResult = {
22524
+ __typename?: 'SubmitExploreFeedbackResult';
22525
+ /** 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. */
22526
+ feedback?: Maybe<ExploreFeedback>;
22527
+ recorded: Scalars['Boolean']['output'];
22528
+ };
22243
22529
  export type SubmitInterviewFeedbackInput = {
22244
22530
  internalNotes?: InputMaybe<Scalars['String']['input']>;
22245
22531
  interviewerId: Scalars['ID']['input'];
@@ -23161,10 +23447,14 @@ export type Tenant = {
23161
23447
  /** Workspaces belonging to this tenant */
23162
23448
  workspaces: Array<Workspace>;
23163
23449
  };
23164
- /** Tenant configuration for regional settings, branding, and features */
23450
+ /** Tenant configuration for regional settings, data residency, and features */
23165
23451
  export type TenantConfig = {
23166
23452
  __typename?: 'TenantConfig';
23167
23453
  complianceRegion?: Maybe<Scalars['String']['output']>;
23454
+ /**
23455
+ * Always null. Burdenoff does no white-labelling: every product keeps its own brand, so tenants cannot set a custom logo, colour or favicon.
23456
+ * @deprecated No white-labelling — products keep their own brand. This setting is ignored.
23457
+ */
23168
23458
  customBranding?: Maybe<Scalars['JSON']['output']>;
23169
23459
  dataResidency?: Maybe<Scalars['String']['output']>;
23170
23460
  features?: Maybe<Scalars['JSON']['output']>;
@@ -25545,12 +25835,16 @@ export type UserWishlist = {
25545
25835
  userId: Scalars['String']['output'];
25546
25836
  };
25547
25837
  export type ValidateCouponInput = {
25838
+ /** Addon being purchased — same purpose as planId, for addon purchases. */
25839
+ addonId?: InputMaybe<Scalars['ID']['input']>;
25548
25840
  /** Order amount before discount */
25549
25841
  amount: Scalars['Float']['input'];
25550
25842
  /** Coupon code to validate */
25551
25843
  code: Scalars['String']['input'];
25552
25844
  /** Currency */
25553
25845
  currency: Scalars['String']['input'];
25846
+ /** 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. */
25847
+ planId?: InputMaybe<Scalars['ID']['input']>;
25554
25848
  /** Optional: product IDs being purchased */
25555
25849
  productIds?: InputMaybe<Array<Scalars['String']['input']>>;
25556
25850
  /** Optional: service IDs being purchased */