@burdenoff/microfe-movethewheels 2026.929.3 → 2026.929.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/generated/wspace-types.d.ts +1547 -64
  2. package/dist/hooks/useCustomers.js +3 -9
  3. package/dist/hooks/useFleet.js +146 -149
  4. package/dist/hooks/useInventory.js +178 -153
  5. package/dist/hooks/useRoutes.js +9 -9
  6. package/dist/hooks/useTracking.js +14 -16
  7. package/dist/movethewheels/hooks/useFleet.d.ts +9 -2
  8. package/dist/movethewheels/hooks/useInventory.d.ts +13 -12
  9. package/dist/movethewheels/hooks/useRoutes.d.ts +4 -1
  10. package/dist/movethewheels/types/index.d.ts +33 -23
  11. package/dist/movethewheels/utils/formatters.d.ts +1 -1
  12. package/dist/pages/CustomerDetailsPage.js +6 -6
  13. package/dist/pages/CustomersPage.js +2 -2
  14. package/dist/pages/DashboardPage.js +1 -1
  15. package/dist/pages/DriverDetailsPage.js +7 -3
  16. package/dist/pages/DriversPage.js +4 -4
  17. package/dist/pages/FleetPage.js +1 -1
  18. package/dist/pages/InventoryPage.js +11 -12
  19. package/dist/pages/LiveTrackingPage.js +4 -4
  20. package/dist/pages/ProductDetailsPage.js +408 -249
  21. package/dist/pages/ProductsPage.js +5 -5
  22. package/dist/pages/RouteDetailsPage.js +8 -10
  23. package/dist/pages/RoutesPage.js +2 -2
  24. package/dist/pages/TrackingPage.js +14 -8
  25. package/dist/pages/WarehouseDetailsPage.js +166 -163
  26. package/dist/pages/WarehousesPage.js +29 -21
  27. package/package.json +1 -1
  28. package/src/generated/wspace-types.ts +1762 -64
  29. package/src/movethewheels/hooks/useCustomers.ts +7 -9
  30. package/src/movethewheels/hooks/useFleet.ts +89 -31
  31. package/src/movethewheels/hooks/useInventory.ts +143 -49
  32. package/src/movethewheels/hooks/useRoutes.ts +36 -16
  33. package/src/movethewheels/hooks/useTracking.ts +23 -15
  34. package/src/movethewheels/pages/CustomerDetailsPage.tsx +14 -8
  35. package/src/movethewheels/pages/CustomersPage.tsx +5 -2
  36. package/src/movethewheels/pages/DashboardPage.tsx +3 -1
  37. package/src/movethewheels/pages/DriverDetailsPage.tsx +13 -3
  38. package/src/movethewheels/pages/DriversPage.tsx +1 -1
  39. package/src/movethewheels/pages/FleetPage.tsx +1 -1
  40. package/src/movethewheels/pages/InventoryPage.tsx +20 -16
  41. package/src/movethewheels/pages/LiveTrackingPage.tsx +6 -4
  42. package/src/movethewheels/pages/ProductDetailsPage.tsx +228 -49
  43. package/src/movethewheels/pages/ProductsPage.tsx +13 -5
  44. package/src/movethewheels/pages/RouteDetailsPage.tsx +16 -8
  45. package/src/movethewheels/pages/RoutesPage.tsx +4 -2
  46. package/src/movethewheels/pages/TrackingPage.tsx +25 -10
  47. package/src/movethewheels/pages/WarehouseDetailsPage.tsx +42 -29
  48. package/src/movethewheels/pages/WarehousesPage.tsx +23 -15
  49. package/src/movethewheels/types/index.ts +36 -24
  50. package/src/movethewheels/utils/formatters.ts +1 -1
@@ -3644,6 +3644,94 @@ export type AssistantConversation = {
3644
3644
  title?: Maybe<Scalars['String']['output']>;
3645
3645
  updatedAt: Scalars['DateTime']['output'];
3646
3646
  };
