@burdenoff/microfe-devportal 2026.1013.2 → 2026.1024.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']>;
@@ -3843,6 +3875,7 @@ export type CreatePermissionOverrideInput = {
3843
3875
  };
3844
3876
  export type CreatePhysicalProductInput = {
3845
3877
  allowBackorder?: InputMaybe<Scalars['Boolean']['input']>;
3878
+ bannerUrl?: InputMaybe<Scalars['String']['input']>;
3846
3879
  brand?: InputMaybe<Scalars['String']['input']>;
3847
3880
  category?: InputMaybe<Scalars['String']['input']>;
3848
3881
  /** Which platform products this listing is relevant to (e.g. "healthybowl"). Set by the calling seller-portal shell — see DeveloperOrgKind (BOFF-7285). */
@@ -5645,6 +5678,25 @@ export type EraseResult = {
5645
5678
  retainedForLegalReason?: Maybe<Scalars['String']['output']>;
5646
5679
  service: Scalars['String']['output'];
5647
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
+ };
5648
5700
  export type EvaluateFeatureFlagsInput = {
5649
5701
  /** Specific flag keys to evaluate. If empty, evaluates ALL active flags. */
5650
5702
  keys?: InputMaybe<Array<Scalars['String']['input']>>;
@@ -5652,6 +5704,10 @@ export type EvaluateFeatureFlagsInput = {
5652
5704
  productSlug?: InputMaybe<Scalars['String']['input']>;
5653
5705
  workspaceId: Scalars['String']['input'];
5654
5706
  };
5707
+ export type ExchangeOwnDelegationInput = {
5708
+ delegationId: Scalars['ID']['input'];
5709
+ scopes?: InputMaybe<Array<Scalars['String']['input']>>;
5710
+ };
5655
5711
  export type ExchangeTokenInput = {
5656
5712
  appId: Scalars['String']['input'];
5657
5713
  scopes?: InputMaybe<Array<Scalars['String']['input']>>;
@@ -5714,6 +5770,8 @@ export type ExploreAdminFilter = {
5714
5770
  from?: InputMaybe<Scalars['DateTime']['input']>;
5715
5771
  /** Salted IP hash, to group one visitor's sessions. */
5716
5772
  ipHash?: InputMaybe<Scalars['String']['input']>;
5773
+ /** Only conversations containing an answer a visitor marked NOT helpful. */
5774
+ notHelpfulOnly?: InputMaybe<Scalars['Boolean']['input']>;
5717
5775
  /** Match conversations that started on this product's website. */
5718
5776
  productSlug?: InputMaybe<Scalars['String']['input']>;
5719
5777
  /** Free-text match against message content. */
@@ -5734,6 +5792,8 @@ export type ExploreAdminMessage = {
5734
5792
  createdAt: Scalars['DateTime']['output'];
5735
5793
  ctas: Array<ExploreCta>;
5736
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>;
5737
5797
  followUps: Array<Scalars['String']['output']>;
5738
5798
  id: Scalars['ID']['output'];
5739
5799
  references: Array<ExploreReference>;
@@ -5760,7 +5820,11 @@ export type ExploreAdminStats = {
5760
5820
  byProduct: Array<ExploreAdminProductStat>;
5761
5821
  clicks: Scalars['Int']['output'];
5762
5822
  conversations: Scalars['Int']['output'];
5823
+ /** Answers a visitor marked helpful. */
5824
+ helpful: Scalars['Int']['output'];
5763
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'];
5764
5828
  /** Assistant answers the corpus could not ground. */
5765
5829
  unanswered: Scalars['Int']['output'];
5766
5830
  };
@@ -5773,8 +5837,20 @@ export type ExploreAgentActivity = {
5773
5837
  export type ExploreAgentCatalog = {
5774
5838
  __typename?: 'ExploreAgentCatalog';
5775
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>;
5776
5842
  products: Array<ExploreAgentProduct>;
5777
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
+ };
5778
5854
  export type ExploreAgentCtaSuggestion = {
5779
5855
  __typename?: 'ExploreAgentCtaSuggestion';
5780
5856
  label: Scalars['String']['output'];
@@ -5877,6 +5953,8 @@ export type ExploreAttachmentInput = {
5877
5953
  export type ExploreCatalog = {
5878
5954
  __typename?: 'ExploreCatalog';
5879
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>;
5880
5958
  enabled: Scalars['Boolean']['output'];
5881
5959
  examplePrompts: Array<Scalars['String']['output']>;
5882
5960
  limits: ExploreLimits;
@@ -5885,6 +5963,17 @@ export type ExploreCatalog = {
5885
5963
  welcomeBody: Scalars['String']['output'];
5886
5964
  welcomeTitle: Scalars['String']['output'];
5887
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
+ };
5888
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. */
5889
5978
  export type ExploreConversation = {
5890
5979
  __typename?: 'ExploreConversation';
@@ -5902,6 +5991,26 @@ export type ExploreCta = {
5902
5991
  product?: Maybe<Scalars['String']['output']>;
5903
5992
  url: Scalars['String']['output'];
5904
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
+ }
5905
6014
  /** Server-enforced limits, surfaced so the UI can pre-validate instead of discovering them through an error. */
5906
6015
  export type ExploreLimits = {
5907
6016
  __typename?: 'ExploreLimits';
@@ -5926,6 +6035,8 @@ export type ExploreMessage = {
5926
6035
  createdAt: Scalars['DateTime']['output'];
5927
6036
  ctas: Array<ExploreCta>;
5928
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>;
5929
6040
  /** Suggested next questions, derived from what this answer actually covered. Empty until the turn completes, and empty when nothing useful can be derived. */
5930
6041
  followUps: Array<Scalars['String']['output']>;
5931
6042
  id: Scalars['ID']['output'];
@@ -6383,6 +6494,10 @@ export type GetStoreProductTagsInput = {
6383
6494
  export type GrantAppDelegationInternalInput = {
6384
6495
  /** Client ID of the first-party system app (e.g. burdenoff_integration_core). */
6385
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']>>;
6386
6501
  /** Scopes to grant — must be a subset of the app's scopes. */
6387
6502
  scopes: Array<Scalars['String']['input']>;
6388
6503
  /** The user granting (and target of) the self-delegation. */
@@ -6392,6 +6507,8 @@ export type GrantAppDelegationInternalInput = {
6392
6507
  };
6393
6508
  export type GrantAppWorkspaceAccessInput = {
6394
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']>;
6395
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. */
6396
6513
  reactivateRevoked?: InputMaybe<Scalars['Boolean']['input']>;
6397
6514
  /** Optional subset of the app's global scopes. Empty array means the authorization inherits the app's full scope list. */
@@ -7113,6 +7230,8 @@ export type IssueAppAsUserTokenInternalInput = {
7113
7230
  scopes?: InputMaybe<Array<Scalars['String']['input']>>;
7114
7231
  /** The user the app will act on behalf of (must have an active delegation). */
7115
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']>;
7116
7235
  };
7117
7236
  export type ItemOrder = {
7118
7237
  __typename?: 'ItemOrder';
@@ -8108,6 +8227,8 @@ export type Mutation = {
8108
8227
  completeSupportAttachmentUpload: SupportAttachmentFile;
8109
8228
  /** Mark a tour as completed for a user */
8110
8229
  completeTour: TourUserProgress;
8230
+ configureAssistantAccountBudget: AssistantAccountBudget;
8231
+ configureAssistantModelPrice: AiModelPrice;
8111
8232
  configureEntitlementSeats: ProductEntitlement;
8112
8233
  /** Configure Kerberos authentication for a tenant */
8113
8234
  configureKerberos: KerberosConfig;
@@ -8462,6 +8583,7 @@ export type Mutation = {
8462
8583
  /** Detach media from a tour step */
8463
8584
  detachMediaFromStep: Scalars['Boolean']['output'];
8464
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. */
8465
8587
  disableMFA: Scalars['Boolean']['output'];
8466
8588
  disableMaintenanceMode: MaintenanceModeStatus;
8467
8589
  disableSchedule: ScheduledJob;
@@ -8477,13 +8599,16 @@ export type Mutation = {
8477
8599
  enableMFA: Scalars['Boolean']['output'];
8478
8600
  enableMaintenanceMode: MaintenanceModeStatus;
8479
8601
  enrollSubscriberInAutomation: AutomationSubscriber;
8480
- /** 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. */
8481
8603
  ensureOrganizationMember: EnsureOrganizationMemberResult;
8482
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. */
8483
8605
  ensureStoreOrderBillingOrder: EnsureStoreOrderBillingOrderResponse;
8484
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. */
8485
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;
8486
8610
  escalateSupportTicket: SupportTicket;
8611
+ exchangeOwnDelegation: AppAsUserTokenResponse;
8487
8612
  /** Exchange app token for app-as-user token (Token Exchange flow) */
8488
8613
  exchangeToken: AppAsUserTokenResponse;
8489
8614
  executeJobNow: JobExecution;
@@ -8623,6 +8748,8 @@ export type Mutation = {
8623
8748
  payInvoice: Invoice;
8624
8749
  permanentlyDeleteSchedule: Scalars['Boolean']['output'];
8625
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;
8626
8753
  prepareSupportAttachmentUpload: SupportAttachmentUploadSession;
8627
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. */
8628
8755
  processAppSaleRefund: DeveloperOrgSale;
@@ -8830,6 +8957,7 @@ export type Mutation = {
8830
8957
  resendOrganizationInvite: OrganizationInvite;
8831
8958
  resendSurvey: CustomerSatisfactionSurvey;
8832
8959
  resendVerificationEmail: ResendVerificationResult;
8960
+ reserveAssistantAccountBudget: AssistantBudgetReceipt;
8833
8961
  resetCircuitBreaker: CircuitBreakerState;
8834
8962
  /** Reset password using token from email */
8835
8963
  resetPassword: Scalars['Boolean']['output'];
@@ -8851,6 +8979,8 @@ export type Mutation = {
8851
8979
  restoreChannel: Channel;
8852
8980
  restoreScheduleVersion: ScheduledJob;
8853
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>;
8854
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. */
8855
8985
  resubscribe: NewsletterSubscriber;
8856
8986
  /** Resume a paused subscription */
@@ -8868,6 +8998,8 @@ export type Mutation = {
8868
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). */
8869
8999
  retryInvoiceGeneration: Invoice;
8870
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'];
8871
9003
  /** Retry a failed payout */
8872
9004
  retryPayout: DeveloperOrgPayout;
8873
9005
  /** Retry a failed refund */
@@ -8880,7 +9012,9 @@ export type Mutation = {
8880
9012
  revokeAPIKey: Scalars['Boolean']['output'];
8881
9013
  /** Revoke all sessions except the current one. Returns the number of sessions that were revoked. */
8882
9014
  revokeAllSessions: RevokeAllSessionsResult;
8883
- /** 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). */
8884
9018
  revokeAppWorkspaceAccess: Scalars['Boolean']['output'];
8885
9019
  revokeConsent: NewsletterConsent;
8886
9020
  revokeDelegation: Scalars['Boolean']['output'];
@@ -8920,6 +9054,8 @@ export type Mutation = {
8920
9054
  scheduleNotification: ScheduledNotification;
8921
9055
  /** Overwrite the built-in AthleteBridge user-facing tours from the service-owned seed file. */
8922
9056
  seedAtheleteBridgeUserTours: SeedAtheleteBridgeUserToursResult;
9057
+ /** Overwrite the service-owned BigConsole onboarding tours. Repeated calls update the same slugs. */
9058
+ seedBigconsoleUserTours: SeedBigconsoleUserToursResult;
8923
9059
  /** Overwrite the built-in Buildmyiq user-facing dashboard tour from the service-owned seed file. */
8924
9060
  seedBuildmyiqUserTours: SeedBuildmyiqUserToursResult;
8925
9061
  /** Overwrite the built-in CollabKin user-facing dashboard tour from the service-owned seed file. */
@@ -8991,6 +9127,7 @@ export type Mutation = {
8991
9127
  setUserLanguagePreference: UserLanguagePreference;
8992
9128
  /** Set workspace-level override for a feature flag (super admin or workspace admin). RBAC is scoped to the target workspace via `input.workspaceId`. */
8993
9129
  setWorkspaceFeatureFlagOverride: WorkspaceFeatureFlagOverride;
9130
+ settleAssistantAccountBudget: AssistantBudgetReceipt;
8994
9131
  setupMFA: MfaSetupResult;
8995
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. */
8996
9133
  shareWorkflow: Application;
@@ -9018,6 +9155,8 @@ export type Mutation = {
9018
9155
  submitAssignmentResponse: SubmitAssignmentResponsePayload;
9019
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. */
9020
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;
9021
9160
  /** Submit feedback for an interview round (admin). */
9022
9161
  submitInterviewFeedback: InterviewFeedback;
9023
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. */
@@ -9302,7 +9441,6 @@ export type Mutation = {
9302
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. */
9303
9442
  upsertUserShippingAddress: ShippingAddress;
9304
9443
  useCannedResponse: CannedResponse;
9305
- validateApiKey: TokenValidationResponse;
9306
9444
  /** Validate an HMAC signature */
9307
9445
  validateHMACSignature: HmacValidationResult;
9308
9446
  /** Validate a signed cookie */
@@ -9887,6 +10025,19 @@ export type MutationCompleteTourArgs = {
9887
10025
  userId: Scalars['ID']['input'];
9888
10026
  };
9889
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 */
9890
10041
  export type MutationConfigureEntitlementSeatsArgs = {
9891
10042
  entitlementId: Scalars['ID']['input'];
9892
10043
  maxSeats: Scalars['Int']['input'];
@@ -10847,6 +10998,10 @@ export type MutationDisableAuthMethodArgs = {
10847
10998
  authType: AuthType;
10848
10999
  };
10849
11000
  /** Root mutation type */
11001
+ export type MutationDisableMfaArgs = {
11002
+ code?: InputMaybe<Scalars['String']['input']>;
11003
+ };
11004
+ /** Root mutation type */
10850
11005
  export type MutationDisableScheduleArgs = {
10851
11006
  id: Scalars['ID']['input'];
10852
11007
  reason?: InputMaybe<Scalars['String']['input']>;
@@ -10912,12 +11067,20 @@ export type MutationEraseSubjectArgs = {
10912
11067
  subjectId: Scalars['ID']['input'];
10913
11068
  };
10914
11069
  /** Root mutation type */
11070
+ export type MutationEscalateExploreConversationArgs = {
11071
+ input: EscalateExploreConversationInput;
11072
+ };
11073
+ /** Root mutation type */
10915
11074
  export type MutationEscalateSupportTicketArgs = {
10916
11075
  escalateTo?: InputMaybe<Scalars['String']['input']>;
10917
11076
  id: Scalars['ID']['input'];
10918
11077
  reason: Scalars['String']['input'];
10919
11078
  };
10920
11079
  /** Root mutation type */
11080
+ export type MutationExchangeOwnDelegationArgs = {
11081
+ input: ExchangeOwnDelegationInput;
11082
+ };
11083
+ /** Root mutation type */
10921
11084
  export type MutationExchangeTokenArgs = {
10922
11085
  input: ExchangeTokenInput;
10923
11086
  };
@@ -11876,6 +12039,10 @@ export type MutationResendVerificationEmailArgs = {
11876
12039
  email: Scalars['String']['input'];
11877
12040
  };
11878
12041
  /** Root mutation type */
12042
+ export type MutationReserveAssistantAccountBudgetArgs = {
12043
+ input: ReserveAssistantBudgetInput;
12044
+ };
12045
+ /** Root mutation type */
11879
12046
  export type MutationResetCircuitBreakerArgs = {
11880
12047
  scope: Scalars['String']['input'];
11881
12048
  scopeValue: Scalars['String']['input'];
@@ -11942,6 +12109,10 @@ export type MutationRestoreTemplateVersionArgs = {
11942
12109
  version: Scalars['Int']['input'];
11943
12110
  };
11944
12111
  /** Root mutation type */
12112
+ export type MutationRestrictAppDelegationInternalArgs = {
12113
+ input: RestrictAppDelegationInternalInput;
12114
+ };
12115
+ /** Root mutation type */
11945
12116
  export type MutationResubscribeArgs = {
11946
12117
  email: Scalars['String']['input'];
11947
12118
  platformProductId?: InputMaybe<Scalars['String']['input']>;
@@ -11991,6 +12162,10 @@ export type MutationRetryJobExecutionArgs = {
11991
12162
  executionId: Scalars['ID']['input'];
11992
12163
  };
11993
12164
  /** Root mutation type */
12165
+ export type MutationRetryNodeSandboxBuildArgs = {
12166
+ id: Scalars['ID']['input'];
12167
+ };
12168
+ /** Root mutation type */
11994
12169
  export type MutationRetryPayoutArgs = {
11995
12170
  id: Scalars['ID']['input'];
11996
12171
  };
@@ -12020,6 +12195,10 @@ export type MutationRevokeApiKeyArgs = {
12020
12195
  keyId: Scalars['String']['input'];
12021
12196
  };
12022
12197
  /** Root mutation type */
12198
+ export type MutationRevokeAppDelegationInternalArgs = {
12199
+ input: RevokeAppDelegationInternalInput;
12200
+ };
12201
+ /** Root mutation type */
12023
12202
  export type MutationRevokeAppWorkspaceAccessArgs = {
12024
12203
  input: RevokeAppWorkspaceAccessInput;
12025
12204
  };
@@ -12262,6 +12441,13 @@ export type MutationSetWorkspaceFeatureFlagOverrideArgs = {
12262
12441
  input: SetWorkspaceFeatureFlagOverrideInput;
12263
12442
  };
12264
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 */
12265
12451
  export type MutationSetupMfaArgs = {
12266
12452
  method: MfaMethod;
12267
12453
  };
@@ -12339,6 +12525,10 @@ export type MutationSubmitContactInquiryArgs = {
12339
12525
  input: SubmitContactInquiryInput;
12340
12526
  };
12341
12527
  /** Root mutation type */
12528
+ export type MutationSubmitExploreFeedbackArgs = {
12529
+ input: SubmitExploreFeedbackInput;
12530
+ };
12531
+ /** Root mutation type */
12342
12532
  export type MutationSubmitInterviewFeedbackArgs = {
12343
12533
  input: SubmitInterviewFeedbackInput;
12344
12534
  };
@@ -13214,10 +13404,6 @@ export type MutationUseCannedResponseArgs = {
13214
13404
  id: Scalars['ID']['input'];
13215
13405
  };
13216
13406
  /** Root mutation type */
13217
- export type MutationValidateApiKeyArgs = {
13218
- apiKey: Scalars['String']['input'];
13219
- };
13220
- /** Root mutation type */
13221
13407
  export type MutationValidateHmacSignatureArgs = {
13222
13408
  algorithm?: InputMaybe<Scalars['String']['input']>;
13223
13409
  appId: Scalars['ID']['input'];
@@ -13654,6 +13840,39 @@ export declare enum NewsletterWaitlistStatus {
13654
13840
  Pending = "PENDING",
13655
13841
  Rejected = "REJECTED"
13656
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
+ };
13657
13876
  export type Notification = {
13658
13877
  __typename?: 'Notification';
13659
13878
  actions: Array<NotificationAction>;
@@ -14141,6 +14360,8 @@ export type OrderEstimateInput = {
14141
14360
  /** Order fulfillment tracking for physical orders */
14142
14361
  export type OrderFulfillment = {
14143
14362
  __typename?: 'OrderFulfillment';
14363
+ /** Carrier shipment-creation attempt history (every retry, not just the last failure) — for admin debugging of "what happened, why, and how to fix it". */
14364
+ attempts: Array<OrderFulfillmentAttempt>;
14144
14365
  /** When order was cancelled */
14145
14366
  cancelledAt?: Maybe<Scalars['DateTime']['output']>;
14146
14367
  /** Shipping carrier name */
@@ -14201,6 +14422,26 @@ export type OrderFulfillment = {
14201
14422
  trackingUrl?: Maybe<Scalars['String']['output']>;
14202
14423
  updatedAt: Scalars['DateTime']['output'];
14203
14424
  };
14425
+ /** One carrier shipment-creation attempt — Temporal retries this up to 5 times; this is the full history behind OrderFulfillment.failureReason (which only ever holds the last attempt's message). */
14426
+ export type OrderFulfillmentAttempt = {
14427
+ __typename?: 'OrderFulfillmentAttempt';
14428
+ attemptNumber: Scalars['Int']['output'];
14429
+ carrier: Scalars['String']['output'];
14430
+ /** How long this attempt took */
14431
+ durationMs?: Maybe<Scalars['Int']['output']>;
14432
+ /** Error message, when this attempt failed */
14433
+ errorMessage?: Maybe<Scalars['String']['output']>;
14434
+ /** Carrier's HTTP status code, when available */
14435
+ errorStatusCode?: Maybe<Scalars['Int']['output']>;
14436
+ id: Scalars['ID']['output'];
14437
+ occurredAt: Scalars['DateTime']['output'];
14438
+ succeeded: Scalars['Boolean']['output'];
14439
+ };
14440
+ export type OrderFulfillmentAttemptsPage = {
14441
+ __typename?: 'OrderFulfillmentAttemptsPage';
14442
+ attempts: Array<OrderFulfillmentAttempt>;
14443
+ totalCount: Scalars['Int']['output'];
14444
+ };
14204
14445
  /** Category of a seller-reported problem fulfilling an order. */
14205
14446
  export declare enum OrderIssueCategory {
14206
14447
  CannotFulfill = "CANNOT_FULFILL",
@@ -14671,6 +14912,8 @@ export declare enum PaymentMethodType {
14671
14912
  Crypto = "CRYPTO",
14672
14913
  DebitCard = "DEBIT_CARD",
14673
14914
  Netbanking = "NETBANKING",
14915
+ /** Zero-total purchases (e.g. a 100%-off coupon) — no gateway/method involved. */
14916
+ None = "NONE",
14674
14917
  Paypal = "PAYPAL",
14675
14918
  Wallet = "WALLET"
14676
14919
  }
@@ -14962,6 +15205,8 @@ export type Plan = {
14962
15205
  minSeats?: Maybe<Scalars['Int']['output']>;
14963
15206
  /** The name of the plan (e.g., 'Basic', 'Pro', 'Enterprise'). */
14964
15207
  name?: Maybe<Scalars['String']['output']>;
15208
+ /** Apple App Store / Google Play SKU for this plan. */
15209
+ nativeProductId?: Maybe<Scalars['String']['output']>;
14965
15210
  /** The price of the plan. */
14966
15211
  price?: Maybe<Scalars['Float']['output']>;
14967
15212
  /** Historical record of price changes for this plan */
@@ -16481,6 +16726,8 @@ export type Query = {
16481
16726
  newsletterVariant?: Maybe<NewsletterVariant>;
16482
16727
  newsletterVariants: Array<NewsletterVariant>;
16483
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;
16484
16731
  /** Get a single notification by ID */
16485
16732
  notification?: Maybe<Notification>;
16486
16733
  /** Get notification events/history for a specific notification */
@@ -16513,6 +16760,8 @@ export type Query = {
16513
16760
  orderEstimate?: Maybe<OrderEstimate>;
16514
16761
  /** Get fulfillment details for an order */
16515
16762
  orderFulfillment?: Maybe<OrderFulfillment>;
16763
+ /** Admin-only: paginated log of carrier shipment-creation attempts across all orders (every Temporal retry, not just the last failure), so ops can debug fulfillment failures without direct DB/log access. */
16764
+ orderFulfillmentAttempts: OrderFulfillmentAttemptsPage;
16516
16765
  /** Get seller-reported issue flags for an order */
16517
16766
  orderIssueFlags: Array<OrderIssueFlag>;
16518
16767
  /** Get a single organization by ID */
@@ -18583,6 +18832,12 @@ export type QueryNewslettersArgs = {
18583
18832
  offset?: InputMaybe<Scalars['Int']['input']>;
18584
18833
  };
18585
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 */
18586
18841
  export type QueryNotificationArgs = {
18587
18842
  id: Scalars['ID']['input'];
18588
18843
  };
@@ -18661,6 +18916,14 @@ export type QueryOrderFulfillmentArgs = {
18661
18916
  orderId: Scalars['ID']['input'];
18662
18917
  };
18663
18918
  /** Root query type */
18919
+ export type QueryOrderFulfillmentAttemptsArgs = {
18920
+ carrier?: InputMaybe<Scalars['String']['input']>;
18921
+ limit?: InputMaybe<Scalars['Int']['input']>;
18922
+ offset?: InputMaybe<Scalars['Int']['input']>;
18923
+ orderId?: InputMaybe<Scalars['ID']['input']>;
18924
+ succeeded?: InputMaybe<Scalars['Boolean']['input']>;
18925
+ };
18926
+ /** Root query type */
18664
18927
  export type QueryOrderIssueFlagsArgs = {
18665
18928
  orderId: Scalars['ID']['input'];
18666
18929
  };
@@ -20415,6 +20678,13 @@ export type ResendVerificationResult = {
20415
20678
  message: Scalars['String']['output'];
20416
20679
  success: Scalars['Boolean']['output'];
20417
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
+ };
20418
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. */
20419
20689
  export type ResolveBillingAccountInput = {
20420
20690
  /** Opaque org id that anchors the billing account. When present the org's default billing account is resolved-or-created. */
@@ -20462,6 +20732,17 @@ export type ResourceTypeProductInfo = {
20462
20732
  products: Array<Scalars['String']['output']>;
20463
20733
  resourceType: Scalars['String']['output'];
20464
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
+ };
20465
20746
  export type RetryBillingOrderCallbackResponse = {
20466
20747
  __typename?: 'RetryBillingOrderCallbackResponse';
20467
20748
  error?: Maybe<Scalars['String']['output']>;
@@ -20518,8 +20799,19 @@ export type RevokeAllSessionsResult = {
20518
20799
  revokedCount: Scalars['Int']['output'];
20519
20800
  success: Scalars['Boolean']['output'];
20520
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
+ };
20521
20811
  export type RevokeAppWorkspaceAccessInput = {
20522
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']>;
20523
20815
  reason?: InputMaybe<Scalars['String']['input']>;
20524
20816
  workspaceId: Scalars['ID']['input'];
20525
20817
  };
@@ -21056,6 +21348,15 @@ export type SeedAtheleteBridgeUserToursResult = {
21056
21348
  updatedCount: Scalars['Int']['output'];
21057
21349
  workspaceId: Scalars['String']['output'];
21058
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
+ };
21059
21360
  export type SeedBuildmyiqUserToursResult = {
21060
21361
  __typename?: 'SeedBuildmyiqUserToursResult';
21061
21362
  createdCount: Scalars['Int']['output'];
@@ -22001,6 +22302,8 @@ export type StoreProduct = {
22001
22302
  publishedAt?: Maybe<Scalars['DateTime']['output']>;
22002
22303
  publisher?: Maybe<Publisher>;
22003
22304
  publisherId: Scalars['String']['output'];
22305
+ /** Number of PHYSICAL orders this product has been fulfilled in at least once — incremented alongside OrderFulfillment's first creation for the order (see OrderService.ensurePhysicalFulfillmentRecord), the physical counterpart to how `downloads` counts first-install events for digital products. Always 0 for DIGITAL nature. */
22306
+ purchaseCount: Scalars['Int']['output'];
22004
22307
  rating?: Maybe<Scalars['Float']['output']>;
22005
22308
  rejectedReason?: Maybe<Scalars['String']['output']>;
22006
22309
  repositoryUrl?: Maybe<Scalars['String']['output']>;
@@ -22205,6 +22508,24 @@ export type SubmitContactInquiryResult = {
22205
22508
  /** Whether the submission was successful */
22206
22509
  success: Scalars['Boolean']['output'];
22207
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
+ };
22208
22529
  export type SubmitInterviewFeedbackInput = {
22209
22530
  internalNotes?: InputMaybe<Scalars['String']['input']>;
22210
22531
  interviewerId: Scalars['ID']['input'];
@@ -23126,10 +23447,14 @@ export type Tenant = {
23126
23447
  /** Workspaces belonging to this tenant */
23127
23448
  workspaces: Array<Workspace>;
23128
23449
  };
23129
- /** Tenant configuration for regional settings, branding, and features */
23450
+ /** Tenant configuration for regional settings, data residency, and features */
23130
23451
  export type TenantConfig = {
23131
23452
  __typename?: 'TenantConfig';
23132
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
+ */
23133
23458
  customBranding?: Maybe<Scalars['JSON']['output']>;
23134
23459
  dataResidency?: Maybe<Scalars['String']['output']>;
23135
23460
  features?: Maybe<Scalars['JSON']['output']>;
@@ -24501,6 +24826,7 @@ export type UpdatePayoutAccountInput = {
24501
24826
  };
24502
24827
  export type UpdatePhysicalProductInput = {
24503
24828
  allowBackorder?: InputMaybe<Scalars['Boolean']['input']>;
24829
+ bannerUrl?: InputMaybe<Scalars['String']['input']>;
24504
24830
  brand?: InputMaybe<Scalars['String']['input']>;
24505
24831
  category?: InputMaybe<Scalars['String']['input']>;
24506
24832
  countryOfOrigin?: InputMaybe<Scalars['String']['input']>;
@@ -25509,12 +25835,16 @@ export type UserWishlist = {
25509
25835
  userId: Scalars['String']['output'];
25510
25836
  };
25511
25837
  export type ValidateCouponInput = {
25838
+ /** Addon being purchased — same purpose as planId, for addon purchases. */
25839
+ addonId?: InputMaybe<Scalars['ID']['input']>;
25512
25840
  /** Order amount before discount */
25513
25841
  amount: Scalars['Float']['input'];
25514
25842
  /** Coupon code to validate */
25515
25843
  code: Scalars['String']['input'];
25516
25844
  /** Currency */
25517
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']>;
25518
25848
  /** Optional: product IDs being purchased */
25519
25849
  productIds?: InputMaybe<Array<Scalars['String']['input']>>;
25520
25850
  /** Optional: service IDs being purchased */