3647
+ export type AssistantHistoryChangeConnection = {
3648
+ __typename?: 'AssistantHistoryChangeConnection';
3649
+ edges: Array<AssistantHistoryConversationEdge>;
3650
+ nodes: Array<AssistantHistoryConversation>;
3651
+ pageInfo: PageInfo;
3652
+ /** True when the cursor predates retained tombstones: drop synced state and pull from the start. */
3653
+ resetRequired: Scalars['Boolean']['output'];
3654
+ };
3655
+ export type AssistantHistoryConversation = {
3656
+ __typename?: 'AssistantHistoryConversation';
3657
+ /** The id the client minted; the same on every device. Null = saved before v2 (read-only). */
3658
+ clientConversationId?: Maybe<Scalars['ID']['output']>;
3659
+ createdAt: Scalars['DateTime']['output'];
3660
+ deleted: Scalars['Boolean']['output'];
3661
+ deletedAt?: Maybe<Scalars['DateTime']['output']>;
3662
+ id: Scalars['ID']['output'];
3663
+ lastMessageSeq: Scalars['Int']['output'];
3664
+ legacy: Scalars['Boolean']['output'];
3665
+ /** The product as the request named it. A renamed product's spellings (botlit / botmanor) are one product with one history: either spelling reads and writes the same conversations, revisions and feed. */
3666
+ productId: Scalars['String']['output'];
3667
+ /** Per-(me, workspace, product) revision of this row's last change. Monotonic in commit order. */
3668
+ revision: Scalars['Int']['output'];
3669
+ /** A label derived from the first prompt. Null once the conversation is deleted: a deleted chat's title is never served. */
3670
+ title?: Maybe<Scalars['String']['output']>;
3671
+ updatedAt: Scalars['DateTime']['output'];
3672
+ };
3673
+ export type AssistantHistoryConversationConnection = {
3674
+ __typename?: 'AssistantHistoryConversationConnection';
3675
+ edges: Array<AssistantHistoryConversationEdge>;
3676
+ nodes: Array<AssistantHistoryConversation>;
3677
+ pageInfo: PageInfo;
3678
+ };
3679
+ export type AssistantHistoryConversationEdge = {
3680
+ __typename?: 'AssistantHistoryConversationEdge';
3681
+ cursor: Scalars['String']['output'];
3682
+ node: AssistantHistoryConversation;
3683
+ };
3684
+ export declare enum AssistantHistoryDeleteOutcome {
3685
+ /** The conversation was already deleted; nothing changed. */
3686
+ AlreadyDeleted = "ALREADY_DELETED",
3687
+ /** A live conversation was deleted. */
3688
+ Deleted = "DELETED",
3689
+ /** No conversation with this legacy (server) id exists in this scope; nothing changed. */
3690
+ NotPresent = "NOT_PRESENT",
3691
+ /** The server had never seen this client id; a tombstone was recorded so a late save cannot create it. */
3692
+ TombstonedUnseen = "TOMBSTONED_UNSEEN"
3693
+ }
3694
+ export type AssistantHistoryEntry = {
3695
+ __typename?: 'AssistantHistoryEntry';
3696
+ /** The client's ISO timestamp, returned exactly as stored (a String, never a Date). */
3697
+ clientCreatedAt?: Maybe<Scalars['String']['output']>;
3698
+ clientMessageId?: Maybe<Scalars['ID']['output']>;
3699
+ content: Scalars['String']['output'];
3700
+ createdAt: Scalars['DateTime']['output'];
3701
+ id: Scalars['ID']['output'];
3702
+ kind?: Maybe<AssistantHistoryEntryKind>;
3703
+ /** Allow-listed client metadata; stored and returned verbatim, never interpreted or executed. */
3704
+ metadata?: Maybe<Scalars['JSON']['output']>;
3705
+ role: AssistantHistoryRole;
3706
+ /** Position in the conversation (1..n). Always set for v2 and backfilled rows. */
3707
+ seq?: Maybe<Scalars['Int']['output']>;
3708
+ };
3709
+ export type AssistantHistoryEntryConnection = {
3710
+ __typename?: 'AssistantHistoryEntryConnection';
3711
+ conversation: AssistantHistoryConversation;
3712
+ edges: Array<AssistantHistoryEntryEdge>;
3713
+ nodes: Array<AssistantHistoryEntry>;
3714
+ pageInfo: PageInfo;
3715
+ };
3716
+ export type AssistantHistoryEntryEdge = {
3717
+ __typename?: 'AssistantHistoryEntryEdge';
3718
+ cursor: Scalars['String']['output'];
3719
+ node: AssistantHistoryEntry;
3720
+ };
3721
+ export type AssistantHistoryEntryInput = {
3722
+ clientCreatedAt?: InputMaybe<Scalars['String']['input']>;
3723
+ clientMessageId: Scalars['ID']['input'];
3724
+ /** Stored as sent, except that U+0000 and an unpaired UTF-16 surrogate (which cannot be stored) become U+FFFD. */
3725
+ content: Scalars['String']['input'];
3726
+ metadata?: InputMaybe<Scalars['JSON']['input']>;
3727
+ role: AssistantHistoryRole;
3728
+ };
3729
+ /** What a saved call records. Extensible later (e.g. RECORD) without any approval schema. */
3730
+ export declare enum AssistantHistoryEntryKind {
3731
+ LocalCommand = "LOCAL_COMMAND",
3732
+ Note = "NOTE",
3733
+ Turn = "TURN"
3734
+ }
3647
3735
  export type AssistantHistoryMessage = {
3648
3736
  __typename?: 'AssistantHistoryMessage';
3649
3737
  content: Scalars['String']['output'];
@@ -3651,10 +3739,111 @@ export type AssistantHistoryMessage = {
3651
3739
  id: Scalars['ID']['output'];
3652
3740
  role: AssistantMessageRole;
3653
3741
  };
3742
+ export declare enum AssistantHistoryRole {
3743
+ Assistant = "ASSISTANT",
3744
+ Note = "NOTE",
3745
+ User = "USER"
3746
+ }
3747
+ export declare enum AssistantHistorySaveOutcome {
3748
+ /** Every entry was already stored; nothing was written. */
3749
+ AlreadyApplied = "ALREADY_APPLIED",
3750
+ /** The missing entries were written. */
3751
+ Applied = "APPLIED",
3752
+ /** The conversation is deleted (or tombstoned); nothing was written. */
3753
+ ConversationDeleted = "CONVERSATION_DELETED"
3754
+ }
3654
3755
  export declare enum AssistantMessageRole {
3655
3756
  Assistant = "ASSISTANT",
3656
3757
  User = "USER"
3657
3758
  }
3759
+ /** The gateway a relayed document is sent to. */
3760
+ export declare enum AssistantRelayGateway {
3761
+ /** The global public gateway (/global/graphql). */
3762
+ Global = "GLOBAL",
3763
+ /** The workspace public gateway (/workspaces/graphql). */
3764
+ Workspace = "WORKSPACE"
3765
+ }
3766
+ /** A GraphQL mutation for the relay to run as the session's owner (admin Take-action sessions only). */
3767
+ export type AssistantSessionExecuteInput = {
3768
+ /** The session capability (asc1.<sandboxId>.<mac>) the sandbox proxy delivered. */
3769
+ capability: Scalars['String']['input'];
3770
+ gateway: AssistantRelayGateway;
3771
+ /** Sent on as x-idempotency-key: 1 to 64 of A-Z, a-z, 0-9, _ and -. */
3772
+ idempotencyKey?: InputMaybe<Scalars['String']['input']>;
3773
+ /** When given, the name of the document's one operation. */
3774
+ operationName?: InputMaybe<Scalars['String']['input']>;
3775
+ /** One GraphQL operation, a mutation whose root selections are plain fields without directives, at most 64 KiB. */
3776
+ query: Scalars['String']['input'];
3777
+ /** A JSON object, at most 256 KiB serialized. */
3778
+ variables?: InputMaybe<Scalars['JSONObject']['input']>;
3779
+ };
3780
+ /** A GraphQL query for the relay to run as the session's owner. */
3781
+ export type AssistantSessionRelayInput = {
3782
+ /** The session capability (asc1.<sandboxId>.<mac>) the sandbox proxy delivered. */
3783
+ capability: Scalars['String']['input'];
3784
+ gateway: AssistantRelayGateway;
3785
+ /** When given, the name of the document's one operation. */
3786
+ operationName?: InputMaybe<Scalars['String']['input']>;
3787
+ /** One GraphQL operation, a query, at most 64 KiB. */
3788
+ query: Scalars['String']['input'];
3789
+ /** A JSON object, at most 256 KiB serialized. */
3790
+ variables?: InputMaybe<Scalars['JSONObject']['input']>;
3791
+ };
3792
+ /** What the relay did. */
3793
+ export type AssistantSessionRelayResult = {
3794
+ __typename?: 'AssistantSessionRelayResult';
3795
+ /** The gateway's JSON response body when ok; otherwise { reason? }. */
3796
+ body?: Maybe<Scalars['JSON']['output']>;
3797
+ /** Null when ok; otherwise why nothing (or, for UPSTREAM_*, nothing usable) came back. */
3798
+ code?: Maybe<Scalars['String']['output']>;
3799
+ /** The gateway's HTTP status when ok; otherwise the status the code maps to. */
3800
+ httpStatus: Scalars['Int']['output'];
3801
+ /** True when the document was sent and the gateway answered; body is then the gateway's response, unmasked. */
3802
+ ok: Scalars['Boolean']['output'];
3803
+ };
3804
+ /** One finished assistant turn. Every duration is whole milliseconds measured from the moment the panel accepted the turn. On a retried turn, the first visible output is the first time ANY attempt showed output, the first answer text comes from the attempt that answered, and runtimeReadyMs and modelStartMs are not recorded (its attempts ran on different runtimes). Dimensions are plain strings, not enums, so a value a newer client introduces is recorded as "other" instead of failing the whole report. */
3805
+ export type AssistantTurnTimingInput = {
3806
+ /** How the question was asked: chat or voice. */
3807
+ channel: Scalars['String']['input'];
3808
+ /** The turn ended. */
3809
+ completeMs: Scalars['Int']['input'];
3810
+ /** The reply's first audio played. Counted only on answered voice turns, and only when it began within 120s of the turn ending. */
3811
+ firstAudioMs?: InputMaybe<Scalars['Int']['input']>;
3812
+ /** The first answer text was shown. Counted only when the outcome is answered. */
3813
+ firstUsefulOutputMs?: InputMaybe<Scalars['Int']['input']>;
3814
+ /** The first output was shown, a tool line included. Loading copy never counts. */
3815
+ firstVisibleOutputMs?: InputMaybe<Scalars['Int']['input']>;
3816
+ /** The assistant mode the turn ran in. */
3817
+ mode: Scalars['String']['input'];
3818
+ /** The model accepted the prompt. */
3819
+ modelStartMs?: InputMaybe<Scalars['Int']['input']>;
3820
+ /** How the turn ended: answered, timedOut, refused, failed, stopped, or abandoned (the page was left while the turn was running; completeMs is then the time to leaving). */
3821
+ outcome: Scalars['String']['input'];
3822
+ /** What a first-keystroke pre-warm did for the turn: hit, joined or joinedFailed. A turn that ended while waiting on a pre-warm that had begun a boot sends joined. Absent when none was involved. */
3823
+ prewarm?: InputMaybe<Scalars['String']['input']>;
3824
+ /** The product whose assistant ran the turn. */
3825
+ product: Scalars['String']['input'];
3826
+ /** The turn was retried on a second runtime after its first attempt failed. */
3827
+ retried?: InputMaybe<Scalars['Boolean']['input']>;
3828
+ /** How the runtime was found: warm, new-session, probed, adopted or cold. A turn that ended while waiting on a boot sends the boot it waited on (cold for its own create, adopted for one it found under way). Absent when the turn ended before it was known to be waiting on one. */
3829
+ runtime?: InputMaybe<Scalars['String']['input']>;
3830
+ /** A runtime (sandbox and session) was ready to take the prompt. */
3831
+ runtimeReadyMs?: InputMaybe<Scalars['Int']['input']>;
3832
+ };
3833
+ /** What the service did with a report. */
3834
+ export type AssistantTurnTimingsReceipt = {
3835
+ __typename?: 'AssistantTurnTimingsReceipt';
3836
+ /** Turns recorded. */
3837
+ accepted: Scalars['Int']['output'];
3838
+ /** This nonce was already recorded; nothing was recorded again. */
3839
+ duplicate: Scalars['Boolean']['output'];
3840
+ /** False when collection is switched off; the client should stop reporting for this page load. */
3841
+ enabled: Scalars['Boolean']['output'];
3842
+ /** The caller is over its reporting budget; nothing was recorded. */
3843
+ rateLimited: Scalars['Boolean']['output'];
3844
+ /** Turns dropped as inconsistent (out-of-range or out-of-order timings, oversized values) or as implausible (more turn time than the caller could have spent). */
3845
+ rejected: Scalars['Int']['output'];
3846
+ };
3658
3847
  export type AthAddDrillInput = {
3659
3848
  description?: InputMaybe<Scalars['String']['input']>;
3660
3849
  durationSec?: InputMaybe<Scalars['Int']['input']>;
@@ -4824,6 +5013,8 @@ export type Board = {
4824
5013
  projectId: Scalars['String']['output'];
4825
5014
  /** Board type */
4826
5015
  type: BoardType;
5016
+ /** Live work items of the board's project that are on no column: their status has no column and they were never placed on one */
5017
+ unplacedCount: Scalars['Int']['output'];
4827
5018
  /** Last update timestamp */
4828
5019
  updatedAt: Scalars['DateTime']['output'];
4829
5020
  /** Actor who last updated this board */
@@ -4836,6 +5027,8 @@ export type BoardColumn = {
4836
5027
  __typename?: 'BoardColumn';
4837
5028
  /** Parent board ID */
4838
5029
  boardId: Scalars['String']['output'];
5030
+ /** The work items this column shows. An item placed in a column stays there unless the column maps to a status the item no longer has; otherwise it is in the first column mapped to its status. */
5031
+ cards: PlanmagnetWorkItemList;
4839
5032
  /** Creation timestamp */
4840
5033
  createdAt: Scalars['DateTime']['output'];
4841
5034
  /** Unique identifier */
@@ -4855,10 +5048,17 @@ export type BoardColumn = {
4855
5048
  /** Work-in-progress limit (0 = unlimited) */
4856
5049
  wipLimit?: Maybe<Scalars['Int']['output']>;
4857
5050
  };
5051
+ /** A column within a board representing a workflow stage. */
5052
+ export type BoardColumnCardsArgs = {
5053
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
5054
+ };
4858
5055
  export declare enum BoardColumnType {
5056
+ Backlog = "BACKLOG",
4859
5057
  Custom = "CUSTOM",
4860
5058
  Done = "DONE",
4861
5059
  InProgress = "IN_PROGRESS",
5060
+ Review = "REVIEW",
5061
+ Testing = "TESTING",
4862
5062
  Todo = "TODO"
4863
5063
  }
4864
5064
  export declare enum BoardType {
@@ -10790,6 +10990,7 @@ export type ConversationMembership = {
10790
10990
  createdAt: Scalars['DateTime']['output'];
10791
10991
  customAvatar?: Maybe<Scalars['String']['output']>;
10792
10992
  customTitle?: Maybe<Scalars['String']['output']>;
10993
+ displayName: Scalars['String']['output'];
10793
10994
  id: Scalars['ID']['output'];
10794
10995
  invitedBy?: Maybe<Scalars['ID']['output']>;
10795
10996
  isMuted: Scalars['Boolean']['output'];
@@ -13130,9 +13331,13 @@ export type CreateDashboardEmbedPolicyInput = {
13130
13331
  allowedParentOrigins: Array<Scalars['String']['input']>;
13131
13332
  dashboardId: Scalars['ID']['input'];
13132
13333
  expiresAt?: InputMaybe<Scalars['DateTime']['input']>;
13133
- /** Publish-time presentation options (BOFF-5735). Omitted fields take the defaults: LIGHT theme, no title header, attribution footer on. */
13334
+ /** Publish-time presentation options (BOFF-5735). Omitted fields take the defaults: LIGHT theme, no title header. The "Powered by BigConsole" footer is not an option: every embed always shows it. */
13134
13335
  presentationTheme?: InputMaybe<DashboardEmbedTheme>;
13135
13336
  sessionTtlSeconds?: InputMaybe<Scalars['Int']['input']>;
13337
+ /**
13338
+ * Ignored. Every embed always shows the "Powered by BigConsole" footer. Accepted only so older clients that still send it keep working.
13339
+ * @deprecated Embeds always show the BigConsole footer; this setting is ignored.
13340
+ */
13136
13341
  showBrandingFooter?: InputMaybe<Scalars['Boolean']['input']>;
13137
13342
  showDashboardTitle?: InputMaybe<Scalars['Boolean']['input']>;
13138
13343
  };
@@ -13279,16 +13484,21 @@ export type CreateDisposableWorkspaceInput = {
13279
13484
  type?: InputMaybe<WorkspaceType>;
13280
13485
  };
13281
13486
  export type CreateDriverInput = {
13487
+ baseSalary?: InputMaybe<Scalars['Float']['input']>;
13488
+ bonusYtd?: InputMaybe<Scalars['Float']['input']>;
13282
13489
  certifications?: InputMaybe<Scalars['JSON']['input']>;
13283
13490
  context?: InputMaybe<ContextInput>;
13284
13491
  currentLocation?: InputMaybe<Scalars['JSON']['input']>;
13285
13492
  email?: InputMaybe<Scalars['String']['input']>;
13286
13493
  employeeId: Scalars['String']['input'];
13287
13494
  firstName: Scalars['String']['input'];
13495
+ hireDate?: InputMaybe<Scalars['DateTime']['input']>;
13288
13496
  lastName: Scalars['String']['input'];
13289
13497
  licenseClass?: InputMaybe<Scalars['String']['input']>;
13290
13498
  licenseExpiry?: InputMaybe<Scalars['DateTime']['input']>;
13291
13499
  licenseNumber?: InputMaybe<Scalars['String']['input']>;
13500
+ notes?: InputMaybe<Scalars['String']['input']>;
13501
+ payCurrency?: InputMaybe<Scalars['String']['input']>;
13292
13502
  performanceMetrics?: InputMaybe<Scalars['JSON']['input']>;
13293
13503
  phone?: InputMaybe<Scalars['String']['input']>;
13294
13504
  rating?: InputMaybe<Scalars['Float']['input']>;
@@ -14193,6 +14403,8 @@ export type CreateHeadshotmarketingSocialAccountInput = {
14193
14403
  /** When set to WEBHOOK, publish/schedule perform a real HTTP POST to webhookUrl. */
14194
14404
  deliveryMode?: InputMaybe<HeadshotmarketingSocialAccountDeliveryMode>;
14195
14405
  followerCount?: InputMaybe<Scalars['Int']['input']>;
14406
+ /** Bind this account to an already-created OAuth connection in wspace-integrations-svc (the id the platform OAuth popup returns — tokens live server-side, never here). When set, the account is stored bound to this connection and the mint-from-tokens path is skipped; if raw tokens are also supplied, the explicit connectionId wins. */
14407
+ integrationConnectionId?: InputMaybe<Scalars['ID']['input']>;
14196
14408
  metadata?: InputMaybe<Scalars['JSON']['input']>;
14197
14409
  platform: HeadshotmarketingSocialPlatform;
14198
14410
  platformAccountId: Scalars['String']['input'];
@@ -16011,9 +16223,9 @@ export type CreateVibeInput = {
16011
16223
  type: VibeType;
16012
16224
  };
16013
16225
  export type CreateVibecontrolsAgentInput = {
16014
- /** Auth-svc App clientId (for display/reference) */
16226
+ /** Auth-svc App clientId. Server-managed like `appId`: a non-null value is rejected with `BAD_USER_INPUT`. */
16015
16227
  appClientId?: InputMaybe<Scalars['String']['input']>;
16016
- /** Linked auth-svc App ID (OAuth2 identity for gateway access) */
16228
+ /** Linked auth-svc App ID (OAuth2 identity for gateway access). Server-managed (BOFF-7920): written only by `setupAgentGatewayAuth`. A non-null value is rejected with `BAD_USER_INPUT`; `null` / omitted is accepted. */
16017
16229
  appId?: InputMaybe<Scalars['String']['input']>;
16018
16230
  architecture: Scalars['String']['input'];
16019
16231
  configuration?: InputMaybe<Scalars['JSON']['input']>;
@@ -17434,6 +17646,10 @@ export type DashboardEmbedPolicy = {
17434
17646
  presentationTheme: DashboardEmbedTheme;
17435
17647
  revokedAt?: Maybe<Scalars['DateTime']['output']>;
17436
17648
  sessionTtlSeconds: Scalars['Int']['output'];
17649
+ /**
17650
+ * Always true. Every embed carries the "Powered by BigConsole" footer and it cannot be turned off. Kept only so older clients that still select it keep working.
17651
+ * @deprecated Embeds always show the BigConsole footer; this setting is ignored.
17652
+ */
17437
17653
  showBrandingFooter: Scalars['Boolean']['output'];
17438
17654
  showDashboardTitle: Scalars['Boolean']['output'];
17439
17655
  status: DashboardEmbedPolicyStatus;
@@ -18446,6 +18662,11 @@ export type DeleteMessagePayload = {
18446
18662
  messageId: Scalars['ID']['output'];
18447
18663
  success: Scalars['Boolean']['output'];
18448
18664
  };
18665
+ export type DeleteMyAssistantConversationPayload = {
18666
+ __typename?: 'DeleteMyAssistantConversationPayload';
18667
+ conversation?: Maybe<AssistantHistoryConversation>;
18668
+ outcome: AssistantHistoryDeleteOutcome;
18669
+ };
18449
18670
  export declare enum DeliveryChannelType {
18450
18671
  Email = "EMAIL",
18451
18672
  Slack = "SLACK",
@@ -18547,14 +18768,16 @@ export type DependencyTriggeredUpdate = {
18547
18768
  timestamp: Scalars['DateTime']['output'];
18548
18769
  triggeredBy: Scalars['ID']['output'];
18549
18770
  };
18771
+ /** How one work item constrains the SCHEDULE of another. These four are the standard CPM relationships; `lagMinutes` offsets them. This enum used to carry issue-link verbs (BLOCKS, DUPLICATES, RELATES_TO, ...) while the database carried these four — one name, ZERO overlapping values — so every `planmagnetCreateDependency` passed gateway validation and then failed the write. The semantic verbs now live on `WorkItemLink.relationType`, which is where they belong: "A relates to B" says nothing about when either one starts. Only these relationships take part in critical-path analysis. */
18550
18772
  export declare enum DependencyType {
18551
- BlockedBy = "BLOCKED_BY",
18552
- Blocks = "BLOCKS",
18553
- CausedBy = "CAUSED_BY",
18554
- Causes = "CAUSES",
18555
- DuplicatedBy = "DUPLICATED_BY",
18556
- Duplicates = "DUPLICATES",
18557
- RelatesTo = "RELATES_TO"
18773
+ /** The successor finishes after the predecessor finishes. */
18774
+ FinishToFinish = "FINISH_TO_FINISH",
18775
+ /** The successor starts after the predecessor finishes. The usual case. */
18776
+ FinishToStart = "FINISH_TO_START",
18777
+ /** The successor finishes after the predecessor starts. Rare. */
18778
+ StartToFinish = "START_TO_FINISH",
18779
+ /** The successor starts after the predecessor starts. */
18780
+ StartToStart = "START_TO_START"
18558
18781
  }
18559
18782
  export declare enum DeploymentEnvironment {
18560
18783
  Development = "DEVELOPMENT",
@@ -21262,6 +21485,34 @@ export type ExecutePipelineInput = {
21262
21485
  inputData?: InputMaybe<Scalars['JSON']['input']>;
21263
21486
  pipelineId: Scalars['ID']['input'];
21264
21487
  };
21488
+ /** Input for a node-level TEST execution. `sourceRunId` is optional: when omitted, the service selects the latest compatible TEST run in this workspace and workflow version. No PRODUCTION run is implicitly used as a data cache. */
21489
+ export type ExecuteStepInput = {
21490
+ nodeId: Scalars['String']['input'];
21491
+ sourceRunId?: InputMaybe<Scalars['ID']['input']>;
21492
+ version: Scalars['String']['input'];
21493
+ workflowKey: Scalars['String']['input'];
21494
+ };
21495
+ /** A node-level TEST execution plan. Reused states are copied into the new run; only `executeNodeIds` are dispatched to the worker. This is intentionally separate from `RunFromNodeInput`, whose semantics include all downstream nodes. */
21496
+ export type ExecuteStepPlan = {
21497
+ __typename?: 'ExecuteStepPlan';
21498
+ blockers: Array<Scalars['String']['output']>;
21499
+ executeNodeIds: Array<Scalars['String']['output']>;
21500
+ initialNodeIds: Array<Scalars['String']['output']>;
21501
+ pinnedNodeIds: Array<Scalars['String']['output']>;
21502
+ reusedNodeIds: Array<Scalars['String']['output']>;
21503
+ sourceRunId?: Maybe<Scalars['ID']['output']>;
21504
+ targetNodeId: Scalars['String']['output'];
21505
+ };
21506
+ /** Result of the n8n-style Execute step action. The run is always TEST mode and is never a production trigger or a production quota event. */
21507
+ export type ExecuteStepResponse = {
21508
+ __typename?: 'ExecuteStepResponse';
21509
+ plan: ExecuteStepPlan;
21510
+ runId: Scalars['ID']['output'];
21511
+ status: Scalars['String']['output'];
21512
+ triggerNodeId: Scalars['String']['output'];
21513
+ version: Scalars['String']['output'];
21514
+ workflowKey: Scalars['String']['output'];
21515
+ };
21265
21516
  export type ExecuteSyncResult = {
21266
21517
  __typename?: 'ExecuteSyncResult';
21267
21518
  eventsAdded?: Maybe<Scalars['Int']['output']>;
@@ -21908,7 +22159,7 @@ export type FarmInsight = {
21908
22159
  /** A product feature request capturing ideas, customer feedback, and implementation priority. */
21909
22160
  export type FeatureRequest = {
21910
22161
  __typename?: 'FeatureRequest';
21911
- /** Business value rating (1-10) */
22162
+ /** Business value score, a whole number from 0 to 100 */
21912
22163
  businessValue?: Maybe<Scalars['Int']['output']>;
21913
22164
  /** Competitors offering this feature */
21914
22165
  competitors: Array<Competitor>;
@@ -21918,10 +22169,16 @@ export type FeatureRequest = {
21918
22169
  createdAt: Scalars['DateTime']['output'];
21919
22170
  /** Actor who created this request */
21920
22171
  createdBy: Scalars['String']['output'];
22172
+ /** Why it was declined (set by planmagnetDeclineFeatureRequest) */
22173
+ declineReason?: Maybe<Scalars['String']['output']>;
21921
22174
  /** Soft-delete timestamp */
21922
22175
  deletedAt?: Maybe<Scalars['DateTime']['output']>;
21923
22176
  /** Detailed description */
21924
22177
  description?: Maybe<Scalars['String']['output']>;
22178
+ /** The original this request was merged into, when it still exists */
22179
+ duplicateOf?: Maybe<FeatureRequest>;
22180
+ /** The original this request was merged into (status DUPLICATE) */
22181
+ duplicateOfId?: Maybe<Scalars['String']['output']>;
21925
22182
  /** Effort estimate (T-shirt: XS, S, M, L, XL) */
21926
22183
  effortEstimate?: Maybe<Scalars['String']['output']>;
21927
22184
  /** Unique identifier */
@@ -21932,8 +22189,14 @@ export type FeatureRequest = {
21932
22189
  onBehalfOf?: Maybe<Scalars['String']['output']>;
21933
22190
  /** Priority score (computed from votes and business value) */
21934
22191
  priorityScore?: Maybe<Scalars['Float']['output']>;
22192
+ /** The linked Product, when set. */
22193
+ product?: Maybe<Product>;
22194
+ /** Linked strategic Product (BOFF-8045). Null when never attached. */
22195
+ productId?: Maybe<Scalars['String']['output']>;
21935
22196
  /** Parent project ID */
21936
22197
  projectId?: Maybe<Scalars['String']['output']>;
22198
+ /** Hidden from the triage queue until this moment (set by planmagnetSnoozeFeatureRequest); still SUBMITTED */
22199
+ snoozedUntil?: Maybe<Scalars['DateTime']['output']>;
21937
22200
  /** Current status */
21938
22201
  status: FeatureRequestStatus;
21939
22202
  /** Submitter actor ID */
@@ -21942,12 +22205,18 @@ export type FeatureRequest = {
21942
22205
  tags: Array<Scalars['String']['output']>;
21943
22206
  /** Feature title */
21944
22207
  title: Scalars['String']['output'];
22208
+ /** When accept, decline or merge decided this request */
22209
+ triagedAt?: Maybe<Scalars['DateTime']['output']>;
22210
+ /** Who accepted, declined or merged this request */
22211
+ triagedBy?: Maybe<Scalars['String']['output']>;
21945
22212
  /** Last update timestamp */
21946
22213
  updatedAt: Scalars['DateTime']['output'];
21947
22214
  /** Actor who last updated this request */
21948
22215
  updatedBy?: Maybe<Scalars['String']['output']>;
21949
22216
  /** Total vote count */
21950
22217
  voteCount: Scalars['Int']['output'];
22218
+ /** Rank by votes among the workspace's live requests (1 = most votes; ties share a rank) */
22219
+ voteRank: Scalars['Int']['output'];
21951
22220
  /** Votes on this feature */
21952
22221
  votes: Array<FeatureVote>;
21953
22222
  /** Linked work item ID */
@@ -28796,6 +29065,8 @@ export type HeadshotmarketingAdPlatformConnection = {
28796
29065
  __typename?: 'HeadshotmarketingAdPlatformConnection';
28797
29066
  createdAt: Scalars['DateTime']['output'];
28798
29067
  id: Scalars['ID']['output'];
29068
+ /** Opaque reference to the credential-owning OAuth connection in wspace-integrations-svc (API mode only). Non-null when this connection is bound to an ad-platform integration. The access/refresh tokens live in the integrations owner and are NEVER exposed through GraphQL; this only lets the frontend read binding status. */
29069
+ integrationConnectionId?: Maybe<Scalars['String']['output']>;
28799
29070
  metadata?: Maybe<Scalars['JSON']['output']>;
28800
29071
  mode: HeadshotmarketingAdConnectionMode;
28801
29072
  platform: HeadshotmarketingAdPlatform;
@@ -28931,9 +29202,11 @@ export type HeadshotmarketingAttributionCredit = {
28931
29202
  };
28932
29203
  export declare enum HeadshotmarketingAttributionModel {
28933
29204
  FirstTouch = "FIRST_TOUCH",
28934
- Linear = "LINEAR"
29205
+ Linear = "LINEAR",
29206
+ PositionBased = "POSITION_BASED",
29207
+ TimeDecay = "TIME_DECAY"
28935
29208
  }
28936
- /** A deterministic attribution report for one conversion event (a WON deal or a CONVERTED lead), showing the same touchpoint history split under both supported models side by side. */
29209
+ /** A deterministic attribution report for one conversion event (a WON deal or a CONVERTED lead), showing the same touchpoint history split under every supported model side by side. */
28937
29210
  export type HeadshotmarketingAttributionReport = {
28938
29211
  __typename?: 'HeadshotmarketingAttributionReport';
28939
29212
  contactId?: Maybe<Scalars['ID']['output']>;
@@ -28943,6 +29216,12 @@ export type HeadshotmarketingAttributionReport = {
28943
29216
  convertedAt: Scalars['DateTime']['output'];
28944
29217
  firstTouch: HeadshotmarketingAttributionSplit;
28945
29218
  linear: HeadshotmarketingAttributionSplit;
29219
+ /** U-shaped split: 40% first touch, 40% last touch, 20% shared across the middle. */
29220
+ positionBased: HeadshotmarketingAttributionSplit;
29221
+ /** Exponential recency-weighted split (weight = 0.5 ^ (daysBefore / halfLife)). */
29222
+ timeDecay: HeadshotmarketingAttributionSplit;
29223
+ /** Half-life in days used to compute the time-decay split (default 7). */
29224
+ timeDecayHalfLifeDays: Scalars['Float']['output'];
28946
29225
  touchpointCount: Scalars['Int']['output'];
28947
29226
  };
28948
29227
  /** The full credit split for one attribution model across every touchpoint that preceded the conversion. */
@@ -29452,9 +29731,15 @@ export type HeadshotmarketingCreateAiToolInput = {
29452
29731
  provider: Scalars['String']['input'];
29453
29732
  };
29454
29733
  export type HeadshotmarketingCreateAdPlatformConnectionInput = {
29734
+ /** API mode only — raw OAuth tokens to register in the integrations owner. Used only when no integrationConnectionId is supplied; tokens are handed to the integrations owner and never persisted locally. */
29735
+ accessToken?: InputMaybe<Scalars['String']['input']>;
29736
+ /** API mode only — bind this connection to an already-created OAuth connection in wspace-integrations-svc (the id the platform OAuth popup returns; tokens live server-side, never here). When set, it is stored directly and the register-from-tokens path is skipped. If raw tokens are also supplied, the explicit connectionId wins. */
29737
+ integrationConnectionId?: InputMaybe<Scalars['ID']['input']>;
29455
29738
  metadata?: InputMaybe<Scalars['JSON']['input']>;
29456
29739
  mode?: InputMaybe<HeadshotmarketingAdConnectionMode>;
29457
29740
  platform: HeadshotmarketingAdPlatform;
29741
+ refreshToken?: InputMaybe<Scalars['String']['input']>;
29742
+ tokenExpiresAt?: InputMaybe<Scalars['DateTime']['input']>;
29458
29743
  webhookUrl?: InputMaybe<Scalars['String']['input']>;
29459
29744
  };
29460
29745
  export type HeadshotmarketingCreateAutomationWorkflowInput = {
@@ -30295,6 +30580,54 @@ export type HeadshotmarketingPipelineStageOverview = {
30295
30580
  stageName: Scalars['String']['output'];
30296
30581
  totalValue: Scalars['Float']['output'];
30297
30582
  };
30583
+ /** A PUBLISHED landing page, exposed to the public unauthenticated renderer served at `/lp/{slug}`. Carries ONLY the fields a public page needs to render — it deliberately omits every workspace-internal field (workspaceId, campaignId, createdBy, viewCount, conversionCount, metadata) so the public endpoint cannot leak tenant data. */
30584
+ export type HeadshotmarketingPublicLandingPage = {
30585
+ __typename?: 'HeadshotmarketingPublicLandingPage';
30586
+ /** Author-provided custom CSS injected when rendering the page */
30587
+ customCss?: Maybe<Scalars['String']['output']>;
30588
+ /** Author-provided custom JS injected when rendering the page */
30589
+ customJs?: Maybe<Scalars['String']['output']>;
30590
+ /** Optional page description / meta description fallback */
30591
+ description?: Maybe<Scalars['String']['output']>;
30592
+ /** Favicon URL */
30593
+ faviconUrl?: Maybe<Scalars['String']['output']>;
30594
+ /** Open Graph image URL */
30595
+ ogImageUrl?: Maybe<Scalars['String']['output']>;
30596
+ /** When the page was published */
30597
+ publishedAt?: Maybe<Scalars['DateTime']['output']>;
30598
+ /** Ordered, visible sections that make up the page body */
30599
+ sections: Array<HeadshotmarketingPublicLandingPageSection>;
30600
+ /** SEO meta description */
30601
+ seoDescription?: Maybe<Scalars['String']['output']>;
30602
+ /** SEO <title> override */
30603
+ seoTitle?: Maybe<Scalars['String']['output']>;
30604
+ /** URL slug the page is published under */
30605
+ slug: Scalars['String']['output'];
30606
+ /** Page title (used for the document/window title) */
30607
+ title: Scalars['String']['output'];
30608
+ };
30609
+ /** A single visible section of a published landing page, for the public renderer. Omits workspace-internal fields (workspaceId, landingPageId, metadata). */
30610
+ export type HeadshotmarketingPublicLandingPageSection = {
30611
+ __typename?: 'HeadshotmarketingPublicLandingPageSection';
30612
+ /** Background color */
30613
+ backgroundColor?: Maybe<Scalars['String']['output']>;
30614
+ /** Background image URL */
30615
+ backgroundImageUrl?: Maybe<Scalars['String']['output']>;
30616
+ /** Type-specific content configuration */
30617
+ content?: Maybe<Scalars['JSON']['output']>;
30618
+ /** Unique identifier (stable key for the renderer) */
30619
+ id: Scalars['ID']['output'];
30620
+ /** Presentation settings */
30621
+ settings?: Maybe<Scalars['JSON']['output']>;
30622
+ /** Position of the section within the page (ascending) */
30623
+ sortOrder: Scalars['Int']['output'];
30624
+ /** Section subtitle */
30625
+ subtitle?: Maybe<Scalars['String']['output']>;
30626
+ /** Section title */
30627
+ title?: Maybe<Scalars['String']['output']>;
30628
+ /** Section type (HERO, FEATURES, CTA, …) */
30629
+ type: HeadshotmarketingLandingPageSectionType;
30630
+ };
30298
30631
  export type HeadshotmarketingRecordAdMetricsSnapshotInput = {
30299
30632
  adCampaignId: Scalars['ID']['input'];
30300
30633
  clicks?: InputMaybe<Scalars['Int']['input']>;
@@ -30357,6 +30690,8 @@ export type HeadshotmarketingSeoAudit = {
30357
30690
  metadata?: Maybe<Scalars['JSON']['output']>;
30358
30691
  overallScore?: Maybe<Scalars['Float']['output']>;
30359
30692
  pageTitle?: Maybe<Scalars['String']['output']>;
30693
+ /** Number of pages analysed (1 for a single-page audit, >1 for a crawl). */
30694
+ pagesCrawled?: Maybe<Scalars['Int']['output']>;
30360
30695
  performanceScore?: Maybe<Scalars['Float']['output']>;
30361
30696
  runBy: Scalars['ID']['output'];
30362
30697
  seoScore?: Maybe<Scalars['Float']['output']>;
@@ -30487,6 +30822,8 @@ export type HeadshotmarketingSocialAccount = {
30487
30822
  followerCount?: Maybe<Scalars['Int']['output']>;
30488
30823
  /** Unique identifier */
30489
30824
  id: Scalars['ID']['output'];
30825
+ /** Opaque reference to the credential-owning OAuth connection in wspace-integrations-svc. Non-null when this account is bound to a platform connection (either minted from tokens, or produced by the platform OAuth popup which returns only a connectionId). The access/refresh tokens live in the integrations owner and are NEVER exposed through GraphQL; this field only lets the frontend read connection/binding status. */
30826
+ integrationConnectionId?: Maybe<Scalars['String']['output']>;
30490
30827
  /** Flexible key-value metadata */
30491
30828
  metadata?: Maybe<Scalars['JSON']['output']>;
30492
30829
  /** Social media platform */
@@ -30506,8 +30843,9 @@ export type HeadshotmarketingSocialAccount = {
30506
30843
  /** Associated workspace ID (opaque reference) */
30507
30844
  workspaceId: Scalars['ID']['output'];
30508
30845
  };
30509
- /** BOFF-4218: how a connected account delivers publish/schedule actions. INTERNAL is the local-state-machine default; WEBHOOK performs a real outbound HTTP POST to `webhookUrl` on publish — a real, generic connector any platform integration or Zapier/Make-style relay can sit behind. */
30846
+ /** How a connected account delivers publish/schedule actions. INTERNAL (BOFF-4218) is the local-state-machine default; WEBHOOK performs a real outbound HTTP POST to `webhookUrl` on publish — a generic connector any platform integration or Zapier/Make-style relay can sit behind; API (BOFF-7858) dispatches to the platform's real native API (Facebook, Instagram, X, LinkedIn) using an OAuth token owned by the integrations service. API delivery is gated: an account with no active connection / token fails with a clear "provider not configured" error rather than faking success. */
30510
30847
  export declare enum HeadshotmarketingSocialAccountDeliveryMode {
30848
+ Api = "API",
30511
30849
  Internal = "INTERNAL",
30512
30850
  Webhook = "WEBHOOK"
30513
30851
  }
@@ -35658,6 +35996,7 @@ export type HousingVistaOffer = {
35658
35996
  counterAmount?: Maybe<Scalars['Float']['output']>;
35659
35997
  createdAt: Scalars['DateTime']['output'];
35660
35998
  currency: Scalars['String']['output'];
35999
+ expiresAt?: Maybe<Scalars['DateTime']['output']>;
35661
36000
  id: Scalars['ID']['output'];
35662
36001
  notes?: Maybe<Scalars['String']['output']>;
35663
36002
  property: HousingVistaProperty;
@@ -35679,6 +36018,7 @@ export declare enum HousingVistaOfferResponseAction {
35679
36018
  export declare enum HousingVistaOfferStatus {
35680
36019
  Accepted = "accepted",
35681
36020
  Countered = "countered",
36021
+ Expired = "expired",
35682
36022
  Rejected = "rejected",
35683
36023
  Submitted = "submitted",
35684
36024
  Withdrawn = "withdrawn"
@@ -35897,6 +36237,7 @@ export type HousingVistaShortlist = {
35897
36237
  export type HousingVistaSubmitOfferInput = {
35898
36238
  amount: Scalars['Float']['input'];
35899
36239
  currency?: InputMaybe<Scalars['String']['input']>;
36240
+ expiresAt?: InputMaybe<Scalars['DateTime']['input']>;
35900
36241
  notes?: InputMaybe<Scalars['String']['input']>;
35901
36242
  propertyId: Scalars['ID']['input'];
35902
36243
  };
@@ -37872,6 +38213,7 @@ export type InvalidateDataSinkCacheResult = {
37872
38213
  };
37873
38214
  export type InventoryFilterInput = {
37874
38215
  cargoItemId?: InputMaybe<Scalars['ID']['input']>;
38216
+ inventoryItemId?: InputMaybe<Scalars['ID']['input']>;
37875
38217
  locationId?: InputMaybe<Scalars['ID']['input']>;
37876
38218
  lowStock?: InputMaybe<Scalars['Boolean']['input']>;
37877
38219
  search?: InputMaybe<Scalars['String']['input']>;
@@ -42892,11 +43234,14 @@ export type MtwCustomer = {
42892
43234
  };
42893
43235
  export type MtwCustomerStats = {
42894
43236
  __typename?: 'MtwCustomerStats';
42895
- active: Scalars['Int']['output'];
42896
- avgRating: Scalars['Float']['output'];
43237
+ /** Unavailable because customers have no lifecycle status field. */
43238
+ active?: Maybe<Scalars['Int']['output']>;
43239
+ /** Average rating, or null when no customer has a rating. */
43240
+ avgRating?: Maybe<Scalars['Float']['output']>;
42897
43241
  b2b: Scalars['Int']['output'];
42898
43242
  b2c: Scalars['Int']['output'];
42899
- inactive: Scalars['Int']['output'];
43243
+ /** Unavailable because customers have no lifecycle status field. */
43244
+ inactive?: Maybe<Scalars['Int']['output']>;
42900
43245
  total: Scalars['Int']['output'];
42901
43246
  };
42902
43247
  export type MtwDashboardMetrics = {
@@ -43008,6 +43353,8 @@ export type MtwDemandForecastVariance = {
43008
43353
  };
43009
43354
  export type MtwDriver = {
43010
43355
  __typename?: 'MtwDriver';
43356
+ baseSalary?: Maybe<Scalars['Float']['output']>;
43357
+ bonusYtd?: Maybe<Scalars['Float']['output']>;
43011
43358
  certifications?: Maybe<Scalars['JSON']['output']>;
43012
43359
  context?: Maybe<OperationContext>;
43013
43360
  createdAt: Scalars['DateTime']['output'];
@@ -43017,16 +43364,25 @@ export type MtwDriver = {
43017
43364
  email?: Maybe<Scalars['String']['output']>;
43018
43365
  employeeId: Scalars['String']['output'];
43019
43366
  firstName: Scalars['String']['output'];
43367
+ hireDate?: Maybe<Scalars['DateTime']['output']>;
43020
43368
  id: Scalars['ID']['output'];
43021
43369
  lastName: Scalars['String']['output'];
43022
43370
  licenseClass?: Maybe<Scalars['String']['output']>;
43023
43371
  licenseExpiry?: Maybe<Scalars['DateTime']['output']>;
43024
43372
  licenseNumber?: Maybe<Scalars['String']['output']>;
43373
+ /** Free-text HR/performance notes. Encrypted at rest. */
43374
+ notes?: Maybe<Scalars['String']['output']>;
43025
43375
  onBehalfOf: Scalars['String']['output'];
43376
+ /** Set and in the future means the driver is currently on leave. Independent of the operational DriverStatus. */
43377
+ onLeaveUntil?: Maybe<Scalars['DateTime']['output']>;
43378
+ payCurrency?: Maybe<Scalars['String']['output']>;
43026
43379
  performanceMetrics?: Maybe<Scalars['JSON']['output']>;
43027
43380
  phone?: Maybe<Scalars['String']['output']>;
43028
43381
  rating?: Maybe<Scalars['Float']['output']>;
43029
43382
  status: DriverStatus;
43383
+ terminatedAt?: Maybe<Scalars['DateTime']['output']>;
43384
+ /** Reason recorded when the driver was dismissed/terminated. Encrypted at rest. */
43385
+ terminationReason?: Maybe<Scalars['String']['output']>;
43030
43386
  updatedAt: Scalars['DateTime']['output'];
43031
43387
  updatedBy?: Maybe<Scalars['String']['output']>;
43032
43388
  userId?: Maybe<Scalars['String']['output']>;
@@ -43236,6 +43592,11 @@ export type MtwInventoryTransaction = {
43236
43592
  warehouseId: Scalars['ID']['output'];
43237
43593
  workspaceId: Scalars['ID']['output'];
43238
43594
  };
43595
+ export type MtwInventoryTransferResult = {
43596
+ __typename?: 'MtwInventoryTransferResult';
43597
+ destination: MtwInventoryItem;
43598
+ source: MtwInventoryItem;
43599
+ };
43239
43600
  /** An estimate from the caller's own inputs — not a quote from anyone. */
43240
43601
  export type MtwOwnFleetEstimate = {
43241
43602
  __typename?: 'MtwOwnFleetEstimate';
@@ -43799,6 +44160,8 @@ export type Mutation = {
43799
44160
  assignWorkspaceQuota: WorkspaceQuotaAssignment;
43800
44161
  /** Batch version of assignWorkspaceQuota — upserts all quotas for a workspace in a single call. All inputs must share the same workspaceId. Returns results in the same order as the inputs. When supersede is true, any active assignment for the same (workspaceId, quotaName) pair that belongs to a DIFFERENT subscriptionId is deactivated after all upserts complete. Use this when activating a new plan that replaces a prior one. */
43801
44162
  assignWorkspaceQuotas: Array<WorkspaceQuotaAssignment>;
44163
+ /** Run one GraphQL mutation as the owner of an admin Take-action session the capability names. */
44164
+ assistantSessionExecute: AssistantSessionRelayResult;
43802
44165
  athAddDrill: AthDrill;
43803
44166
  athAddMember: AthMember;
43804
44167
  /** BOFF-3571: reads the athlete's recent AthWorkoutLog + AthPerformanceMetric rows, asks the AI to classify progression/deload/at-risk/maintain, and records the decision onto the target program as a PROPOSAL, readable at AthProgram.context.lastAiAdjustment with status "PROPOSED". It changes no prescribed training load on its own — a coach resolves it via athOverrideAgentRun. */
@@ -44280,9 +44643,9 @@ export type Mutation = {
44280
44643
  connectHealthyBowlAccountingIntegration: HealthyBowlAccountingIntegration;
44281
44644
  /** Send a natural-language message (with optional current spec + history) to the conversational agent and receive an updated spec plus a reply. */
44282
44645
  conversationalDashboardEdit: ConversationalEditResult;
44283
- /** Anonymise the subject's conversations data. With dryRun=true, returns counts without mutating. Message bodies are RETAINED for thread integrity; senderId / mention / reaction / read-receipt records keyed to the subject are anonymised or deleted. Reported back via `retainedForLegalReason: "thread-integrity"`. */
44646
+ /** Erase the subject's conversations data in every workspace (called with no workspace, like the export). With dryRun=true, reports what would change without mutating. The CONTENT of the subject's AI-assistant history is purged (messages deleted; each chat reduced to a content-free tombstone that stops a late save from recreating it), except chats under a legal hold (one placed while the erase runs included; the hold count is taken after it). In human conversations message bodies are RETAINED for thread integrity and the subject's authorship is anonymised; mention / reaction / read-receipt / poll-vote / call / report / draft records keyed to the subject are deleted. Reported back via `retainedForLegalReason`: "thread-integrity", plus "legal-hold" when a hold retained assistant chats and "erasure-tombstones" when content-free assistant tombstones remain (all joined with "; "). FAILS (code SERVICE_UNAVAILABLE, i18nKey privacy.errors.assistantHistoryEraseIncomplete) when any unheld assistant history still holds content after the erase's passes -- after every other step has run. Every step is idempotent: run the erase again. */
44284
44647
  conversationsEraseSubject: ConversationsEraseResult;
44285
- /** Export the subject's conversations data: messages authored, conversation memberships, mentions of the subject, reactions, poll votes, call participations, comment activity. Attachments listed by reference only. */
44648
+ /** Export the subject's conversations data: conversations created (AI-assistant chats and their tombstones included), messages authored (both sides of each assistant turn included), conversation memberships, mentions of the subject, reactions, poll votes, call participations, comment activity, drafts and assistant-history scopes, across every workspace. Attachments listed by reference only. Called with no workspace (a DSAR spans all of them). Never a partial bundle: when any collection cannot be read the export fails (SERVICE_UNAVAILABLE, naming the collections) and is run again. */
44286
44649
  conversationsExportSubject: Scalars['JSON']['output'];
44287
44650
  /** Convert a lead into a deal */
44288
44651
  convertHeadshotmarketingLead: HeadshotmarketingDeal;
@@ -44921,7 +45284,10 @@ export type Mutation = {
44921
45284
  deleteArtifact: MutationResponse;
44922
45285
  deleteAsset: Scalars['Boolean']['output'];
44923
45286
  deleteAssetAssignment: Scalars['Boolean']['output'];
44924
- /** Delete one of my assistant chats and its messages. */
45287
+ /**
45288
+ * Delete one of my assistant chats and its messages. Its content is purged permanently 30 days later (unless under a legal hold).
45289
+ * @deprecated Use the my* assistant-history fields (BOFF-7335).
45290
+ */
44925
45291
  deleteAssistantConversation: Scalars['Boolean']['output'];
44926
45292
  deleteAvailabilityRule: Scalars['Boolean']['output'];
44927
45293
  /** Delete a batch download and its archive */
@@ -45175,6 +45541,8 @@ export type Mutation = {
45175
45541
  deleteMetadataByKey: Scalars['Boolean']['output'];
45176
45542
  deleteMetric: Scalars['Boolean']['output'];
45177
45543
  deleteModifiedInstance: Scalars['Boolean']['output'];
45544
+ /** Idempotent. An id never seen is recorded as a tombstone, so a late save cannot create it. Such tombstones are rate-bounded per actor and workspace: past the bound the call fails with the retryable RATE_LIMIT_EXCEEDED and nothing is written, so retry later rather than dropping the delete. The deleted conversation's content is purged permanently 30 days after the delete (unless under a legal hold); its content-free tombstone is kept. */
45545
+ deleteMyAssistantConversation: DeleteMyAssistantConversationPayload;
45178
45546
  /** Soft-delete one of the calling user's custom views. */
45179
45547
  deleteMyNavView: Scalars['Boolean']['output'];
45180
45548
  deleteNode: Scalars['Boolean']['output'];
@@ -45528,7 +45896,9 @@ export type Mutation = {
45528
45896
  executeScheduledPrompt: ScheduledPromptResult;
45529
45897
  /** Execute a button via share token (PUBLIC — no auth required). Only works if the share link has EXECUTE permission. */
45530
45898
  executeSharedVibeDeckButton: VibeDeckButtonExecution;
45531
- /** Execute one approved transform in an isolated, limit-enforced worker. */
45899
+ /** Execute only one node with reusable upstream TEST data. The service creates a new TEST run, snapshots compatible completed states and pinned data, and dispatches only unresolved ancestors plus the target. This mutation is not decorated with `@usage`: debug executions are excluded from production run quota accounting by design. */
45900
+ executeStep: ExecuteStepResponse;
45901
+ /** Execute one approved transform in an isolated, limit-enforced worker. Gated on `sandbox`/`update`, the same pair as `runSandboxScript` — both execute caller-supplied code inside a sandbox, so they carry the same authority. There is deliberately no bespoke `transform` action: the RBAC action catalogue (`wspace-rbac-svc` `prisma/seed-unified-rbac.ts`) defines only admin/create/delete/read/update for `sandbox`, and an action that is absent from the catalogue resolves to default-deny at the gateway. */
45532
45902
  executeTransform: TransformRuntimeResult;
45533
45903
  executeVibeDeckButton: VibeDeckButtonExecution;
45534
45904
  /** Execute a workflow. If an external FluidGrids workflow exists, triggers real execution via wspace-workflow-svc. Otherwise performs mock execution. */
@@ -45558,6 +45928,8 @@ export type Mutation = {
45558
45928
  exportWorkspaceResourceConfig: WorkspaceResourceConfigExport;
45559
45929
  /** Extend an existing file lock */
45560
45930
  extendFileLock: FileLock;
45931
+ /** Extend the caller's OWN running Ask or Take-action assistant sandbox (any workspace role), capped exactly as extendSandboxTTL is. Another user's sandbox, or one that is not an assistant sandbox, is NOT_FOUND. */
45932
+ extendMyAssistantSandboxTTL: Sandbox;
45561
45933
  extendSandboxTTL: Sandbox;
45562
45934
  /** Host-only (must own the listing behind the booking): files a claim against a COMPLETED booking. */
45563
45935
  fileGgnomadDamageClaim: GgnomadDamageClaim;
@@ -45771,7 +46143,7 @@ export type Mutation = {
45771
46143
  headshotmarketingRemoveLandingPageSection: Scalars['Boolean']['output'];
45772
46144
  /** Reorder sections within a landing page */
45773
46145
  headshotmarketingReorderLandingPageSections: HeadshotmarketingLandingPage;
45774
- /** Run an SEO audit for a given URL (creates and executes an audit) */
46146
+ /** Run an SEO audit for a given URL (creates and executes an audit). With no crawl arguments this runs a single-page on-page audit. Set `maxPages` greater than 1 to run a bounded, same-origin multi-page crawl (default depth 2) that aggregates per-page findings into a site-level report. `maxPages`/`maxDepth` are clamped to safe ceilings. */
45775
46147
  headshotmarketingRunSEOAudit: HeadshotmarketingSeoAudit;
45776
46148
  /** Send a message to the marketing agent. Persists the user message, calls the configured LLM provider, persists the assistant's reply, and records any proposed actions as PROPOSED -- never executes them. */
45777
46149
  headshotmarketingSendAgentMessage: HeadshotmarketingAgentTurn;
@@ -46169,6 +46541,8 @@ export type Mutation = {
46169
46541
  linkDataSinkToWorkflow: DataSinkWorkflowLink;
46170
46542
  /** Link a vibecontrols-owned entity (VibeDeck / Action / AiPrompt / Tunnel) to a Vibe. Cross-svc entities (SANDBOX, SCHEDULED_JOB) have their own dedicated mutations in wspace-sandbox-svc / wspace-scheduler-svc — calls with those types here are rejected. RBAC: caller needs `update` on the entity's resource. */
46171
46543
  linkEntityToVibe: VibeLinkedEntity;
46544
+ /** Bind an existing social account to an already-created OAuth connection in wspace-integrations-svc (the connectionId the platform OAuth popup returns). Used to (re)connect an account without re-minting credentials — tokens stay server-side in the integrations owner and are never handled here. Marks the account connected; re-checks the social-accounts quota when reconnecting a previously-disconnected account. */
46545
+ linkHeadshotmarketingSocialAccountConnection: HeadshotmarketingSocialAccount;
46172
46546
  /** BOFF-6095 — add an already-recorded harvest to inventory. Idempotent: a harvest that already carries a `productId` is returned unchanged rather than banking its quantity a second time. Reuses the `healthybowl_harvest` / `update` permission — this stamps the harvest row, so it is an update of that harvest, not a new resource. */
46173
46547
  linkHealthyBowlHarvestToInventory: HarvestRecord;
46174
46548
  /** Link a personal integration connection to a bot channel. Called by microfe-botlit (via global-channel-svc) after the user completes OAuth and clicks "Link to bot channel" in the UI. Sets channelId + organizationId on the IntegrationConnection record. */
@@ -46376,6 +46750,16 @@ export type Mutation = {
46376
46750
  /** Place a lot of produce/milk into a bin; records an opening IN movement of the initial quantity. */
46377
46751
  placeHealthyBowlStorageLot: HealthyBowlStorageLot;
46378
46752
  planMultiModalShipment: MtwShipment;
46753
+ /** Triage: accept an open request (SUBMITTED or UNDER_REVIEW) as UNDER_REVIEW or PLANNED */
46754
+ planmagnetAcceptFeatureRequest: FeatureRequest;
46755
+ /** Add members to a team. Re-adding an existing (live) member is a no-op, not an error. */
46756
+ planmagnetAddTeamMembers: Team;
46757
+ /** Add projects to a team, so its team sprints can draw work from them. Every project id must be a live project of this workspace. Re-adding an existing (live) project is a no-op, not an error. */
46758
+ planmagnetAddTeamProjects: Team;
46759
+ /** Post a comment on a work item */
46760
+ planmagnetAddWorkItemComment: PlanmagnetWorkItemComment;
46761
+ /** Add work items to a release. Each must be a live work item of the release's project; otherwise nothing is added and the reason names how many were refused. */
46762
+ planmagnetAddWorkItemsToRelease: Release;
46379
46763
  /** Add work items to a sprint */
46380
46764
  planmagnetAddWorkItemsToSprint: Sprint;
46381
46765
  /** Grant a user billable editor access to a PlanMagnet workspace. Rejected once the workspace is at its plan's editor limit (Free tier: 10). Idempotent: granting an already-active editor returns the existing seat. */
@@ -46386,6 +46770,8 @@ export type Mutation = {
46386
46770
  planmagnetApproveBudget: PlanmagnetBudget;
46387
46771
  /** Approve a submitted timesheet */
46388
46772
  planmagnetApproveTimesheet: PlanmagnetTimesheet;
46773
+ /** Sets archivedAt = now(). A no-op (still succeeds) if already archived. */
46774
+ planmagnetArchiveProduct: Product;
46389
46775
  /** Assign a work item to an actor */
46390
46776
  planmagnetAssignWorkItem: WorkItem;
46391
46777
  /** Bulk update multiple work items at once */
@@ -46419,6 +46805,7 @@ export type Mutation = {
46419
46805
  planmagnetCreateObjective: PlanmagnetObjective;
46420
46806
  /** Create a new portfolio */
46421
46807
  planmagnetCreatePortfolio: Portfolio;
46808
+ planmagnetCreateProduct: Product;
46422
46809
  /** Create a new program */
46423
46810
  planmagnetCreateProgram: Program;
46424
46811
  /** Create a new project */
@@ -46437,6 +46824,8 @@ export type Mutation = {
46437
46824
  planmagnetCreateRoadmapItem: RoadmapItem;
46438
46825
  /** Create a new sprint */
46439
46826
  planmagnetCreateSprint: Sprint;
46827
+ /** Create a new team. */
46828
+ planmagnetCreateTeam: Team;
46440
46829
  /** Create a template from an existing project */
46441
46830
  planmagnetCreateTemplateFromProject: ProjectTemplate;
46442
46831
  /** Create a new time entry */
@@ -46445,6 +46834,8 @@ export type Mutation = {
46445
46834
  planmagnetCreateTimesheet: PlanmagnetTimesheet;
46446
46835
  /** Create a new work item */
46447
46836
  planmagnetCreateWorkItem: WorkItem;
46837
+ /** Triage: decline an open request, with the reason */
46838
+ planmagnetDeclineFeatureRequest: FeatureRequest;
46448
46839
  /** Delete an automation rule */
46449
46840
  planmagnetDeleteAutomationRule: Scalars['Boolean']['output'];
46450
46841
  /** Delete a board */
@@ -46474,6 +46865,8 @@ export type Mutation = {
46474
46865
  planmagnetDeleteObjective: Scalars['Boolean']['output'];
46475
46866
  /** Delete a portfolio */
46476
46867
  planmagnetDeletePortfolio: Scalars['Boolean']['output'];
46868
+ /** Soft-delete. Every linked roadmap/release/feature request has its productId cleared, never deleted; every ProductObjectiveLink row is removed. */
46869
+ planmagnetDeleteProduct: Scalars['Boolean']['output'];
46477
46870
  /** Soft-delete a program */
46478
46871
  planmagnetDeleteProgram: Scalars['Boolean']['output'];
46479
46872
  /** Soft-delete a project */
@@ -46492,12 +46885,22 @@ export type Mutation = {
46492
46885
  planmagnetDeleteRoadmapItem: Scalars['Boolean']['output'];
46493
46886
  /** Soft-delete a sprint */
46494
46887
  planmagnetDeleteSprint: Scalars['Boolean']['output'];
46888
+ /** Soft-delete a team. Its team-scoped sprints disappear from every read at the same time (same "a deleted parent takes its contents with it" behavior as Project — see utils/live-project-scope.ts); the sprint rows themselves are never cascaded or rewritten. */
46889
+ planmagnetDeleteTeam: Scalars['Boolean']['output'];
46495
46890
  /** Delete a time entry */
46496
46891
  planmagnetDeleteTimeEntry: Scalars['Boolean']['output'];
46497
46892
  /** Soft-delete a work item */
46498
46893
  planmagnetDeleteWorkItem: Scalars['Boolean']['output'];
46894
+ /** Delete your own comment (only its author can) */
46895
+ planmagnetDeleteWorkItemComment: Scalars['Boolean']['output'];
46896
+ /** Change the text of your own comment (only its author can) */
46897
+ planmagnetEditWorkItemComment: PlanmagnetWorkItemComment;
46898
+ /** Erase the person from PlanMagnet in one transaction; dryRun returns the counts and writes nothing (service actors only) */
46899
+ planmagnetEraseSubject: PlanmagnetEraseResult;
46499
46900
  /** Manually run an automation rule (BOFF-4445) against a specific work item. `triggerData` MUST include `workItemId` — every supported action type (`ASSIGN_TO_USER`/`ADD_LABEL`/`SET_STATUS`/`SET_PRIORITY`) mutates a specific WorkItem, and a manual run with no target records a FAILURE execution explaining that instead of evaluating anything. When a WorkItem is given, the rule's `conditions` are evaluated against a live snapshot of that item (merged with any extra fields in `triggerData`) and, if they pass, its `actions` are dispatched for real — this always records an `AutomationExecution` row, including a non-matching run. Carries `@usage` again as of BOFF-4445: PlanMagnet now has a real evaluation + dispatch engine (see `automation-engine.ts`), so a manual run is real billable work. */
46500
46901
  planmagnetExecuteAutomationRule: PlanmagnetAutomationExecution;
46902
+ /** Everything PlanMagnet holds that names the person, per table, deleted rows included (service actors only) */
46903
+ planmagnetExportSubject: Scalars['JSON']['output'];
46501
46904
  /** Export items to the external tool. Real for `provider: GITHUB` (BOFF-4446): creates/updates real GitHub Issues for the given `internalIds` (WorkItem ids), or one bounded page of every WorkItem in the sync's project when omitted. Every other provider records an honest `NOT_IMPLEMENTED` outcome. */
46502
46905
  planmagnetExportToExternal: PlanmagnetSyncResult;
46503
46906
  /** Generate release notes from the closed work items linked to a release (by `workItemIds`, falling back to the release's `projectIds`). Persists the generated markdown on `Release.releaseNotes` so it remains editable via `planmagnetUpdateRelease`. When `persist` is false the notes are computed and returned without writing to the database. */
@@ -46510,12 +46913,20 @@ export type Mutation = {
46510
46913
  planmagnetLinkCompetitorToFeature: FeatureRequest;
46511
46914
  planmagnetLinkDocToWorkItem: PlanmagnetDoc;
46512
46915
  planmagnetLinkKeyResultToWorkItem: PlanmagnetKeyResult;
46916
+ planmagnetLinkProductFeatureRequest: Product;
46917
+ /** *-* join — same pairwise-link shape as planmagnetLinkKeyResultToWorkItem (okr module). Re-linking an already-linked pair is a no-op success, not a conflict (matches the Team module's own precedent for a re-added live member). */
46918
+ planmagnetLinkProductObjective: Product;
46919
+ planmagnetLinkProductRelease: Product;
46920
+ /** roadmapId must be a live roadmap in the same workspace, else BAD_USER_INPUT. */
46921
+ planmagnetLinkProductRoadmap: Product;
46513
46922
  /** Link a work item to an external product entity */
46514
46923
  planmagnetLinkWorkItem: WorkItemLink;
46515
46924
  /** Log an expense against a budget */
46516
46925
  planmagnetLogExpense: BudgetExpense;
46517
46926
  /** Quick log time against a work item */
46518
46927
  planmagnetLogTime: PlanmagnetTimeEntry;
46928
+ /** Triage: merge an open request into its original. It becomes DUPLICATE of it, and its votes move there (a voter who voted on both keeps one vote). Returns the original. */
46929
+ planmagnetMergeFeatureRequest: FeatureRequest;
46519
46930
  /** Move a card (work item) to a different column and/or position */
46520
46931
  planmagnetMoveCard: Board;
46521
46932
  /** Move a work item to a different status, sprint, or position */
@@ -46528,6 +46939,12 @@ export type Mutation = {
46528
46939
  planmagnetRemoveCustomFieldValue: Scalars['Boolean']['output'];
46529
46940
  /** Remove a vote from a feature request */
46530
46941
  planmagnetRemoveFeatureVote: Scalars['Boolean']['output'];
46942
+ /** Remove members from a team. */
46943
+ planmagnetRemoveTeamMembers: Team;
46944
+ /** Remove projects from a team. Work items already in an active team sprint from that project are NOT retroactively evicted — see sprint.service.ts. */
46945
+ planmagnetRemoveTeamProjects: Team;
46946
+ /** Take work items out of a release. Ids not in the release are ignored. */
46947
+ planmagnetRemoveWorkItemsFromRelease: Release;
46531
46948
  /** Remove work items from a sprint */
46532
46949
  planmagnetRemoveWorkItemsFromSprint: Sprint;
46533
46950
  /** Revoke a user's editor access to a PlanMagnet workspace, freeing the slot. Idempotent: revoking a user who is not currently an editor returns false. */
@@ -46542,6 +46959,8 @@ export type Mutation = {
46542
46959
  planmagnetReviewQualityGate: QualityGate;
46543
46960
  /** Set a custom field value on a work item */
46544
46961
  planmagnetSetCustomFieldValue: CustomFieldValue;
46962
+ /** Triage: hide a SUBMITTED request from the queue until a future moment (at most a year); null wakes it now */
46963
+ planmagnetSnoozeFeatureRequest: FeatureRequest;
46545
46964
  /** Start a sprint (transition to ACTIVE) */
46546
46965
  planmagnetStartSprint: Sprint;
46547
46966
  /** Start a sync operation in the direction `ExternalSync.direction` already records. Real for `provider: GITHUB` (BOFF-4446) — pulls/pushes real GitHub Issues, bounded to one REST page each way. Every other provider records an honest `NOT_IMPLEMENTED` outcome instead of a fabricated success. */
@@ -46552,10 +46971,16 @@ export type Mutation = {
46552
46971
  planmagnetSuggestWorkItemBreakdown: PlanmagnetWorkItemBreakdownResult;
46553
46972
  /** Toggle an automation rule (activate/pause) */
46554
46973
  planmagnetToggleAutomationRule: PlanmagnetAutomationRule;
46974
+ /** Clears archivedAt. A no-op (still succeeds) if not archived. */
46975
+ planmagnetUnarchiveProduct: Product;
46555
46976
  /** Unlink a competitor from a feature request */
46556
46977
  planmagnetUnlinkCompetitorFromFeature: FeatureRequest;
46557
46978
  planmagnetUnlinkDocFromWorkItem: Scalars['Boolean']['output'];
46558
46979
  planmagnetUnlinkKeyResultFromWorkItem: Scalars['Boolean']['output'];
46980
+ planmagnetUnlinkProductFeatureRequest: Product;
46981
+ planmagnetUnlinkProductObjective: Scalars['Boolean']['output'];
46982
+ planmagnetUnlinkProductRelease: Product;
46983
+ planmagnetUnlinkProductRoadmap: Product;
46559
46984
  /** Remove a work item link */
46560
46985
  planmagnetUnlinkWorkItem: Scalars['Boolean']['output'];
46561
46986
  /** Update an existing automation rule */
@@ -46587,12 +47012,15 @@ export type Mutation = {
46587
47012
  planmagnetUpdateObjective: PlanmagnetObjective;
46588
47013
  /** Update an existing portfolio */
46589
47014
  planmagnetUpdatePortfolio: Portfolio;
47015
+ planmagnetUpdateProduct: Product;
46590
47016
  /** Update an existing program */
46591
47017
  planmagnetUpdateProgram: Program;
46592
47018
  /** Update an existing project */
46593
47019
  planmagnetUpdateProject: PlanmagnetProject;
46594
47020
  /** Update an existing project template */
46595
47021
  planmagnetUpdateProjectTemplate: ProjectTemplate;
47022
+ /** Change a project's workflow */
47023
+ planmagnetUpdateProjectWorkflow: PlanmagnetProjectWorkflow;
46596
47024
  /** Update an existing quality gate */
46597
47025
  planmagnetUpdateQualityGate: QualityGate;
46598
47026
  /** Update an existing release */
@@ -46605,6 +47033,8 @@ export type Mutation = {
46605
47033
  planmagnetUpdateRoadmapItem: RoadmapItem;
46606
47034
  /** Update an existing sprint */
46607
47035
  planmagnetUpdateSprint: Sprint;
47036
+ /** Update an existing team. Membership and projects are changed through the dedicated mutations below, not through this one. */
47037
+ planmagnetUpdateTeam: Team;
46608
47038
  /** Update an existing time entry */
46609
47039
  planmagnetUpdateTimeEntry: PlanmagnetTimeEntry;
46610
47040
  /** Update an existing work item */
@@ -46651,6 +47081,8 @@ export type Mutation = {
46651
47081
  propagateTagToChildren: Array<UniversalTagAssignment>;
46652
47082
  /** Run an agronomic sweep and return the proposals it wrote. A second sweep over unchanged data updates the open proposal rather than adding another — otherwise the inbox becomes a pile of identical cards, which is how a farmer learns to ignore it. Returns BLOCKED rows too: a treatment the compliance rail refused is recorded so the farmer can see it was considered and why it was refused. Dropping it silently looks identical to the engine never having noticed. */
46653
47083
  proposeHealthyBowlAgronomyDecisions: AgronomyDecisionSweepResult;
47084
+ /** Provision an Ask or Take-action assistant sandbox for the caller (any workspace role). */
47085
+ provisionAssistantSandbox: Sandbox;
46654
47086
  /** Proxy an HTTP request to a sandbox service. Used by the frontend to communicate with services running inside sandboxes (e.g., ai-assistant) through the gateway. */
46655
47087
  proxySandboxRequest: ProxySandboxResponse;
46656
47088
  pswAddTeamAssignment: PswTeamAssignment;
@@ -46996,13 +47428,15 @@ export type Mutation = {
46996
47428
  replayWorkflowRun: TriggerResponse;
46997
47429
  /** Record an agent → agent mesh edge. Called by the SOURCE agent after a successful mesh-deploy/connect (or by an operator). Authorization: the caller must control BOTH agents (same workspace + ownerUserId boundary on each). Topology only — no scoped peer credential is stored. */
46998
47430
  reportAgentMeshLink: AgentMeshLink;
46999
- /** Records the real token usage of a completed assistant turn. The resolver computes COST-WEIGHTED credits server-side (billing.quoteAiCredits, per-model prices) and charges them once via addUsageForWorkspace — so the amount is never client-supplied. No @usage(trackUsage) directive here: that would charge a second time (flat token count) on top of the resolver's weighted charge. */
47431
+ /** Records the real token usage of a completed assistant turn. The resolver computes COST-WEIGHTED credits server-side (billing.quoteAiCredits, per-model prices) and charges them once via addUsageForWorkspace — so the amount is never client-supplied. No @usage(trackUsage) directive here: that would charge a second time (flat token count) on top of the resolver's weighted charge. Gated on `assistant:use` (BOFF-7803 5a), the permission every workspace role holds to open an assistant session at all. It was `ai-prompt:create`, which is viewerDefault:false, so a Member/Viewer/Guest could run an assistant turn but the turn could never be charged. The charge always lands on the caller's gateway workspace (x-workspace-id), never on a workspace named in the input. */
47000
47432
  reportAiTokenUsage: Scalars['Boolean']['output'];
47001
47433
  /** Records the real token usage of a completed assistant turn. The resolver computes COST-WEIGHTED credits server-side (billing.quoteAiCredits, per-model prices) and charges them once via addUsageForWorkspace — so the amount is never client-supplied. No @usage(trackUsage) directive here: that would charge a second time (flat token count) on top of the resolver's weighted charge. */
47002
47434
  reportGovAiTokenUsage: Scalars['Boolean']['output'];
47003
- /** Record and charge the AI credits a completed HealthyBowl assistant turn consumed. Best-effort by contract: the answer has already been produced and shown to the farmer, so a billing or pricing failure must never fail this mutation. It logs and returns true. Callers should not branch on the result. `resource: "ai-prompt"` reuses the platform's existing AI-prompt permission rather than introducing a new resource type: RBAC is default-DENY and an unregistered resource would reject every caller, silently reducing this meter to a no-op. It is the same resource VibeControls' equivalent mutation uses. */
47435
+ /** Record and charge the AI credits a completed HealthyBowl assistant turn consumed. Best-effort by contract: the answer has already been produced and shown to the farmer, so a billing or pricing failure must never fail this mutation. It logs and returns true. Callers should not branch on the result. Gated on `assistant:use` (BOFF-7803 5a): the permission every workspace role holds to open an assistant session at all, so every turn a farmer can run can also be charged. It was `ai-prompt:create`, which is viewerDefault:false and is not in the HealthyBowl product roles at all, so a Member/Viewer/Guest (or a farm role) could run a turn that was never metered. It is the same permission VibeControls' equivalent mutation uses. The charge always lands on the caller's gateway workspace (x-workspace-id); `input.context.workspaceId` is not consulted. */
47004
47436
  reportHealthyBowlAiTokenUsage: Scalars['Boolean']['output'];
47005
47437
  reportMessage: ReportMessagePayload;
47438
+ /** Report the calling actor's own finished assistant turns for latency metrics. Self-scoped: the actor comes from the gateway and is used only to rate-limit reports; it is never recorded. */
47439
+ reportMyAssistantTurnTimings: AssistantTurnTimingsReceipt;
47006
47440
  reprocessTimeCampusTimeline: TimeCampusAdminMutationResult;
47007
47441
  /** Request input-loan facilitation: creates a time-bounded, revocable FinancierAccessGrant (UC-14) sharing the farmer's field + input-plan records with the lender, plus the loan request row. No always-on data sharing. communityFunded is rejected unless the flag is ON. */
47008
47442
  requestHealthyBowlLoanFacilitation: HealthyBowlLoanFacilitation;
@@ -47229,7 +47663,10 @@ export type Mutation = {
47229
47663
  /** Run a script inside the sandbox and capture its output. The sandbox must be running. The run is recorded (even on failure) so it can be reviewed before any real-target execution. */
47230
47664
  runSandboxScript: SandboxScriptRun;
47231
47665
  runSecurityScan: SecurityScanRun;
47232
- /** Append one completed turn (prompt + reply), creating the conversation on the first turn. Idempotent enough to be safe to retry: a duplicate turn simply appends, it never corrupts the conversation. This resolver writes both prompt and reply rows internally, so it performs manual quota checks/tracking instead of using a fixed-amount @usage directive. */
47666
+ /**
47667
+ * Append one completed turn (prompt + reply), creating the conversation on the first turn. NOT idempotent: a retried call appends a duplicate turn. This resolver writes both prompt and reply rows internally, so it performs manual quota checks/tracking instead of using a fixed-amount @usage directive.
47668
+ * @deprecated Use the my* assistant-history fields (BOFF-7335).
47669
+ */
47233
47670
  saveAssistantTurn: AssistantConversation;
47234
47671
  /** Save collection as template */
47235
47672
  saveCollectionAsTemplate: Collection;
@@ -47243,6 +47680,8 @@ export type Mutation = {
47243
47680
  /** Persist a yield scenario (the simulation 'Save Scenario' action). */
47244
47681
  saveHealthyBowlYieldScenario: HbYieldForecast;
47245
47682
  saveHousingvistaShortlist: HousingVistaShortlist;
47683
+ /** Idempotent per clientMessageId. Never recreates a deleted conversation. Never throws NOT_FOUND. */
47684
+ saveMyAssistantHistoryEntries: SaveMyAssistantHistoryEntriesPayload;
47246
47685
  /** Upsert the calling user's active view + per-view overrides. */
47247
47686
  saveMyNavPreferences: NavPreferences;
47248
47687
  /** Save an AI-assistant sandbox artifact directly into Files without round- tripping bytes through the browser. Calls `wspace-sandbox-svc` over the internal gateway, decodes the artifact, uploads to S3, and creates a File row in the target folder. Returns the freshly created File. Larger artifacts (decoded > 50 MB) return `SANDBOX_ARTIFACT_TOO_LARGE` and the caller falls back to the client-side download path. */
@@ -47310,7 +47749,7 @@ export type Mutation = {
47310
47749
  setAgentAutoUpdate: AgentProxyResponse;
47311
47750
  /** F4 Wave C — narrow svc-side proxy for playground (GraphiQL) config writes. PUTs `/api/profiles/<profile>/graphiql/config/<vibeId>` with `{ openapiUrl, graphqlUrl }` (only provided keys sent). */
47312
47751
  setAgentPlaygroundConfig: AgentProxyResponse;
47313
- /** Share this agent with the workspace, or take it back (BOFF-6394). `WORKSPACE` exposes the agent to every member holding the matching `@rbac` permission; `PRIVATE` restricts it to `ownerUserId`. Only the owner may change it. Making an ownerless legacy agent `PRIVATE` claims it for the caller in the same step — otherwise the row would become unreachable by everyone, the caller included. */
47752
+ /** Share this agent with the workspace, or take it back (BOFF-6394). `WORKSPACE` exposes the agent to every member holding the matching `@rbac` permission; `PRIVATE` restricts it to `ownerUserId`. Only the owner may change it, and only as a person — `app` / `service` actors are refused. Making an ownerless legacy agent `PRIVATE` claims it for the caller in the same step — otherwise the row would become unreachable by everyone, the caller included. */
47314
47753
  setAgentVisibility: VibecontrolsAgent;
47315
47754
  setAiPredictionStatus: AiPrediction;
47316
47755
  setBalanceTarget: TimeCampusBalanceTarget;
@@ -47438,6 +47877,8 @@ export type Mutation = {
47438
47877
  /** Start a stopped or inactive resource */
47439
47878
  startWorkspaceResource: WorkspaceResource;
47440
47879
  stopCallRecording: CallRecording;
47880
+ /** Stop the caller's OWN Ask or Take-action assistant sandbox (any workspace role). Another user's sandbox, or one that is not an assistant sandbox, is NOT_FOUND. Under the session relay the stop also revokes the session's capability. */
47881
+ stopMyAssistantSandbox: Sandbox;
47441
47882
  stopSandbox: Sandbox;
47442
47883
  /** Stop a session */
47443
47884
  stopSession: Session;
@@ -47718,6 +48159,7 @@ export type Mutation = {
47718
48159
  /** Track usage consumption Called by gateway after successful operations */
47719
48160
  trackUsage: Scalars['Boolean']['output'];
47720
48161
  transferGroupOwnership: Group;
48162
+ transferInventoryStock: MtwInventoryTransferResult;
47721
48163
  /** Transfer control to another collaborator */
47722
48164
  transferSessionControl: Scalars['Boolean']['output'];
47723
48165
  /** Advance a credit's status forward (DRAFT→PENDING→VERIFIED→ISSUED→RETIRED). Illegal transitions throw CONFLICT. */
@@ -47824,7 +48266,7 @@ export type Mutation = {
47824
48266
  updateAgentInstructionFile: AgentInstructionFile;
47825
48267
  updateAgentInstructionFileShareRole: ShareGrant;
47826
48268
  updateAgentMessageBookmark: AgentMessageBookmark;
47827
- /** Hand an agent to a different owner, or release it. Ownership is what the `PRIVATE` visibility resolves against, so this mutation is itself owner-gated (BOFF-6394) — the `@rbac` directive below only decides whether the caller may update agents at all, not whose agent they may update: - An agent with NO owner (created by an `app` / `service` actor) may be claimed by anyone who can update agents. - The current owner may hand it to anyone, or release it with `ownerUserId: null`. - Anyone else gets `FORBIDDEN` — including for "release to shared", which used to be the cheapest way to take over a colleague's machine. Releasing ownership also forces `visibility` to `WORKSPACE`: a `PRIVATE` agent with no owner would be reachable by nobody. Claiming an agent does NOT change its visibility — that stays an explicit `setAgentVisibility` call. */
48269
+ /** Claim an ownerless agent for yourself, or release one you own. Ownership is what the `PRIVATE` visibility resolves against, so this mutation is itself owner-gated (BOFF-6394, BOFF-7920) — the `@rbac` directive below only decides whether the caller may update agents at all, not whose agent they may update: - Only a person (`user` / `super_admin`) may change ownership. - An agent with NO owner may be claimed by anyone who can update agents — `ownerUserId` must then be the caller's own id. - The current owner may release it with `ownerUserId: null`. - Assigning an agent to a DIFFERENT user is refused (`FORBIDDEN`): an agent's OAuth identity acts with its owner's reach, so handing your machine to a colleague would let it reach their private agents. The recipient claims it after you release it instead. - Anyone else gets `FORBIDDEN` — including for "release to shared", which used to be the cheapest way to take over a colleague's machine. Releasing ownership also forces `visibility` to `WORKSPACE`: a `PRIVATE` agent with no owner would be reachable by nobody. Claiming an agent does NOT change its visibility — that stays an explicit `setAgentVisibility` call. */
47828
48270
  updateAgentOwnership: VibecontrolsAgent;
47829
48271
  /** Update an installed plugin to the latest version, or to a specific `version`. Proxies POST /api/profiles/<p>/plugins/update. */
47830
48272
  updateAgentPlugin: AgentProxyResponse;
@@ -48342,6 +48784,8 @@ export type Mutation = {
48342
48784
  workerAppendRunLogs: WorkerAppendRunLogsResponse;
48343
48785
  /** Complete a workflow run (calculates stats and updates status) INTERNAL: Requires actorType SERVICE */
48344
48786
  workerCompleteRun: WorkerCompleteRunResponse;
48787
+ /** Start the child run for a Sub-workflow node (BOFF-7648). Run creation stays on this side of the wire: the worker has no database, and the parent/child link, the recursion guards and the workspace scope must be enforced where the data is. The worker then parks its node in WAITING and the child's own completion resumes it. `success: false` with `errorCode` is a USER error (unknown workflow, recursion, empty target) the worker turns into a failed node with a readable message — not a transport failure to retry. INTERNAL: Requires actorType SERVICE */
48788
+ workerCreateChildRun: WorkerCreateChildRunResponse;
48345
48789
  /** Create a new node state (for pending nodes) INTERNAL: Requires actorType SERVICE */
48346
48790
  workerCreateNodeState: WorkerNodeStateResponse;
48347
48791
  /** Record a batch of AI-agent tool calls parked for human approval (BOFF-7521). Called by the executor right after it parks the run/node in WAITING for an opt-in AI Agent node — creates the approval-inbox row the user decides on. INTERNAL: Requires actorType SERVICE */
@@ -49144,6 +49588,10 @@ export type MutationAssignWorkspaceQuotasArgs = {
49144
49588
  workspaceId: Scalars['ID']['input'];
49145
49589
  };
49146
49590
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
49591
+ export type MutationAssistantSessionExecuteArgs = {
49592
+ input: AssistantSessionExecuteInput;
49593
+ };
49594
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
49147
49595
  export type MutationAthAddDrillArgs = {
49148
49596
  input: AthAddDrillInput;
49149
49597
  };
@@ -53434,6 +53882,12 @@ export type MutationDeleteModifiedInstanceArgs = {
53434
53882
  instanceId: Scalars['ID']['input'];
53435
53883
  };
53436
53884
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
53885
+ export type MutationDeleteMyAssistantConversationArgs = {
53886
+ clientConversationId?: InputMaybe<Scalars['ID']['input']>;
53887
+ conversationId?: InputMaybe<Scalars['ID']['input']>;
53888
+ productId: Scalars['String']['input'];
53889
+ };
53890
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
53437
53891
  export type MutationDeleteMyNavViewArgs = {
53438
53892
  id: Scalars['ID']['input'];
53439
53893
  workspaceId: Scalars['String']['input'];
@@ -54570,6 +55024,10 @@ export type MutationExecuteSharedVibeDeckButtonArgs = {
54570
55024
  token: Scalars['String']['input'];
54571
55025
  };
54572
55026
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
55027
+ export type MutationExecuteStepArgs = {
55028
+ input: ExecuteStepInput;
55029
+ };
55030
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
54573
55031
  export type MutationExecuteTransformArgs = {
54574
55032
  input: ExecuteTransformInput;
54575
55033
  };
@@ -54647,6 +55105,12 @@ export type MutationExtendFileLockArgs = {
54647
55105
  input: ExtendLockInput;
54648
55106
  };
54649
55107
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
55108
+ export type MutationExtendMyAssistantSandboxTtlArgs = {
55109
+ additionalSeconds: Scalars['Int']['input'];
55110
+ context: ContextInput;
55111
+ id: Scalars['ID']['input'];
55112
+ };
55113
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
54650
55114
  export type MutationExtendSandboxTtlArgs = {
54651
55115
  additionalSeconds: Scalars['Int']['input'];
54652
55116
  context: ContextInput;
@@ -55296,6 +55760,8 @@ export type MutationHeadshotmarketingReorderLandingPageSectionsArgs = {
55296
55760
  };
55297
55761
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
55298
55762
  export type MutationHeadshotmarketingRunSeoAuditArgs = {
55763
+ maxDepth?: InputMaybe<Scalars['Int']['input']>;
55764
+ maxPages?: InputMaybe<Scalars['Int']['input']>;
55299
55765
  url: Scalars['String']['input'];
55300
55766
  };
55301
55767
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
@@ -56419,6 +56885,11 @@ export type MutationLinkEntityToVibeArgs = {
56419
56885
  input: LinkEntityToVibeInput;
56420
56886
  };
56421
56887
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
56888
+ export type MutationLinkHeadshotmarketingSocialAccountConnectionArgs = {
56889
+ id: Scalars['ID']['input'];
56890
+ integrationConnectionId: Scalars['ID']['input'];
56891
+ };
56892
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
56422
56893
  export type MutationLinkHealthyBowlHarvestToInventoryArgs = {
56423
56894
  input: LinkHarvestToInventoryInput;
56424
56895
  };
@@ -57049,6 +57520,30 @@ export type MutationPlanMultiModalShipmentArgs = {
57049
57520
  input: PlanMultiModalShipmentInput;
57050
57521
  };
57051
57522
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57523
+ export type MutationPlanmagnetAcceptFeatureRequestArgs = {
57524
+ id: Scalars['ID']['input'];
57525
+ input?: InputMaybe<PlanmagnetAcceptFeatureRequestInput>;
57526
+ };
57527
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57528
+ export type MutationPlanmagnetAddTeamMembersArgs = {
57529
+ id: Scalars['ID']['input'];
57530
+ input: PlanmagnetTeamMembersInput;
57531
+ };
57532
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57533
+ export type MutationPlanmagnetAddTeamProjectsArgs = {
57534
+ id: Scalars['ID']['input'];
57535
+ input: PlanmagnetTeamProjectsInput;
57536
+ };
57537
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57538
+ export type MutationPlanmagnetAddWorkItemCommentArgs = {
57539
+ input: PlanmagnetAddWorkItemCommentInput;
57540
+ };
57541
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57542
+ export type MutationPlanmagnetAddWorkItemsToReleaseArgs = {
57543
+ releaseId: Scalars['ID']['input'];
57544
+ workItemIds: Array<Scalars['ID']['input']>;
57545
+ };
57546
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57052
57547
  export type MutationPlanmagnetAddWorkItemsToSprintArgs = {
57053
57548
  id: Scalars['ID']['input'];
57054
57549
  input: PlanmagnetSprintWorkItemsInput;
@@ -57071,6 +57566,10 @@ export type MutationPlanmagnetApproveTimesheetArgs = {
57071
57566
  id: Scalars['ID']['input'];
57072
57567
  };
57073
57568
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57569
+ export type MutationPlanmagnetArchiveProductArgs = {
57570
+ id: Scalars['ID']['input'];
57571
+ };
57572
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57074
57573
  export type MutationPlanmagnetAssignWorkItemArgs = {
57075
57574
  id: Scalars['ID']['input'];
57076
57575
  input: PlanmagnetAssignWorkItemInput;
@@ -57144,6 +57643,10 @@ export type MutationPlanmagnetCreatePortfolioArgs = {
57144
57643
  input: PlanmagnetCreatePortfolioInput;
57145
57644
  };
57146
57645
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57646
+ export type MutationPlanmagnetCreateProductArgs = {
57647
+ input: PlanmagnetCreateProductInput;
57648
+ };
57649
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57147
57650
  export type MutationPlanmagnetCreateProgramArgs = {
57148
57651
  input: PlanmagnetCreateProgramInput;
57149
57652
  };
@@ -57180,6 +57683,10 @@ export type MutationPlanmagnetCreateSprintArgs = {
57180
57683
  input: PlanmagnetCreateSprintInput;
57181
57684
  };
57182
57685
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57686
+ export type MutationPlanmagnetCreateTeamArgs = {
57687
+ input: PlanmagnetCreateTeamInput;
57688
+ };
57689
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57183
57690
  export type MutationPlanmagnetCreateTemplateFromProjectArgs = {
57184
57691
  description?: InputMaybe<Scalars['String']['input']>;
57185
57692
  name: Scalars['String']['input'];
@@ -57198,6 +57705,11 @@ export type MutationPlanmagnetCreateWorkItemArgs = {
57198
57705
  input: PlanmagnetCreateWorkItemInput;
57199
57706
  };
57200
57707
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57708
+ export type MutationPlanmagnetDeclineFeatureRequestArgs = {
57709
+ id: Scalars['ID']['input'];
57710
+ reason: Scalars['String']['input'];
57711
+ };
57712
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57201
57713
  export type MutationPlanmagnetDeleteAutomationRuleArgs = {
57202
57714
  id: Scalars['ID']['input'];
57203
57715
  };
@@ -57258,6 +57770,10 @@ export type MutationPlanmagnetDeletePortfolioArgs = {
57258
57770
  id: Scalars['ID']['input'];
57259
57771
  };
57260
57772
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57773
+ export type MutationPlanmagnetDeleteProductArgs = {
57774
+ id: Scalars['ID']['input'];
57775
+ };
57776
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57261
57777
  export type MutationPlanmagnetDeleteProgramArgs = {
57262
57778
  id: Scalars['ID']['input'];
57263
57779
  };
@@ -57294,6 +57810,10 @@ export type MutationPlanmagnetDeleteSprintArgs = {
57294
57810
  id: Scalars['ID']['input'];
57295
57811
  };
57296
57812
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57813
+ export type MutationPlanmagnetDeleteTeamArgs = {
57814
+ id: Scalars['ID']['input'];
57815
+ };
57816
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57297
57817
  export type MutationPlanmagnetDeleteTimeEntryArgs = {
57298
57818
  id: Scalars['ID']['input'];
57299
57819
  };
@@ -57302,11 +57822,29 @@ export type MutationPlanmagnetDeleteWorkItemArgs = {
57302
57822
  id: Scalars['ID']['input'];
57303
57823
  };
57304
57824
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57825
+ export type MutationPlanmagnetDeleteWorkItemCommentArgs = {
57826
+ id: Scalars['ID']['input'];
57827
+ };
57828
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57829
+ export type MutationPlanmagnetEditWorkItemCommentArgs = {
57830
+ body: Scalars['String']['input'];
57831
+ id: Scalars['ID']['input'];
57832
+ };
57833
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57834
+ export type MutationPlanmagnetEraseSubjectArgs = {
57835
+ dryRun?: InputMaybe<Scalars['Boolean']['input']>;
57836
+ subjectId: Scalars['ID']['input'];
57837
+ };
57838
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57305
57839
  export type MutationPlanmagnetExecuteAutomationRuleArgs = {
57306
57840
  id: Scalars['ID']['input'];
57307
57841
  triggerData?: InputMaybe<Scalars['JSON']['input']>;
57308
57842
  };
57309
57843
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57844
+ export type MutationPlanmagnetExportSubjectArgs = {
57845
+ subjectId: Scalars['ID']['input'];
57846
+ };
57847
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57310
57848
  export type MutationPlanmagnetExportToExternalArgs = {
57311
57849
  input: PlanmagnetExportToExternalInput;
57312
57850
  };
@@ -57338,6 +57876,26 @@ export type MutationPlanmagnetLinkKeyResultToWorkItemArgs = {
57338
57876
  workItemId: Scalars['ID']['input'];
57339
57877
  };
57340
57878
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57879
+ export type MutationPlanmagnetLinkProductFeatureRequestArgs = {
57880
+ featureRequestId: Scalars['ID']['input'];
57881
+ productId: Scalars['ID']['input'];
57882
+ };
57883
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57884
+ export type MutationPlanmagnetLinkProductObjectiveArgs = {
57885
+ objectiveId: Scalars['ID']['input'];
57886
+ productId: Scalars['ID']['input'];
57887
+ };
57888
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57889
+ export type MutationPlanmagnetLinkProductReleaseArgs = {
57890
+ productId: Scalars['ID']['input'];
57891
+ releaseId: Scalars['ID']['input'];
57892
+ };
57893
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57894
+ export type MutationPlanmagnetLinkProductRoadmapArgs = {
57895
+ productId: Scalars['ID']['input'];
57896
+ roadmapId: Scalars['ID']['input'];
57897
+ };
57898
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57341
57899
  export type MutationPlanmagnetLinkWorkItemArgs = {
57342
57900
  input: PlanmagnetCreateWorkItemLinkInput;
57343
57901
  };
@@ -57350,6 +57908,11 @@ export type MutationPlanmagnetLogTimeArgs = {
57350
57908
  input: PlanmagnetLogTimeInput;
57351
57909
  };
57352
57910
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57911
+ export type MutationPlanmagnetMergeFeatureRequestArgs = {
57912
+ id: Scalars['ID']['input'];
57913
+ intoId: Scalars['ID']['input'];
57914
+ };
57915
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57353
57916
  export type MutationPlanmagnetMoveCardArgs = {
57354
57917
  boardId: Scalars['ID']['input'];
57355
57918
  input: PlanmagnetMoveCardInput;
@@ -57378,6 +57941,21 @@ export type MutationPlanmagnetRemoveFeatureVoteArgs = {
57378
57941
  featureRequestId: Scalars['ID']['input'];
57379
57942
  };
57380
57943
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57944
+ export type MutationPlanmagnetRemoveTeamMembersArgs = {
57945
+ id: Scalars['ID']['input'];
57946
+ input: PlanmagnetTeamMembersInput;
57947
+ };
57948
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57949
+ export type MutationPlanmagnetRemoveTeamProjectsArgs = {
57950
+ id: Scalars['ID']['input'];
57951
+ input: PlanmagnetTeamProjectsInput;
57952
+ };
57953
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57954
+ export type MutationPlanmagnetRemoveWorkItemsFromReleaseArgs = {
57955
+ releaseId: Scalars['ID']['input'];
57956
+ workItemIds: Array<Scalars['ID']['input']>;
57957
+ };
57958
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57381
57959
  export type MutationPlanmagnetRemoveWorkItemsFromSprintArgs = {
57382
57960
  id: Scalars['ID']['input'];
57383
57961
  input: PlanmagnetSprintWorkItemsInput;
@@ -57398,6 +57976,7 @@ export type MutationPlanmagnetResumeExternalSyncArgs = {
57398
57976
  };
57399
57977
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57400
57978
  export type MutationPlanmagnetRevertDocArgs = {
57979
+ expectedVersion?: InputMaybe<Scalars['Int']['input']>;
57401
57980
  id: Scalars['ID']['input'];
57402
57981
  toVersion: Scalars['Int']['input'];
57403
57982
  };
@@ -57411,6 +57990,11 @@ export type MutationPlanmagnetSetCustomFieldValueArgs = {
57411
57990
  input: PlanmagnetSetCustomFieldValueInput;
57412
57991
  };
57413
57992
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57993
+ export type MutationPlanmagnetSnoozeFeatureRequestArgs = {
57994
+ id: Scalars['ID']['input'];
57995
+ until?: InputMaybe<Scalars['DateTime']['input']>;
57996
+ };
57997
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57414
57998
  export type MutationPlanmagnetStartSprintArgs = {
57415
57999
  id: Scalars['ID']['input'];
57416
58000
  };
@@ -57432,6 +58016,10 @@ export type MutationPlanmagnetToggleAutomationRuleArgs = {
57432
58016
  status: PlanmagnetAutomationStatus;
57433
58017
  };
57434
58018
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58019
+ export type MutationPlanmagnetUnarchiveProductArgs = {
58020
+ id: Scalars['ID']['input'];
58021
+ };
58022
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57435
58023
  export type MutationPlanmagnetUnlinkCompetitorFromFeatureArgs = {
57436
58024
  input: PlanmagnetLinkCompetitorInput;
57437
58025
  };
@@ -57446,6 +58034,26 @@ export type MutationPlanmagnetUnlinkKeyResultFromWorkItemArgs = {
57446
58034
  workItemId: Scalars['ID']['input'];
57447
58035
  };
57448
58036
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58037
+ export type MutationPlanmagnetUnlinkProductFeatureRequestArgs = {
58038
+ featureRequestId: Scalars['ID']['input'];
58039
+ productId: Scalars['ID']['input'];
58040
+ };
58041
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58042
+ export type MutationPlanmagnetUnlinkProductObjectiveArgs = {
58043
+ objectiveId: Scalars['ID']['input'];
58044
+ productId: Scalars['ID']['input'];
58045
+ };
58046
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58047
+ export type MutationPlanmagnetUnlinkProductReleaseArgs = {
58048
+ productId: Scalars['ID']['input'];
58049
+ releaseId: Scalars['ID']['input'];
58050
+ };
58051
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58052
+ export type MutationPlanmagnetUnlinkProductRoadmapArgs = {
58053
+ productId: Scalars['ID']['input'];
58054
+ roadmapId: Scalars['ID']['input'];
58055
+ };
58056
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57449
58057
  export type MutationPlanmagnetUnlinkWorkItemArgs = {
57450
58058
  id: Scalars['ID']['input'];
57451
58059
  };
@@ -57525,6 +58133,11 @@ export type MutationPlanmagnetUpdatePortfolioArgs = {
57525
58133
  input: PlanmagnetUpdatePortfolioInput;
57526
58134
  };
57527
58135
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58136
+ export type MutationPlanmagnetUpdateProductArgs = {
58137
+ id: Scalars['ID']['input'];
58138
+ input: PlanmagnetUpdateProductInput;
58139
+ };
58140
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57528
58141
  export type MutationPlanmagnetUpdateProgramArgs = {
57529
58142
  id: Scalars['ID']['input'];
57530
58143
  input: PlanmagnetUpdateProgramInput;
@@ -57540,6 +58153,11 @@ export type MutationPlanmagnetUpdateProjectTemplateArgs = {
57540
58153
  input: PlanmagnetUpdateProjectTemplateInput;
57541
58154
  };
57542
58155
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58156
+ export type MutationPlanmagnetUpdateProjectWorkflowArgs = {
58157
+ input: PlanmagnetUpdateProjectWorkflowInput;
58158
+ projectId: Scalars['ID']['input'];
58159
+ };
58160
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57543
58161
  export type MutationPlanmagnetUpdateQualityGateArgs = {
57544
58162
  id: Scalars['ID']['input'];
57545
58163
  input: PlanmagnetUpdateQualityGateInput;
@@ -57570,6 +58188,11 @@ export type MutationPlanmagnetUpdateSprintArgs = {
57570
58188
  input: PlanmagnetUpdateSprintInput;
57571
58189
  };
57572
58190
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58191
+ export type MutationPlanmagnetUpdateTeamArgs = {
58192
+ id: Scalars['ID']['input'];
58193
+ input: PlanmagnetUpdateTeamInput;
58194
+ };
58195
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57573
58196
  export type MutationPlanmagnetUpdateTimeEntryArgs = {
57574
58197
  id: Scalars['ID']['input'];
57575
58198
  input: PlanmagnetUpdateTimeEntryInput;
@@ -57715,6 +58338,10 @@ export type MutationProposeHealthyBowlAgronomyDecisionsArgs = {
57715
58338
  input: ProposeAgronomyDecisionsInput;
57716
58339
  };
57717
58340
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58341
+ export type MutationProvisionAssistantSandboxArgs = {
58342
+ input: ProvisionAssistantSandboxInput;
58343
+ };
58344
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57718
58345
  export type MutationProxySandboxRequestArgs = {
57719
58346
  input: ProxySandboxRequestInput;
57720
58347
  };
@@ -58748,6 +59375,10 @@ export type MutationReportMessageArgs = {
58748
59375
  reason: Scalars['String']['input'];
58749
59376
  };
58750
59377
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
59378
+ export type MutationReportMyAssistantTurnTimingsArgs = {
59379
+ input: ReportAssistantTurnTimingsInput;
59380
+ };
59381
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58751
59382
  export type MutationReprocessTimeCampusTimelineArgs = {
58752
59383
  workspaceId: Scalars['ID']['input'];
58753
59384
  };
@@ -59441,6 +60072,10 @@ export type MutationSaveHousingvistaShortlistArgs = {
59441
60072
  input: HousingVistaSaveShortlistInput;
59442
60073
  };
59443
60074
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
60075
+ export type MutationSaveMyAssistantHistoryEntriesArgs = {
60076
+ input: SaveMyAssistantHistoryEntriesInput;
60077
+ };
60078
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
59444
60079
  export type MutationSaveMyNavPreferencesArgs = {
59445
60080
  input: SaveNavPreferencesInput;
59446
60081
  };
@@ -60038,6 +60673,11 @@ export type MutationStopCallRecordingArgs = {
60038
60673
  callSessionId: Scalars['ID']['input'];
60039
60674
  };
60040
60675
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
60676
+ export type MutationStopMyAssistantSandboxArgs = {
60677
+ context: ContextInput;
60678
+ id: Scalars['ID']['input'];
60679
+ };
60680
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
60041
60681
  export type MutationStopSandboxArgs = {
60042
60682
  context: ContextInput;
60043
60683
  id: Scalars['ID']['input'];
@@ -60873,6 +61513,10 @@ export type MutationTransferGroupOwnershipArgs = {
60873
61513
  newOwnerId: Scalars['ID']['input'];
60874
61514
  };
60875
61515
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
61516
+ export type MutationTransferInventoryStockArgs = {
61517
+ input: TransferInventoryStockInput;
61518
+ };
61519
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
60876
61520
  export type MutationTransferSessionControlArgs = {
60877
61521
  sessionId: Scalars['ID']['input'];
60878
61522
  toUserId: Scalars['ID']['input'];
@@ -63074,6 +63718,10 @@ export type MutationWorkerCompleteRunArgs = {
63074
63718
  input: WorkerCompleteRunInput;
63075
63719
  };
63076
63720
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
63721
+ export type MutationWorkerCreateChildRunArgs = {
63722
+ input: WorkerCreateChildRunInput;
63723
+ };
63724
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
63077
63725
  export type MutationWorkerCreateNodeStateArgs = {
63078
63726
  input: WorkerCreateNodeStateInput;
63079
63727
  };
@@ -64848,6 +65496,55 @@ export type PlanMultiModalShipmentInput = {
64848
65496
  shipmentNumber: Scalars['String']['input'];
64849
65497
  storeOrderId?: InputMaybe<Scalars['ID']['input']>;
64850
65498
  };
65499
+ /** Accept a request out of triage */
65500
+ export type PlanmagnetAcceptFeatureRequestInput = {
65501
+ /** The project that will deliver it */
65502
+ projectId?: InputMaybe<Scalars['String']['input']>;
65503
+ /** UNDER_REVIEW or PLANNED (the default) */
65504
+ status?: InputMaybe<FeatureRequestStatus>;
65505
+ };
65506
+ export type PlanmagnetAddWorkItemCommentInput = {
65507
+ /** Comment text (1 to 10,000 characters after trimming) */
65508
+ body: Scalars['String']['input'];
65509
+ workItemId: Scalars['ID']['input'];
65510
+ };
65511
+ /** One recorded AI call. Every call is written, success or failure, by AiGatewayService.completeWithDecision. `inputRefs` is deliberately NOT exposed: the column is classified L3 in the Prisma schema, and a ledger read should not become the easiest way to pull classified input back out. */
65512
+ export type PlanmagnetAgentRun = {
65513
+ __typename?: 'PlanmagnetAgentRun';
65514
+ actorId: Scalars['String']['output'];
65515
+ actorType: Scalars['String']['output'];
65516
+ createdAt: Scalars['DateTime']['output'];
65517
+ /** What the model decided (e.g. the suggestions it returned), as recorded. */
65518
+ decision?: Maybe<Scalars['JSON']['output']>;
65519
+ error?: Maybe<Scalars['String']['output']>;
65520
+ id: Scalars['ID']['output'];
65521
+ latencyMs?: Maybe<Scalars['Int']['output']>;
65522
+ model: Scalars['String']['output'];
65523
+ promptSummary: Scalars['String']['output'];
65524
+ provider: Scalars['String']['output'];
65525
+ status: PlanmagnetAgentRunStatus;
65526
+ tokensIn?: Maybe<Scalars['Int']['output']>;
65527
+ tokensOut?: Maybe<Scalars['Int']['output']>;
65528
+ trigger: PlanmagnetAgentRunTrigger;
65529
+ workspaceId: Scalars['ID']['output'];
65530
+ };
65531
+ export type PlanmagnetAgentRunFilter = {
65532
+ status?: InputMaybe<PlanmagnetAgentRunStatus>;
65533
+ };
65534
+ export type PlanmagnetAgentRunList = {
65535
+ __typename?: 'PlanmagnetAgentRunList';
65536
+ items: Array<PlanmagnetAgentRun>;
65537
+ pageInfo: PlanmagnetPageInfo;
65538
+ totalCount: Scalars['Int']['output'];
65539
+ };
65540
+ /** Values mirror the Prisma enum exactly. Enum drift between the two layers is how every dependency write in this service 500'd for months — see 20260924130000 — so do not add a value here without the migration. */
65541
+ export declare enum PlanmagnetAgentRunStatus {
65542
+ Failed = "FAILED",
65543
+ Succeeded = "SUCCEEDED"
65544
+ }
65545
+ export declare enum PlanmagnetAgentRunTrigger {
65546
+ Manual = "MANUAL"
65547
+ }
64851
65548
  export type PlanmagnetApplyTemplateInput = {
64852
65549
  ownerId: Scalars['String']['input'];
64853
65550
  projectDescription?: InputMaybe<Scalars['String']['input']>;
@@ -64893,10 +65590,14 @@ export type PlanmagnetAutomationExecutionList = {
64893
65590
  pageInfo: PlanmagnetPageInfo;
64894
65591
  totalCount: Scalars['Int']['output'];
64895
65592
  };
65593
+ /** The outcome of one automation run. PARTIAL_FAILURE exists because a run that dispatched some actions and could not dispatch others is neither a success nor a plain failure, and an operator needs to tell those apart. Before the status column existed the backing store was a single boolean, so this distinction could not be represented at all. */
64896
65594
  export declare enum PlanmagnetAutomationExecutionStatus {
64897
65595
  Failure = "FAILURE",
65596
+ /** Some actions ran, others failed or could not be dispatched. */
65597
+ PartialFailure = "PARTIAL_FAILURE",
64898
65598
  Pending = "PENDING",
64899
65599
  Running = "RUNNING",
65600
+ /** Nothing ran — no action the rule declared is supported by this engine. */
64900
65601
  Skipped = "SKIPPED",
64901
65602
  Success = "SUCCESS"
64902
65603
  }
@@ -65065,7 +65766,9 @@ export type PlanmagnetBudget = {
65065
65766
  export type PlanmagnetBudgetExpenseFilter = {
65066
65767
  budgetId?: InputMaybe<Scalars['String']['input']>;
65067
65768
  category?: InputMaybe<Scalars['String']['input']>;
65769
+ /** Expenses dated on or after this UTC day */
65068
65770
  dateFrom?: InputMaybe<Scalars['DateTime']['input']>;
65771
+ /** Expenses dated on or before this UTC day (the whole day is included) */
65069
65772
  dateTo?: InputMaybe<Scalars['DateTime']['input']>;
65070
65773
  };
65071
65774
  export type PlanmagnetBudgetExpenseList = {
@@ -65154,6 +65857,8 @@ export type PlanmagnetCreateBoardInput = {
65154
65857
  name: Scalars['String']['input'];
65155
65858
  projectId: Scalars['String']['input'];
65156
65859
  type: BoardType;
65860
+ /** Also create one column per status of the default workflow (Backlog, To Do, In Progress, In Review, Testing, Done), each mapped to its status */
65861
+ withDefaultColumns?: InputMaybe<Scalars['Boolean']['input']>;
65157
65862
  };
65158
65863
  export type PlanmagnetCreateBudgetInput = {
65159
65864
  currency: Scalars['String']['input'];
@@ -65186,9 +65891,10 @@ export type PlanmagnetCreateCustomFieldDefinitionInput = {
65186
65891
  };
65187
65892
  export type PlanmagnetCreateDependencyInput = {
65188
65893
  description?: InputMaybe<Scalars['String']['input']>;
65894
+ lagMinutes?: InputMaybe<Scalars['Int']['input']>;
65189
65895
  metadata?: InputMaybe<Scalars['JSON']['input']>;
65190
- sourceWorkItemId: Scalars['String']['input'];
65191
- targetWorkItemId: Scalars['String']['input'];
65896
+ predecessorId: Scalars['String']['input'];
65897
+ successorId: Scalars['String']['input'];
65192
65898
  type: DependencyType;
65193
65899
  };
65194
65900
  export type PlanmagnetCreateDocInput = {
@@ -65212,6 +65918,7 @@ export type PlanmagnetCreateFeatureRequestInput = {
65212
65918
  description?: InputMaybe<Scalars['String']['input']>;
65213
65919
  effortEstimate?: InputMaybe<Scalars['String']['input']>;
65214
65920
  metadata?: InputMaybe<Scalars['JSON']['input']>;
65921
+ productId?: InputMaybe<Scalars['String']['input']>;
65215
65922
  projectId?: InputMaybe<Scalars['String']['input']>;
65216
65923
  status?: InputMaybe<FeatureRequestStatus>;
65217
65924
  tags?: InputMaybe<Array<Scalars['String']['input']>>;
@@ -65266,6 +65973,15 @@ export type PlanmagnetCreatePortfolioInput = {
65266
65973
  status?: InputMaybe<PortfolioStatus>;
65267
65974
  tags?: InputMaybe<Array<Scalars['String']['input']>>;
65268
65975
  };
65976
+ export type PlanmagnetCreateProductInput = {
65977
+ description?: InputMaybe<Scalars['String']['input']>;
65978
+ lifecycleStage?: InputMaybe<PlanmagnetProductLifecycleStage>;
65979
+ metadata?: InputMaybe<Scalars['JSON']['input']>;
65980
+ name: Scalars['String']['input'];
65981
+ northStar?: InputMaybe<PlanmagnetProductNorthStarInput>;
65982
+ ownerId: Scalars['String']['input'];
65983
+ vision: Scalars['String']['input'];
65984
+ };
65269
65985
  export type PlanmagnetCreateProgramInput = {
65270
65986
  budgetTotal?: InputMaybe<Scalars['Float']['input']>;
65271
65987
  currency?: InputMaybe<Scalars['String']['input']>;
@@ -65287,6 +66003,8 @@ export type PlanmagnetCreateProjectInput = {
65287
66003
  methodology?: InputMaybe<ProjectMethodology>;
65288
66004
  name: Scalars['String']['input'];
65289
66005
  ownerId: Scalars['String']['input'];
66006
+ /** Parent portfolio ID. Must exist in the same workspace and not be soft-deleted (BOFF-8047). */
66007
+ portfolioId?: InputMaybe<Scalars['String']['input']>;
65290
66008
  programId?: InputMaybe<Scalars['String']['input']>;
65291
66009
  startDate?: InputMaybe<Scalars['DateTime']['input']>;
65292
66010
  status?: InputMaybe<PlanmagnetProjectStatus>;
@@ -65315,6 +66033,8 @@ export type PlanmagnetCreateQualityGateInput = {
65315
66033
  name: Scalars['String']['input'];
65316
66034
  phase?: InputMaybe<Scalars['String']['input']>;
65317
66035
  projectId: Scalars['String']['input'];
66036
+ /** The release this gate holds (a release of the same project, or one with no projects) */
66037
+ releaseId?: InputMaybe<Scalars['String']['input']>;
65318
66038
  sortOrder?: InputMaybe<Scalars['Int']['input']>;
65319
66039
  };
65320
66040
  export type PlanmagnetCreateReleaseInput = {
@@ -65323,6 +66043,7 @@ export type PlanmagnetCreateReleaseInput = {
65323
66043
  name: Scalars['String']['input'];
65324
66044
  ownerId?: InputMaybe<Scalars['String']['input']>;
65325
66045
  plannedDate?: InputMaybe<Scalars['DateTime']['input']>;
66046
+ productId?: InputMaybe<Scalars['String']['input']>;
65326
66047
  projectId: Scalars['String']['input'];
65327
66048
  releaseNotes?: InputMaybe<Scalars['String']['input']>;
65328
66049
  status?: InputMaybe<ReleaseStatus>;
@@ -65350,6 +66071,8 @@ export type PlanmagnetCreateRoadmapInput = {
65350
66071
  metadata?: InputMaybe<Scalars['JSON']['input']>;
65351
66072
  name: Scalars['String']['input'];
65352
66073
  ownerId: Scalars['String']['input'];
66074
+ planningFocus?: InputMaybe<RoadmapPlanningFocus>;
66075
+ productId?: InputMaybe<Scalars['String']['input']>;
65353
66076
  type: RoadmapType;
65354
66077
  };
65355
66078
  export type PlanmagnetCreateRoadmapItemInput = {
@@ -65373,10 +66096,18 @@ export type PlanmagnetCreateSprintInput = {
65373
66096
  goal?: InputMaybe<Scalars['String']['input']>;
65374
66097
  metadata?: InputMaybe<Scalars['JSON']['input']>;
65375
66098
  name: Scalars['String']['input'];
65376
- projectId: Scalars['String']['input'];
66099
+ /** Exactly one of projectId/teamId is required (BOFF-8044) — enforced server-side (sprint.errors.scopeConflict / sprint.errors.scopeRequired). */
66100
+ projectId?: InputMaybe<Scalars['String']['input']>;
65377
66101
  /** Accepted for API compatibility but not honored: sort position is always the auto-assigned, per-project-unique `sequenceNumber` — see sprint.service.ts. */
65378
66102
  sortOrder?: InputMaybe<Scalars['Int']['input']>;
65379
66103
  startDate?: InputMaybe<Scalars['DateTime']['input']>;
66104
+ teamId?: InputMaybe<Scalars['String']['input']>;
66105
+ };
66106
+ export type PlanmagnetCreateTeamInput = {
66107
+ capacity?: InputMaybe<Scalars['Int']['input']>;
66108
+ description?: InputMaybe<Scalars['String']['input']>;
66109
+ leadId?: InputMaybe<Scalars['String']['input']>;
66110
+ name: Scalars['String']['input'];
65380
66111
  };
65381
66112
  export type PlanmagnetCreateTimeEntryInput = {
65382
66113
  billingRate?: InputMaybe<Scalars['Float']['input']>;
@@ -65384,10 +66115,8 @@ export type PlanmagnetCreateTimeEntryInput = {
65384
66115
  date: Scalars['DateTime']['input'];
65385
66116
  description?: InputMaybe<Scalars['String']['input']>;
65386
66117
  durationMinutes: Scalars['Int']['input'];
65387
- endTime?: InputMaybe<Scalars['DateTime']['input']>;
65388
66118
  metadata?: InputMaybe<Scalars['JSON']['input']>;
65389
66119
  projectId: Scalars['String']['input'];
65390
- startTime?: InputMaybe<Scalars['DateTime']['input']>;
65391
66120
  timesheetId?: InputMaybe<Scalars['String']['input']>;
65392
66121
  workItemId: Scalars['String']['input'];
65393
66122
  };
@@ -65431,7 +66160,8 @@ export type PlanmagnetCriticalPath = {
65431
66160
  path: Array<PlanmagnetDependencyNode>;
65432
66161
  /** Per-node slack in days. Nodes on the critical path have slack 0. */
65433
66162
  slack: Scalars['JSON']['output'];
65434
- totalLagDays: Scalars['Int']['output'];
66163
+ /** Length of the critical chain in MINUTES — WORK PLUS LAG. This field has been wrong twice, in two different ways. As `totalLagDays` it summed lag expressed in days; the column rename made it minutes without renaming the field, so a two-day lag read as 2880 "days". And summing lag at all was the deeper error: A(5d) → B(3d) with FINISH_TO_START and no lag is an eight-day chain, and a lag-only total reports ZERO. It now measures what the name says. No consumer in the repo, MFE, SDK or CLI selects it. */
66164
+ totalDurationMinutes: Scalars['Int']['output'];
65435
66165
  };
65436
66166
  /** Cumulative flow diagram data for a project over a date range. */
65437
66167
  export type PlanmagnetCumulativeFlow = {
@@ -65495,9 +66225,9 @@ export type PlanmagnetDependencyCycle = {
65495
66225
  workItemIds: Array<Scalars['ID']['output']>;
65496
66226
  };
65497
66227
  export type PlanmagnetDependencyFilter = {
65498
- sourceWorkItemId?: InputMaybe<Scalars['String']['input']>;
66228
+ predecessorId?: InputMaybe<Scalars['String']['input']>;
65499
66229
  status?: InputMaybe<DependencyStatus>;
65500
- targetWorkItemId?: InputMaybe<Scalars['String']['input']>;
66230
+ successorId?: InputMaybe<Scalars['String']['input']>;
65501
66231
  type?: InputMaybe<DependencyType>;
65502
66232
  };
65503
66233
  /** A node participating in a dependency chain / critical path. Holds the resolved work-item title and key so the client can render the chain without a follow-up N+1 query. */
@@ -65548,6 +66278,25 @@ export type PlanmagnetDocRevision = {
65548
66278
  title: Scalars['String']['output'];
65549
66279
  version: Scalars['Int']['output'];
65550
66280
  };
66281
+ /** Which due-date bucket a work item falls into, server-computed (see utils/my-work.ts) so the "My Work" grouping can never disagree between two clients or two requests. */
66282
+ export declare enum PlanmagnetDueGroup {
66283
+ DueLater = "DUE_LATER",
66284
+ DueThisWeek = "DUE_THIS_WEEK",
66285
+ DueToday = "DUE_TODAY",
66286
+ NoDueDate = "NO_DUE_DATE",
66287
+ Overdue = "OVERDUE"
66288
+ }
66289
+ export type PlanmagnetEraseResult = {
66290
+ __typename?: 'PlanmagnetEraseResult';
66291
+ /** Id columns replaced by a one-way tombstone or cleared (authorship, ownership, history, assignments) */
66292
+ anonymised: Scalars['Int']['output'];
66293
+ dryRun: Scalars['Boolean']['output'];
66294
+ notes?: Maybe<Scalars['String']['output']>;
66295
+ /** Rows deleted (the person's own: votes, editor seats, time nobody signed off) */
66296
+ purged: Scalars['Int']['output'];
66297
+ retainedForLegalReason?: Maybe<Scalars['String']['output']>;
66298
+ service: Scalars['String']['output'];
66299
+ };
65551
66300
  export type PlanmagnetExportToExternalInput = {
65552
66301
  exportAll?: InputMaybe<Scalars['Boolean']['input']>;
65553
66302
  internalIds?: InputMaybe<Array<Scalars['String']['input']>>;
@@ -65579,11 +66328,23 @@ export type PlanmagnetExternalSyncList = {
65579
66328
  pageInfo: PlanmagnetPageInfo;
65580
66329
  totalCount: Scalars['Int']['output'];
65581
66330
  };
66331
+ /** Feature request list order */
66332
+ export declare enum PlanmagnetFeatureOrder {
66333
+ /** Most votes first */
66334
+ MostVoted = "MOST_VOTED",
66335
+ /** Newest first (the default) */
66336
+ Newest = "NEWEST"
66337
+ }
65582
66338
  export type PlanmagnetFeatureRequestFilter = {
66339
+ productId?: InputMaybe<Scalars['String']['input']>;
65583
66340
  projectId?: InputMaybe<Scalars['String']['input']>;
65584
66341
  search?: InputMaybe<Scalars['String']['input']>;
66342
+ /** true: SUBMITTED and snoozed into the future. false: not currently snoozed */
66343
+ snoozed?: InputMaybe<Scalars['Boolean']['input']>;
65585
66344
  status?: InputMaybe<FeatureRequestStatus>;
65586
66345
  submittedBy?: InputMaybe<Scalars['String']['input']>;
66346
+ /** true: the triage queue — SUBMITTED and not snoozed (or its snooze has passed). false: everything else */
66347
+ triage?: InputMaybe<Scalars['Boolean']['input']>;
65587
66348
  };
65588
66349
  export type PlanmagnetFeatureRequestList = {
65589
66350
  __typename?: 'PlanmagnetFeatureRequestList';
@@ -65602,6 +66363,10 @@ export type PlanmagnetGenerateReleaseNotesPayload = {
65602
66363
  export type PlanmagnetImportExternalIssuesInput = {
65603
66364
  /** The exported file contents (CSV text or JSON). */
65604
66365
  data: Scalars['String']['input'];
66366
+ /** Preview only: report what WOULD be imported and what would be lost, and write nothing (not even the sync). */
66367
+ dryRun?: InputMaybe<Scalars['Boolean']['input']>;
66368
+ /** Explicit field mapping, our field -> their column, e.g. { "title": "Summary", "status": "State" }. Fields: externalId, title, description, status, priority, labels, assigneeEmail, dueDate, externalUrl. Outranks the sync's stored mapping, which outranks the built-in column aliases. */
66369
+ fieldMapping?: InputMaybe<Scalars['JSON']['input']>;
65605
66370
  /** Format of the exported payload. */
65606
66371
  format: PlanmagnetImportFormat;
65607
66372
  /** Target PlanMagnet project the imported WorkItems are created in. */
@@ -65620,12 +66385,42 @@ export type PlanmagnetImportFromExternalInput = {
65620
66385
  importAll?: InputMaybe<Scalars['Boolean']['input']>;
65621
66386
  syncId: Scalars['String']['input'];
65622
66387
  };
66388
+ /** One issue of an import, with what could not be carried over from it */
66389
+ export type PlanmagnetImportIssueReport = {
66390
+ __typename?: 'PlanmagnetImportIssueReport';
66391
+ externalId: Scalars['String']['output'];
66392
+ /** Link back to the issue in the source tool */
66393
+ externalUrl?: Maybe<Scalars['String']['output']>;
66394
+ /** What was lost or changed on the way (unmapped state or priority, unmatched assignee, bad due date) */
66395
+ notes: Array<Scalars['String']['output']>;
66396
+ outcome: PlanmagnetImportOutcome;
66397
+ title: Scalars['String']['output'];
66398
+ /** The work item it became (or already is) */
66399
+ workItemId?: Maybe<Scalars['String']['output']>;
66400
+ };
66401
+ /** What happened to one issue of an import */
66402
+ export declare enum PlanmagnetImportOutcome {
66403
+ /** Imported by an earlier run; this run left it alone (reruns are duplicate-safe) */
66404
+ AlreadyImported = "ALREADY_IMPORTED",
66405
+ /** Could not be created (see the run's errors) */
66406
+ Failed = "FAILED",
66407
+ /** Created as a work item */
66408
+ Imported = "IMPORTED",
66409
+ /** Preview: would be created */
66410
+ WouldImport = "WOULD_IMPORT"
66411
+ }
65623
66412
  /** Summary of an external-issue import run. */
65624
66413
  export type PlanmagnetImportResult = {
65625
66414
  __typename?: 'PlanmagnetImportResult';
66415
+ /** True when this was a preview and nothing was written */
66416
+ dryRun: Scalars['Boolean']['output'];
65626
66417
  errors: Array<Scalars['String']['output']>;
65627
66418
  failed: Scalars['Int']['output'];
65628
66419
  imported: Scalars['Int']['output'];
66420
+ /** Every issue in the export, in order, with its outcome and notes */
66421
+ issues: Array<PlanmagnetImportIssueReport>;
66422
+ /** The discrepancy report: each kind of loss, counted (unmapped states, unmatched assignees, rejected rows, columns nothing reads) */
66423
+ notCarriedOver: Array<Scalars['String']['output']>;
65629
66424
  skipped: Scalars['Int']['output'];
65630
66425
  workItemIds: Array<Scalars['String']['output']>;
65631
66426
  };
@@ -65686,6 +66481,12 @@ export type PlanmagnetLogTimeInput = {
65686
66481
  workItemId: Scalars['String']['input'];
65687
66482
  };
65688
66483
  export type PlanmagnetMilestoneFilter = {
66484
+ /** Due on or after this UTC day */
66485
+ dueFrom?: InputMaybe<Scalars['DateTime']['input']>;
66486
+ /** Due on or before this UTC day */
66487
+ dueTo?: InputMaybe<Scalars['DateTime']['input']>;
66488
+ /** Only milestones still open (PENDING or IN_PROGRESS) */
66489
+ open?: InputMaybe<Scalars['Boolean']['input']>;
65689
66490
  ownerId?: InputMaybe<Scalars['String']['input']>;
65690
66491
  projectId?: InputMaybe<Scalars['String']['input']>;
65691
66492
  search?: InputMaybe<Scalars['String']['input']>;
@@ -65697,6 +66498,13 @@ export type PlanmagnetMilestoneList = {
65697
66498
  pageInfo: PlanmagnetPageInfo;
65698
66499
  totalCount: Scalars['Int']['output'];
65699
66500
  };
66501
+ /** Milestone list order */
66502
+ export declare enum PlanmagnetMilestoneOrder {
66503
+ /** Nearest due date first; milestones with no due date last */
66504
+ DueSoonest = "DUE_SOONEST",
66505
+ /** Newest first (the default) */
66506
+ Newest = "NEWEST"
66507
+ }
65700
66508
  export type PlanmagnetMoveCardInput = {
65701
66509
  sortOrder?: InputMaybe<Scalars['Int']['input']>;
65702
66510
  targetColumnId: Scalars['ID']['input'];
@@ -65707,6 +66515,13 @@ export type PlanmagnetMoveWorkItemInput = {
65707
66515
  sprintId?: InputMaybe<Scalars['String']['input']>;
65708
66516
  status?: InputMaybe<WorkItemStatus>;
65709
66517
  };
66518
+ export type PlanmagnetMyWorkItemFilter = {
66519
+ /** Default false: DONE/CANCELLED items are left out. Set true to also see recently-closed work. */
66520
+ includeClosed?: InputMaybe<Scalars['Boolean']['input']>;
66521
+ projectId?: InputMaybe<Scalars['String']['input']>;
66522
+ sprintId?: InputMaybe<Scalars['String']['input']>;
66523
+ status?: InputMaybe<WorkItemStatus>;
66524
+ };
65710
66525
  /** A workspace-scoped goal for a given time period. `progress` is the average of its non-deleted KeyResults' progress (0 when it has none). */
65711
66526
  export type PlanmagnetObjective = {
65712
66527
  __typename?: 'PlanmagnetObjective';
@@ -65789,6 +66604,46 @@ export type PlanmagnetPortfolioOverview = {
65789
66604
  /** Total budget spent */
65790
66605
  totalSpent?: Maybe<Scalars['Float']['output']>;
65791
66606
  };
66607
+ export type PlanmagnetProductFilter = {
66608
+ /** false: only archived; true: only active; omitted: both. */
66609
+ isActive?: InputMaybe<Scalars['Boolean']['input']>;
66610
+ lifecycleStage?: InputMaybe<PlanmagnetProductLifecycleStage>;
66611
+ ownerId?: InputMaybe<Scalars['String']['input']>;
66612
+ search?: InputMaybe<Scalars['String']['input']>;
66613
+ };
66614
+ export declare enum PlanmagnetProductLifecycleStage {
66615
+ Beta = "BETA",
66616
+ Concept = "CONCEPT",
66617
+ Deprecated = "DEPRECATED",
66618
+ Development = "DEVELOPMENT",
66619
+ Launched = "LAUNCHED",
66620
+ Mature = "MATURE"
66621
+ }
66622
+ export type PlanmagnetProductList = {
66623
+ __typename?: 'PlanmagnetProductList';
66624
+ items: Array<Product>;
66625
+ pageInfo: PlanmagnetPageInfo;
66626
+ totalCount: Scalars['Int']['output'];
66627
+ };
66628
+ export type PlanmagnetProductNorthStar = {
66629
+ __typename?: 'PlanmagnetProductNorthStar';
66630
+ current: Scalars['Float']['output'];
66631
+ measuredAt?: Maybe<Scalars['DateTime']['output']>;
66632
+ name: Scalars['String']['output'];
66633
+ /** Server-computed: current/target clamped to [0,1], null when target is 0 (a zero target is an unset/degenerate state, not "0% progress"). Never stored. */
66634
+ progressRatio?: Maybe<Scalars['Float']['output']>;
66635
+ target: Scalars['Float']['output'];
66636
+ unit: Scalars['String']['output'];
66637
+ window: Scalars['String']['output'];
66638
+ };
66639
+ export type PlanmagnetProductNorthStarInput = {
66640
+ current: Scalars['Float']['input'];
66641
+ measuredAt?: InputMaybe<Scalars['DateTime']['input']>;
66642
+ name: Scalars['String']['input'];
66643
+ target: Scalars['Float']['input'];
66644
+ unit: Scalars['String']['input'];
66645
+ window: Scalars['String']['input'];
66646
+ };
65792
66647
  export type PlanmagnetProgramFilter = {
65793
66648
  ownerId?: InputMaybe<Scalars['String']['input']>;
65794
66649
  search?: InputMaybe<Scalars['String']['input']>;
@@ -65841,6 +66696,10 @@ export type PlanmagnetProject = {
65841
66696
  onBehalfOf?: Maybe<Scalars['String']['output']>;
65842
66697
  /** Owner actor ID */
65843
66698
  ownerId: Scalars['String']['output'];
66699
+ /** Parent portfolio */
66700
+ portfolio?: Maybe<Portfolio>;
66701
+ /** Parent portfolio ID. Set directly on the project (BOFF-8047) — independent of `programId`: a project may carry both at once, and neither implies the other. */
66702
+ portfolioId?: Maybe<Scalars['String']['output']>;
65844
66703
  /** Parent program */
65845
66704
  program?: Maybe<Program>;
65846
66705
  /** Parent program ID */
@@ -65865,12 +66724,15 @@ export type PlanmagnetProject = {
65865
66724
  updatedBy?: Maybe<Scalars['String']['output']>;
65866
66725
  /** Work items in this project */
65867
66726
  workItems: Array<WorkItem>;
66727
+ /** This project's workflow (labels, hidden statuses, categories, transition rules) */
66728
+ workflow: PlanmagnetProjectWorkflow;
65868
66729
  /** Associated workspace ID */
65869
66730
  workspaceId: Scalars['String']['output'];
65870
66731
  };
65871
66732
  export type PlanmagnetProjectFilter = {
65872
66733
  methodology?: InputMaybe<ProjectMethodology>;
65873
66734
  ownerId?: InputMaybe<Scalars['String']['input']>;
66735
+ portfolioId?: InputMaybe<Scalars['String']['input']>;
65874
66736
  programId?: InputMaybe<Scalars['String']['input']>;
65875
66737
  search?: InputMaybe<Scalars['String']['input']>;
65876
66738
  status?: InputMaybe<PlanmagnetProjectStatus>;
@@ -65901,6 +66763,16 @@ export type PlanmagnetProjectTemplateList = {
65901
66763
  pageInfo: PlanmagnetPageInfo;
65902
66764
  totalCount: Scalars['Int']['output'];
65903
66765
  };
66766
+ /** A project's workflow: all seven statuses in canonical order, and its transition rules */
66767
+ export type PlanmagnetProjectWorkflow = {
66768
+ __typename?: 'PlanmagnetProjectWorkflow';
66769
+ /** When false, any move between visible statuses is allowed */
66770
+ enforceTransitions: Scalars['Boolean']['output'];
66771
+ projectId: Scalars['String']['output'];
66772
+ statuses: Array<PlanmagnetWorkflowStatus>;
66773
+ /** Allowed moves (read only when enforceTransitions is true) */
66774
+ transitions: Array<PlanmagnetWorkflowTransition>;
66775
+ };
65904
66776
  export type PlanmagnetQualityGateFilter = {
65905
66777
  milestoneId?: InputMaybe<Scalars['String']['input']>;
65906
66778
  phase?: InputMaybe<Scalars['String']['input']>;
@@ -65936,8 +66808,15 @@ export type PlanmagnetQuotaOverview = {
65936
66808
  /** Workspace identifier */
65937
66809
  workspaceId: Scalars['ID']['output'];
65938
66810
  };
66811
+ export type PlanmagnetReleaseBlocker = {
66812
+ __typename?: 'PlanmagnetReleaseBlocker';
66813
+ /** Unfinished (or, for START_* dependencies, unstarted) predecessors holding it back. They may belong to another release or project. */
66814
+ waitingOn: Array<WorkItem>;
66815
+ workItem: WorkItem;
66816
+ };
65939
66817
  export type PlanmagnetReleaseFilter = {
65940
66818
  ownerId?: InputMaybe<Scalars['String']['input']>;
66819
+ productId?: InputMaybe<Scalars['String']['input']>;
65941
66820
  projectId?: InputMaybe<Scalars['String']['input']>;
65942
66821
  search?: InputMaybe<Scalars['String']['input']>;
65943
66822
  status?: InputMaybe<ReleaseStatus>;
@@ -65956,6 +66835,23 @@ export type PlanmagnetReleaseNotesCounts = {
65956
66835
  other: Scalars['Int']['output'];
65957
66836
  total: Scalars['Int']['output'];
65958
66837
  };
66838
+ export type PlanmagnetReleaseReadiness = {
66839
+ __typename?: 'PlanmagnetReleaseReadiness';
66840
+ blockers: Array<PlanmagnetReleaseBlocker>;
66841
+ doneItems: Scalars['Int']['output'];
66842
+ /** Ids of the open (not DONE or CANCELLED) items in scope. */
66843
+ openWorkItemIds: Array<Scalars['ID']['output']>;
66844
+ releaseId: Scalars['ID']['output'];
66845
+ scope: PlanmagnetReleaseScope;
66846
+ /** Items in scope. For PROJECTS scope only open items are in scope, so this equals the open count. */
66847
+ totalItems: Scalars['Int']['output'];
66848
+ };
66849
+ /** How a release's scope was chosen. - WORK_ITEMS: the release's own work items - PROJECTS: it has none of its own, so every open item in its projects - NONE: it has neither work items nor projects */
66850
+ export declare enum PlanmagnetReleaseScope {
66851
+ None = "NONE",
66852
+ Projects = "PROJECTS",
66853
+ WorkItems = "WORK_ITEMS"
66854
+ }
65959
66855
  export type PlanmagnetReorderColumnsInput = {
65960
66856
  columnIds: Array<Scalars['ID']['input']>;
65961
66857
  };
@@ -65994,8 +66890,12 @@ export type PlanmagnetRiskMatrix = {
65994
66890
  totalRisks: Scalars['Int']['output'];
65995
66891
  };
65996
66892
  export type PlanmagnetRoadmapFilter = {
66893
+ /** false: only roadmaps with no planning focus set; true: only roadmaps that have one */
66894
+ hasPlanningFocus?: InputMaybe<Scalars['Boolean']['input']>;
65997
66895
  isPublic?: InputMaybe<Scalars['Boolean']['input']>;
65998
66896
  ownerId?: InputMaybe<Scalars['String']['input']>;
66897
+ planningFocus?: InputMaybe<RoadmapPlanningFocus>;
66898
+ productId?: InputMaybe<Scalars['String']['input']>;
65999
66899
  search?: InputMaybe<Scalars['String']['input']>;
66000
66900
  type?: InputMaybe<RoadmapType>;
66001
66901
  };
@@ -66078,6 +66978,8 @@ export type PlanmagnetSprintFilter = {
66078
66978
  projectId?: InputMaybe<Scalars['String']['input']>;
66079
66979
  search?: InputMaybe<Scalars['String']['input']>;
66080
66980
  status?: InputMaybe<SprintStatus>;
66981
+ /** Team-scoped sprints of this team (BOFF-8044). */
66982
+ teamId?: InputMaybe<Scalars['String']['input']>;
66081
66983
  };
66082
66984
  export type PlanmagnetSprintList = {
66083
66985
  __typename?: 'PlanmagnetSprintList';
@@ -66085,9 +66987,34 @@ export type PlanmagnetSprintList = {
66085
66987
  pageInfo: PlanmagnetPageInfo;
66086
66988
  totalCount: Scalars['Int']['output'];
66087
66989
  };
66990
+ /** One change to a sprint's planned start or end date (BOFF-7918). */
66991
+ export type PlanmagnetSprintPlanChange = {
66992
+ __typename?: 'PlanmagnetSprintPlanChange';
66993
+ changedAt: Scalars['DateTime']['output'];
66994
+ changedBy: Scalars['String']['output'];
66995
+ /** "startDate" or "endDate" */
66996
+ field: Scalars['String']['output'];
66997
+ fromValue?: Maybe<Scalars['DateTime']['output']>;
66998
+ id: Scalars['ID']['output'];
66999
+ /** The sprint's status when the plan changed: PLANNING is planning; ACTIVE is a replan of a commitment. */
67000
+ sprintStatus: SprintStatus;
67001
+ toValue?: Maybe<Scalars['DateTime']['output']>;
67002
+ };
67003
+ export declare enum PlanmagnetSprintScope {
67004
+ Project = "PROJECT",
67005
+ Team = "TEAM"
67006
+ }
66088
67007
  export type PlanmagnetSprintWorkItemsInput = {
66089
67008
  workItemIds: Array<Scalars['ID']['input']>;
66090
67009
  };
67010
+ /** Reporting group of a status. DONE and CANCELLED never change category. */
67011
+ export declare enum PlanmagnetStatusCategory {
67012
+ Backlog = "BACKLOG",
67013
+ Cancelled = "CANCELLED",
67014
+ Done = "DONE",
67015
+ Started = "STARTED",
67016
+ Unstarted = "UNSTARTED"
67017
+ }
66091
67018
  export type PlanmagnetSuggestWorkItemBreakdownInput = {
66092
67019
  /** Plain-text feature request or description to break down. */
66093
67020
  description: Scalars['String']['input'];
@@ -66141,6 +67068,69 @@ export declare enum PlanmagnetSyncStatus {
66141
67068
  Success = "SUCCESS",
66142
67069
  Syncing = "SYNCING"
66143
67070
  }
67071
+ export type PlanmagnetTeamFilter = {
67072
+ search?: InputMaybe<Scalars['String']['input']>;
67073
+ };
67074
+ export type PlanmagnetTeamList = {
67075
+ __typename?: 'PlanmagnetTeamList';
67076
+ items: Array<Team>;
67077
+ pageInfo: PlanmagnetPageInfo;
67078
+ totalCount: Scalars['Int']['output'];
67079
+ };
67080
+ export type PlanmagnetTeamMembersInput = {
67081
+ actorIds: Array<Scalars['ID']['input']>;
67082
+ };
67083
+ export type PlanmagnetTeamProjectsInput = {
67084
+ projectIds: Array<Scalars['ID']['input']>;
67085
+ };
67086
+ /** Velocity across the trailing N completed sprints of a team (BOFF-8044). */
67087
+ export type PlanmagnetTeamVelocity = {
67088
+ __typename?: 'PlanmagnetTeamVelocity';
67089
+ averageVelocity: Scalars['Float']['output'];
67090
+ forecastNextSprintPoints: Scalars['Float']['output'];
67091
+ sprints: Array<PlanmagnetTeamVelocitySprintPoint>;
67092
+ teamId: Scalars['ID']['output'];
67093
+ };
67094
+ /** One project's share of a team sprint's completed points (BOFF-8044) — shares always sum to that sprint's team total by construction (see analytics.service.ts / utils/sprint-velocity.ts). */
67095
+ export type PlanmagnetTeamVelocityProjectShare = {
67096
+ __typename?: 'PlanmagnetTeamVelocityProjectShare';
67097
+ count: Scalars['Int']['output'];
67098
+ points: Scalars['Int']['output'];
67099
+ projectId: Scalars['ID']['output'];
67100
+ projectName: Scalars['String']['output'];
67101
+ };
67102
+ /** One completed team sprint's velocity reading, with its per-project split (BOFF-8044). The split is the snapshot captured at completion (sprint_project_velocities) — a later work-item reassignment across the team's projects cannot rewrite it. */
67103
+ export type PlanmagnetTeamVelocitySprintPoint = {
67104
+ __typename?: 'PlanmagnetTeamVelocitySprintPoint';
67105
+ byProject: Array<PlanmagnetTeamVelocityProjectShare>;
67106
+ completedCount: Scalars['Int']['output'];
67107
+ completedPoints: Scalars['Int']['output'];
67108
+ plannedPoints?: Maybe<Scalars['Int']['output']>;
67109
+ sequenceNumber: Scalars['Int']['output'];
67110
+ sprintId: Scalars['ID']['output'];
67111
+ sprintName: Scalars['String']['output'];
67112
+ };
67113
+ /** Throughput (items/points completed per period) for a project over a date range — the sibling metric to planmagnetCycleTime, same data source (WorkItemStatusTransition into DONE). Every bucket in range is emitted, including empty ones (0/0), so a chart never silently skips a dead period. */
67114
+ export type PlanmagnetThroughput = {
67115
+ __typename?: 'PlanmagnetThroughput';
67116
+ bucket: PlanmagnetThroughputBucket;
67117
+ endDate: Scalars['DateTime']['output'];
67118
+ points: Array<PlanmagnetThroughputPoint>;
67119
+ projectId: Scalars['ID']['output'];
67120
+ startDate: Scalars['DateTime']['output'];
67121
+ };
67122
+ export declare enum PlanmagnetThroughputBucket {
67123
+ Day = "DAY",
67124
+ Week = "WEEK"
67125
+ }
67126
+ /** One bucket's completed work: item count and story points that reached DONE within it. */
67127
+ export type PlanmagnetThroughputPoint = {
67128
+ __typename?: 'PlanmagnetThroughputPoint';
67129
+ completedCount: Scalars['Int']['output'];
67130
+ completedPoints: Scalars['Int']['output'];
67131
+ /** Bucket start (UTC midnight; for WEEK, the Monday that starts the bucket). */
67132
+ periodStart: Scalars['DateTime']['output'];
67133
+ };
66144
67134
  /** An individual time record capturing work performed on a specific work item during a time period. */
66145
67135
  export type PlanmagnetTimeEntry = {
66146
67136
  __typename?: 'PlanmagnetTimeEntry';
@@ -66158,8 +67148,6 @@ export type PlanmagnetTimeEntry = {
66158
67148
  description?: Maybe<Scalars['String']['output']>;
66159
67149
  /** Duration in minutes */
66160
67150
  durationMinutes: Scalars['Int']['output'];
66161
- /** End time (optional, for clock-in/clock-out) */
66162
- endTime?: Maybe<Scalars['DateTime']['output']>;
66163
67151
  /** Unique identifier */
66164
67152
  id: Scalars['ID']['output'];
66165
67153
  /** Arbitrary metadata */
@@ -66168,8 +67156,6 @@ export type PlanmagnetTimeEntry = {
66168
67156
  onBehalfOf?: Maybe<Scalars['String']['output']>;
66169
67157
  /** Project ID */
66170
67158
  projectId: Scalars['String']['output'];
66171
- /** Start time (optional, for clock-in/clock-out) */
66172
- startTime?: Maybe<Scalars['DateTime']['output']>;
66173
67159
  /** Current status */
66174
67160
  status: TimeEntryStatus;
66175
67161
  /** Timesheet this entry belongs to */
@@ -66187,7 +67173,9 @@ export type PlanmagnetTimeEntry = {
66187
67173
  };
66188
67174
  export type PlanmagnetTimeEntryFilter = {
66189
67175
  billingType?: InputMaybe<BillingType>;
67176
+ /** Entries dated on or after this UTC day */
66190
67177
  dateFrom?: InputMaybe<Scalars['DateTime']['input']>;
67178
+ /** Entries dated on or before this UTC day (the whole day is included) */
66191
67179
  dateTo?: InputMaybe<Scalars['DateTime']['input']>;
66192
67180
  projectId?: InputMaybe<Scalars['String']['input']>;
66193
67181
  status?: InputMaybe<TimeEntryStatus>;
@@ -66238,7 +67226,9 @@ export type PlanmagnetTimesheet = {
66238
67226
  workspaceId: Scalars['String']['output'];
66239
67227
  };
66240
67228
  export type PlanmagnetTimesheetFilter = {
67229
+ /** With periodStart: timesheets whose period OVERLAPS the window (inclusive by UTC day). Alone: periods starting on or before this day */
66241
67230
  periodEnd?: InputMaybe<Scalars['DateTime']['input']>;
67231
+ /** With periodEnd: timesheets whose period OVERLAPS the window (inclusive by UTC day). Alone: periods ending on or after this day */
66242
67232
  periodStart?: InputMaybe<Scalars['DateTime']['input']>;
66243
67233
  status?: InputMaybe<TimeEntryStatus>;
66244
67234
  userId?: InputMaybe<Scalars['String']['input']>;
@@ -66303,6 +67293,7 @@ export type PlanmagnetUpdateCustomFieldDefinitionInput = {
66303
67293
  };
66304
67294
  export type PlanmagnetUpdateDependencyInput = {
66305
67295
  description?: InputMaybe<Scalars['String']['input']>;
67296
+ lagMinutes?: InputMaybe<Scalars['Int']['input']>;
66306
67297
  metadata?: InputMaybe<Scalars['JSON']['input']>;
66307
67298
  status?: InputMaybe<DependencyStatus>;
66308
67299
  type?: InputMaybe<DependencyType>;
@@ -66311,6 +67302,8 @@ export type PlanmagnetUpdateDocInput = {
66311
67302
  /** Optional note recorded on the new revision this update creates. */
66312
67303
  changeNote?: InputMaybe<Scalars['String']['input']>;
66313
67304
  content?: InputMaybe<Scalars['String']['input']>;
67305
+ /** The version this edit started from. When set, the save is refused (CONFLICT) if the doc has moved on since — someone else saved in between — instead of silently overwriting their change. */
67306
+ expectedVersion?: InputMaybe<Scalars['Int']['input']>;
66314
67307
  status?: InputMaybe<DocStatus>;
66315
67308
  title?: InputMaybe<Scalars['String']['input']>;
66316
67309
  };
@@ -66337,6 +67330,7 @@ export type PlanmagnetUpdateFeatureRequestInput = {
66337
67330
  description?: InputMaybe<Scalars['String']['input']>;
66338
67331
  effortEstimate?: InputMaybe<Scalars['String']['input']>;
66339
67332
  metadata?: InputMaybe<Scalars['JSON']['input']>;
67333
+ productId?: InputMaybe<Scalars['String']['input']>;
66340
67334
  projectId?: InputMaybe<Scalars['String']['input']>;
66341
67335
  status?: InputMaybe<FeatureRequestStatus>;
66342
67336
  tags?: InputMaybe<Array<Scalars['String']['input']>>;
@@ -66389,6 +67383,15 @@ export type PlanmagnetUpdatePortfolioInput = {
66389
67383
  status?: InputMaybe<PortfolioStatus>;
66390
67384
  tags?: InputMaybe<Array<Scalars['String']['input']>>;
66391
67385
  };
67386
+ export type PlanmagnetUpdateProductInput = {
67387
+ description?: InputMaybe<Scalars['String']['input']>;
67388
+ lifecycleStage?: InputMaybe<PlanmagnetProductLifecycleStage>;
67389
+ metadata?: InputMaybe<Scalars['JSON']['input']>;
67390
+ name?: InputMaybe<Scalars['String']['input']>;
67391
+ northStar?: InputMaybe<PlanmagnetProductNorthStarInput>;
67392
+ ownerId?: InputMaybe<Scalars['String']['input']>;
67393
+ vision?: InputMaybe<Scalars['String']['input']>;
67394
+ };
66392
67395
  export type PlanmagnetUpdateProgramInput = {
66393
67396
  budgetTotal?: InputMaybe<Scalars['Float']['input']>;
66394
67397
  currency?: InputMaybe<Scalars['String']['input']>;
@@ -66410,6 +67413,8 @@ export type PlanmagnetUpdateProjectInput = {
66410
67413
  methodology?: InputMaybe<ProjectMethodology>;
66411
67414
  name?: InputMaybe<Scalars['String']['input']>;
66412
67415
  ownerId?: InputMaybe<Scalars['String']['input']>;
67416
+ /** Parent portfolio ID. Must exist in the same workspace and not be soft-deleted (BOFF-8047); pass `null` to clear it. Only fields the caller actually sends are written — omit this to leave the current value alone. */
67417
+ portfolioId?: InputMaybe<Scalars['String']['input']>;
66413
67418
  programId?: InputMaybe<Scalars['String']['input']>;
66414
67419
  startDate?: InputMaybe<Scalars['DateTime']['input']>;
66415
67420
  status?: InputMaybe<PlanmagnetProjectStatus>;
@@ -66430,6 +67435,13 @@ export type PlanmagnetUpdateProjectTemplateInput = {
66430
67435
  sprintConfig?: InputMaybe<Scalars['JSON']['input']>;
66431
67436
  tags?: InputMaybe<Array<Scalars['String']['input']>>;
66432
67437
  };
67438
+ /** Omitted fields keep their current value; a list that is sent replaces the whole list */
67439
+ export type PlanmagnetUpdateProjectWorkflowInput = {
67440
+ enforceTransitions?: InputMaybe<Scalars['Boolean']['input']>;
67441
+ /** Statuses not listed return to their defaults */
67442
+ statuses?: InputMaybe<Array<PlanmagnetWorkflowStatusInput>>;
67443
+ transitions?: InputMaybe<Array<PlanmagnetWorkflowTransitionInput>>;
67444
+ };
66433
67445
  export type PlanmagnetUpdateQualityGateInput = {
66434
67446
  criteria?: InputMaybe<Scalars['JSON']['input']>;
66435
67447
  description?: InputMaybe<Scalars['String']['input']>;
@@ -66437,6 +67449,8 @@ export type PlanmagnetUpdateQualityGateInput = {
66437
67449
  milestoneId?: InputMaybe<Scalars['String']['input']>;
66438
67450
  name?: InputMaybe<Scalars['String']['input']>;
66439
67451
  phase?: InputMaybe<Scalars['String']['input']>;
67452
+ /** The release this gate holds (a release of the same project, or one with no projects) */
67453
+ releaseId?: InputMaybe<Scalars['String']['input']>;
66440
67454
  sortOrder?: InputMaybe<Scalars['Int']['input']>;
66441
67455
  status?: InputMaybe<QualityGateStatus>;
66442
67456
  };
@@ -66446,6 +67460,7 @@ export type PlanmagnetUpdateReleaseInput = {
66446
67460
  name?: InputMaybe<Scalars['String']['input']>;
66447
67461
  ownerId?: InputMaybe<Scalars['String']['input']>;
66448
67462
  plannedDate?: InputMaybe<Scalars['DateTime']['input']>;
67463
+ productId?: InputMaybe<Scalars['String']['input']>;
66449
67464
  releaseNotes?: InputMaybe<Scalars['String']['input']>;
66450
67465
  releasedAt?: InputMaybe<Scalars['DateTime']['input']>;
66451
67466
  status?: InputMaybe<ReleaseStatus>;
@@ -66474,6 +67489,8 @@ export type PlanmagnetUpdateRoadmapInput = {
66474
67489
  metadata?: InputMaybe<Scalars['JSON']['input']>;
66475
67490
  name?: InputMaybe<Scalars['String']['input']>;
66476
67491
  ownerId?: InputMaybe<Scalars['String']['input']>;
67492
+ planningFocus?: InputMaybe<RoadmapPlanningFocus>;
67493
+ productId?: InputMaybe<Scalars['String']['input']>;
66477
67494
  type?: InputMaybe<RoadmapType>;
66478
67495
  };
66479
67496
  export type PlanmagnetUpdateRoadmapItemInput = {
@@ -66501,15 +67518,19 @@ export type PlanmagnetUpdateSprintInput = {
66501
67518
  startDate?: InputMaybe<Scalars['DateTime']['input']>;
66502
67519
  velocity?: InputMaybe<Scalars['Int']['input']>;
66503
67520
  };
67521
+ export type PlanmagnetUpdateTeamInput = {
67522
+ capacity?: InputMaybe<Scalars['Int']['input']>;
67523
+ description?: InputMaybe<Scalars['String']['input']>;
67524
+ leadId?: InputMaybe<Scalars['String']['input']>;
67525
+ name?: InputMaybe<Scalars['String']['input']>;
67526
+ };
66504
67527
  export type PlanmagnetUpdateTimeEntryInput = {
66505
67528
  billingRate?: InputMaybe<Scalars['Float']['input']>;
66506
67529
  billingType?: InputMaybe<BillingType>;
66507
67530
  date?: InputMaybe<Scalars['DateTime']['input']>;
66508
67531
  description?: InputMaybe<Scalars['String']['input']>;
66509
67532
  durationMinutes?: InputMaybe<Scalars['Int']['input']>;
66510
- endTime?: InputMaybe<Scalars['DateTime']['input']>;
66511
67533
  metadata?: InputMaybe<Scalars['JSON']['input']>;
66512
- startTime?: InputMaybe<Scalars['DateTime']['input']>;
66513
67534
  status?: InputMaybe<TimeEntryStatus>;
66514
67535
  workItemId?: InputMaybe<Scalars['String']['input']>;
66515
67536
  };
@@ -66557,14 +67578,49 @@ export type PlanmagnetVelocitySprintPoint = {
66557
67578
  completedPoints: Scalars['Int']['output'];
66558
67579
  /** Planned/committed points for the sprint, if set. */
66559
67580
  plannedPoints?: Maybe<Scalars['Int']['output']>;
67581
+ /** PROJECT when this point is the project's own sprint; TEAM when it is this project's share of a completed team sprint (BOFF-8044). The two are never summed together anywhere. */
67582
+ scope: PlanmagnetSprintScope;
66560
67583
  sequenceNumber: Scalars['Int']['output'];
66561
67584
  sprintId: Scalars['ID']['output'];
66562
67585
  sprintName: Scalars['String']['output'];
67586
+ /** Set only when scope is TEAM. */
67587
+ teamId?: Maybe<Scalars['ID']['output']>;
67588
+ /** Set only when scope is TEAM. */
67589
+ teamName?: Maybe<Scalars['String']['output']>;
66563
67590
  };
66564
67591
  export type PlanmagnetVoteOnFeatureInput = {
66565
67592
  comment?: InputMaybe<Scalars['String']['input']>;
67593
+ /** Whole number from 1 to 100 (default 1) */
66566
67594
  weight?: InputMaybe<Scalars['Int']['input']>;
66567
67595
  };
67596
+ export type PlanmagnetWorkItemActivity = {
67597
+ __typename?: 'PlanmagnetWorkItemActivity';
67598
+ /** Newest first */
67599
+ items: Array<PlanmagnetWorkItemActivityEvent>;
67600
+ /** Every recorded event */
67601
+ totalCount: Scalars['Int']['output'];
67602
+ /** True when more events exist than were returned */
67603
+ truncated: Scalars['Boolean']['output'];
67604
+ };
67605
+ /** One recorded event in a work item's history. Only what is actually recorded appears: creation, status changes and comments. Assignee and field edits are not recorded yet. */
67606
+ export type PlanmagnetWorkItemActivityEvent = {
67607
+ __typename?: 'PlanmagnetWorkItemActivityEvent';
67608
+ /** Actor who did it */
67609
+ actorId?: Maybe<Scalars['String']['output']>;
67610
+ at: Scalars['DateTime']['output'];
67611
+ /** The comment (COMMENTED) */
67612
+ commentId?: Maybe<Scalars['String']['output']>;
67613
+ /** The start of the comment (COMMENTED) */
67614
+ excerpt?: Maybe<Scalars['String']['output']>;
67615
+ /** Status before (STATUS_CHANGED) */
67616
+ fromStatus?: Maybe<Scalars['String']['output']>;
67617
+ /** Stable id, prefixed by source (transition:, comment:, created:) */
67618
+ id: Scalars['ID']['output'];
67619
+ /** CREATED, STATUS_CHANGED or COMMENTED */
67620
+ kind: Scalars['String']['output'];
67621
+ /** Status after (CREATED from the transition log, STATUS_CHANGED) */
67622
+ toStatus?: Maybe<Scalars['String']['output']>;
67623
+ };
66568
67624
  export type PlanmagnetWorkItemBreakdownResult = {
66569
67625
  __typename?: 'PlanmagnetWorkItemBreakdownResult';
66570
67626
  /** Id of the PlanmagnetAgentRun ledger row this call was recorded as. */
@@ -66572,6 +67628,39 @@ export type PlanmagnetWorkItemBreakdownResult = {
66572
67628
  provider: Scalars['String']['output'];
66573
67629
  suggestions: Array<PlanmagnetWorkItemSuggestion>;
66574
67630
  };
67631
+ /** A comment on a work item. Visible to everyone who can read the work item; only its author can edit or delete it. */
67632
+ export type PlanmagnetWorkItemComment = {
67633
+ __typename?: 'PlanmagnetWorkItemComment';
67634
+ /** Actor who posted the comment */
67635
+ authorId: Scalars['String']['output'];
67636
+ body: Scalars['String']['output'];
67637
+ createdAt: Scalars['DateTime']['output'];
67638
+ /** Set when the author changed the body after posting */
67639
+ editedAt?: Maybe<Scalars['DateTime']['output']>;
67640
+ id: Scalars['ID']['output'];
67641
+ updatedAt: Scalars['DateTime']['output'];
67642
+ workItemId: Scalars['String']['output'];
67643
+ };
67644
+ export type PlanmagnetWorkItemCommentList = {
67645
+ __typename?: 'PlanmagnetWorkItemCommentList';
67646
+ items: Array<PlanmagnetWorkItemComment>;
67647
+ pageInfo: PlanmagnetPageInfo;
67648
+ totalCount: Scalars['Int']['output'];
67649
+ };
67650
+ /** Server-side counts of the work items matching a filter. The list query returns at most 100 rows per page, so a count taken from a page undercounts any workspace with more than 100 items. */
67651
+ export type PlanmagnetWorkItemCounts = {
67652
+ __typename?: 'PlanmagnetWorkItemCounts';
67653
+ /** Open matching work items held back by an active dependency whose predecessor is not done (the release readiness definition of blocked) */
67654
+ blocked: Scalars['Int']['output'];
67655
+ /** Matching work items per project and status */
67656
+ byProject: Array<PlanmagnetWorkItemProjectStatusCount>;
67657
+ /** Matching work items per status (statuses with no items are omitted) */
67658
+ byStatus: Array<PlanmagnetWorkItemStatusCount>;
67659
+ /** Sum of story points over every matching work item */
67660
+ points: Scalars['Int']['output'];
67661
+ /** Every matching work item */
67662
+ total: Scalars['Int']['output'];
67663
+ };
66575
67664
  export type PlanmagnetWorkItemDependencyList = {
66576
67665
  __typename?: 'PlanmagnetWorkItemDependencyList';
66577
67666
  items: Array<WorkItemDependency>;
@@ -66580,6 +67669,8 @@ export type PlanmagnetWorkItemDependencyList = {
66580
67669
  };
66581
67670
  export type PlanmagnetWorkItemFilter = {
66582
67671
  assigneeId?: InputMaybe<Scalars['String']['input']>;
67672
+ /** Leave these work items out (e.g. the ones already in a sprint or release), so a picker never pages first and excludes afterwards */
67673
+ excludeIds?: InputMaybe<Array<Scalars['String']['input']>>;
66583
67674
  parentId?: InputMaybe<Scalars['String']['input']>;
66584
67675
  priority?: InputMaybe<WorkItemPriority>;
66585
67676
  projectId?: InputMaybe<Scalars['String']['input']>;
@@ -66608,6 +67699,22 @@ export type PlanmagnetWorkItemList = {
66608
67699
  pageInfo: PlanmagnetPageInfo;
66609
67700
  totalCount: Scalars['Int']['output'];
66610
67701
  };
67702
+ export type PlanmagnetWorkItemProjectStatusCount = {
67703
+ __typename?: 'PlanmagnetWorkItemProjectStatusCount';
67704
+ count: Scalars['Int']['output'];
67705
+ /** Sum of story points of these work items (items without an estimate count as 0) */
67706
+ points: Scalars['Int']['output'];
67707
+ projectId: Scalars['String']['output'];
67708
+ status: Scalars['String']['output'];
67709
+ };
67710
+ export type PlanmagnetWorkItemStatusCount = {
67711
+ __typename?: 'PlanmagnetWorkItemStatusCount';
67712
+ count: Scalars['Int']['output'];
67713
+ /** Sum of story points of these work items (items without an estimate count as 0) */
67714
+ points: Scalars['Int']['output'];
67715
+ /** A WorkItemStatus value. A String, not the enum, so a stored status the API does not expose yet (BLOCKED) cannot fail the whole query */
67716
+ status: Scalars['String']['output'];
67717
+ };
66611
67718
  export type PlanmagnetWorkItemSuggestion = {
66612
67719
  __typename?: 'PlanmagnetWorkItemSuggestion';
66613
67720
  description?: Maybe<Scalars['String']['output']>;
@@ -66616,6 +67723,33 @@ export type PlanmagnetWorkItemSuggestion = {
66616
67723
  title: Scalars['String']['output'];
66617
67724
  type: WorkItemType;
66618
67725
  };
67726
+ /** How one canonical status appears and behaves in a project */
67727
+ export type PlanmagnetWorkflowStatus = {
67728
+ __typename?: 'PlanmagnetWorkflowStatus';
67729
+ category: PlanmagnetStatusCategory;
67730
+ /** Hidden statuses cannot be chosen for new moves; items already in one stay readable */
67731
+ hidden: Scalars['Boolean']['output'];
67732
+ /** The project's name for it */
67733
+ label: Scalars['String']['output'];
67734
+ status: WorkItemStatus;
67735
+ };
67736
+ export type PlanmagnetWorkflowStatusInput = {
67737
+ /** Defaults to the status's standard category */
67738
+ category?: InputMaybe<PlanmagnetStatusCategory>;
67739
+ hidden?: InputMaybe<Scalars['Boolean']['input']>;
67740
+ label: Scalars['String']['input'];
67741
+ status: WorkItemStatus;
67742
+ };
67743
+ /** An allowed status change */
67744
+ export type PlanmagnetWorkflowTransition = {
67745
+ __typename?: 'PlanmagnetWorkflowTransition';
67746
+ from: WorkItemStatus;
67747
+ to: WorkItemStatus;
67748
+ };
67749
+ export type PlanmagnetWorkflowTransitionInput = {
67750
+ from: WorkItemStatus;
67751
+ to: WorkItemStatus;
67752
+ };
66619
67753
  /** A user who currently holds billable "editor" access to a PlanMagnet workspace -- counted against the Free-tier `planmagnet.editors.count` quota (10 editors). Viewers/commenters are not tracked here and are free. */
66620
67754
  export type PlanmagnetWorkspaceEditor = {
66621
67755
  __typename?: 'PlanmagnetWorkspaceEditor';
@@ -67182,7 +68316,28 @@ export type ProduceWithdrawalStatus = {
67182
68316
  };
67183
68317
  export type Product = {
67184
68318
  __typename?: 'Product';
68319
+ /** Domain lifecycle marker, distinct from deletedAt. Null = active. */
68320
+ archivedAt?: Maybe<Scalars['DateTime']['output']>;
68321
+ context?: Maybe<Scalars['JSON']['output']>;
68322
+ createdAt: Scalars['DateTime']['output'];
68323
+ createdBy: Scalars['String']['output'];
68324
+ deletedAt?: Maybe<Scalars['DateTime']['output']>;
68325
+ description?: Maybe<Scalars['String']['output']>;
68326
+ featureRequests: Array<FeatureRequest>;
67185
68327
  id: Scalars['ID']['output'];
68328
+ lifecycleStage: PlanmagnetProductLifecycleStage;
68329
+ metadata?: Maybe<Scalars['JSON']['output']>;
68330
+ name: Scalars['String']['output'];
68331
+ northStar?: Maybe<PlanmagnetProductNorthStar>;
68332
+ objectives: Array<PlanmagnetObjective>;
68333
+ onBehalfOf?: Maybe<Scalars['String']['output']>;
68334
+ ownerId: Scalars['String']['output'];
68335
+ releases: Array<Release>;
68336
+ roadmaps: Array<Roadmap>;
68337
+ updatedAt: Scalars['DateTime']['output'];
68338
+ updatedBy?: Maybe<Scalars['String']['output']>;
68339
+ vision: Scalars['String']['output'];
68340
+ workspaceId: Scalars['String']['output'];
67186
68341
  };
67187
68342
  export type ProductCount = {
67188
68343
  __typename?: 'ProductCount';
@@ -68148,6 +69303,21 @@ export type ProviderList = {
68148
69303
  items: Array<IntegrationProvider>;
68149
69304
  total: Scalars['Int']['output'];
68150
69305
  };
69306
+ /** An assistant sandbox for the caller, built by the service. */
69307
+ export type ProvisionAssistantSandboxInput = {
69308
+ context: ContextInput;
69309
+ /** At most AI_ASSISTANT_PRODUCT, HOSTNAME and WORKSPACE_ID, each with the value the request implies. Never a token. */
69310
+ env?: InputMaybe<Array<EnvVarInput>>;
69311
+ /** An org-published ai-assistant runtime image. */
69312
+ image: Scalars['String']['input'];
69313
+ mode: SandboxAssistantMode;
69314
+ /** The product whose docs and persona the assistant uses (e.g. vibecontrols). */
69315
+ product: Scalars['String']['input'];
69316
+ /** Requested lifetime; bounded by the plan and the workspace maximum. */
69317
+ ttlSeconds?: InputMaybe<Scalars['Int']['input']>;
69318
+ /** Take action only; Ask ignores it. */
69319
+ writeApproval?: InputMaybe<SandboxAssistantWriteApproval>;
69320
+ };
68151
69321
  export type ProxySandboxRequestInput = {
68152
69322
  /** Request body as JSON (for POST/PUT/PATCH) */
68153
69323
  body?: InputMaybe<Scalars['JSON']['input']>;
@@ -69352,6 +70522,8 @@ export type QualityGate = {
69352
70522
  project?: Maybe<PlanmagnetProject>;
69353
70523
  /** Parent project ID */
69354
70524
  projectId: Scalars['String']['output'];
70525
+ /** The release this gate holds. The release cannot become RELEASED until this gate is PASSED or WAIVED */
70526
+ releaseId?: Maybe<Scalars['String']['output']>;
69355
70527
  /** Review results and notes */
69356
70528
  reviewNotes?: Maybe<Scalars['String']['output']>;
69357
70529
  /** Review timestamp */
@@ -69537,10 +70709,18 @@ export type Query = {
69537
70709
  assetRegister: Array<Asset>;
69538
70710
  assets: Array<Asset>;
69539
70711
  assignmentSuggestions: MtwAssignmentSuggestions;
69540
- /** The transcript of one of my assistant chats, oldest first. */
70712
+ /**
70713
+ * The transcript of one of my assistant chats, oldest first.
70714
+ * @deprecated Use the my* assistant-history fields (BOFF-7335).
70715
+ */
69541
70716
  assistantConversationMessages: Array<AssistantHistoryMessage>;
69542
- /** My assistant chats for one product, newest first. */
70717
+ /**
70718
+ * My assistant chats for one product, newest first.
70719
+ * @deprecated Use the my* assistant-history fields (BOFF-7335).
70720
+ */
69543
70721
  assistantConversations: Array<AssistantConversation>;
70722
+ /** Run one GraphQL query as the owner of the session the capability names. Queries only. */
70723
+ assistantSessionQuery: AssistantSessionRelayResult;
69544
70724
  /** A single AI decision execution log entry by id, scoped to the caller's workspace. */
69545
70725
  athAgentRun?: Maybe<AthAgentRun>;
69546
70726
  /** Paginated, workspace-scoped AI decision execution log, most recent first. */
@@ -70963,7 +72143,7 @@ export type Query = {
70963
72143
  /** Get aggregated ad performance metrics for the workspace */
70964
72144
  headshotmarketingAdMetrics: HeadshotmarketingAdMetrics;
70965
72145
  headshotmarketingAdPlatformConnections: HeadshotmarketingAdPlatformConnectionList;
70966
- /** Compute a deterministic first-touch + linear attribution report for a WON deal or a CONVERTED lead. Exactly one of dealId/leadId must be supplied. */
72146
+ /** Compute a deterministic attribution report (first-touch, linear, time-decay and position-based) for a WON deal or a CONVERTED lead. Exactly one of dealId/leadId must be supplied. `timeDecayHalfLifeDays` overrides the time-decay half-life (default 7 days; ignored when not positive). */
70967
72147
  headshotmarketingAttributionReport: HeadshotmarketingAttributionReport;
70968
72148
  /** Get a specific audience by ID */
70969
72149
  headshotmarketingAudience?: Maybe<HeadshotmarketingAudience>;
@@ -71061,6 +72241,8 @@ export type Query = {
71061
72241
  headshotmarketingPipelineOverview?: Maybe<HeadshotmarketingPipelineOverview>;
71062
72242
  /** List pipelines with optional filters */
71063
72243
  headshotmarketingPipelines: HeadshotmarketingPipelineList;
72244
+ /** PUBLIC, unauthenticated fetch of a PUBLISHED landing page by slug, for the public renderer at `/lp/{slug}`. Resolves WITHOUT a workspace context: it matches across all workspaces and returns only published, not-deleted pages (and their visible sections). Slugs are not globally unique, so when more than one published page shares a slug the most recently published one is returned. Exposes only public renderer fields — no workspace-internal data. */
72245
+ headshotmarketingPublicLandingPage?: Maybe<HeadshotmarketingPublicLandingPage>;
71064
72246
  /** Get an SEO audit by ID */
71065
72247
  headshotmarketingSEOAudit?: Maybe<HeadshotmarketingSeoAudit>;
71066
72248
  /** List SEO audits with optional filters and pagination */
@@ -71570,6 +72752,12 @@ export type Query = {
71570
72752
  metrics: Array<Metric>;
71571
72753
  myAgentMessageBookmarks: AgentMessageBookmarkList;
71572
72754
  myApprovalRequests: Array<TimeApprovalRequest>;
72755
+ /** One of my conversations. Exactly one of clientConversationId / conversationId. Default: the newest 50. */
72756
+ myAssistantConversationEntries: AssistantHistoryEntryConnection;
72757
+ /** My live conversations, most recently changed first. */
72758
+ myAssistantConversations: AssistantHistoryConversationConnection;
72759
+ /** My conversations' changes in commit order, tombstones included. */
72760
+ myAssistantHistoryChanges: AssistantHistoryChangeConnection;
71573
72761
  myBalanceTargets: Array<TimeCampusBalanceTarget>;
71574
72762
  myContextSharingPolicy: TimeCampusContextSharingPolicy;
71575
72763
  myDeadTimeRadar: TimeCampusDeadTimeRadar;
@@ -71718,6 +72906,8 @@ export type Query = {
71718
72906
  planmagnetAutomationRules: PlanmagnetAutomationRuleList;
71719
72907
  /** Get a single board by ID */
71720
72908
  planmagnetBoard?: Maybe<Board>;
72909
+ /** One column's cards, a page at a time (a column shows its first 100; this pages past them). Same placement as BoardColumn.cards */
72910
+ planmagnetBoardColumnCards: PlanmagnetWorkItemList;
71721
72911
  /** List boards in a workspace */
71722
72912
  planmagnetBoards: PlanmagnetBoardList;
71723
72913
  /** Get a single budget by ID */
@@ -71767,6 +72957,10 @@ export type Query = {
71767
72957
  planmagnetMilestone?: Maybe<Milestone>;
71768
72958
  /** List milestones in a workspace */
71769
72959
  planmagnetMilestones: PlanmagnetMilestoneList;
72960
+ /** The CALLING actor's own AI calls in this workspace, newest first. Until 2026-09-24 the ledger was write-only: every AI call was recorded and nothing could read the record back. Two checks, deliberately both. The directive requires read on planmagnet-ai in this workspace, so someone removed from the workspace loses access to it. The resolver then filters on the caller's own actorId, which is what makes this a personal list — the rows are other people's prompts otherwise, and a workspace-wide view needs its own policy decision (see BOFF-7868: every member currently holds VIEWER on planmagnet-admin, so gating on that would show everyone's prompts to everyone). */
72961
+ planmagnetMyAgentRuns: PlanmagnetAgentRunList;
72962
+ /** The caller's own assigned work items across every project in the workspace, sorted overdue-first (see utils/my-work.ts for the exact order). Identity comes from x-actor-id — there is no actorId argument, by design: work items are a collaborative resource (BOFF-8043 workflow, projects with many members), so this is NOT an @rbac(scopeType: "self") field — it reuses the same read grant as planmagnetWorkItems and filters to the caller inside the resolver. */
72963
+ planmagnetMyWorkItems: PlanmagnetWorkItemList;
71770
72964
  planmagnetObjective?: Maybe<PlanmagnetObjective>;
71771
72965
  planmagnetObjectives: PlanmagnetObjectiveList;
71772
72966
  /** Get a single portfolio by ID */
@@ -71775,6 +72969,8 @@ export type Query = {
71775
72969
  planmagnetPortfolioOverview: PlanmagnetPortfolioOverview;
71776
72970
  /** List portfolios in a workspace */
71777
72971
  planmagnetPortfolios: PlanmagnetPortfolioList;
72972
+ planmagnetProduct?: Maybe<Product>;
72973
+ planmagnetProducts: PlanmagnetProductList;
71778
72974
  /** Get a single program by ID */
71779
72975
  planmagnetProgram?: Maybe<Program>;
71780
72976
  /** List programs in a workspace */
@@ -71785,6 +72981,8 @@ export type Query = {
71785
72981
  planmagnetProjectTemplate?: Maybe<ProjectTemplate>;
71786
72982
  /** List project templates in a workspace */
71787
72983
  planmagnetProjectTemplates: PlanmagnetProjectTemplateList;
72984
+ /** A project's workflow */
72985
+ planmagnetProjectWorkflow: PlanmagnetProjectWorkflow;
71788
72986
  /** List projects in a workspace */
71789
72987
  planmagnetProjects: PlanmagnetProjectList;
71790
72988
  /** Get a single quality gate by ID */
@@ -71793,6 +72991,8 @@ export type Query = {
71793
72991
  planmagnetQualityGates: PlanmagnetQualityGateList;
71794
72992
  /** Get a single release by ID */
71795
72993
  planmagnetRelease?: Maybe<Release>;
72994
+ /** What stands between a release and shipping: its scope, and every open item in it held by an unmet dependency, with what it waits on. Gated on dependency read: it exposes which item waits on which. */
72995
+ planmagnetReleaseReadiness: PlanmagnetReleaseReadiness;
71796
72996
  /** List releases in a workspace */
71797
72997
  planmagnetReleases: PlanmagnetReleaseList;
71798
72998
  /** Get a single risk by ID */
@@ -71817,6 +73017,14 @@ export type Query = {
71817
73017
  planmagnetSprintCapacity: PlanmagnetSprintCapacity;
71818
73018
  /** List sprints in a workspace */
71819
73019
  planmagnetSprints: PlanmagnetSprintList;
73020
+ /** Get a single team by ID. */
73021
+ planmagnetTeam?: Maybe<Team>;
73022
+ /** Velocity (whole-sprint completed points, plus the per-project split) across the trailing N COMPLETED sprints of a team (BOFF-8044). */
73023
+ planmagnetTeamVelocity: PlanmagnetTeamVelocity;
73024
+ /** List teams in a workspace. */
73025
+ planmagnetTeams: PlanmagnetTeamList;
73026
+ /** Work items that reached DONE per period (day or week), over a date range (defaults to the trailing 12 weeks). BOFF-8048 Reports: the throughput sibling of planmagnetCycleTime, reusing the exact toStatus='DONE' transition scan — see AnalyticsService.throughput(). */
73027
+ planmagnetThroughput: PlanmagnetThroughput;
71820
73028
  /** List time entries in a workspace */
71821
73029
  planmagnetTimeEntries: PlanmagnetTimeEntryList;
71822
73030
  /** Get a single time entry by ID */
@@ -71829,6 +73037,12 @@ export type Query = {
71829
73037
  planmagnetVelocity: PlanmagnetVelocity;
71830
73038
  /** Get a single work item by ID */
71831
73039
  planmagnetWorkItem?: Maybe<WorkItem>;
73040
+ /** A work item's recorded history, newest first */
73041
+ planmagnetWorkItemActivity: PlanmagnetWorkItemActivity;
73042
+ /** Comments on a work item, oldest first */
73043
+ planmagnetWorkItemComments: PlanmagnetWorkItemCommentList;
73044
+ /** Count work items matching a filter, in total, per status and per project, computed on the server */
73045
+ planmagnetWorkItemCounts: PlanmagnetWorkItemCounts;
71832
73046
  /** Docs currently linked to a given work item. */
71833
73047
  planmagnetWorkItemDocs: Array<PlanmagnetDoc>;
71834
73048
  /** Get a single work item link by ID */
@@ -73138,6 +74352,10 @@ export type QueryAssistantConversationsArgs = {
73138
74352
  productId: Scalars['String']['input'];
73139
74353
  };
73140
74354
  /** Base Query type with placeholder field. Extended by individual query files. */
74355
+ export type QueryAssistantSessionQueryArgs = {
74356
+ input: AssistantSessionRelayInput;
74357
+ };
74358
+ /** Base Query type with placeholder field. Extended by individual query files. */
73141
74359
  export type QueryAthAgentRunArgs = {
73142
74360
  id: Scalars['ID']['input'];
73143
74361
  };
@@ -77954,6 +79172,7 @@ export type QueryHeadshotmarketingAdPlatformConnectionsArgs = {
77954
79172
  export type QueryHeadshotmarketingAttributionReportArgs = {
77955
79173
  dealId?: InputMaybe<Scalars['ID']['input']>;
77956
79174
  leadId?: InputMaybe<Scalars['ID']['input']>;
79175
+ timeDecayHalfLifeDays?: InputMaybe<Scalars['Float']['input']>;
77957
79176
  };
77958
79177
  /** Base Query type with placeholder field. Extended by individual query files. */
77959
79178
  export type QueryHeadshotmarketingAudienceArgs = {
@@ -78170,6 +79389,10 @@ export type QueryHeadshotmarketingPipelinesArgs = {
78170
79389
  pagination?: InputMaybe<PaginationInput>;
78171
79390
  };
78172
79391
  /** Base Query type with placeholder field. Extended by individual query files. */
79392
+ export type QueryHeadshotmarketingPublicLandingPageArgs = {
79393
+ slug: Scalars['String']['input'];
79394
+ };
79395
+ /** Base Query type with placeholder field. Extended by individual query files. */
78173
79396
  export type QueryHeadshotmarketingSeoAuditArgs = {
78174
79397
  id: Scalars['ID']['input'];
78175
79398
  };
@@ -79968,6 +81191,29 @@ export type QueryMyApprovalRequestsArgs = {
79968
81191
  status?: InputMaybe<ApprovalStatus>;
79969
81192
  };
79970
81193
  /** Base Query type with placeholder field. Extended by individual query files. */
81194
+ export type QueryMyAssistantConversationEntriesArgs = {
81195
+ after?: InputMaybe<Scalars['String']['input']>;
81196
+ before?: InputMaybe<Scalars['String']['input']>;
81197
+ clientConversationId?: InputMaybe<Scalars['ID']['input']>;
81198
+ conversationId?: InputMaybe<Scalars['ID']['input']>;
81199
+ first?: InputMaybe<Scalars['Int']['input']>;
81200
+ last?: InputMaybe<Scalars['Int']['input']>;
81201
+ productId: Scalars['String']['input'];
81202
+ sinceSeq?: InputMaybe<Scalars['Int']['input']>;
81203
+ };
81204
+ /** Base Query type with placeholder field. Extended by individual query files. */
81205
+ export type QueryMyAssistantConversationsArgs = {
81206
+ after?: InputMaybe<Scalars['String']['input']>;
81207
+ first?: InputMaybe<Scalars['Int']['input']>;
81208
+ productId: Scalars['String']['input'];
81209
+ };
81210
+ /** Base Query type with placeholder field. Extended by individual query files. */
81211
+ export type QueryMyAssistantHistoryChangesArgs = {
81212
+ after?: InputMaybe<Scalars['String']['input']>;
81213
+ first?: InputMaybe<Scalars['Int']['input']>;
81214
+ productId: Scalars['String']['input'];
81215
+ };
81216
+ /** Base Query type with placeholder field. Extended by individual query files. */
79971
81217
  export type QueryMyBalanceTargetsArgs = {
79972
81218
  pagination?: InputMaybe<PaginationInput>;
79973
81219
  };
@@ -80356,6 +81602,12 @@ export type QueryPlanmagnetBoardArgs = {
80356
81602
  id: Scalars['ID']['input'];
80357
81603
  };
80358
81604
  /** Base Query type with placeholder field. Extended by individual query files. */
81605
+ export type QueryPlanmagnetBoardColumnCardsArgs = {
81606
+ boardId: Scalars['ID']['input'];
81607
+ columnId: Scalars['ID']['input'];
81608
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
81609
+ };
81610
+ /** Base Query type with placeholder field. Extended by individual query files. */
80359
81611
  export type QueryPlanmagnetBoardsArgs = {
80360
81612
  filter?: InputMaybe<PlanmagnetBoardFilter>;
80361
81613
  pagination?: InputMaybe<PlanmagnetPaginationInput>;
@@ -80476,6 +81728,7 @@ export type QueryPlanmagnetFeatureRequestArgs = {
80476
81728
  /** Base Query type with placeholder field. Extended by individual query files. */
80477
81729
  export type QueryPlanmagnetFeatureRequestsArgs = {
80478
81730
  filter?: InputMaybe<PlanmagnetFeatureRequestFilter>;
81731
+ orderBy?: InputMaybe<PlanmagnetFeatureOrder>;
80479
81732
  pagination?: InputMaybe<PlanmagnetPaginationInput>;
80480
81733
  workspaceId: Scalars['ID']['input'];
80481
81734
  };
@@ -80490,6 +81743,19 @@ export type QueryPlanmagnetMilestoneArgs = {
80490
81743
  /** Base Query type with placeholder field. Extended by individual query files. */
80491
81744
  export type QueryPlanmagnetMilestonesArgs = {
80492
81745
  filter?: InputMaybe<PlanmagnetMilestoneFilter>;
81746
+ orderBy?: InputMaybe<PlanmagnetMilestoneOrder>;
81747
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
81748
+ workspaceId: Scalars['ID']['input'];
81749
+ };
81750
+ /** Base Query type with placeholder field. Extended by individual query files. */
81751
+ export type QueryPlanmagnetMyAgentRunsArgs = {
81752
+ filter?: InputMaybe<PlanmagnetAgentRunFilter>;
81753
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
81754
+ workspaceId: Scalars['ID']['input'];
81755
+ };
81756
+ /** Base Query type with placeholder field. Extended by individual query files. */
81757
+ export type QueryPlanmagnetMyWorkItemsArgs = {
81758
+ filter?: InputMaybe<PlanmagnetMyWorkItemFilter>;
80493
81759
  pagination?: InputMaybe<PlanmagnetPaginationInput>;
80494
81760
  workspaceId: Scalars['ID']['input'];
80495
81761
  };
@@ -80518,6 +81784,16 @@ export type QueryPlanmagnetPortfoliosArgs = {
80518
81784
  workspaceId: Scalars['ID']['input'];
80519
81785
  };
80520
81786
  /** Base Query type with placeholder field. Extended by individual query files. */
81787
+ export type QueryPlanmagnetProductArgs = {
81788
+ id: Scalars['ID']['input'];
81789
+ };
81790
+ /** Base Query type with placeholder field. Extended by individual query files. */
81791
+ export type QueryPlanmagnetProductsArgs = {
81792
+ filter?: InputMaybe<PlanmagnetProductFilter>;
81793
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
81794
+ workspaceId: Scalars['ID']['input'];
81795
+ };
81796
+ /** Base Query type with placeholder field. Extended by individual query files. */
80521
81797
  export type QueryPlanmagnetProgramArgs = {
80522
81798
  id: Scalars['ID']['input'];
80523
81799
  };
@@ -80542,6 +81818,10 @@ export type QueryPlanmagnetProjectTemplatesArgs = {
80542
81818
  workspaceId: Scalars['ID']['input'];
80543
81819
  };
80544
81820
  /** Base Query type with placeholder field. Extended by individual query files. */
81821
+ export type QueryPlanmagnetProjectWorkflowArgs = {
81822
+ projectId: Scalars['ID']['input'];
81823
+ };
81824
+ /** Base Query type with placeholder field. Extended by individual query files. */
80545
81825
  export type QueryPlanmagnetProjectsArgs = {
80546
81826
  filter?: InputMaybe<PlanmagnetProjectFilter>;
80547
81827
  pagination?: InputMaybe<PlanmagnetPaginationInput>;
@@ -80562,6 +81842,10 @@ export type QueryPlanmagnetReleaseArgs = {
80562
81842
  id: Scalars['ID']['input'];
80563
81843
  };
80564
81844
  /** Base Query type with placeholder field. Extended by individual query files. */
81845
+ export type QueryPlanmagnetReleaseReadinessArgs = {
81846
+ releaseId: Scalars['ID']['input'];
81847
+ };
81848
+ /** Base Query type with placeholder field. Extended by individual query files. */
80565
81849
  export type QueryPlanmagnetReleasesArgs = {
80566
81850
  filter?: InputMaybe<PlanmagnetReleaseFilter>;
80567
81851
  pagination?: InputMaybe<PlanmagnetPaginationInput>;
@@ -80621,6 +81905,30 @@ export type QueryPlanmagnetSprintsArgs = {
80621
81905
  workspaceId: Scalars['ID']['input'];
80622
81906
  };
80623
81907
  /** Base Query type with placeholder field. Extended by individual query files. */
81908
+ export type QueryPlanmagnetTeamArgs = {
81909
+ id: Scalars['ID']['input'];
81910
+ };
81911
+ /** Base Query type with placeholder field. Extended by individual query files. */
81912
+ export type QueryPlanmagnetTeamVelocityArgs = {
81913
+ teamId: Scalars['ID']['input'];
81914
+ trailingSprintCount?: InputMaybe<Scalars['Int']['input']>;
81915
+ workspaceId: Scalars['ID']['input'];
81916
+ };
81917
+ /** Base Query type with placeholder field. Extended by individual query files. */
81918
+ export type QueryPlanmagnetTeamsArgs = {
81919
+ filter?: InputMaybe<PlanmagnetTeamFilter>;
81920
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
81921
+ workspaceId: Scalars['ID']['input'];
81922
+ };
81923
+ /** Base Query type with placeholder field. Extended by individual query files. */
81924
+ export type QueryPlanmagnetThroughputArgs = {
81925
+ bucket?: InputMaybe<PlanmagnetThroughputBucket>;
81926
+ endDate?: InputMaybe<Scalars['DateTime']['input']>;
81927
+ projectId: Scalars['ID']['input'];
81928
+ startDate?: InputMaybe<Scalars['DateTime']['input']>;
81929
+ workspaceId: Scalars['ID']['input'];
81930
+ };
81931
+ /** Base Query type with placeholder field. Extended by individual query files. */
80624
81932
  export type QueryPlanmagnetTimeEntriesArgs = {
80625
81933
  filter?: InputMaybe<PlanmagnetTimeEntryFilter>;
80626
81934
  pagination?: InputMaybe<PlanmagnetPaginationInput>;
@@ -80651,6 +81959,21 @@ export type QueryPlanmagnetWorkItemArgs = {
80651
81959
  id: Scalars['ID']['input'];
80652
81960
  };
80653
81961
  /** Base Query type with placeholder field. Extended by individual query files. */
81962
+ export type QueryPlanmagnetWorkItemActivityArgs = {
81963
+ first?: InputMaybe<Scalars['Int']['input']>;
81964
+ workItemId: Scalars['ID']['input'];
81965
+ };
81966
+ /** Base Query type with placeholder field. Extended by individual query files. */
81967
+ export type QueryPlanmagnetWorkItemCommentsArgs = {
81968
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
81969
+ workItemId: Scalars['ID']['input'];
81970
+ };
81971
+ /** Base Query type with placeholder field. Extended by individual query files. */
81972
+ export type QueryPlanmagnetWorkItemCountsArgs = {
81973
+ filter?: InputMaybe<PlanmagnetWorkItemFilter>;
81974
+ workspaceId: Scalars['ID']['input'];
81975
+ };
81976
+ /** Base Query type with placeholder field. Extended by individual query files. */
80654
81977
  export type QueryPlanmagnetWorkItemDocsArgs = {
80655
81978
  workItemId: Scalars['ID']['input'];
80656
81979
  };
@@ -83676,10 +84999,16 @@ export type Release = {
83676
84999
  ownerId?: Maybe<Scalars['String']['output']>;
83677
85000
  /** Planned release date */
83678
85001
  plannedDate?: Maybe<Scalars['DateTime']['output']>;
85002
+ /** The linked Product, when set. */
85003
+ product?: Maybe<Product>;
85004
+ /** Linked strategic Product (BOFF-8045). Null when never attached. */
85005
+ productId?: Maybe<Scalars['String']['output']>;
83679
85006
  /** Parent project */
83680
85007
  project?: Maybe<PlanmagnetProject>;
83681
85008
  /** Parent project ID */
83682
85009
  projectId: Scalars['String']['output'];
85010
+ /** Live quality gates holding this release. It cannot become RELEASED until every one is PASSED or WAIVED */
85011
+ qualityGates: Array<QualityGate>;
83683
85012
  /** Release notes (markdown) */
83684
85013
  releaseNotes?: Maybe<Scalars['String']['output']>;
83685
85014
  /** Actual release date */
@@ -83725,7 +85054,8 @@ export declare enum ReleaseStatus {
83725
85054
  Planning = "PLANNING",
83726
85055
  Ready = "READY",
83727
85056
  Released = "RELEASED",
83728
- RolledBack = "ROLLED_BACK"
85057
+ RolledBack = "ROLLED_BACK",
85058
+ Staging = "STAGING"
83729
85059
  }
83730
85060
  export declare enum ReminderChannel {
83731
85061
  Email = "EMAIL",
@@ -83942,6 +85272,13 @@ export type ReportAiTokenUsageInput = {
83942
85272
  /** Deprecated/ignored. Credits are now computed server-side from the model's token prices (input + ~5×output), not from a client-supplied total. Retained (nullable) only so the field removal isn't a breaking schema change. */
83943
85273
  totalTokens?: InputMaybe<Scalars['Int']['input']>;
83944
85274
  };
85275
+ /** A batch of finished turns from one page. */
85276
+ export type ReportAssistantTurnTimingsInput = {
85277
+ /** A random UUID per request, used only to ignore a repeated delivery. Never stored as a metric label. */
85278
+ nonce: Scalars['String']['input'];
85279
+ /** Between 1 and 20 turns. */
85280
+ turns: Array<AssistantTurnTimingInput>;
85281
+ };
83945
85282
  export declare enum ReportFormat {
83946
85283
  Csv = "CSV",
83947
85284
  Excel = "EXCEL",
@@ -84617,6 +85954,12 @@ export type Roadmap = {
84617
85954
  onBehalfOf?: Maybe<Scalars['String']['output']>;
84618
85955
  /** Owner actor ID */
84619
85956
  ownerId: Scalars['String']['output'];
85957
+ /** What the roadmap is organised around. Null when never recorded — legacy roadmaps were not classified, and this is not guessed. */
85958
+ planningFocus?: Maybe<RoadmapPlanningFocus>;
85959
+ /** The linked Product, when set. */
85960
+ product?: Maybe<Product>;
85961
+ /** Linked strategic Product (BOFF-8045). Null when never attached — see the BOFF-8045 backfill for the migration path from a pre-existing roadmap. */
85962
+ productId?: Maybe<Scalars['String']['output']>;
84620
85963
  /** Roadmap visualization type */
84621
85964
  type: RoadmapType;
84622
85965
  /** Last update timestamp */
@@ -84674,6 +86017,14 @@ export declare enum RoadmapItemStatus {
84674
86017
  InProgress = "IN_PROGRESS",
84675
86018
  Planned = "PLANNED"
84676
86019
  }
86020
+ /** What a roadmap is organised around. Independent of how it is displayed: a technology roadmap can be shown as a timeline. */
86021
+ export declare enum RoadmapPlanningFocus {
86022
+ Feature = "FEATURE",
86023
+ Portfolio = "PORTFOLIO",
86024
+ Technology = "TECHNOLOGY",
86025
+ Theme = "THEME"
86026
+ }
86027
+ /** How a roadmap is displayed. Only TIMELINE is served today; SWIMLANE, GANTT and CUSTOM are refused with a reason until those views are built (BOFF-7934). */
84677
86028
  export declare enum RoadmapType {
84678
86029
  Custom = "CUSTOM",
84679
86030
  Gantt = "GANTT",
@@ -85031,6 +86382,20 @@ export type SandboxArtifactBytesInput = {
85031
86382
  sandboxId: Scalars['ID']['input'];
85032
86383
  sessionId: Scalars['String']['input'];
85033
86384
  };
86385
+ /** The assistant modes the dedicated path provisions. */
86386
+ export declare enum SandboxAssistantMode {
86387
+ /** Take action: prepares changes as proposals; only a workspace admin's session can run them. */
86388
+ ApiCalls = "API_CALLS",
86389
+ /** Ask: answers and reads, as the user, through the read-only session relay. */
86390
+ Assistant = "ASSISTANT"
86391
+ }
86392
+ /** The write-approval flow a Take-action sandbox is asked to run. The service grants it to workspace admins only. */
86393
+ export declare enum SandboxAssistantWriteApproval {
86394
+ /** The pre-5a confirm-writes flow. */
86395
+ Legacy = "LEGACY",
86396
+ /** Proposals confirmed with a button (5a). */
86397
+ ProposalV1 = "PROPOSAL_V1"
86398
+ }
85034
86399
  /** A tag available for selection (lightweight type for tag picker) */
85035
86400
  export type SandboxAvailableTag = {
85036
86401
  __typename?: 'SandboxAvailableTag';
@@ -85300,7 +86665,7 @@ export type SaveAssistantTurnInput = {
85300
86665
  agentSessionId?: InputMaybe<Scalars['String']['input']>;
85301
86666
  /** Conversation to append to. Omit to start a new one. */
85302
86667
  conversationId?: InputMaybe<Scalars['ID']['input']>;
85303
- /** Product that owns this chat, e.g. "bigconsole". */
86668
+ /** Product that owns this chat, e.g. "bigconsole": lowercase letters, digits and hyphens, 2-40 characters, starting with a letter (the v2 rule). Anything else is BAD_USER_INPUT (assistant.errors.invalidHistoryInput) and nothing is written. */
85304
86669
  productId: Scalars['String']['input'];
85305
86670
  /** What the user asked. */
85306
86671
  prompt: Scalars['String']['input'];
@@ -85312,6 +86677,22 @@ export type SaveDraftInput = {
85312
86677
  conversationId: Scalars['ID']['input'];
85313
86678
  parentMessageId?: InputMaybe<Scalars['ID']['input']>;
85314
86679
  };
86680
+ export type SaveMyAssistantHistoryEntriesInput = {
86681
+ clientConversationId: Scalars['ID']['input'];
86682
+ /** TURN / LOCAL_COMMAND: exactly [USER, ASSISTANT]. NOTE: exactly [NOTE]. */
86683
+ entries: Array<AssistantHistoryEntryInput>;
86684
+ kind: AssistantHistoryEntryKind;
86685
+ /** The owning product. A renamed product's spellings (botlit / botmanor) are one history scope. */
86686
+ productId: Scalars['String']['input'];
86687
+ };
86688
+ export type SaveMyAssistantHistoryEntriesPayload = {
86689
+ __typename?: 'SaveMyAssistantHistoryEntriesPayload';
86690
+ conversation: AssistantHistoryConversation;
86691
+ /** What was NOT stored: "<entryIndex>.<key>" for a dropped metadata key (unknown, ill-typed, too deep to store, or among the largest when one entry's keys together exceed the 16 KB metadata limit -- a key is dropped, never the turn), and "<entryIndex>.<key>.<path>.pendingWrite" for approval data stripped from inside a kept value. */
86692
+ droppedMetadataKeys: Array<Scalars['String']['output']>;
86693
+ entries: Array<AssistantHistoryEntry>;
86694
+ outcome: AssistantHistorySaveOutcome;
86695
+ };
85315
86696
  export type SaveNavPreferencesInput = {
85316
86697
  activeViewId?: InputMaybe<Scalars['String']['input']>;
85317
86698
  /** JSON string: Record<viewId, Record<navItemId, "shown" | "hidden">>. */
@@ -88227,8 +89608,13 @@ export declare enum SortOrder {
88227
89608
  /** A time-boxed iteration within a project that groups work items for focused delivery during a fixed period. */
88228
89609
  export type Sprint = {
88229
89610
  __typename?: 'Sprint';
89611
+ baselineEndDate?: Maybe<Scalars['DateTime']['output']>;
89612
+ /** The planned start/end in force when the sprint was started: the commitment that "finished on time?" is measured against, even after a later replan. */
89613
+ baselineStartDate?: Maybe<Scalars['DateTime']['output']>;
88230
89614
  /** Sprint capacity in story points */
88231
89615
  capacity?: Maybe<Scalars['Int']['output']>;
89616
+ /** When the sprint was actually completed. Null if not completed, or completed before 2026-09-26 (unknown). */
89617
+ completedAt?: Maybe<Scalars['DateTime']['output']>;
88232
89618
  /** Context information */
88233
89619
  context?: Maybe<Scalars['JSON']['output']>;
88234
89620
  /** Creation timestamp */
@@ -88237,7 +89623,7 @@ export type Sprint = {
88237
89623
  createdBy: Scalars['String']['output'];
88238
89624
  /** Soft-delete timestamp */
88239
89625
  deletedAt?: Maybe<Scalars['DateTime']['output']>;
88240
- /** Sprint end date */
89626
+ /** PLANNED end. Completing the sprint does not change it; see completedAt. For sprints completed before 2026-09-26 this holds the moment of Complete. */
88241
89627
  endDate?: Maybe<Scalars['DateTime']['output']>;
88242
89628
  /** Sprint goal description */
88243
89629
  goal?: Maybe<Scalars['String']['output']>;
@@ -88249,21 +89635,29 @@ export type Sprint = {
88249
89635
  name: Scalars['String']['output'];
88250
89636
  /** Actor on whose behalf this was created */
88251
89637
  onBehalfOf?: Maybe<Scalars['String']['output']>;
89638
+ /** Every change to the planned dates, oldest first. Append-only. */
89639
+ planChanges: Array<PlanmagnetSprintPlanChange>;
88252
89640
  /** Parent project */
88253
89641
  project?: Maybe<PlanmagnetProject>;
88254
- /** Parent project ID */
88255
- projectId: Scalars['String']['output'];
89642
+ /** Parent project ID. Set only for a project-scoped sprint — exactly one of projectId/teamId is ever set (BOFF-8044). */
89643
+ projectId?: Maybe<Scalars['String']['output']>;
88256
89644
  /** Sort order. Backed by the Prisma `sequenceNumber` column (the only ordering primitive Sprint has) via a field resolver — see sprint.resolvers.ts. Not independently settable; see PlanmagnetCreateSprintInput/ PlanmagnetUpdateSprintInput below. */
88257
89645
  sortOrder: Scalars['Int']['output'];
88258
- /** Sprint start date */
89646
+ /** PLANNED start. Starting the sprint does not change it (BOFF-7918); see startedAt for when it actually started. For sprints started before 2026-09-26 this field holds the moment of Start (the plan was overwritten then; it is not reconstructed here). */
88259
89647
  startDate?: Maybe<Scalars['DateTime']['output']>;
89648
+ /** When the sprint was actually started. Null if not started — or if it was started before 2026-09-26, when this was not recorded (unknown, not guessed). */
89649
+ startedAt?: Maybe<Scalars['DateTime']['output']>;
88260
89650
  /** Current status */
88261
89651
  status: SprintStatus;
89652
+ /** Parent team */
89653
+ team?: Maybe<Team>;
89654
+ /** Parent team ID. Set only for a team-scoped sprint (BOFF-8044) — see projectId above. */
89655
+ teamId?: Maybe<Scalars['String']['output']>;
88262
89656
  /** Last update timestamp */
88263
89657
  updatedAt: Scalars['DateTime']['output'];
88264
89658
  /** Actor who last updated this sprint */
88265
89659
  updatedBy?: Maybe<Scalars['String']['output']>;
88266
- /** Sprint velocity (completed story points). Backed by the Prisma `velocityActual` column via a field resolver — see sprint.resolvers.ts. */
89660
+ /** Sprint velocity: the story points of the sprint's work items that were DONE when the sprint was completed. Null until the sprint is COMPLETED (a running sprint has points done so far, not a velocity). Snapshotted at completion; computed from status history for sprints completed earlier. Same number as planmagnetVelocity. */
88267
89661
  velocity?: Maybe<Scalars['Int']['output']>;
88268
89662
  /** Work items in this sprint */
88269
89663
  workItems: Array<WorkItem>;
@@ -90935,6 +92329,34 @@ export declare enum TcpVerificationStatus {
90935
92329
  Retracted = "RETRACTED",
90936
92330
  Unverified = "UNVERIFIED"
90937
92331
  }
92332
+ /** A cross-project team that can own its own sprints (BOFF-8044). Membership does NOT grant project access — see the @rbac directives below; RBAC is enforced purely by workspace role, identically to every other PlanMagnet resource. */
92333
+ export type Team = {
92334
+ __typename?: 'Team';
92335
+ /** Story-point capacity for this team's own sprints, if set. */
92336
+ capacity?: Maybe<Scalars['Int']['output']>;
92337
+ createdAt: Scalars['DateTime']['output'];
92338
+ createdBy: Scalars['String']['output'];
92339
+ description?: Maybe<Scalars['String']['output']>;
92340
+ id: Scalars['ID']['output'];
92341
+ /** The team's lead — an actor id, or null. Backed by the `ownerId` column; see team.resolvers.ts. */
92342
+ leadId?: Maybe<Scalars['String']['output']>;
92343
+ /** Members of this team. */
92344
+ members: Array<TeamMember>;
92345
+ name: Scalars['String']['output'];
92346
+ onBehalfOf?: Maybe<Scalars['String']['output']>;
92347
+ /** Live projects on this team. A project soft-deleted elsewhere disappears from this list. */
92348
+ projects: Array<PlanmagnetProject>;
92349
+ updatedAt: Scalars['DateTime']['output'];
92350
+ updatedBy?: Maybe<Scalars['String']['output']>;
92351
+ workspaceId: Scalars['String']['output'];
92352
+ };
92353
+ export type TeamMember = {
92354
+ __typename?: 'TeamMember';
92355
+ actorId: Scalars['String']['output'];
92356
+ createdAt: Scalars['DateTime']['output'];
92357
+ id: Scalars['ID']['output'];
92358
+ teamId: Scalars['String']['output'];
92359
+ };
90938
92360
  /** A single workspace-wide activity-feed entry: a WorkPattern row logged by some member of the workspace, paired with that member's resolved display identity. Backs `teamWorkPatterns` so the Team Activity feed never has to render a raw userId UUID. */
90939
92361
  export type TeamWorkPatternEntry = {
90940
92362
  __typename?: 'TeamWorkPatternEntry';
@@ -93680,6 +95102,11 @@ export type Transaction = {
93680
95102
  __typename?: 'Transaction';
93681
95103
  id: Scalars['ID']['output'];
93682
95104
  };
95105
+ export type TransferInventoryStockInput = {
95106
+ destinationInventoryItemId: Scalars['ID']['input'];
95107
+ quantity: Scalars['Int']['input'];
95108
+ sourceInventoryItemId: Scalars['ID']['input'];
95109
+ };
93683
95110
  export type TransformRuntimeInfo = {
93684
95111
  __typename?: 'TransformRuntimeInfo';
93685
95112
  maxInputBytes: Scalars['Int']['output'];
@@ -95190,9 +96617,13 @@ export type UpdateDashboardEmbedPolicyInput = {
95190
96617
  allowedParentOrigins?: InputMaybe<Array<Scalars['String']['input']>>;
95191
96618
  expiresAt?: InputMaybe<Scalars['DateTime']['input']>;
95192
96619
  policyId: Scalars['ID']['input'];
95193
- /** Publish-time presentation options (BOFF-5735). Read live at view time, so a change reflects on the next render with no re-publish. */
96620
+ /** Publish-time presentation options (BOFF-5735). Read live at view time, so a change reflects on the next render with no re-publish. The "Powered by BigConsole" footer is not an option: every embed always shows it. */
95194
96621
  presentationTheme?: InputMaybe<DashboardEmbedTheme>;
95195
96622
  sessionTtlSeconds?: InputMaybe<Scalars['Int']['input']>;
96623
+ /**
96624
+ * Ignored. Every embed always shows the "Powered by BigConsole" footer. Accepted only so older clients that still send it keep working.
96625
+ * @deprecated Embeds always show the BigConsole footer; this setting is ignored.
96626
+ */
95196
96627
  showBrandingFooter?: InputMaybe<Scalars['Boolean']['input']>;
95197
96628
  showDashboardTitle?: InputMaybe<Scalars['Boolean']['input']>;
95198
96629
  };
@@ -95317,19 +96748,27 @@ export type UpdateDeliveryJobStatusInput = {
95317
96748
  status: DeliveryJobStatus;
95318
96749
  };
95319
96750
  export type UpdateDriverInput = {
96751
+ baseSalary?: InputMaybe<Scalars['Float']['input']>;
96752
+ bonusYtd?: InputMaybe<Scalars['Float']['input']>;
95320
96753
  certifications?: InputMaybe<Scalars['JSON']['input']>;
95321
96754
  context?: InputMaybe<ContextInput>;
95322
96755
  currentLocation?: InputMaybe<Scalars['JSON']['input']>;
95323
96756
  email?: InputMaybe<Scalars['String']['input']>;
95324
96757
  firstName?: InputMaybe<Scalars['String']['input']>;
96758
+ hireDate?: InputMaybe<Scalars['DateTime']['input']>;
95325
96759
  lastName?: InputMaybe<Scalars['String']['input']>;
95326
96760
  licenseClass?: InputMaybe<Scalars['String']['input']>;
95327
96761
  licenseExpiry?: InputMaybe<Scalars['DateTime']['input']>;
95328
96762
  licenseNumber?: InputMaybe<Scalars['String']['input']>;
96763
+ notes?: InputMaybe<Scalars['String']['input']>;
96764
+ onLeaveUntil?: InputMaybe<Scalars['DateTime']['input']>;
96765
+ payCurrency?: InputMaybe<Scalars['String']['input']>;
95329
96766
  performanceMetrics?: InputMaybe<Scalars['JSON']['input']>;
95330
96767
  phone?: InputMaybe<Scalars['String']['input']>;
95331
96768
  rating?: InputMaybe<Scalars['Float']['input']>;
95332
96769
  status?: InputMaybe<DriverStatus>;
96770
+ terminatedAt?: InputMaybe<Scalars['DateTime']['input']>;
96771
+ terminationReason?: InputMaybe<Scalars['String']['input']>;
95333
96772
  userId?: InputMaybe<Scalars['String']['input']>;
95334
96773
  vehicleId?: InputMaybe<Scalars['String']['input']>;
95335
96774
  vehicleIds?: InputMaybe<Array<Scalars['ID']['input']>>;
@@ -96044,6 +97483,8 @@ export type UpdateHeadshotmarketingSocialAccountInput = {
96044
97483
  avatarUrl?: InputMaybe<Scalars['String']['input']>;
96045
97484
  deliveryMode?: InputMaybe<HeadshotmarketingSocialAccountDeliveryMode>;
96046
97485
  followerCount?: InputMaybe<Scalars['Int']['input']>;
97486
+ /** Rebind this account to an already-created OAuth connection in wspace-integrations-svc (tokens live server-side, never here). When set, it is stored directly and the refresh-from-tokens path is skipped; if raw tokens are also supplied, the explicit connectionId wins. */
97487
+ integrationConnectionId?: InputMaybe<Scalars['ID']['input']>;
96047
97488
  metadata?: InputMaybe<Scalars['JSON']['input']>;
96048
97489
  profileUrl?: InputMaybe<Scalars['String']['input']>;
96049
97490
  refreshToken?: InputMaybe<Scalars['String']['input']>;
@@ -97730,9 +99171,9 @@ export type UpdateVibecontrolsAgentInput = {
97730
99171
  agentApiKey?: InputMaybe<Scalars['String']['input']>;
97731
99172
  /** Custom AI context (markdown) surfaced to AI tools running on this agent */
97732
99173
  aiContext?: InputMaybe<Scalars['String']['input']>;
97733
- /** Auth-svc App clientId (for display/reference) */
99174
+ /** Auth-svc App clientId. Server-managed like `appId`: a non-null value is rejected with `BAD_USER_INPUT`. */
97734
99175
  appClientId?: InputMaybe<Scalars['String']['input']>;
97735
- /** Linked auth-svc App ID (OAuth2 identity for gateway access) */
99176
+ /** Linked auth-svc App ID (OAuth2 identity for gateway access). Server-managed (BOFF-7920): written only by `setupAgentGatewayAuth`. A non-null value is rejected with `BAD_USER_INPUT`; `null` clears the link ("unlink app"), which only ever removes access. */
97736
99177
  appId?: InputMaybe<Scalars['String']['input']>;
97737
99178
  capabilities?: InputMaybe<Scalars['JSON']['input']>;
97738
99179
  configuration?: InputMaybe<Scalars['JSON']['input']>;
@@ -98532,6 +99973,7 @@ export declare enum ValidationMethod {
98532
99973
  BasicAuth = "BASIC_AUTH",
98533
99974
  BearerToken = "BEARER_TOKEN",
98534
99975
  HmacSha256 = "HMAC_SHA256",
99976
+ Jwt = "JWT",
98535
99977
  None = "NONE",
98536
99978
  Signature = "SIGNATURE"
98537
99979
  }
@@ -99009,6 +100451,8 @@ export type VaultUpdatedPayload = {
99009
100451
  };
99010
100452
  export type VehicleFilterInput = {
99011
100453
  driverId?: InputMaybe<Scalars['ID']['input']>;
100454
+ /** Fetch exactly these vehicles by id, regardless of how many. Ignores other filters/pagination when set. */
100455
+ ids?: InputMaybe<Array<Scalars['ID']['input']>>;
99012
100456
  search?: InputMaybe<Scalars['String']['input']>;
99013
100457
  status?: InputMaybe<VehicleStatus>;
99014
100458
  type?: InputMaybe<VehicleType>;
@@ -99825,9 +101269,9 @@ export type VibecontrolsAgentProfile = {
99825
101269
  };
99826
101270
  /** Who inside the workspace can see and use an agent (BOFF-6394). An agent is remote code execution on a physical machine, so it carries this second authorization dimension on top of the `@rbac` directives: the gateway answers "may this actor do `update` on `agent` here?", `visibility` answers "…on THIS agent?". Named for the subgraph on purpose: `botlit` already publishes an unrelated `AgentVisibility` enum whose values include `PUBLIC`, and Federation requires an enum used as BOTH input and output to carry identical values in every subgraph that defines it. Sharing the name would break composition of the whole workspaces supergraph. */
99827
101271
  export declare enum VibecontrolsAgentVisibility {
99828
- /** Only `ownerUserId` can see or use the agent. The default for an agent added by a user. */
101272
+ /** Only `ownerUserId` can see or use the agent. The default for an agent added by a user, or created by an agent on its owner's behalf (mesh deploy). There is no actor-type bypass (BOFF-7920): super-admins and services are held to it like any member, and an agent's own OAuth identity (`app`) only reaches the agent it is plus its owner's other agents. */
99829
101273
  Private = "PRIVATE",
99830
- /** Every workspace member holding the matching `@rbac` permission can see and use the agent. The pre-BOFF-6394 behaviour, and the default for agents that have no human owner (created by an `app` / `service` actor). */
101274
+ /** Every workspace member holding the matching `@rbac` permission can see and use the agent. The pre-BOFF-6394 behaviour, and the default for agents that have no human owner (created by a `service` actor, or by an agent that is itself ownerless). */
99831
101275
  Workspace = "WORKSPACE"
99832
101276
  }
99833
101277
  export type VibecontrolsAnalyticsInput = {
@@ -101678,10 +103122,14 @@ export type WorkItem = {
101678
103122
  description?: Maybe<Scalars['String']['output']>;
101679
103123
  /** Due date */
101680
103124
  dueDate?: Maybe<Scalars['DateTime']['output']>;
103125
+ /** Which due-date bucket this item falls into (OVERDUE, DUE_TODAY, DUE_THIS_WEEK within 7 days, DUE_LATER, or NO_DUE_DATE). Server-computed so the My Work grouping can never disagree between two clients or two requests — see utils/my-work.ts. */
103126
+ dueGroup: PlanmagnetDueGroup;
101681
103127
  /** Original time estimate in minutes */
101682
103128
  estimateMinutes?: Maybe<Scalars['Int']['output']>;
101683
103129
  /** Unique identifier */
101684
103130
  id: Scalars['ID']['output'];
103131
+ /** True when dueDate is set and earlier than the start of today (UTC). Open items only in spirit — a DONE/CANCELLED item past its due date still reports true; callers that only care about outstanding overdue work must also check status/category. */
103132
+ isOverdue: Scalars['Boolean']['output'];
101685
103133
  /** Human-readable key (e.g. PROJ-123) */
101686
103134
  key: Scalars['String']['output'];
101687
103135
  /** Labels for categorization */
@@ -101710,6 +103158,8 @@ export type WorkItem = {
101710
103158
  sprintId?: Maybe<Scalars['String']['output']>;
101711
103159
  /** Current status */
101712
103160
  status: WorkItemStatus;
103161
+ /** When it entered its current status (card aging). Null when that moment is unknown: its status was changed by a path that records no history, such as an import */
103162
+ statusSince?: Maybe<Scalars['DateTime']['output']>;
101713
103163
  /** Story points estimate */
101714
103164
  storyPoints?: Maybe<Scalars['Int']['output']>;
101715
103165
  /** Tags for categorization */
@@ -101738,20 +103188,22 @@ export type WorkItemDependency = {
101738
103188
  description?: Maybe<Scalars['String']['output']>;
101739
103189
  /** Unique identifier */
101740
103190
  id: Scalars['ID']['output'];
103191
+ /** Offset applied to the constraint, in minutes. Negative means lead (overlap) rather than lag. The column has always existed as `lagDays`; the SDL never exposed it, so a lagged constraint could not be expressed at all. */
103192
+ lagMinutes?: Maybe<Scalars['Int']['output']>;
101741
103193
  /** Arbitrary metadata */
101742
103194
  metadata?: Maybe<Scalars['JSON']['output']>;
101743
103195
  /** Actor on whose behalf this was created */
101744
103196
  onBehalfOf?: Maybe<Scalars['String']['output']>;
101745
- /** Source work item */
101746
- sourceWorkItem?: Maybe<WorkItem>;
101747
- /** Source work item ID */
101748
- sourceWorkItemId: Scalars['String']['output'];
103197
+ /** The constraining work item */
103198
+ predecessor?: Maybe<WorkItem>;
103199
+ /** The work item that constrains the other. Renamed from `sourceWorkItemId`: with `type` now purely a scheduling relationship, source/target read as a generic graph edge while predecessor/successor state the actual meaning. */
103200
+ predecessorId: Scalars['String']['output'];
101749
103201
  /** Current status */
101750
103202
  status: DependencyStatus;
101751
- /** Target work item */
101752
- targetWorkItem?: Maybe<WorkItem>;
101753
- /** Target work item ID */
101754
- targetWorkItemId: Scalars['String']['output'];
103203
+ /** The constrained work item */
103204
+ successor?: Maybe<WorkItem>;
103205
+ /** The work item whose schedule is constrained. Renamed from `targetWorkItemId`. */
103206
+ successorId: Scalars['String']['output'];
101755
103207
  /** Type of dependency */
101756
103208
  type: DependencyType;
101757
103209
  /** Last update timestamp */
@@ -101793,9 +103245,16 @@ export type WorkItemLink = {
101793
103245
  /** Associated workspace ID */
101794
103246
  workspaceId: Scalars['String']['output'];
101795
103247
  };
103248
+ /** How a work item relates to the thing it is linked to. The first six are cross-product verbs: a work item INSPECTS a HealthyBowl sensor, PRODUCES an artifact. The five added in 20260924130000 are the work-item-to-work-item issue-link verbs that used to sit on `WorkItemDependency.type`, where they were indistinguishable from scheduling constraints and dragged semantic links into critical-path maths. For a link between two PlanMagnet work items, use `sourceProduct: "planmagnet"` and `entityType: "WorkItem"`. **None of these relations affect scheduling** — that is `WorkItemDependency` and only `WorkItemDependency`. */
101796
103249
  export declare enum WorkItemLinkRelation {
101797
103250
  Affects = "AFFECTS",
103251
+ /** This work item is blocked by the linked one. Semantic only: it does NOT schedule. */
103252
+ BlockedBy = "BLOCKED_BY",
101798
103253
  Blocks = "BLOCKS",
103254
+ CausedBy = "CAUSED_BY",
103255
+ Causes = "CAUSES",
103256
+ DuplicatedBy = "DUPLICATED_BY",
103257
+ Duplicates = "DUPLICATES",
101799
103258
  Inspects = "INSPECTS",
101800
103259
  Produces = "PRODUCES",
101801
103260
  RelatedTo = "RELATED_TO",
@@ -101939,6 +103398,29 @@ export type WorkerCompleteRunResponse = {
101939
103398
  success: Scalars['Boolean']['output'];
101940
103399
  totalNodes?: Maybe<Scalars['Int']['output']>;
101941
103400
  };
103401
+ /** Input for starting a Sub-workflow node's child run. */
103402
+ export type WorkerCreateChildRunInput = {
103403
+ /** Mapped data handed to the child as its trigger data. */
103404
+ input?: InputMaybe<Scalars['JSON']['input']>;
103405
+ parentNodeId: Scalars['String']['input'];
103406
+ parentRunId: Scalars['ID']['input'];
103407
+ /** Pinned version; omitted resolves the executable one (ACTIVE wins, else newest). */
103408
+ version?: InputMaybe<Scalars['String']['input']>;
103409
+ /** Target workflow, always resolved inside the parent's workspace. */
103410
+ workflowKey: Scalars['String']['input'];
103411
+ };
103412
+ /** Result of starting a child run. */
103413
+ export type WorkerCreateChildRunResponse = {
103414
+ __typename?: 'WorkerCreateChildRunResponse';
103415
+ childRunId?: Maybe<Scalars['ID']['output']>;
103416
+ error?: Maybe<Scalars['String']['output']>;
103417
+ /** One of: PARENT_NOT_FOUND, WORKFLOW_NOT_FOUND, DEPTH_EXCEEDED, CYCLE_DETECTED, NO_ENTRY_NODE. */
103418
+ errorCode?: Maybe<Scalars['String']['output']>;
103419
+ success: Scalars['Boolean']['output'];
103420
+ triggerNodeId?: Maybe<Scalars['String']['output']>;
103421
+ version?: Maybe<Scalars['String']['output']>;
103422
+ workflowKey?: Maybe<Scalars['String']['output']>;
103423
+ };
101942
103424
  /** Input for creating node state */
101943
103425
  export type WorkerCreateNodeStateInput = {
101944
103426
  context?: InputMaybe<Scalars['JSON']['input']>;
@@ -102184,6 +103666,7 @@ export type WorkerToolApprovalRequestResponse = {
102184
103666
  /** Input for updating node state */
102185
103667
  export type WorkerUpdateNodeStateInput = {
102186
103668
  attemptCount?: InputMaybe<Scalars['Int']['input']>;
103669
+ context?: InputMaybe<Scalars['JSON']['input']>;
102187
103670
  duration?: InputMaybe<Scalars['Float']['input']>;
102188
103671
  endTime?: InputMaybe<Scalars['DateTime']['input']>;
102189
103672
  error?: InputMaybe<Scalars['String']['input']>;