@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
@@ -3937,6 +3937,104 @@ export type AssistantConversation = {
3937
3937
  updatedAt: Scalars['DateTime']['output'];
3938
3938
  };
3939
3939
 
3940
+ export type AssistantHistoryChangeConnection = {
3941
+ __typename?: 'AssistantHistoryChangeConnection';
3942
+ edges: Array<AssistantHistoryConversationEdge>;
3943
+ nodes: Array<AssistantHistoryConversation>;
3944
+ pageInfo: PageInfo;
3945
+ /** True when the cursor predates retained tombstones: drop synced state and pull from the start. */
3946
+ resetRequired: Scalars['Boolean']['output'];
3947
+ };
3948
+
3949
+ export type AssistantHistoryConversation = {
3950
+ __typename?: 'AssistantHistoryConversation';
3951
+ /** The id the client minted; the same on every device. Null = saved before v2 (read-only). */
3952
+ clientConversationId?: Maybe<Scalars['ID']['output']>;
3953
+ createdAt: Scalars['DateTime']['output'];
3954
+ deleted: Scalars['Boolean']['output'];
3955
+ deletedAt?: Maybe<Scalars['DateTime']['output']>;
3956
+ id: Scalars['ID']['output'];
3957
+ lastMessageSeq: Scalars['Int']['output'];
3958
+ legacy: Scalars['Boolean']['output'];
3959
+ /** 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. */
3960
+ productId: Scalars['String']['output'];
3961
+ /** Per-(me, workspace, product) revision of this row's last change. Monotonic in commit order. */
3962
+ revision: Scalars['Int']['output'];
3963
+ /** A label derived from the first prompt. Null once the conversation is deleted: a deleted chat's title is never served. */
3964
+ title?: Maybe<Scalars['String']['output']>;
3965
+ updatedAt: Scalars['DateTime']['output'];
3966
+ };
3967
+
3968
+ export type AssistantHistoryConversationConnection = {
3969
+ __typename?: 'AssistantHistoryConversationConnection';
3970
+ edges: Array<AssistantHistoryConversationEdge>;
3971
+ nodes: Array<AssistantHistoryConversation>;
3972
+ pageInfo: PageInfo;
3973
+ };
3974
+
3975
+ export type AssistantHistoryConversationEdge = {
3976
+ __typename?: 'AssistantHistoryConversationEdge';
3977
+ cursor: Scalars['String']['output'];
3978
+ node: AssistantHistoryConversation;
3979
+ };
3980
+
3981
+ export enum AssistantHistoryDeleteOutcome {
3982
+ /** The conversation was already deleted; nothing changed. */
3983
+ AlreadyDeleted = 'ALREADY_DELETED',
3984
+ /** A live conversation was deleted. */
3985
+ Deleted = 'DELETED',
3986
+ /** No conversation with this legacy (server) id exists in this scope; nothing changed. */
3987
+ NotPresent = 'NOT_PRESENT',
3988
+ /** The server had never seen this client id; a tombstone was recorded so a late save cannot create it. */
3989
+ TombstonedUnseen = 'TOMBSTONED_UNSEEN'
3990
+ }
3991
+
3992
+ export type AssistantHistoryEntry = {
3993
+ __typename?: 'AssistantHistoryEntry';
3994
+ /** The client's ISO timestamp, returned exactly as stored (a String, never a Date). */
3995
+ clientCreatedAt?: Maybe<Scalars['String']['output']>;
3996
+ clientMessageId?: Maybe<Scalars['ID']['output']>;
3997
+ content: Scalars['String']['output'];
3998
+ createdAt: Scalars['DateTime']['output'];
3999
+ id: Scalars['ID']['output'];
4000
+ kind?: Maybe<AssistantHistoryEntryKind>;
4001
+ /** Allow-listed client metadata; stored and returned verbatim, never interpreted or executed. */
4002
+ metadata?: Maybe<Scalars['JSON']['output']>;
4003
+ role: AssistantHistoryRole;
4004
+ /** Position in the conversation (1..n). Always set for v2 and backfilled rows. */
4005
+ seq?: Maybe<Scalars['Int']['output']>;
4006
+ };
4007
+
4008
+ export type AssistantHistoryEntryConnection = {
4009
+ __typename?: 'AssistantHistoryEntryConnection';
4010
+ conversation: AssistantHistoryConversation;
4011
+ edges: Array<AssistantHistoryEntryEdge>;
4012
+ nodes: Array<AssistantHistoryEntry>;
4013
+ pageInfo: PageInfo;
4014
+ };
4015
+
4016
+ export type AssistantHistoryEntryEdge = {
4017
+ __typename?: 'AssistantHistoryEntryEdge';
4018
+ cursor: Scalars['String']['output'];
4019
+ node: AssistantHistoryEntry;
4020
+ };
4021
+
4022
+ export type AssistantHistoryEntryInput = {
4023
+ clientCreatedAt?: InputMaybe<Scalars['String']['input']>;
4024
+ clientMessageId: Scalars['ID']['input'];
4025
+ /** Stored as sent, except that U+0000 and an unpaired UTF-16 surrogate (which cannot be stored) become U+FFFD. */
4026
+ content: Scalars['String']['input'];
4027
+ metadata?: InputMaybe<Scalars['JSON']['input']>;
4028
+ role: AssistantHistoryRole;
4029
+ };
4030
+
4031
+ /** What a saved call records. Extensible later (e.g. RECORD) without any approval schema. */
4032
+ export enum AssistantHistoryEntryKind {
4033
+ LocalCommand = 'LOCAL_COMMAND',
4034
+ Note = 'NOTE',
4035
+ Turn = 'TURN'
4036
+ }
4037
+
3940
4038
  export type AssistantHistoryMessage = {
3941
4039
  __typename?: 'AssistantHistoryMessage';
3942
4040
  content: Scalars['String']['output'];
@@ -3945,11 +4043,120 @@ export type AssistantHistoryMessage = {
3945
4043
  role: AssistantMessageRole;
3946
4044
  };
3947
4045
 
4046
+ export enum AssistantHistoryRole {
4047
+ Assistant = 'ASSISTANT',
4048
+ Note = 'NOTE',
4049
+ User = 'USER'
4050
+ }
4051
+
4052
+ export enum AssistantHistorySaveOutcome {
4053
+ /** Every entry was already stored; nothing was written. */
4054
+ AlreadyApplied = 'ALREADY_APPLIED',
4055
+ /** The missing entries were written. */
4056
+ Applied = 'APPLIED',
4057
+ /** The conversation is deleted (or tombstoned); nothing was written. */
4058
+ ConversationDeleted = 'CONVERSATION_DELETED'
4059
+ }
4060
+
3948
4061
  export enum AssistantMessageRole {
3949
4062
  Assistant = 'ASSISTANT',
3950
4063
  User = 'USER'
3951
4064
  }
3952
4065
 
4066
+ /** The gateway a relayed document is sent to. */
4067
+ export enum AssistantRelayGateway {
4068
+ /** The global public gateway (/global/graphql). */
4069
+ Global = 'GLOBAL',
4070
+ /** The workspace public gateway (/workspaces/graphql). */
4071
+ Workspace = 'WORKSPACE'
4072
+ }
4073
+
4074
+ /** A GraphQL mutation for the relay to run as the session's owner (admin Take-action sessions only). */
4075
+ export type AssistantSessionExecuteInput = {
4076
+ /** The session capability (asc1.<sandboxId>.<mac>) the sandbox proxy delivered. */
4077
+ capability: Scalars['String']['input'];
4078
+ gateway: AssistantRelayGateway;
4079
+ /** Sent on as x-idempotency-key: 1 to 64 of A-Z, a-z, 0-9, _ and -. */
4080
+ idempotencyKey?: InputMaybe<Scalars['String']['input']>;
4081
+ /** When given, the name of the document's one operation. */
4082
+ operationName?: InputMaybe<Scalars['String']['input']>;
4083
+ /** One GraphQL operation, a mutation whose root selections are plain fields without directives, at most 64 KiB. */
4084
+ query: Scalars['String']['input'];
4085
+ /** A JSON object, at most 256 KiB serialized. */
4086
+ variables?: InputMaybe<Scalars['JSONObject']['input']>;
4087
+ };
4088
+
4089
+ /** A GraphQL query for the relay to run as the session's owner. */
4090
+ export type AssistantSessionRelayInput = {
4091
+ /** The session capability (asc1.<sandboxId>.<mac>) the sandbox proxy delivered. */
4092
+ capability: Scalars['String']['input'];
4093
+ gateway: AssistantRelayGateway;
4094
+ /** When given, the name of the document's one operation. */
4095
+ operationName?: InputMaybe<Scalars['String']['input']>;
4096
+ /** One GraphQL operation, a query, at most 64 KiB. */
4097
+ query: Scalars['String']['input'];
4098
+ /** A JSON object, at most 256 KiB serialized. */
4099
+ variables?: InputMaybe<Scalars['JSONObject']['input']>;
4100
+ };
4101
+
4102
+ /** What the relay did. */
4103
+ export type AssistantSessionRelayResult = {
4104
+ __typename?: 'AssistantSessionRelayResult';
4105
+ /** The gateway's JSON response body when ok; otherwise { reason? }. */
4106
+ body?: Maybe<Scalars['JSON']['output']>;
4107
+ /** Null when ok; otherwise why nothing (or, for UPSTREAM_*, nothing usable) came back. */
4108
+ code?: Maybe<Scalars['String']['output']>;
4109
+ /** The gateway's HTTP status when ok; otherwise the status the code maps to. */
4110
+ httpStatus: Scalars['Int']['output'];
4111
+ /** True when the document was sent and the gateway answered; body is then the gateway's response, unmasked. */
4112
+ ok: Scalars['Boolean']['output'];
4113
+ };
4114
+
4115
+ /** 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. */
4116
+ export type AssistantTurnTimingInput = {
4117
+ /** How the question was asked: chat or voice. */
4118
+ channel: Scalars['String']['input'];
4119
+ /** The turn ended. */
4120
+ completeMs: Scalars['Int']['input'];
4121
+ /** The reply's first audio played. Counted only on answered voice turns, and only when it began within 120s of the turn ending. */
4122
+ firstAudioMs?: InputMaybe<Scalars['Int']['input']>;
4123
+ /** The first answer text was shown. Counted only when the outcome is answered. */
4124
+ firstUsefulOutputMs?: InputMaybe<Scalars['Int']['input']>;
4125
+ /** The first output was shown, a tool line included. Loading copy never counts. */
4126
+ firstVisibleOutputMs?: InputMaybe<Scalars['Int']['input']>;
4127
+ /** The assistant mode the turn ran in. */
4128
+ mode: Scalars['String']['input'];
4129
+ /** The model accepted the prompt. */
4130
+ modelStartMs?: InputMaybe<Scalars['Int']['input']>;
4131
+ /** 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). */
4132
+ outcome: Scalars['String']['input'];
4133
+ /** 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. */
4134
+ prewarm?: InputMaybe<Scalars['String']['input']>;
4135
+ /** The product whose assistant ran the turn. */
4136
+ product: Scalars['String']['input'];
4137
+ /** The turn was retried on a second runtime after its first attempt failed. */
4138
+ retried?: InputMaybe<Scalars['Boolean']['input']>;
4139
+ /** 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. */
4140
+ runtime?: InputMaybe<Scalars['String']['input']>;
4141
+ /** A runtime (sandbox and session) was ready to take the prompt. */
4142
+ runtimeReadyMs?: InputMaybe<Scalars['Int']['input']>;
4143
+ };
4144
+
4145
+ /** What the service did with a report. */
4146
+ export type AssistantTurnTimingsReceipt = {
4147
+ __typename?: 'AssistantTurnTimingsReceipt';
4148
+ /** Turns recorded. */
4149
+ accepted: Scalars['Int']['output'];
4150
+ /** This nonce was already recorded; nothing was recorded again. */
4151
+ duplicate: Scalars['Boolean']['output'];
4152
+ /** False when collection is switched off; the client should stop reporting for this page load. */
4153
+ enabled: Scalars['Boolean']['output'];
4154
+ /** The caller is over its reporting budget; nothing was recorded. */
4155
+ rateLimited: Scalars['Boolean']['output'];
4156
+ /** 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). */
4157
+ rejected: Scalars['Int']['output'];
4158
+ };
4159
+
3953
4160
  export type AthAddDrillInput = {
3954
4161
  description?: InputMaybe<Scalars['String']['input']>;
3955
4162
  durationSec?: InputMaybe<Scalars['Int']['input']>;
@@ -5233,6 +5440,8 @@ export type Board = {
5233
5440
  projectId: Scalars['String']['output'];
5234
5441
  /** Board type */
5235
5442
  type: BoardType;
5443
+ /** 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 */
5444
+ unplacedCount: Scalars['Int']['output'];
5236
5445
  /** Last update timestamp */
5237
5446
  updatedAt: Scalars['DateTime']['output'];
5238
5447
  /** Actor who last updated this board */
@@ -5246,6 +5455,8 @@ export type BoardColumn = {
5246
5455
  __typename?: 'BoardColumn';
5247
5456
  /** Parent board ID */
5248
5457
  boardId: Scalars['String']['output'];
5458
+ /** 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. */
5459
+ cards: PlanmagnetWorkItemList;
5249
5460
  /** Creation timestamp */
5250
5461
  createdAt: Scalars['DateTime']['output'];
5251
5462
  /** Unique identifier */
@@ -5266,10 +5477,19 @@ export type BoardColumn = {
5266
5477
  wipLimit?: Maybe<Scalars['Int']['output']>;
5267
5478
  };
5268
5479
 
5480
+
5481
+ /** A column within a board representing a workflow stage. */
5482
+ export type BoardColumnCardsArgs = {
5483
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
5484
+ };
5485
+
5269
5486
  export enum BoardColumnType {
5487
+ Backlog = 'BACKLOG',
5270
5488
  Custom = 'CUSTOM',
5271
5489
  Done = 'DONE',
5272
5490
  InProgress = 'IN_PROGRESS',
5491
+ Review = 'REVIEW',
5492
+ Testing = 'TESTING',
5273
5493
  Todo = 'TODO'
5274
5494
  }
5275
5495
 
@@ -11880,6 +12100,7 @@ export type ConversationMembership = {
11880
12100
  createdAt: Scalars['DateTime']['output'];
11881
12101
  customAvatar?: Maybe<Scalars['String']['output']>;
11882
12102
  customTitle?: Maybe<Scalars['String']['output']>;
12103
+ displayName: Scalars['String']['output'];
11883
12104
  id: Scalars['ID']['output'];
11884
12105
  invitedBy?: Maybe<Scalars['ID']['output']>;
11885
12106
  isMuted: Scalars['Boolean']['output'];
@@ -14449,9 +14670,13 @@ export type CreateDashboardEmbedPolicyInput = {
14449
14670
  allowedParentOrigins: Array<Scalars['String']['input']>;
14450
14671
  dashboardId: Scalars['ID']['input'];
14451
14672
  expiresAt?: InputMaybe<Scalars['DateTime']['input']>;
14452
- /** Publish-time presentation options (BOFF-5735). Omitted fields take the defaults: LIGHT theme, no title header, attribution footer on. */
14673
+ /** 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. */
14453
14674
  presentationTheme?: InputMaybe<DashboardEmbedTheme>;
14454
14675
  sessionTtlSeconds?: InputMaybe<Scalars['Int']['input']>;
14676
+ /**
14677
+ * Ignored. Every embed always shows the "Powered by BigConsole" footer. Accepted only so older clients that still send it keep working.
14678
+ * @deprecated Embeds always show the BigConsole footer; this setting is ignored.
14679
+ */
14455
14680
  showBrandingFooter?: InputMaybe<Scalars['Boolean']['input']>;
14456
14681
  showDashboardTitle?: InputMaybe<Scalars['Boolean']['input']>;
14457
14682
  };
@@ -14609,16 +14834,21 @@ export type CreateDisposableWorkspaceInput = {
14609
14834
  };
14610
14835
 
14611
14836
  export type CreateDriverInput = {
14837
+ baseSalary?: InputMaybe<Scalars['Float']['input']>;
14838
+ bonusYtd?: InputMaybe<Scalars['Float']['input']>;
14612
14839
  certifications?: InputMaybe<Scalars['JSON']['input']>;
14613
14840
  context?: InputMaybe<ContextInput>;
14614
14841
  currentLocation?: InputMaybe<Scalars['JSON']['input']>;
14615
14842
  email?: InputMaybe<Scalars['String']['input']>;
14616
14843
  employeeId: Scalars['String']['input'];
14617
14844
  firstName: Scalars['String']['input'];
14845
+ hireDate?: InputMaybe<Scalars['DateTime']['input']>;
14618
14846
  lastName: Scalars['String']['input'];
14619
14847
  licenseClass?: InputMaybe<Scalars['String']['input']>;
14620
14848
  licenseExpiry?: InputMaybe<Scalars['DateTime']['input']>;
14621
14849
  licenseNumber?: InputMaybe<Scalars['String']['input']>;
14850
+ notes?: InputMaybe<Scalars['String']['input']>;
14851
+ payCurrency?: InputMaybe<Scalars['String']['input']>;
14622
14852
  performanceMetrics?: InputMaybe<Scalars['JSON']['input']>;
14623
14853
  phone?: InputMaybe<Scalars['String']['input']>;
14624
14854
  rating?: InputMaybe<Scalars['Float']['input']>;
@@ -15591,6 +15821,8 @@ export type CreateHeadshotmarketingSocialAccountInput = {
15591
15821
  /** When set to WEBHOOK, publish/schedule perform a real HTTP POST to webhookUrl. */
15592
15822
  deliveryMode?: InputMaybe<HeadshotmarketingSocialAccountDeliveryMode>;
15593
15823
  followerCount?: InputMaybe<Scalars['Int']['input']>;
15824
+ /** 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. */
15825
+ integrationConnectionId?: InputMaybe<Scalars['ID']['input']>;
15594
15826
  metadata?: InputMaybe<Scalars['JSON']['input']>;
15595
15827
  platform: HeadshotmarketingSocialPlatform;
15596
15828
  platformAccountId: Scalars['String']['input'];
@@ -17552,9 +17784,9 @@ export type CreateVibeInput = {
17552
17784
  };
17553
17785
 
17554
17786
  export type CreateVibecontrolsAgentInput = {
17555
- /** Auth-svc App clientId (for display/reference) */
17787
+ /** Auth-svc App clientId. Server-managed like `appId`: a non-null value is rejected with `BAD_USER_INPUT`. */
17556
17788
  appClientId?: InputMaybe<Scalars['String']['input']>;
17557
- /** Linked auth-svc App ID (OAuth2 identity for gateway access) */
17789
+ /** 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. */
17558
17790
  appId?: InputMaybe<Scalars['String']['input']>;
17559
17791
  architecture: Scalars['String']['input'];
17560
17792
  configuration?: InputMaybe<Scalars['JSON']['input']>;
@@ -19088,6 +19320,10 @@ export type DashboardEmbedPolicy = {
19088
19320
  presentationTheme: DashboardEmbedTheme;
19089
19321
  revokedAt?: Maybe<Scalars['DateTime']['output']>;
19090
19322
  sessionTtlSeconds: Scalars['Int']['output'];
19323
+ /**
19324
+ * 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.
19325
+ * @deprecated Embeds always show the BigConsole footer; this setting is ignored.
19326
+ */
19091
19327
  showBrandingFooter: Scalars['Boolean']['output'];
19092
19328
  showDashboardTitle: Scalars['Boolean']['output'];
19093
19329
  status: DashboardEmbedPolicyStatus;
@@ -20188,6 +20424,12 @@ export type DeleteMessagePayload = {
20188
20424
  success: Scalars['Boolean']['output'];
20189
20425
  };
20190
20426
 
20427
+ export type DeleteMyAssistantConversationPayload = {
20428
+ __typename?: 'DeleteMyAssistantConversationPayload';
20429
+ conversation?: Maybe<AssistantHistoryConversation>;
20430
+ outcome: AssistantHistoryDeleteOutcome;
20431
+ };
20432
+
20191
20433
  export enum DeliveryChannelType {
20192
20434
  Email = 'EMAIL',
20193
20435
  Slack = 'SLACK',
@@ -20299,14 +20541,16 @@ export type DependencyTriggeredUpdate = {
20299
20541
  triggeredBy: Scalars['ID']['output'];
20300
20542
  };
20301
20543
 
20544
+ /** 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. */
20302
20545
  export enum DependencyType {
20303
- BlockedBy = 'BLOCKED_BY',
20304
- Blocks = 'BLOCKS',
20305
- CausedBy = 'CAUSED_BY',
20306
- Causes = 'CAUSES',
20307
- DuplicatedBy = 'DUPLICATED_BY',
20308
- Duplicates = 'DUPLICATES',
20309
- RelatesTo = 'RELATES_TO'
20546
+ /** The successor finishes after the predecessor finishes. */
20547
+ FinishToFinish = 'FINISH_TO_FINISH',
20548
+ /** The successor starts after the predecessor finishes. The usual case. */
20549
+ FinishToStart = 'FINISH_TO_START',
20550
+ /** The successor finishes after the predecessor starts. Rare. */
20551
+ StartToFinish = 'START_TO_FINISH',
20552
+ /** The successor starts after the predecessor starts. */
20553
+ StartToStart = 'START_TO_START'
20310
20554
  }
20311
20555
 
20312
20556
  export enum DeploymentEnvironment {
@@ -23284,6 +23528,37 @@ export type ExecutePipelineInput = {
23284
23528
  pipelineId: Scalars['ID']['input'];
23285
23529
  };
23286
23530
 
23531
+ /** 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. */
23532
+ export type ExecuteStepInput = {
23533
+ nodeId: Scalars['String']['input'];
23534
+ sourceRunId?: InputMaybe<Scalars['ID']['input']>;
23535
+ version: Scalars['String']['input'];
23536
+ workflowKey: Scalars['String']['input'];
23537
+ };
23538
+
23539
+ /** 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. */
23540
+ export type ExecuteStepPlan = {
23541
+ __typename?: 'ExecuteStepPlan';
23542
+ blockers: Array<Scalars['String']['output']>;
23543
+ executeNodeIds: Array<Scalars['String']['output']>;
23544
+ initialNodeIds: Array<Scalars['String']['output']>;
23545
+ pinnedNodeIds: Array<Scalars['String']['output']>;
23546
+ reusedNodeIds: Array<Scalars['String']['output']>;
23547
+ sourceRunId?: Maybe<Scalars['ID']['output']>;
23548
+ targetNodeId: Scalars['String']['output'];
23549
+ };
23550
+
23551
+ /** 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. */
23552
+ export type ExecuteStepResponse = {
23553
+ __typename?: 'ExecuteStepResponse';
23554
+ plan: ExecuteStepPlan;
23555
+ runId: Scalars['ID']['output'];
23556
+ status: Scalars['String']['output'];
23557
+ triggerNodeId: Scalars['String']['output'];
23558
+ version: Scalars['String']['output'];
23559
+ workflowKey: Scalars['String']['output'];
23560
+ };
23561
+
23287
23562
  export type ExecuteSyncResult = {
23288
23563
  __typename?: 'ExecuteSyncResult';
23289
23564
  eventsAdded?: Maybe<Scalars['Int']['output']>;
@@ -23990,7 +24265,7 @@ export type FarmInsight = {
23990
24265
  /** A product feature request capturing ideas, customer feedback, and implementation priority. */
23991
24266
  export type FeatureRequest = {
23992
24267
  __typename?: 'FeatureRequest';
23993
- /** Business value rating (1-10) */
24268
+ /** Business value score, a whole number from 0 to 100 */
23994
24269
  businessValue?: Maybe<Scalars['Int']['output']>;
23995
24270
  /** Competitors offering this feature */
23996
24271
  competitors: Array<Competitor>;
@@ -24000,10 +24275,16 @@ export type FeatureRequest = {
24000
24275
  createdAt: Scalars['DateTime']['output'];
24001
24276
  /** Actor who created this request */
24002
24277
  createdBy: Scalars['String']['output'];
24278
+ /** Why it was declined (set by planmagnetDeclineFeatureRequest) */
24279
+ declineReason?: Maybe<Scalars['String']['output']>;
24003
24280
  /** Soft-delete timestamp */
24004
24281
  deletedAt?: Maybe<Scalars['DateTime']['output']>;
24005
24282
  /** Detailed description */
24006
24283
  description?: Maybe<Scalars['String']['output']>;
24284
+ /** The original this request was merged into, when it still exists */
24285
+ duplicateOf?: Maybe<FeatureRequest>;
24286
+ /** The original this request was merged into (status DUPLICATE) */
24287
+ duplicateOfId?: Maybe<Scalars['String']['output']>;
24007
24288
  /** Effort estimate (T-shirt: XS, S, M, L, XL) */
24008
24289
  effortEstimate?: Maybe<Scalars['String']['output']>;
24009
24290
  /** Unique identifier */
@@ -24014,8 +24295,14 @@ export type FeatureRequest = {
24014
24295
  onBehalfOf?: Maybe<Scalars['String']['output']>;
24015
24296
  /** Priority score (computed from votes and business value) */
24016
24297
  priorityScore?: Maybe<Scalars['Float']['output']>;
24298
+ /** The linked Product, when set. */
24299
+ product?: Maybe<Product>;
24300
+ /** Linked strategic Product (BOFF-8045). Null when never attached. */
24301
+ productId?: Maybe<Scalars['String']['output']>;
24017
24302
  /** Parent project ID */
24018
24303
  projectId?: Maybe<Scalars['String']['output']>;
24304
+ /** Hidden from the triage queue until this moment (set by planmagnetSnoozeFeatureRequest); still SUBMITTED */
24305
+ snoozedUntil?: Maybe<Scalars['DateTime']['output']>;
24019
24306
  /** Current status */
24020
24307
  status: FeatureRequestStatus;
24021
24308
  /** Submitter actor ID */
@@ -24024,12 +24311,18 @@ export type FeatureRequest = {
24024
24311
  tags: Array<Scalars['String']['output']>;
24025
24312
  /** Feature title */
24026
24313
  title: Scalars['String']['output'];
24314
+ /** When accept, decline or merge decided this request */
24315
+ triagedAt?: Maybe<Scalars['DateTime']['output']>;
24316
+ /** Who accepted, declined or merged this request */
24317
+ triagedBy?: Maybe<Scalars['String']['output']>;
24027
24318
  /** Last update timestamp */
24028
24319
  updatedAt: Scalars['DateTime']['output'];
24029
24320
  /** Actor who last updated this request */
24030
24321
  updatedBy?: Maybe<Scalars['String']['output']>;
24031
24322
  /** Total vote count */
24032
24323
  voteCount: Scalars['Int']['output'];
24324
+ /** Rank by votes among the workspace's live requests (1 = most votes; ties share a rank) */
24325
+ voteRank: Scalars['Int']['output'];
24033
24326
  /** Votes on this feature */
24034
24327
  votes: Array<FeatureVote>;
24035
24328
  /** Linked work item ID */
@@ -31449,6 +31742,8 @@ export type HeadshotmarketingAdPlatformConnection = {
31449
31742
  __typename?: 'HeadshotmarketingAdPlatformConnection';
31450
31743
  createdAt: Scalars['DateTime']['output'];
31451
31744
  id: Scalars['ID']['output'];
31745
+ /** 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. */
31746
+ integrationConnectionId?: Maybe<Scalars['String']['output']>;
31452
31747
  metadata?: Maybe<Scalars['JSON']['output']>;
31453
31748
  mode: HeadshotmarketingAdConnectionMode;
31454
31749
  platform: HeadshotmarketingAdPlatform;
@@ -31599,10 +31894,12 @@ export type HeadshotmarketingAttributionCredit = {
31599
31894
 
31600
31895
  export enum HeadshotmarketingAttributionModel {
31601
31896
  FirstTouch = 'FIRST_TOUCH',
31602
- Linear = 'LINEAR'
31897
+ Linear = 'LINEAR',
31898
+ PositionBased = 'POSITION_BASED',
31899
+ TimeDecay = 'TIME_DECAY'
31603
31900
  }
31604
31901
 
31605
- /** 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. */
31902
+ /** 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. */
31606
31903
  export type HeadshotmarketingAttributionReport = {
31607
31904
  __typename?: 'HeadshotmarketingAttributionReport';
31608
31905
  contactId?: Maybe<Scalars['ID']['output']>;
@@ -31612,6 +31909,12 @@ export type HeadshotmarketingAttributionReport = {
31612
31909
  convertedAt: Scalars['DateTime']['output'];
31613
31910
  firstTouch: HeadshotmarketingAttributionSplit;
31614
31911
  linear: HeadshotmarketingAttributionSplit;
31912
+ /** U-shaped split: 40% first touch, 40% last touch, 20% shared across the middle. */
31913
+ positionBased: HeadshotmarketingAttributionSplit;
31914
+ /** Exponential recency-weighted split (weight = 0.5 ^ (daysBefore / halfLife)). */
31915
+ timeDecay: HeadshotmarketingAttributionSplit;
31916
+ /** Half-life in days used to compute the time-decay split (default 7). */
31917
+ timeDecayHalfLifeDays: Scalars['Float']['output'];
31615
31918
  touchpointCount: Scalars['Int']['output'];
31616
31919
  };
31617
31920
 
@@ -32165,9 +32468,15 @@ export type HeadshotmarketingCreateAiToolInput = {
32165
32468
  };
32166
32469
 
32167
32470
  export type HeadshotmarketingCreateAdPlatformConnectionInput = {
32471
+ /** 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. */
32472
+ accessToken?: InputMaybe<Scalars['String']['input']>;
32473
+ /** 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. */
32474
+ integrationConnectionId?: InputMaybe<Scalars['ID']['input']>;
32168
32475
  metadata?: InputMaybe<Scalars['JSON']['input']>;
32169
32476
  mode?: InputMaybe<HeadshotmarketingAdConnectionMode>;
32170
32477
  platform: HeadshotmarketingAdPlatform;
32478
+ refreshToken?: InputMaybe<Scalars['String']['input']>;
32479
+ tokenExpiresAt?: InputMaybe<Scalars['DateTime']['input']>;
32171
32480
  webhookUrl?: InputMaybe<Scalars['String']['input']>;
32172
32481
  };
32173
32482
 
@@ -33077,6 +33386,56 @@ export type HeadshotmarketingPipelineStageOverview = {
33077
33386
  totalValue: Scalars['Float']['output'];
33078
33387
  };
33079
33388
 
33389
+ /** 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. */
33390
+ export type HeadshotmarketingPublicLandingPage = {
33391
+ __typename?: 'HeadshotmarketingPublicLandingPage';
33392
+ /** Author-provided custom CSS injected when rendering the page */
33393
+ customCss?: Maybe<Scalars['String']['output']>;
33394
+ /** Author-provided custom JS injected when rendering the page */
33395
+ customJs?: Maybe<Scalars['String']['output']>;
33396
+ /** Optional page description / meta description fallback */
33397
+ description?: Maybe<Scalars['String']['output']>;
33398
+ /** Favicon URL */
33399
+ faviconUrl?: Maybe<Scalars['String']['output']>;
33400
+ /** Open Graph image URL */
33401
+ ogImageUrl?: Maybe<Scalars['String']['output']>;
33402
+ /** When the page was published */
33403
+ publishedAt?: Maybe<Scalars['DateTime']['output']>;
33404
+ /** Ordered, visible sections that make up the page body */
33405
+ sections: Array<HeadshotmarketingPublicLandingPageSection>;
33406
+ /** SEO meta description */
33407
+ seoDescription?: Maybe<Scalars['String']['output']>;
33408
+ /** SEO <title> override */
33409
+ seoTitle?: Maybe<Scalars['String']['output']>;
33410
+ /** URL slug the page is published under */
33411
+ slug: Scalars['String']['output'];
33412
+ /** Page title (used for the document/window title) */
33413
+ title: Scalars['String']['output'];
33414
+ };
33415
+
33416
+ /** A single visible section of a published landing page, for the public renderer. Omits workspace-internal fields (workspaceId, landingPageId, metadata). */
33417
+ export type HeadshotmarketingPublicLandingPageSection = {
33418
+ __typename?: 'HeadshotmarketingPublicLandingPageSection';
33419
+ /** Background color */
33420
+ backgroundColor?: Maybe<Scalars['String']['output']>;
33421
+ /** Background image URL */
33422
+ backgroundImageUrl?: Maybe<Scalars['String']['output']>;
33423
+ /** Type-specific content configuration */
33424
+ content?: Maybe<Scalars['JSON']['output']>;
33425
+ /** Unique identifier (stable key for the renderer) */
33426
+ id: Scalars['ID']['output'];
33427
+ /** Presentation settings */
33428
+ settings?: Maybe<Scalars['JSON']['output']>;
33429
+ /** Position of the section within the page (ascending) */
33430
+ sortOrder: Scalars['Int']['output'];
33431
+ /** Section subtitle */
33432
+ subtitle?: Maybe<Scalars['String']['output']>;
33433
+ /** Section title */
33434
+ title?: Maybe<Scalars['String']['output']>;
33435
+ /** Section type (HERO, FEATURES, CTA, …) */
33436
+ type: HeadshotmarketingLandingPageSectionType;
33437
+ };
33438
+
33080
33439
  export type HeadshotmarketingRecordAdMetricsSnapshotInput = {
33081
33440
  adCampaignId: Scalars['ID']['input'];
33082
33441
  clicks?: InputMaybe<Scalars['Int']['input']>;
@@ -33144,6 +33503,8 @@ export type HeadshotmarketingSeoAudit = {
33144
33503
  metadata?: Maybe<Scalars['JSON']['output']>;
33145
33504
  overallScore?: Maybe<Scalars['Float']['output']>;
33146
33505
  pageTitle?: Maybe<Scalars['String']['output']>;
33506
+ /** Number of pages analysed (1 for a single-page audit, >1 for a crawl). */
33507
+ pagesCrawled?: Maybe<Scalars['Int']['output']>;
33147
33508
  performanceScore?: Maybe<Scalars['Float']['output']>;
33148
33509
  runBy: Scalars['ID']['output'];
33149
33510
  seoScore?: Maybe<Scalars['Float']['output']>;
@@ -33287,6 +33648,8 @@ export type HeadshotmarketingSocialAccount = {
33287
33648
  followerCount?: Maybe<Scalars['Int']['output']>;
33288
33649
  /** Unique identifier */
33289
33650
  id: Scalars['ID']['output'];
33651
+ /** 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. */
33652
+ integrationConnectionId?: Maybe<Scalars['String']['output']>;
33290
33653
  /** Flexible key-value metadata */
33291
33654
  metadata?: Maybe<Scalars['JSON']['output']>;
33292
33655
  /** Social media platform */
@@ -33307,8 +33670,9 @@ export type HeadshotmarketingSocialAccount = {
33307
33670
  workspaceId: Scalars['ID']['output'];
33308
33671
  };
33309
33672
 
33310
- /** 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. */
33673
+ /** 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. */
33311
33674
  export enum HeadshotmarketingSocialAccountDeliveryMode {
33675
+ Api = 'API',
33312
33676
  Internal = 'INTERNAL',
33313
33677
  Webhook = 'WEBHOOK'
33314
33678
  }
@@ -38899,6 +39263,7 @@ export type HousingVistaOffer = {
38899
39263
  counterAmount?: Maybe<Scalars['Float']['output']>;
38900
39264
  createdAt: Scalars['DateTime']['output'];
38901
39265
  currency: Scalars['String']['output'];
39266
+ expiresAt?: Maybe<Scalars['DateTime']['output']>;
38902
39267
  id: Scalars['ID']['output'];
38903
39268
  notes?: Maybe<Scalars['String']['output']>;
38904
39269
  property: HousingVistaProperty;
@@ -38923,6 +39288,7 @@ export enum HousingVistaOfferResponseAction {
38923
39288
  export enum HousingVistaOfferStatus {
38924
39289
  Accepted = 'accepted',
38925
39290
  Countered = 'countered',
39291
+ Expired = 'expired',
38926
39292
  Rejected = 'rejected',
38927
39293
  Submitted = 'submitted',
38928
39294
  Withdrawn = 'withdrawn'
@@ -39164,6 +39530,7 @@ export type HousingVistaShortlist = {
39164
39530
  export type HousingVistaSubmitOfferInput = {
39165
39531
  amount: Scalars['Float']['input'];
39166
39532
  currency?: InputMaybe<Scalars['String']['input']>;
39533
+ expiresAt?: InputMaybe<Scalars['DateTime']['input']>;
39167
39534
  notes?: InputMaybe<Scalars['String']['input']>;
39168
39535
  propertyId: Scalars['ID']['input'];
39169
39536
  };
@@ -41329,6 +41696,7 @@ export type InvalidateDataSinkCacheResult = {
41329
41696
 
41330
41697
  export type InventoryFilterInput = {
41331
41698
  cargoItemId?: InputMaybe<Scalars['ID']['input']>;
41699
+ inventoryItemId?: InputMaybe<Scalars['ID']['input']>;
41332
41700
  locationId?: InputMaybe<Scalars['ID']['input']>;
41333
41701
  lowStock?: InputMaybe<Scalars['Boolean']['input']>;
41334
41702
  search?: InputMaybe<Scalars['String']['input']>;
@@ -46869,11 +47237,14 @@ export type MtwCustomer = {
46869
47237
 
46870
47238
  export type MtwCustomerStats = {
46871
47239
  __typename?: 'MtwCustomerStats';
46872
- active: Scalars['Int']['output'];
46873
- avgRating: Scalars['Float']['output'];
47240
+ /** Unavailable because customers have no lifecycle status field. */
47241
+ active?: Maybe<Scalars['Int']['output']>;
47242
+ /** Average rating, or null when no customer has a rating. */
47243
+ avgRating?: Maybe<Scalars['Float']['output']>;
46874
47244
  b2b: Scalars['Int']['output'];
46875
47245
  b2c: Scalars['Int']['output'];
46876
- inactive: Scalars['Int']['output'];
47246
+ /** Unavailable because customers have no lifecycle status field. */
47247
+ inactive?: Maybe<Scalars['Int']['output']>;
46877
47248
  total: Scalars['Int']['output'];
46878
47249
  };
46879
47250
 
@@ -46994,6 +47365,8 @@ export type MtwDemandForecastVariance = {
46994
47365
 
46995
47366
  export type MtwDriver = {
46996
47367
  __typename?: 'MtwDriver';
47368
+ baseSalary?: Maybe<Scalars['Float']['output']>;
47369
+ bonusYtd?: Maybe<Scalars['Float']['output']>;
46997
47370
  certifications?: Maybe<Scalars['JSON']['output']>;
46998
47371
  context?: Maybe<OperationContext>;
46999
47372
  createdAt: Scalars['DateTime']['output'];
@@ -47003,16 +47376,25 @@ export type MtwDriver = {
47003
47376
  email?: Maybe<Scalars['String']['output']>;
47004
47377
  employeeId: Scalars['String']['output'];
47005
47378
  firstName: Scalars['String']['output'];
47379
+ hireDate?: Maybe<Scalars['DateTime']['output']>;
47006
47380
  id: Scalars['ID']['output'];
47007
47381
  lastName: Scalars['String']['output'];
47008
47382
  licenseClass?: Maybe<Scalars['String']['output']>;
47009
47383
  licenseExpiry?: Maybe<Scalars['DateTime']['output']>;
47010
47384
  licenseNumber?: Maybe<Scalars['String']['output']>;
47385
+ /** Free-text HR/performance notes. Encrypted at rest. */
47386
+ notes?: Maybe<Scalars['String']['output']>;
47011
47387
  onBehalfOf: Scalars['String']['output'];
47388
+ /** Set and in the future means the driver is currently on leave. Independent of the operational DriverStatus. */
47389
+ onLeaveUntil?: Maybe<Scalars['DateTime']['output']>;
47390
+ payCurrency?: Maybe<Scalars['String']['output']>;
47012
47391
  performanceMetrics?: Maybe<Scalars['JSON']['output']>;
47013
47392
  phone?: Maybe<Scalars['String']['output']>;
47014
47393
  rating?: Maybe<Scalars['Float']['output']>;
47015
47394
  status: DriverStatus;
47395
+ terminatedAt?: Maybe<Scalars['DateTime']['output']>;
47396
+ /** Reason recorded when the driver was dismissed/terminated. Encrypted at rest. */
47397
+ terminationReason?: Maybe<Scalars['String']['output']>;
47016
47398
  updatedAt: Scalars['DateTime']['output'];
47017
47399
  updatedBy?: Maybe<Scalars['String']['output']>;
47018
47400
  userId?: Maybe<Scalars['String']['output']>;
@@ -47244,6 +47626,12 @@ export type MtwInventoryTransaction = {
47244
47626
  workspaceId: Scalars['ID']['output'];
47245
47627
  };
47246
47628
 
47629
+ export type MtwInventoryTransferResult = {
47630
+ __typename?: 'MtwInventoryTransferResult';
47631
+ destination: MtwInventoryItem;
47632
+ source: MtwInventoryItem;
47633
+ };
47634
+
47247
47635
  /** An estimate from the caller's own inputs — not a quote from anyone. */
47248
47636
  export type MtwOwnFleetEstimate = {
47249
47637
  __typename?: 'MtwOwnFleetEstimate';
@@ -47829,6 +48217,8 @@ export type Mutation = {
47829
48217
  assignWorkspaceQuota: WorkspaceQuotaAssignment;
47830
48218
  /** 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. */
47831
48219
  assignWorkspaceQuotas: Array<WorkspaceQuotaAssignment>;
48220
+ /** Run one GraphQL mutation as the owner of an admin Take-action session the capability names. */
48221
+ assistantSessionExecute: AssistantSessionRelayResult;
47832
48222
  athAddDrill: AthDrill;
47833
48223
  athAddMember: AthMember;
47834
48224
  /** 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. */
@@ -48310,9 +48700,9 @@ export type Mutation = {
48310
48700
  connectHealthyBowlAccountingIntegration: HealthyBowlAccountingIntegration;
48311
48701
  /** Send a natural-language message (with optional current spec + history) to the conversational agent and receive an updated spec plus a reply. */
48312
48702
  conversationalDashboardEdit: ConversationalEditResult;
48313
- /** 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"`. */
48703
+ /** 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. */
48314
48704
  conversationsEraseSubject: ConversationsEraseResult;
48315
- /** 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. */
48705
+ /** 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. */
48316
48706
  conversationsExportSubject: Scalars['JSON']['output'];
48317
48707
  /** Convert a lead into a deal */
48318
48708
  convertHeadshotmarketingLead: HeadshotmarketingDeal;
@@ -48951,7 +49341,10 @@ export type Mutation = {
48951
49341
  deleteArtifact: MutationResponse;
48952
49342
  deleteAsset: Scalars['Boolean']['output'];
48953
49343
  deleteAssetAssignment: Scalars['Boolean']['output'];
48954
- /** Delete one of my assistant chats and its messages. */
49344
+ /**
49345
+ * Delete one of my assistant chats and its messages. Its content is purged permanently 30 days later (unless under a legal hold).
49346
+ * @deprecated Use the my* assistant-history fields (BOFF-7335).
49347
+ */
48955
49348
  deleteAssistantConversation: Scalars['Boolean']['output'];
48956
49349
  deleteAvailabilityRule: Scalars['Boolean']['output'];
48957
49350
  /** Delete a batch download and its archive */
@@ -49205,6 +49598,8 @@ export type Mutation = {
49205
49598
  deleteMetadataByKey: Scalars['Boolean']['output'];
49206
49599
  deleteMetric: Scalars['Boolean']['output'];
49207
49600
  deleteModifiedInstance: Scalars['Boolean']['output'];
49601
+ /** 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. */
49602
+ deleteMyAssistantConversation: DeleteMyAssistantConversationPayload;
49208
49603
  /** Soft-delete one of the calling user's custom views. */
49209
49604
  deleteMyNavView: Scalars['Boolean']['output'];
49210
49605
  deleteNode: Scalars['Boolean']['output'];
@@ -49558,7 +49953,9 @@ export type Mutation = {
49558
49953
  executeScheduledPrompt: ScheduledPromptResult;
49559
49954
  /** Execute a button via share token (PUBLIC — no auth required). Only works if the share link has EXECUTE permission. */
49560
49955
  executeSharedVibeDeckButton: VibeDeckButtonExecution;
49561
- /** Execute one approved transform in an isolated, limit-enforced worker. */
49956
+ /** 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. */
49957
+ executeStep: ExecuteStepResponse;
49958
+ /** 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. */
49562
49959
  executeTransform: TransformRuntimeResult;
49563
49960
  executeVibeDeckButton: VibeDeckButtonExecution;
49564
49961
  /** Execute a workflow. If an external FluidGrids workflow exists, triggers real execution via wspace-workflow-svc. Otherwise performs mock execution. */
@@ -49588,6 +49985,8 @@ export type Mutation = {
49588
49985
  exportWorkspaceResourceConfig: WorkspaceResourceConfigExport;
49589
49986
  /** Extend an existing file lock */
49590
49987
  extendFileLock: FileLock;
49988
+ /** 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. */
49989
+ extendMyAssistantSandboxTTL: Sandbox;
49591
49990
  extendSandboxTTL: Sandbox;
49592
49991
  /** Host-only (must own the listing behind the booking): files a claim against a COMPLETED booking. */
49593
49992
  fileGgnomadDamageClaim: GgnomadDamageClaim;
@@ -49801,7 +50200,7 @@ export type Mutation = {
49801
50200
  headshotmarketingRemoveLandingPageSection: Scalars['Boolean']['output'];
49802
50201
  /** Reorder sections within a landing page */
49803
50202
  headshotmarketingReorderLandingPageSections: HeadshotmarketingLandingPage;
49804
- /** Run an SEO audit for a given URL (creates and executes an audit) */
50203
+ /** 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. */
49805
50204
  headshotmarketingRunSEOAudit: HeadshotmarketingSeoAudit;
49806
50205
  /** 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. */
49807
50206
  headshotmarketingSendAgentMessage: HeadshotmarketingAgentTurn;
@@ -50199,6 +50598,8 @@ export type Mutation = {
50199
50598
  linkDataSinkToWorkflow: DataSinkWorkflowLink;
50200
50599
  /** 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. */
50201
50600
  linkEntityToVibe: VibeLinkedEntity;
50601
+ /** 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. */
50602
+ linkHeadshotmarketingSocialAccountConnection: HeadshotmarketingSocialAccount;
50202
50603
  /** 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. */
50203
50604
  linkHealthyBowlHarvestToInventory: HarvestRecord;
50204
50605
  /** 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. */
@@ -50406,6 +50807,16 @@ export type Mutation = {
50406
50807
  /** Place a lot of produce/milk into a bin; records an opening IN movement of the initial quantity. */
50407
50808
  placeHealthyBowlStorageLot: HealthyBowlStorageLot;
50408
50809
  planMultiModalShipment: MtwShipment;
50810
+ /** Triage: accept an open request (SUBMITTED or UNDER_REVIEW) as UNDER_REVIEW or PLANNED */
50811
+ planmagnetAcceptFeatureRequest: FeatureRequest;
50812
+ /** Add members to a team. Re-adding an existing (live) member is a no-op, not an error. */
50813
+ planmagnetAddTeamMembers: Team;
50814
+ /** 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. */
50815
+ planmagnetAddTeamProjects: Team;
50816
+ /** Post a comment on a work item */
50817
+ planmagnetAddWorkItemComment: PlanmagnetWorkItemComment;
50818
+ /** 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. */
50819
+ planmagnetAddWorkItemsToRelease: Release;
50409
50820
  /** Add work items to a sprint */
50410
50821
  planmagnetAddWorkItemsToSprint: Sprint;
50411
50822
  /** 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. */
@@ -50416,6 +50827,8 @@ export type Mutation = {
50416
50827
  planmagnetApproveBudget: PlanmagnetBudget;
50417
50828
  /** Approve a submitted timesheet */
50418
50829
  planmagnetApproveTimesheet: PlanmagnetTimesheet;
50830
+ /** Sets archivedAt = now(). A no-op (still succeeds) if already archived. */
50831
+ planmagnetArchiveProduct: Product;
50419
50832
  /** Assign a work item to an actor */
50420
50833
  planmagnetAssignWorkItem: WorkItem;
50421
50834
  /** Bulk update multiple work items at once */
@@ -50449,6 +50862,7 @@ export type Mutation = {
50449
50862
  planmagnetCreateObjective: PlanmagnetObjective;
50450
50863
  /** Create a new portfolio */
50451
50864
  planmagnetCreatePortfolio: Portfolio;
50865
+ planmagnetCreateProduct: Product;
50452
50866
  /** Create a new program */
50453
50867
  planmagnetCreateProgram: Program;
50454
50868
  /** Create a new project */
@@ -50467,6 +50881,8 @@ export type Mutation = {
50467
50881
  planmagnetCreateRoadmapItem: RoadmapItem;
50468
50882
  /** Create a new sprint */
50469
50883
  planmagnetCreateSprint: Sprint;
50884
+ /** Create a new team. */
50885
+ planmagnetCreateTeam: Team;
50470
50886
  /** Create a template from an existing project */
50471
50887
  planmagnetCreateTemplateFromProject: ProjectTemplate;
50472
50888
  /** Create a new time entry */
@@ -50475,6 +50891,8 @@ export type Mutation = {
50475
50891
  planmagnetCreateTimesheet: PlanmagnetTimesheet;
50476
50892
  /** Create a new work item */
50477
50893
  planmagnetCreateWorkItem: WorkItem;
50894
+ /** Triage: decline an open request, with the reason */
50895
+ planmagnetDeclineFeatureRequest: FeatureRequest;
50478
50896
  /** Delete an automation rule */
50479
50897
  planmagnetDeleteAutomationRule: Scalars['Boolean']['output'];
50480
50898
  /** Delete a board */
@@ -50504,6 +50922,8 @@ export type Mutation = {
50504
50922
  planmagnetDeleteObjective: Scalars['Boolean']['output'];
50505
50923
  /** Delete a portfolio */
50506
50924
  planmagnetDeletePortfolio: Scalars['Boolean']['output'];
50925
+ /** Soft-delete. Every linked roadmap/release/feature request has its productId cleared, never deleted; every ProductObjectiveLink row is removed. */
50926
+ planmagnetDeleteProduct: Scalars['Boolean']['output'];
50507
50927
  /** Soft-delete a program */
50508
50928
  planmagnetDeleteProgram: Scalars['Boolean']['output'];
50509
50929
  /** Soft-delete a project */
@@ -50522,12 +50942,22 @@ export type Mutation = {
50522
50942
  planmagnetDeleteRoadmapItem: Scalars['Boolean']['output'];
50523
50943
  /** Soft-delete a sprint */
50524
50944
  planmagnetDeleteSprint: Scalars['Boolean']['output'];
50945
+ /** 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. */
50946
+ planmagnetDeleteTeam: Scalars['Boolean']['output'];
50525
50947
  /** Delete a time entry */
50526
50948
  planmagnetDeleteTimeEntry: Scalars['Boolean']['output'];
50527
50949
  /** Soft-delete a work item */
50528
50950
  planmagnetDeleteWorkItem: Scalars['Boolean']['output'];
50951
+ /** Delete your own comment (only its author can) */
50952
+ planmagnetDeleteWorkItemComment: Scalars['Boolean']['output'];
50953
+ /** Change the text of your own comment (only its author can) */
50954
+ planmagnetEditWorkItemComment: PlanmagnetWorkItemComment;
50955
+ /** Erase the person from PlanMagnet in one transaction; dryRun returns the counts and writes nothing (service actors only) */
50956
+ planmagnetEraseSubject: PlanmagnetEraseResult;
50529
50957
  /** 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. */
50530
50958
  planmagnetExecuteAutomationRule: PlanmagnetAutomationExecution;
50959
+ /** Everything PlanMagnet holds that names the person, per table, deleted rows included (service actors only) */
50960
+ planmagnetExportSubject: Scalars['JSON']['output'];
50531
50961
  /** 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. */
50532
50962
  planmagnetExportToExternal: PlanmagnetSyncResult;
50533
50963
  /** 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. */
@@ -50540,12 +50970,20 @@ export type Mutation = {
50540
50970
  planmagnetLinkCompetitorToFeature: FeatureRequest;
50541
50971
  planmagnetLinkDocToWorkItem: PlanmagnetDoc;
50542
50972
  planmagnetLinkKeyResultToWorkItem: PlanmagnetKeyResult;
50973
+ planmagnetLinkProductFeatureRequest: Product;
50974
+ /** *-* 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). */
50975
+ planmagnetLinkProductObjective: Product;
50976
+ planmagnetLinkProductRelease: Product;
50977
+ /** roadmapId must be a live roadmap in the same workspace, else BAD_USER_INPUT. */
50978
+ planmagnetLinkProductRoadmap: Product;
50543
50979
  /** Link a work item to an external product entity */
50544
50980
  planmagnetLinkWorkItem: WorkItemLink;
50545
50981
  /** Log an expense against a budget */
50546
50982
  planmagnetLogExpense: BudgetExpense;
50547
50983
  /** Quick log time against a work item */
50548
50984
  planmagnetLogTime: PlanmagnetTimeEntry;
50985
+ /** 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. */
50986
+ planmagnetMergeFeatureRequest: FeatureRequest;
50549
50987
  /** Move a card (work item) to a different column and/or position */
50550
50988
  planmagnetMoveCard: Board;
50551
50989
  /** Move a work item to a different status, sprint, or position */
@@ -50558,6 +50996,12 @@ export type Mutation = {
50558
50996
  planmagnetRemoveCustomFieldValue: Scalars['Boolean']['output'];
50559
50997
  /** Remove a vote from a feature request */
50560
50998
  planmagnetRemoveFeatureVote: Scalars['Boolean']['output'];
50999
+ /** Remove members from a team. */
51000
+ planmagnetRemoveTeamMembers: Team;
51001
+ /** Remove projects from a team. Work items already in an active team sprint from that project are NOT retroactively evicted — see sprint.service.ts. */
51002
+ planmagnetRemoveTeamProjects: Team;
51003
+ /** Take work items out of a release. Ids not in the release are ignored. */
51004
+ planmagnetRemoveWorkItemsFromRelease: Release;
50561
51005
  /** Remove work items from a sprint */
50562
51006
  planmagnetRemoveWorkItemsFromSprint: Sprint;
50563
51007
  /** 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. */
@@ -50572,6 +51016,8 @@ export type Mutation = {
50572
51016
  planmagnetReviewQualityGate: QualityGate;
50573
51017
  /** Set a custom field value on a work item */
50574
51018
  planmagnetSetCustomFieldValue: CustomFieldValue;
51019
+ /** Triage: hide a SUBMITTED request from the queue until a future moment (at most a year); null wakes it now */
51020
+ planmagnetSnoozeFeatureRequest: FeatureRequest;
50575
51021
  /** Start a sprint (transition to ACTIVE) */
50576
51022
  planmagnetStartSprint: Sprint;
50577
51023
  /** 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. */
@@ -50582,10 +51028,16 @@ export type Mutation = {
50582
51028
  planmagnetSuggestWorkItemBreakdown: PlanmagnetWorkItemBreakdownResult;
50583
51029
  /** Toggle an automation rule (activate/pause) */
50584
51030
  planmagnetToggleAutomationRule: PlanmagnetAutomationRule;
51031
+ /** Clears archivedAt. A no-op (still succeeds) if not archived. */
51032
+ planmagnetUnarchiveProduct: Product;
50585
51033
  /** Unlink a competitor from a feature request */
50586
51034
  planmagnetUnlinkCompetitorFromFeature: FeatureRequest;
50587
51035
  planmagnetUnlinkDocFromWorkItem: Scalars['Boolean']['output'];
50588
51036
  planmagnetUnlinkKeyResultFromWorkItem: Scalars['Boolean']['output'];
51037
+ planmagnetUnlinkProductFeatureRequest: Product;
51038
+ planmagnetUnlinkProductObjective: Scalars['Boolean']['output'];
51039
+ planmagnetUnlinkProductRelease: Product;
51040
+ planmagnetUnlinkProductRoadmap: Product;
50589
51041
  /** Remove a work item link */
50590
51042
  planmagnetUnlinkWorkItem: Scalars['Boolean']['output'];
50591
51043
  /** Update an existing automation rule */
@@ -50617,12 +51069,15 @@ export type Mutation = {
50617
51069
  planmagnetUpdateObjective: PlanmagnetObjective;
50618
51070
  /** Update an existing portfolio */
50619
51071
  planmagnetUpdatePortfolio: Portfolio;
51072
+ planmagnetUpdateProduct: Product;
50620
51073
  /** Update an existing program */
50621
51074
  planmagnetUpdateProgram: Program;
50622
51075
  /** Update an existing project */
50623
51076
  planmagnetUpdateProject: PlanmagnetProject;
50624
51077
  /** Update an existing project template */
50625
51078
  planmagnetUpdateProjectTemplate: ProjectTemplate;
51079
+ /** Change a project's workflow */
51080
+ planmagnetUpdateProjectWorkflow: PlanmagnetProjectWorkflow;
50626
51081
  /** Update an existing quality gate */
50627
51082
  planmagnetUpdateQualityGate: QualityGate;
50628
51083
  /** Update an existing release */
@@ -50635,6 +51090,8 @@ export type Mutation = {
50635
51090
  planmagnetUpdateRoadmapItem: RoadmapItem;
50636
51091
  /** Update an existing sprint */
50637
51092
  planmagnetUpdateSprint: Sprint;
51093
+ /** Update an existing team. Membership and projects are changed through the dedicated mutations below, not through this one. */
51094
+ planmagnetUpdateTeam: Team;
50638
51095
  /** Update an existing time entry */
50639
51096
  planmagnetUpdateTimeEntry: PlanmagnetTimeEntry;
50640
51097
  /** Update an existing work item */
@@ -50681,6 +51138,8 @@ export type Mutation = {
50681
51138
  propagateTagToChildren: Array<UniversalTagAssignment>;
50682
51139
  /** 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. */
50683
51140
  proposeHealthyBowlAgronomyDecisions: AgronomyDecisionSweepResult;
51141
+ /** Provision an Ask or Take-action assistant sandbox for the caller (any workspace role). */
51142
+ provisionAssistantSandbox: Sandbox;
50684
51143
  /** 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. */
50685
51144
  proxySandboxRequest: ProxySandboxResponse;
50686
51145
  pswAddTeamAssignment: PswTeamAssignment;
@@ -51026,13 +51485,15 @@ export type Mutation = {
51026
51485
  replayWorkflowRun: TriggerResponse;
51027
51486
  /** 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. */
51028
51487
  reportAgentMeshLink: AgentMeshLink;
51029
- /** 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. */
51488
+ /** 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. */
51030
51489
  reportAiTokenUsage: Scalars['Boolean']['output'];
51031
51490
  /** 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. */
51032
51491
  reportGovAiTokenUsage: Scalars['Boolean']['output'];
51033
- /** 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. */
51492
+ /** 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. */
51034
51493
  reportHealthyBowlAiTokenUsage: Scalars['Boolean']['output'];
51035
51494
  reportMessage: ReportMessagePayload;
51495
+ /** 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. */
51496
+ reportMyAssistantTurnTimings: AssistantTurnTimingsReceipt;
51036
51497
  reprocessTimeCampusTimeline: TimeCampusAdminMutationResult;
51037
51498
  /** 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. */
51038
51499
  requestHealthyBowlLoanFacilitation: HealthyBowlLoanFacilitation;
@@ -51259,7 +51720,10 @@ export type Mutation = {
51259
51720
  /** 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. */
51260
51721
  runSandboxScript: SandboxScriptRun;
51261
51722
  runSecurityScan: SecurityScanRun;
51262
- /** 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. */
51723
+ /**
51724
+ * 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.
51725
+ * @deprecated Use the my* assistant-history fields (BOFF-7335).
51726
+ */
51263
51727
  saveAssistantTurn: AssistantConversation;
51264
51728
  /** Save collection as template */
51265
51729
  saveCollectionAsTemplate: Collection;
@@ -51273,6 +51737,8 @@ export type Mutation = {
51273
51737
  /** Persist a yield scenario (the simulation 'Save Scenario' action). */
51274
51738
  saveHealthyBowlYieldScenario: HbYieldForecast;
51275
51739
  saveHousingvistaShortlist: HousingVistaShortlist;
51740
+ /** Idempotent per clientMessageId. Never recreates a deleted conversation. Never throws NOT_FOUND. */
51741
+ saveMyAssistantHistoryEntries: SaveMyAssistantHistoryEntriesPayload;
51276
51742
  /** Upsert the calling user's active view + per-view overrides. */
51277
51743
  saveMyNavPreferences: NavPreferences;
51278
51744
  /** 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. */
@@ -51340,7 +51806,7 @@ export type Mutation = {
51340
51806
  setAgentAutoUpdate: AgentProxyResponse;
51341
51807
  /** 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). */
51342
51808
  setAgentPlaygroundConfig: AgentProxyResponse;
51343
- /** 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. */
51809
+ /** 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. */
51344
51810
  setAgentVisibility: VibecontrolsAgent;
51345
51811
  setAiPredictionStatus: AiPrediction;
51346
51812
  setBalanceTarget: TimeCampusBalanceTarget;
@@ -51468,6 +51934,8 @@ export type Mutation = {
51468
51934
  /** Start a stopped or inactive resource */
51469
51935
  startWorkspaceResource: WorkspaceResource;
51470
51936
  stopCallRecording: CallRecording;
51937
+ /** 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. */
51938
+ stopMyAssistantSandbox: Sandbox;
51471
51939
  stopSandbox: Sandbox;
51472
51940
  /** Stop a session */
51473
51941
  stopSession: Session;
@@ -51748,6 +52216,7 @@ export type Mutation = {
51748
52216
  /** Track usage consumption Called by gateway after successful operations */
51749
52217
  trackUsage: Scalars['Boolean']['output'];
51750
52218
  transferGroupOwnership: Group;
52219
+ transferInventoryStock: MtwInventoryTransferResult;
51751
52220
  /** Transfer control to another collaborator */
51752
52221
  transferSessionControl: Scalars['Boolean']['output'];
51753
52222
  /** Advance a credit's status forward (DRAFT→PENDING→VERIFIED→ISSUED→RETIRED). Illegal transitions throw CONFLICT. */
@@ -51854,7 +52323,7 @@ export type Mutation = {
51854
52323
  updateAgentInstructionFile: AgentInstructionFile;
51855
52324
  updateAgentInstructionFileShareRole: ShareGrant;
51856
52325
  updateAgentMessageBookmark: AgentMessageBookmark;
51857
- /** 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. */
52326
+ /** 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. */
51858
52327
  updateAgentOwnership: VibecontrolsAgent;
51859
52328
  /** Update an installed plugin to the latest version, or to a specific `version`. Proxies POST /api/profiles/<p>/plugins/update. */
51860
52329
  updateAgentPlugin: AgentProxyResponse;
@@ -52372,6 +52841,8 @@ export type Mutation = {
52372
52841
  workerAppendRunLogs: WorkerAppendRunLogsResponse;
52373
52842
  /** Complete a workflow run (calculates stats and updates status) INTERNAL: Requires actorType SERVICE */
52374
52843
  workerCompleteRun: WorkerCompleteRunResponse;
52844
+ /** 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 */
52845
+ workerCreateChildRun: WorkerCreateChildRunResponse;
52375
52846
  /** Create a new node state (for pending nodes) INTERNAL: Requires actorType SERVICE */
52376
52847
  workerCreateNodeState: WorkerNodeStateResponse;
52377
52848
  /** 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 */
@@ -53513,6 +53984,12 @@ export type MutationAssignWorkspaceQuotasArgs = {
53513
53984
  };
53514
53985
 
53515
53986
 
53987
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
53988
+ export type MutationAssistantSessionExecuteArgs = {
53989
+ input: AssistantSessionExecuteInput;
53990
+ };
53991
+
53992
+
53516
53993
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
53517
53994
  export type MutationAthAddDrillArgs = {
53518
53995
  input: AthAddDrillInput;
@@ -59803,6 +60280,14 @@ export type MutationDeleteModifiedInstanceArgs = {
59803
60280
  };
59804
60281
 
59805
60282
 
60283
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
60284
+ export type MutationDeleteMyAssistantConversationArgs = {
60285
+ clientConversationId?: InputMaybe<Scalars['ID']['input']>;
60286
+ conversationId?: InputMaybe<Scalars['ID']['input']>;
60287
+ productId: Scalars['String']['input'];
60288
+ };
60289
+
60290
+
59806
60291
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
59807
60292
  export type MutationDeleteMyNavViewArgs = {
59808
60293
  id: Scalars['ID']['input'];
@@ -61461,6 +61946,12 @@ export type MutationExecuteSharedVibeDeckButtonArgs = {
61461
61946
  };
61462
61947
 
61463
61948
 
61949
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
61950
+ export type MutationExecuteStepArgs = {
61951
+ input: ExecuteStepInput;
61952
+ };
61953
+
61954
+
61464
61955
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
61465
61956
  export type MutationExecuteTransformArgs = {
61466
61957
  input: ExecuteTransformInput;
@@ -61574,6 +62065,14 @@ export type MutationExtendFileLockArgs = {
61574
62065
  };
61575
62066
 
61576
62067
 
62068
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
62069
+ export type MutationExtendMyAssistantSandboxTtlArgs = {
62070
+ additionalSeconds: Scalars['Int']['input'];
62071
+ context: ContextInput;
62072
+ id: Scalars['ID']['input'];
62073
+ };
62074
+
62075
+
61577
62076
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
61578
62077
  export type MutationExtendSandboxTtlArgs = {
61579
62078
  additionalSeconds: Scalars['Int']['input'];
@@ -62518,6 +63017,8 @@ export type MutationHeadshotmarketingReorderLandingPageSectionsArgs = {
62518
63017
 
62519
63018
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
62520
63019
  export type MutationHeadshotmarketingRunSeoAuditArgs = {
63020
+ maxDepth?: InputMaybe<Scalars['Int']['input']>;
63021
+ maxPages?: InputMaybe<Scalars['Int']['input']>;
62521
63022
  url: Scalars['String']['input'];
62522
63023
  };
62523
63024
 
@@ -64152,6 +64653,13 @@ export type MutationLinkEntityToVibeArgs = {
64152
64653
  };
64153
64654
 
64154
64655
 
64656
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
64657
+ export type MutationLinkHeadshotmarketingSocialAccountConnectionArgs = {
64658
+ id: Scalars['ID']['input'];
64659
+ integrationConnectionId: Scalars['ID']['input'];
64660
+ };
64661
+
64662
+
64155
64663
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
64156
64664
  export type MutationLinkHealthyBowlHarvestToInventoryArgs = {
64157
64665
  input: LinkHarvestToInventoryInput;
@@ -65052,6 +65560,40 @@ export type MutationPlanMultiModalShipmentArgs = {
65052
65560
  };
65053
65561
 
65054
65562
 
65563
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65564
+ export type MutationPlanmagnetAcceptFeatureRequestArgs = {
65565
+ id: Scalars['ID']['input'];
65566
+ input?: InputMaybe<PlanmagnetAcceptFeatureRequestInput>;
65567
+ };
65568
+
65569
+
65570
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65571
+ export type MutationPlanmagnetAddTeamMembersArgs = {
65572
+ id: Scalars['ID']['input'];
65573
+ input: PlanmagnetTeamMembersInput;
65574
+ };
65575
+
65576
+
65577
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65578
+ export type MutationPlanmagnetAddTeamProjectsArgs = {
65579
+ id: Scalars['ID']['input'];
65580
+ input: PlanmagnetTeamProjectsInput;
65581
+ };
65582
+
65583
+
65584
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65585
+ export type MutationPlanmagnetAddWorkItemCommentArgs = {
65586
+ input: PlanmagnetAddWorkItemCommentInput;
65587
+ };
65588
+
65589
+
65590
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65591
+ export type MutationPlanmagnetAddWorkItemsToReleaseArgs = {
65592
+ releaseId: Scalars['ID']['input'];
65593
+ workItemIds: Array<Scalars['ID']['input']>;
65594
+ };
65595
+
65596
+
65055
65597
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65056
65598
  export type MutationPlanmagnetAddWorkItemsToSprintArgs = {
65057
65599
  id: Scalars['ID']['input'];
@@ -65084,6 +65626,12 @@ export type MutationPlanmagnetApproveTimesheetArgs = {
65084
65626
  };
65085
65627
 
65086
65628
 
65629
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65630
+ export type MutationPlanmagnetArchiveProductArgs = {
65631
+ id: Scalars['ID']['input'];
65632
+ };
65633
+
65634
+
65087
65635
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65088
65636
  export type MutationPlanmagnetAssignWorkItemArgs = {
65089
65637
  id: Scalars['ID']['input'];
@@ -65193,6 +65741,12 @@ export type MutationPlanmagnetCreatePortfolioArgs = {
65193
65741
  };
65194
65742
 
65195
65743
 
65744
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65745
+ export type MutationPlanmagnetCreateProductArgs = {
65746
+ input: PlanmagnetCreateProductInput;
65747
+ };
65748
+
65749
+
65196
65750
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65197
65751
  export type MutationPlanmagnetCreateProgramArgs = {
65198
65752
  input: PlanmagnetCreateProgramInput;
@@ -65247,6 +65801,12 @@ export type MutationPlanmagnetCreateSprintArgs = {
65247
65801
  };
65248
65802
 
65249
65803
 
65804
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65805
+ export type MutationPlanmagnetCreateTeamArgs = {
65806
+ input: PlanmagnetCreateTeamInput;
65807
+ };
65808
+
65809
+
65250
65810
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65251
65811
  export type MutationPlanmagnetCreateTemplateFromProjectArgs = {
65252
65812
  description?: InputMaybe<Scalars['String']['input']>;
@@ -65273,6 +65833,13 @@ export type MutationPlanmagnetCreateWorkItemArgs = {
65273
65833
  };
65274
65834
 
65275
65835
 
65836
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65837
+ export type MutationPlanmagnetDeclineFeatureRequestArgs = {
65838
+ id: Scalars['ID']['input'];
65839
+ reason: Scalars['String']['input'];
65840
+ };
65841
+
65842
+
65276
65843
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65277
65844
  export type MutationPlanmagnetDeleteAutomationRuleArgs = {
65278
65845
  id: Scalars['ID']['input'];
@@ -65363,6 +65930,12 @@ export type MutationPlanmagnetDeletePortfolioArgs = {
65363
65930
  };
65364
65931
 
65365
65932
 
65933
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65934
+ export type MutationPlanmagnetDeleteProductArgs = {
65935
+ id: Scalars['ID']['input'];
65936
+ };
65937
+
65938
+
65366
65939
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65367
65940
  export type MutationPlanmagnetDeleteProgramArgs = {
65368
65941
  id: Scalars['ID']['input'];
@@ -65417,6 +65990,12 @@ export type MutationPlanmagnetDeleteSprintArgs = {
65417
65990
  };
65418
65991
 
65419
65992
 
65993
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65994
+ export type MutationPlanmagnetDeleteTeamArgs = {
65995
+ id: Scalars['ID']['input'];
65996
+ };
65997
+
65998
+
65420
65999
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65421
66000
  export type MutationPlanmagnetDeleteTimeEntryArgs = {
65422
66001
  id: Scalars['ID']['input'];
@@ -65429,6 +66008,26 @@ export type MutationPlanmagnetDeleteWorkItemArgs = {
65429
66008
  };
65430
66009
 
65431
66010
 
66011
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66012
+ export type MutationPlanmagnetDeleteWorkItemCommentArgs = {
66013
+ id: Scalars['ID']['input'];
66014
+ };
66015
+
66016
+
66017
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66018
+ export type MutationPlanmagnetEditWorkItemCommentArgs = {
66019
+ body: Scalars['String']['input'];
66020
+ id: Scalars['ID']['input'];
66021
+ };
66022
+
66023
+
66024
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66025
+ export type MutationPlanmagnetEraseSubjectArgs = {
66026
+ dryRun?: InputMaybe<Scalars['Boolean']['input']>;
66027
+ subjectId: Scalars['ID']['input'];
66028
+ };
66029
+
66030
+
65432
66031
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65433
66032
  export type MutationPlanmagnetExecuteAutomationRuleArgs = {
65434
66033
  id: Scalars['ID']['input'];
@@ -65436,6 +66035,12 @@ export type MutationPlanmagnetExecuteAutomationRuleArgs = {
65436
66035
  };
65437
66036
 
65438
66037
 
66038
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66039
+ export type MutationPlanmagnetExportSubjectArgs = {
66040
+ subjectId: Scalars['ID']['input'];
66041
+ };
66042
+
66043
+
65439
66044
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65440
66045
  export type MutationPlanmagnetExportToExternalArgs = {
65441
66046
  input: PlanmagnetExportToExternalInput;
@@ -65481,6 +66086,34 @@ export type MutationPlanmagnetLinkKeyResultToWorkItemArgs = {
65481
66086
  };
65482
66087
 
65483
66088
 
66089
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66090
+ export type MutationPlanmagnetLinkProductFeatureRequestArgs = {
66091
+ featureRequestId: Scalars['ID']['input'];
66092
+ productId: Scalars['ID']['input'];
66093
+ };
66094
+
66095
+
66096
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66097
+ export type MutationPlanmagnetLinkProductObjectiveArgs = {
66098
+ objectiveId: Scalars['ID']['input'];
66099
+ productId: Scalars['ID']['input'];
66100
+ };
66101
+
66102
+
66103
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66104
+ export type MutationPlanmagnetLinkProductReleaseArgs = {
66105
+ productId: Scalars['ID']['input'];
66106
+ releaseId: Scalars['ID']['input'];
66107
+ };
66108
+
66109
+
66110
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66111
+ export type MutationPlanmagnetLinkProductRoadmapArgs = {
66112
+ productId: Scalars['ID']['input'];
66113
+ roadmapId: Scalars['ID']['input'];
66114
+ };
66115
+
66116
+
65484
66117
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65485
66118
  export type MutationPlanmagnetLinkWorkItemArgs = {
65486
66119
  input: PlanmagnetCreateWorkItemLinkInput;
@@ -65499,6 +66132,13 @@ export type MutationPlanmagnetLogTimeArgs = {
65499
66132
  };
65500
66133
 
65501
66134
 
66135
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66136
+ export type MutationPlanmagnetMergeFeatureRequestArgs = {
66137
+ id: Scalars['ID']['input'];
66138
+ intoId: Scalars['ID']['input'];
66139
+ };
66140
+
66141
+
65502
66142
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65503
66143
  export type MutationPlanmagnetMoveCardArgs = {
65504
66144
  boardId: Scalars['ID']['input'];
@@ -65539,6 +66179,27 @@ export type MutationPlanmagnetRemoveFeatureVoteArgs = {
65539
66179
  };
65540
66180
 
65541
66181
 
66182
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66183
+ export type MutationPlanmagnetRemoveTeamMembersArgs = {
66184
+ id: Scalars['ID']['input'];
66185
+ input: PlanmagnetTeamMembersInput;
66186
+ };
66187
+
66188
+
66189
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66190
+ export type MutationPlanmagnetRemoveTeamProjectsArgs = {
66191
+ id: Scalars['ID']['input'];
66192
+ input: PlanmagnetTeamProjectsInput;
66193
+ };
66194
+
66195
+
66196
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66197
+ export type MutationPlanmagnetRemoveWorkItemsFromReleaseArgs = {
66198
+ releaseId: Scalars['ID']['input'];
66199
+ workItemIds: Array<Scalars['ID']['input']>;
66200
+ };
66201
+
66202
+
65542
66203
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65543
66204
  export type MutationPlanmagnetRemoveWorkItemsFromSprintArgs = {
65544
66205
  id: Scalars['ID']['input'];
@@ -65568,6 +66229,7 @@ export type MutationPlanmagnetResumeExternalSyncArgs = {
65568
66229
 
65569
66230
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65570
66231
  export type MutationPlanmagnetRevertDocArgs = {
66232
+ expectedVersion?: InputMaybe<Scalars['Int']['input']>;
65571
66233
  id: Scalars['ID']['input'];
65572
66234
  toVersion: Scalars['Int']['input'];
65573
66235
  };
@@ -65586,6 +66248,13 @@ export type MutationPlanmagnetSetCustomFieldValueArgs = {
65586
66248
  };
65587
66249
 
65588
66250
 
66251
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66252
+ export type MutationPlanmagnetSnoozeFeatureRequestArgs = {
66253
+ id: Scalars['ID']['input'];
66254
+ until?: InputMaybe<Scalars['DateTime']['input']>;
66255
+ };
66256
+
66257
+
65589
66258
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65590
66259
  export type MutationPlanmagnetStartSprintArgs = {
65591
66260
  id: Scalars['ID']['input'];
@@ -65617,6 +66286,12 @@ export type MutationPlanmagnetToggleAutomationRuleArgs = {
65617
66286
  };
65618
66287
 
65619
66288
 
66289
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66290
+ export type MutationPlanmagnetUnarchiveProductArgs = {
66291
+ id: Scalars['ID']['input'];
66292
+ };
66293
+
66294
+
65620
66295
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65621
66296
  export type MutationPlanmagnetUnlinkCompetitorFromFeatureArgs = {
65622
66297
  input: PlanmagnetLinkCompetitorInput;
@@ -65637,6 +66312,34 @@ export type MutationPlanmagnetUnlinkKeyResultFromWorkItemArgs = {
65637
66312
  };
65638
66313
 
65639
66314
 
66315
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66316
+ export type MutationPlanmagnetUnlinkProductFeatureRequestArgs = {
66317
+ featureRequestId: Scalars['ID']['input'];
66318
+ productId: Scalars['ID']['input'];
66319
+ };
66320
+
66321
+
66322
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66323
+ export type MutationPlanmagnetUnlinkProductObjectiveArgs = {
66324
+ objectiveId: Scalars['ID']['input'];
66325
+ productId: Scalars['ID']['input'];
66326
+ };
66327
+
66328
+
66329
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66330
+ export type MutationPlanmagnetUnlinkProductReleaseArgs = {
66331
+ productId: Scalars['ID']['input'];
66332
+ releaseId: Scalars['ID']['input'];
66333
+ };
66334
+
66335
+
66336
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66337
+ export type MutationPlanmagnetUnlinkProductRoadmapArgs = {
66338
+ productId: Scalars['ID']['input'];
66339
+ roadmapId: Scalars['ID']['input'];
66340
+ };
66341
+
66342
+
65640
66343
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65641
66344
  export type MutationPlanmagnetUnlinkWorkItemArgs = {
65642
66345
  id: Scalars['ID']['input'];
@@ -65748,6 +66451,13 @@ export type MutationPlanmagnetUpdatePortfolioArgs = {
65748
66451
  };
65749
66452
 
65750
66453
 
66454
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66455
+ export type MutationPlanmagnetUpdateProductArgs = {
66456
+ id: Scalars['ID']['input'];
66457
+ input: PlanmagnetUpdateProductInput;
66458
+ };
66459
+
66460
+
65751
66461
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65752
66462
  export type MutationPlanmagnetUpdateProgramArgs = {
65753
66463
  id: Scalars['ID']['input'];
@@ -65769,6 +66479,13 @@ export type MutationPlanmagnetUpdateProjectTemplateArgs = {
65769
66479
  };
65770
66480
 
65771
66481
 
66482
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66483
+ export type MutationPlanmagnetUpdateProjectWorkflowArgs = {
66484
+ input: PlanmagnetUpdateProjectWorkflowInput;
66485
+ projectId: Scalars['ID']['input'];
66486
+ };
66487
+
66488
+
65772
66489
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65773
66490
  export type MutationPlanmagnetUpdateQualityGateArgs = {
65774
66491
  id: Scalars['ID']['input'];
@@ -65811,6 +66528,13 @@ export type MutationPlanmagnetUpdateSprintArgs = {
65811
66528
  };
65812
66529
 
65813
66530
 
66531
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66532
+ export type MutationPlanmagnetUpdateTeamArgs = {
66533
+ id: Scalars['ID']['input'];
66534
+ input: PlanmagnetUpdateTeamInput;
66535
+ };
66536
+
66537
+
65814
66538
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65815
66539
  export type MutationPlanmagnetUpdateTimeEntryArgs = {
65816
66540
  id: Scalars['ID']['input'];
@@ -66020,6 +66744,12 @@ export type MutationProposeHealthyBowlAgronomyDecisionsArgs = {
66020
66744
  };
66021
66745
 
66022
66746
 
66747
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66748
+ export type MutationProvisionAssistantSandboxArgs = {
66749
+ input: ProvisionAssistantSandboxInput;
66750
+ };
66751
+
66752
+
66023
66753
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66024
66754
  export type MutationProxySandboxRequestArgs = {
66025
66755
  input: ProxySandboxRequestInput;
@@ -67529,6 +68259,12 @@ export type MutationReportMessageArgs = {
67529
68259
  };
67530
68260
 
67531
68261
 
68262
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
68263
+ export type MutationReportMyAssistantTurnTimingsArgs = {
68264
+ input: ReportAssistantTurnTimingsInput;
68265
+ };
68266
+
68267
+
67532
68268
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
67533
68269
  export type MutationReprocessTimeCampusTimelineArgs = {
67534
68270
  workspaceId: Scalars['ID']['input'];
@@ -68542,6 +69278,12 @@ export type MutationSaveHousingvistaShortlistArgs = {
68542
69278
  };
68543
69279
 
68544
69280
 
69281
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
69282
+ export type MutationSaveMyAssistantHistoryEntriesArgs = {
69283
+ input: SaveMyAssistantHistoryEntriesInput;
69284
+ };
69285
+
69286
+
68545
69287
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
68546
69288
  export type MutationSaveMyNavPreferencesArgs = {
68547
69289
  input: SaveNavPreferencesInput;
@@ -69405,6 +70147,13 @@ export type MutationStopCallRecordingArgs = {
69405
70147
  };
69406
70148
 
69407
70149
 
70150
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
70151
+ export type MutationStopMyAssistantSandboxArgs = {
70152
+ context: ContextInput;
70153
+ id: Scalars['ID']['input'];
70154
+ };
70155
+
70156
+
69408
70157
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
69409
70158
  export type MutationStopSandboxArgs = {
69410
70159
  context: ContextInput;
@@ -70628,6 +71377,12 @@ export type MutationTransferGroupOwnershipArgs = {
70628
71377
  };
70629
71378
 
70630
71379
 
71380
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
71381
+ export type MutationTransferInventoryStockArgs = {
71382
+ input: TransferInventoryStockInput;
71383
+ };
71384
+
71385
+
70631
71386
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
70632
71387
  export type MutationTransferSessionControlArgs = {
70633
71388
  sessionId: Scalars['ID']['input'];
@@ -73771,6 +74526,12 @@ export type MutationWorkerCompleteRunArgs = {
73771
74526
  };
73772
74527
 
73773
74528
 
74529
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
74530
+ export type MutationWorkerCreateChildRunArgs = {
74531
+ input: WorkerCreateChildRunInput;
74532
+ };
74533
+
74534
+
73774
74535
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
73775
74536
  export type MutationWorkerCreateNodeStateArgs = {
73776
74537
  input: WorkerCreateNodeStateInput;
@@ -75752,6 +76513,62 @@ export type PlanMultiModalShipmentInput = {
75752
76513
  storeOrderId?: InputMaybe<Scalars['ID']['input']>;
75753
76514
  };
75754
76515
 
76516
+ /** Accept a request out of triage */
76517
+ export type PlanmagnetAcceptFeatureRequestInput = {
76518
+ /** The project that will deliver it */
76519
+ projectId?: InputMaybe<Scalars['String']['input']>;
76520
+ /** UNDER_REVIEW or PLANNED (the default) */
76521
+ status?: InputMaybe<FeatureRequestStatus>;
76522
+ };
76523
+
76524
+ export type PlanmagnetAddWorkItemCommentInput = {
76525
+ /** Comment text (1 to 10,000 characters after trimming) */
76526
+ body: Scalars['String']['input'];
76527
+ workItemId: Scalars['ID']['input'];
76528
+ };
76529
+
76530
+ /** 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. */
76531
+ export type PlanmagnetAgentRun = {
76532
+ __typename?: 'PlanmagnetAgentRun';
76533
+ actorId: Scalars['String']['output'];
76534
+ actorType: Scalars['String']['output'];
76535
+ createdAt: Scalars['DateTime']['output'];
76536
+ /** What the model decided (e.g. the suggestions it returned), as recorded. */
76537
+ decision?: Maybe<Scalars['JSON']['output']>;
76538
+ error?: Maybe<Scalars['String']['output']>;
76539
+ id: Scalars['ID']['output'];
76540
+ latencyMs?: Maybe<Scalars['Int']['output']>;
76541
+ model: Scalars['String']['output'];
76542
+ promptSummary: Scalars['String']['output'];
76543
+ provider: Scalars['String']['output'];
76544
+ status: PlanmagnetAgentRunStatus;
76545
+ tokensIn?: Maybe<Scalars['Int']['output']>;
76546
+ tokensOut?: Maybe<Scalars['Int']['output']>;
76547
+ trigger: PlanmagnetAgentRunTrigger;
76548
+ workspaceId: Scalars['ID']['output'];
76549
+ };
76550
+
76551
+ export type PlanmagnetAgentRunFilter = {
76552
+ status?: InputMaybe<PlanmagnetAgentRunStatus>;
76553
+ };
76554
+
76555
+ export type PlanmagnetAgentRunList = {
76556
+ __typename?: 'PlanmagnetAgentRunList';
76557
+ items: Array<PlanmagnetAgentRun>;
76558
+ pageInfo: PlanmagnetPageInfo;
76559
+ totalCount: Scalars['Int']['output'];
76560
+ };
76561
+
76562
+ /** 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. */
76563
+ export enum PlanmagnetAgentRunStatus {
76564
+ Failed = 'FAILED',
76565
+ Succeeded = 'SUCCEEDED'
76566
+ }
76567
+
76568
+ export enum PlanmagnetAgentRunTrigger {
76569
+ Manual = 'MANUAL'
76570
+ }
76571
+
75755
76572
  export type PlanmagnetApplyTemplateInput = {
75756
76573
  ownerId: Scalars['String']['input'];
75757
76574
  projectDescription?: InputMaybe<Scalars['String']['input']>;
@@ -75802,10 +76619,14 @@ export type PlanmagnetAutomationExecutionList = {
75802
76619
  totalCount: Scalars['Int']['output'];
75803
76620
  };
75804
76621
 
76622
+ /** 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. */
75805
76623
  export enum PlanmagnetAutomationExecutionStatus {
75806
76624
  Failure = 'FAILURE',
76625
+ /** Some actions ran, others failed or could not be dispatched. */
76626
+ PartialFailure = 'PARTIAL_FAILURE',
75807
76627
  Pending = 'PENDING',
75808
76628
  Running = 'RUNNING',
76629
+ /** Nothing ran — no action the rule declared is supported by this engine. */
75809
76630
  Skipped = 'SKIPPED',
75810
76631
  Success = 'SUCCESS'
75811
76632
  }
@@ -75985,7 +76806,9 @@ export type PlanmagnetBudget = {
75985
76806
  export type PlanmagnetBudgetExpenseFilter = {
75986
76807
  budgetId?: InputMaybe<Scalars['String']['input']>;
75987
76808
  category?: InputMaybe<Scalars['String']['input']>;
76809
+ /** Expenses dated on or after this UTC day */
75988
76810
  dateFrom?: InputMaybe<Scalars['DateTime']['input']>;
76811
+ /** Expenses dated on or before this UTC day (the whole day is included) */
75989
76812
  dateTo?: InputMaybe<Scalars['DateTime']['input']>;
75990
76813
  };
75991
76814
 
@@ -76086,6 +76909,8 @@ export type PlanmagnetCreateBoardInput = {
76086
76909
  name: Scalars['String']['input'];
76087
76910
  projectId: Scalars['String']['input'];
76088
76911
  type: BoardType;
76912
+ /** Also create one column per status of the default workflow (Backlog, To Do, In Progress, In Review, Testing, Done), each mapped to its status */
76913
+ withDefaultColumns?: InputMaybe<Scalars['Boolean']['input']>;
76089
76914
  };
76090
76915
 
76091
76916
  export type PlanmagnetCreateBudgetInput = {
@@ -76122,9 +76947,10 @@ export type PlanmagnetCreateCustomFieldDefinitionInput = {
76122
76947
 
76123
76948
  export type PlanmagnetCreateDependencyInput = {
76124
76949
  description?: InputMaybe<Scalars['String']['input']>;
76950
+ lagMinutes?: InputMaybe<Scalars['Int']['input']>;
76125
76951
  metadata?: InputMaybe<Scalars['JSON']['input']>;
76126
- sourceWorkItemId: Scalars['String']['input'];
76127
- targetWorkItemId: Scalars['String']['input'];
76952
+ predecessorId: Scalars['String']['input'];
76953
+ successorId: Scalars['String']['input'];
76128
76954
  type: DependencyType;
76129
76955
  };
76130
76956
 
@@ -76151,6 +76977,7 @@ export type PlanmagnetCreateFeatureRequestInput = {
76151
76977
  description?: InputMaybe<Scalars['String']['input']>;
76152
76978
  effortEstimate?: InputMaybe<Scalars['String']['input']>;
76153
76979
  metadata?: InputMaybe<Scalars['JSON']['input']>;
76980
+ productId?: InputMaybe<Scalars['String']['input']>;
76154
76981
  projectId?: InputMaybe<Scalars['String']['input']>;
76155
76982
  status?: InputMaybe<FeatureRequestStatus>;
76156
76983
  tags?: InputMaybe<Array<Scalars['String']['input']>>;
@@ -76210,6 +77037,16 @@ export type PlanmagnetCreatePortfolioInput = {
76210
77037
  tags?: InputMaybe<Array<Scalars['String']['input']>>;
76211
77038
  };
76212
77039
 
77040
+ export type PlanmagnetCreateProductInput = {
77041
+ description?: InputMaybe<Scalars['String']['input']>;
77042
+ lifecycleStage?: InputMaybe<PlanmagnetProductLifecycleStage>;
77043
+ metadata?: InputMaybe<Scalars['JSON']['input']>;
77044
+ name: Scalars['String']['input'];
77045
+ northStar?: InputMaybe<PlanmagnetProductNorthStarInput>;
77046
+ ownerId: Scalars['String']['input'];
77047
+ vision: Scalars['String']['input'];
77048
+ };
77049
+
76213
77050
  export type PlanmagnetCreateProgramInput = {
76214
77051
  budgetTotal?: InputMaybe<Scalars['Float']['input']>;
76215
77052
  currency?: InputMaybe<Scalars['String']['input']>;
@@ -76232,6 +77069,8 @@ export type PlanmagnetCreateProjectInput = {
76232
77069
  methodology?: InputMaybe<ProjectMethodology>;
76233
77070
  name: Scalars['String']['input'];
76234
77071
  ownerId: Scalars['String']['input'];
77072
+ /** Parent portfolio ID. Must exist in the same workspace and not be soft-deleted (BOFF-8047). */
77073
+ portfolioId?: InputMaybe<Scalars['String']['input']>;
76235
77074
  programId?: InputMaybe<Scalars['String']['input']>;
76236
77075
  startDate?: InputMaybe<Scalars['DateTime']['input']>;
76237
77076
  status?: InputMaybe<PlanmagnetProjectStatus>;
@@ -76262,6 +77101,8 @@ export type PlanmagnetCreateQualityGateInput = {
76262
77101
  name: Scalars['String']['input'];
76263
77102
  phase?: InputMaybe<Scalars['String']['input']>;
76264
77103
  projectId: Scalars['String']['input'];
77104
+ /** The release this gate holds (a release of the same project, or one with no projects) */
77105
+ releaseId?: InputMaybe<Scalars['String']['input']>;
76265
77106
  sortOrder?: InputMaybe<Scalars['Int']['input']>;
76266
77107
  };
76267
77108
 
@@ -76271,6 +77112,7 @@ export type PlanmagnetCreateReleaseInput = {
76271
77112
  name: Scalars['String']['input'];
76272
77113
  ownerId?: InputMaybe<Scalars['String']['input']>;
76273
77114
  plannedDate?: InputMaybe<Scalars['DateTime']['input']>;
77115
+ productId?: InputMaybe<Scalars['String']['input']>;
76274
77116
  projectId: Scalars['String']['input'];
76275
77117
  releaseNotes?: InputMaybe<Scalars['String']['input']>;
76276
77118
  status?: InputMaybe<ReleaseStatus>;
@@ -76300,6 +77142,8 @@ export type PlanmagnetCreateRoadmapInput = {
76300
77142
  metadata?: InputMaybe<Scalars['JSON']['input']>;
76301
77143
  name: Scalars['String']['input'];
76302
77144
  ownerId: Scalars['String']['input'];
77145
+ planningFocus?: InputMaybe<RoadmapPlanningFocus>;
77146
+ productId?: InputMaybe<Scalars['String']['input']>;
76303
77147
  type: RoadmapType;
76304
77148
  };
76305
77149
 
@@ -76325,10 +77169,19 @@ export type PlanmagnetCreateSprintInput = {
76325
77169
  goal?: InputMaybe<Scalars['String']['input']>;
76326
77170
  metadata?: InputMaybe<Scalars['JSON']['input']>;
76327
77171
  name: Scalars['String']['input'];
76328
- projectId: Scalars['String']['input'];
77172
+ /** Exactly one of projectId/teamId is required (BOFF-8044) — enforced server-side (sprint.errors.scopeConflict / sprint.errors.scopeRequired). */
77173
+ projectId?: InputMaybe<Scalars['String']['input']>;
76329
77174
  /** Accepted for API compatibility but not honored: sort position is always the auto-assigned, per-project-unique `sequenceNumber` — see sprint.service.ts. */
76330
77175
  sortOrder?: InputMaybe<Scalars['Int']['input']>;
76331
77176
  startDate?: InputMaybe<Scalars['DateTime']['input']>;
77177
+ teamId?: InputMaybe<Scalars['String']['input']>;
77178
+ };
77179
+
77180
+ export type PlanmagnetCreateTeamInput = {
77181
+ capacity?: InputMaybe<Scalars['Int']['input']>;
77182
+ description?: InputMaybe<Scalars['String']['input']>;
77183
+ leadId?: InputMaybe<Scalars['String']['input']>;
77184
+ name: Scalars['String']['input'];
76332
77185
  };
76333
77186
 
76334
77187
  export type PlanmagnetCreateTimeEntryInput = {
@@ -76337,10 +77190,8 @@ export type PlanmagnetCreateTimeEntryInput = {
76337
77190
  date: Scalars['DateTime']['input'];
76338
77191
  description?: InputMaybe<Scalars['String']['input']>;
76339
77192
  durationMinutes: Scalars['Int']['input'];
76340
- endTime?: InputMaybe<Scalars['DateTime']['input']>;
76341
77193
  metadata?: InputMaybe<Scalars['JSON']['input']>;
76342
77194
  projectId: Scalars['String']['input'];
76343
- startTime?: InputMaybe<Scalars['DateTime']['input']>;
76344
77195
  timesheetId?: InputMaybe<Scalars['String']['input']>;
76345
77196
  workItemId: Scalars['String']['input'];
76346
77197
  };
@@ -76388,7 +77239,8 @@ export type PlanmagnetCriticalPath = {
76388
77239
  path: Array<PlanmagnetDependencyNode>;
76389
77240
  /** Per-node slack in days. Nodes on the critical path have slack 0. */
76390
77241
  slack: Scalars['JSON']['output'];
76391
- totalLagDays: Scalars['Int']['output'];
77242
+ /** 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. */
77243
+ totalDurationMinutes: Scalars['Int']['output'];
76392
77244
  };
76393
77245
 
76394
77246
  /** Cumulative flow diagram data for a project over a date range. */
@@ -76462,9 +77314,9 @@ export type PlanmagnetDependencyCycle = {
76462
77314
  };
76463
77315
 
76464
77316
  export type PlanmagnetDependencyFilter = {
76465
- sourceWorkItemId?: InputMaybe<Scalars['String']['input']>;
77317
+ predecessorId?: InputMaybe<Scalars['String']['input']>;
76466
77318
  status?: InputMaybe<DependencyStatus>;
76467
- targetWorkItemId?: InputMaybe<Scalars['String']['input']>;
77319
+ successorId?: InputMaybe<Scalars['String']['input']>;
76468
77320
  type?: InputMaybe<DependencyType>;
76469
77321
  };
76470
77322
 
@@ -76521,6 +77373,27 @@ export type PlanmagnetDocRevision = {
76521
77373
  version: Scalars['Int']['output'];
76522
77374
  };
76523
77375
 
77376
+ /** 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. */
77377
+ export enum PlanmagnetDueGroup {
77378
+ DueLater = 'DUE_LATER',
77379
+ DueThisWeek = 'DUE_THIS_WEEK',
77380
+ DueToday = 'DUE_TODAY',
77381
+ NoDueDate = 'NO_DUE_DATE',
77382
+ Overdue = 'OVERDUE'
77383
+ }
77384
+
77385
+ export type PlanmagnetEraseResult = {
77386
+ __typename?: 'PlanmagnetEraseResult';
77387
+ /** Id columns replaced by a one-way tombstone or cleared (authorship, ownership, history, assignments) */
77388
+ anonymised: Scalars['Int']['output'];
77389
+ dryRun: Scalars['Boolean']['output'];
77390
+ notes?: Maybe<Scalars['String']['output']>;
77391
+ /** Rows deleted (the person's own: votes, editor seats, time nobody signed off) */
77392
+ purged: Scalars['Int']['output'];
77393
+ retainedForLegalReason?: Maybe<Scalars['String']['output']>;
77394
+ service: Scalars['String']['output'];
77395
+ };
77396
+
76524
77397
  export type PlanmagnetExportToExternalInput = {
76525
77398
  exportAll?: InputMaybe<Scalars['Boolean']['input']>;
76526
77399
  internalIds?: InputMaybe<Array<Scalars['String']['input']>>;
@@ -76557,11 +77430,24 @@ export type PlanmagnetExternalSyncList = {
76557
77430
  totalCount: Scalars['Int']['output'];
76558
77431
  };
76559
77432
 
77433
+ /** Feature request list order */
77434
+ export enum PlanmagnetFeatureOrder {
77435
+ /** Most votes first */
77436
+ MostVoted = 'MOST_VOTED',
77437
+ /** Newest first (the default) */
77438
+ Newest = 'NEWEST'
77439
+ }
77440
+
76560
77441
  export type PlanmagnetFeatureRequestFilter = {
77442
+ productId?: InputMaybe<Scalars['String']['input']>;
76561
77443
  projectId?: InputMaybe<Scalars['String']['input']>;
76562
77444
  search?: InputMaybe<Scalars['String']['input']>;
77445
+ /** true: SUBMITTED and snoozed into the future. false: not currently snoozed */
77446
+ snoozed?: InputMaybe<Scalars['Boolean']['input']>;
76563
77447
  status?: InputMaybe<FeatureRequestStatus>;
76564
77448
  submittedBy?: InputMaybe<Scalars['String']['input']>;
77449
+ /** true: the triage queue — SUBMITTED and not snoozed (or its snooze has passed). false: everything else */
77450
+ triage?: InputMaybe<Scalars['Boolean']['input']>;
76565
77451
  };
76566
77452
 
76567
77453
  export type PlanmagnetFeatureRequestList = {
@@ -76583,6 +77469,10 @@ export type PlanmagnetGenerateReleaseNotesPayload = {
76583
77469
  export type PlanmagnetImportExternalIssuesInput = {
76584
77470
  /** The exported file contents (CSV text or JSON). */
76585
77471
  data: Scalars['String']['input'];
77472
+ /** Preview only: report what WOULD be imported and what would be lost, and write nothing (not even the sync). */
77473
+ dryRun?: InputMaybe<Scalars['Boolean']['input']>;
77474
+ /** 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. */
77475
+ fieldMapping?: InputMaybe<Scalars['JSON']['input']>;
76586
77476
  /** Format of the exported payload. */
76587
77477
  format: PlanmagnetImportFormat;
76588
77478
  /** Target PlanMagnet project the imported WorkItems are created in. */
@@ -76604,12 +77494,44 @@ export type PlanmagnetImportFromExternalInput = {
76604
77494
  syncId: Scalars['String']['input'];
76605
77495
  };
76606
77496
 
77497
+ /** One issue of an import, with what could not be carried over from it */
77498
+ export type PlanmagnetImportIssueReport = {
77499
+ __typename?: 'PlanmagnetImportIssueReport';
77500
+ externalId: Scalars['String']['output'];
77501
+ /** Link back to the issue in the source tool */
77502
+ externalUrl?: Maybe<Scalars['String']['output']>;
77503
+ /** What was lost or changed on the way (unmapped state or priority, unmatched assignee, bad due date) */
77504
+ notes: Array<Scalars['String']['output']>;
77505
+ outcome: PlanmagnetImportOutcome;
77506
+ title: Scalars['String']['output'];
77507
+ /** The work item it became (or already is) */
77508
+ workItemId?: Maybe<Scalars['String']['output']>;
77509
+ };
77510
+
77511
+ /** What happened to one issue of an import */
77512
+ export enum PlanmagnetImportOutcome {
77513
+ /** Imported by an earlier run; this run left it alone (reruns are duplicate-safe) */
77514
+ AlreadyImported = 'ALREADY_IMPORTED',
77515
+ /** Could not be created (see the run's errors) */
77516
+ Failed = 'FAILED',
77517
+ /** Created as a work item */
77518
+ Imported = 'IMPORTED',
77519
+ /** Preview: would be created */
77520
+ WouldImport = 'WOULD_IMPORT'
77521
+ }
77522
+
76607
77523
  /** Summary of an external-issue import run. */
76608
77524
  export type PlanmagnetImportResult = {
76609
77525
  __typename?: 'PlanmagnetImportResult';
77526
+ /** True when this was a preview and nothing was written */
77527
+ dryRun: Scalars['Boolean']['output'];
76610
77528
  errors: Array<Scalars['String']['output']>;
76611
77529
  failed: Scalars['Int']['output'];
76612
77530
  imported: Scalars['Int']['output'];
77531
+ /** Every issue in the export, in order, with its outcome and notes */
77532
+ issues: Array<PlanmagnetImportIssueReport>;
77533
+ /** The discrepancy report: each kind of loss, counted (unmapped states, unmatched assignees, rejected rows, columns nothing reads) */
77534
+ notCarriedOver: Array<Scalars['String']['output']>;
76613
77535
  skipped: Scalars['Int']['output'];
76614
77536
  workItemIds: Array<Scalars['String']['output']>;
76615
77537
  };
@@ -76676,6 +77598,12 @@ export type PlanmagnetLogTimeInput = {
76676
77598
  };
76677
77599
 
76678
77600
  export type PlanmagnetMilestoneFilter = {
77601
+ /** Due on or after this UTC day */
77602
+ dueFrom?: InputMaybe<Scalars['DateTime']['input']>;
77603
+ /** Due on or before this UTC day */
77604
+ dueTo?: InputMaybe<Scalars['DateTime']['input']>;
77605
+ /** Only milestones still open (PENDING or IN_PROGRESS) */
77606
+ open?: InputMaybe<Scalars['Boolean']['input']>;
76679
77607
  ownerId?: InputMaybe<Scalars['String']['input']>;
76680
77608
  projectId?: InputMaybe<Scalars['String']['input']>;
76681
77609
  search?: InputMaybe<Scalars['String']['input']>;
@@ -76689,6 +77617,14 @@ export type PlanmagnetMilestoneList = {
76689
77617
  totalCount: Scalars['Int']['output'];
76690
77618
  };
76691
77619
 
77620
+ /** Milestone list order */
77621
+ export enum PlanmagnetMilestoneOrder {
77622
+ /** Nearest due date first; milestones with no due date last */
77623
+ DueSoonest = 'DUE_SOONEST',
77624
+ /** Newest first (the default) */
77625
+ Newest = 'NEWEST'
77626
+ }
77627
+
76692
77628
  export type PlanmagnetMoveCardInput = {
76693
77629
  sortOrder?: InputMaybe<Scalars['Int']['input']>;
76694
77630
  targetColumnId: Scalars['ID']['input'];
@@ -76701,6 +77637,14 @@ export type PlanmagnetMoveWorkItemInput = {
76701
77637
  status?: InputMaybe<WorkItemStatus>;
76702
77638
  };
76703
77639
 
77640
+ export type PlanmagnetMyWorkItemFilter = {
77641
+ /** Default false: DONE/CANCELLED items are left out. Set true to also see recently-closed work. */
77642
+ includeClosed?: InputMaybe<Scalars['Boolean']['input']>;
77643
+ projectId?: InputMaybe<Scalars['String']['input']>;
77644
+ sprintId?: InputMaybe<Scalars['String']['input']>;
77645
+ status?: InputMaybe<WorkItemStatus>;
77646
+ };
77647
+
76704
77648
  /** A workspace-scoped goal for a given time period. `progress` is the average of its non-deleted KeyResults' progress (0 when it has none). */
76705
77649
  export type PlanmagnetObjective = {
76706
77650
  __typename?: 'PlanmagnetObjective';
@@ -76791,6 +77735,51 @@ export type PlanmagnetPortfolioOverview = {
76791
77735
  totalSpent?: Maybe<Scalars['Float']['output']>;
76792
77736
  };
76793
77737
 
77738
+ export type PlanmagnetProductFilter = {
77739
+ /** false: only archived; true: only active; omitted: both. */
77740
+ isActive?: InputMaybe<Scalars['Boolean']['input']>;
77741
+ lifecycleStage?: InputMaybe<PlanmagnetProductLifecycleStage>;
77742
+ ownerId?: InputMaybe<Scalars['String']['input']>;
77743
+ search?: InputMaybe<Scalars['String']['input']>;
77744
+ };
77745
+
77746
+ export enum PlanmagnetProductLifecycleStage {
77747
+ Beta = 'BETA',
77748
+ Concept = 'CONCEPT',
77749
+ Deprecated = 'DEPRECATED',
77750
+ Development = 'DEVELOPMENT',
77751
+ Launched = 'LAUNCHED',
77752
+ Mature = 'MATURE'
77753
+ }
77754
+
77755
+ export type PlanmagnetProductList = {
77756
+ __typename?: 'PlanmagnetProductList';
77757
+ items: Array<Product>;
77758
+ pageInfo: PlanmagnetPageInfo;
77759
+ totalCount: Scalars['Int']['output'];
77760
+ };
77761
+
77762
+ export type PlanmagnetProductNorthStar = {
77763
+ __typename?: 'PlanmagnetProductNorthStar';
77764
+ current: Scalars['Float']['output'];
77765
+ measuredAt?: Maybe<Scalars['DateTime']['output']>;
77766
+ name: Scalars['String']['output'];
77767
+ /** 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. */
77768
+ progressRatio?: Maybe<Scalars['Float']['output']>;
77769
+ target: Scalars['Float']['output'];
77770
+ unit: Scalars['String']['output'];
77771
+ window: Scalars['String']['output'];
77772
+ };
77773
+
77774
+ export type PlanmagnetProductNorthStarInput = {
77775
+ current: Scalars['Float']['input'];
77776
+ measuredAt?: InputMaybe<Scalars['DateTime']['input']>;
77777
+ name: Scalars['String']['input'];
77778
+ target: Scalars['Float']['input'];
77779
+ unit: Scalars['String']['input'];
77780
+ window: Scalars['String']['input'];
77781
+ };
77782
+
76794
77783
  export type PlanmagnetProgramFilter = {
76795
77784
  ownerId?: InputMaybe<Scalars['String']['input']>;
76796
77785
  search?: InputMaybe<Scalars['String']['input']>;
@@ -76845,6 +77834,10 @@ export type PlanmagnetProject = {
76845
77834
  onBehalfOf?: Maybe<Scalars['String']['output']>;
76846
77835
  /** Owner actor ID */
76847
77836
  ownerId: Scalars['String']['output'];
77837
+ /** Parent portfolio */
77838
+ portfolio?: Maybe<Portfolio>;
77839
+ /** 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. */
77840
+ portfolioId?: Maybe<Scalars['String']['output']>;
76848
77841
  /** Parent program */
76849
77842
  program?: Maybe<Program>;
76850
77843
  /** Parent program ID */
@@ -76869,6 +77862,8 @@ export type PlanmagnetProject = {
76869
77862
  updatedBy?: Maybe<Scalars['String']['output']>;
76870
77863
  /** Work items in this project */
76871
77864
  workItems: Array<WorkItem>;
77865
+ /** This project's workflow (labels, hidden statuses, categories, transition rules) */
77866
+ workflow: PlanmagnetProjectWorkflow;
76872
77867
  /** Associated workspace ID */
76873
77868
  workspaceId: Scalars['String']['output'];
76874
77869
  };
@@ -76876,6 +77871,7 @@ export type PlanmagnetProject = {
76876
77871
  export type PlanmagnetProjectFilter = {
76877
77872
  methodology?: InputMaybe<ProjectMethodology>;
76878
77873
  ownerId?: InputMaybe<Scalars['String']['input']>;
77874
+ portfolioId?: InputMaybe<Scalars['String']['input']>;
76879
77875
  programId?: InputMaybe<Scalars['String']['input']>;
76880
77876
  search?: InputMaybe<Scalars['String']['input']>;
76881
77877
  status?: InputMaybe<PlanmagnetProjectStatus>;
@@ -76911,6 +77907,17 @@ export type PlanmagnetProjectTemplateList = {
76911
77907
  totalCount: Scalars['Int']['output'];
76912
77908
  };
76913
77909
 
77910
+ /** A project's workflow: all seven statuses in canonical order, and its transition rules */
77911
+ export type PlanmagnetProjectWorkflow = {
77912
+ __typename?: 'PlanmagnetProjectWorkflow';
77913
+ /** When false, any move between visible statuses is allowed */
77914
+ enforceTransitions: Scalars['Boolean']['output'];
77915
+ projectId: Scalars['String']['output'];
77916
+ statuses: Array<PlanmagnetWorkflowStatus>;
77917
+ /** Allowed moves (read only when enforceTransitions is true) */
77918
+ transitions: Array<PlanmagnetWorkflowTransition>;
77919
+ };
77920
+
76914
77921
  export type PlanmagnetQualityGateFilter = {
76915
77922
  milestoneId?: InputMaybe<Scalars['String']['input']>;
76916
77923
  phase?: InputMaybe<Scalars['String']['input']>;
@@ -76949,8 +77956,16 @@ export type PlanmagnetQuotaOverview = {
76949
77956
  workspaceId: Scalars['ID']['output'];
76950
77957
  };
76951
77958
 
77959
+ export type PlanmagnetReleaseBlocker = {
77960
+ __typename?: 'PlanmagnetReleaseBlocker';
77961
+ /** Unfinished (or, for START_* dependencies, unstarted) predecessors holding it back. They may belong to another release or project. */
77962
+ waitingOn: Array<WorkItem>;
77963
+ workItem: WorkItem;
77964
+ };
77965
+
76952
77966
  export type PlanmagnetReleaseFilter = {
76953
77967
  ownerId?: InputMaybe<Scalars['String']['input']>;
77968
+ productId?: InputMaybe<Scalars['String']['input']>;
76954
77969
  projectId?: InputMaybe<Scalars['String']['input']>;
76955
77970
  search?: InputMaybe<Scalars['String']['input']>;
76956
77971
  status?: InputMaybe<ReleaseStatus>;
@@ -76972,6 +77987,25 @@ export type PlanmagnetReleaseNotesCounts = {
76972
77987
  total: Scalars['Int']['output'];
76973
77988
  };
76974
77989
 
77990
+ export type PlanmagnetReleaseReadiness = {
77991
+ __typename?: 'PlanmagnetReleaseReadiness';
77992
+ blockers: Array<PlanmagnetReleaseBlocker>;
77993
+ doneItems: Scalars['Int']['output'];
77994
+ /** Ids of the open (not DONE or CANCELLED) items in scope. */
77995
+ openWorkItemIds: Array<Scalars['ID']['output']>;
77996
+ releaseId: Scalars['ID']['output'];
77997
+ scope: PlanmagnetReleaseScope;
77998
+ /** Items in scope. For PROJECTS scope only open items are in scope, so this equals the open count. */
77999
+ totalItems: Scalars['Int']['output'];
78000
+ };
78001
+
78002
+ /** 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 */
78003
+ export enum PlanmagnetReleaseScope {
78004
+ None = 'NONE',
78005
+ Projects = 'PROJECTS',
78006
+ WorkItems = 'WORK_ITEMS'
78007
+ }
78008
+
76975
78009
  export type PlanmagnetReorderColumnsInput = {
76976
78010
  columnIds: Array<Scalars['ID']['input']>;
76977
78011
  };
@@ -77015,8 +78049,12 @@ export type PlanmagnetRiskMatrix = {
77015
78049
  };
77016
78050
 
77017
78051
  export type PlanmagnetRoadmapFilter = {
78052
+ /** false: only roadmaps with no planning focus set; true: only roadmaps that have one */
78053
+ hasPlanningFocus?: InputMaybe<Scalars['Boolean']['input']>;
77018
78054
  isPublic?: InputMaybe<Scalars['Boolean']['input']>;
77019
78055
  ownerId?: InputMaybe<Scalars['String']['input']>;
78056
+ planningFocus?: InputMaybe<RoadmapPlanningFocus>;
78057
+ productId?: InputMaybe<Scalars['String']['input']>;
77020
78058
  search?: InputMaybe<Scalars['String']['input']>;
77021
78059
  type?: InputMaybe<RoadmapType>;
77022
78060
  };
@@ -77107,6 +78145,8 @@ export type PlanmagnetSprintFilter = {
77107
78145
  projectId?: InputMaybe<Scalars['String']['input']>;
77108
78146
  search?: InputMaybe<Scalars['String']['input']>;
77109
78147
  status?: InputMaybe<SprintStatus>;
78148
+ /** Team-scoped sprints of this team (BOFF-8044). */
78149
+ teamId?: InputMaybe<Scalars['String']['input']>;
77110
78150
  };
77111
78151
 
77112
78152
  export type PlanmagnetSprintList = {
@@ -77116,10 +78156,38 @@ export type PlanmagnetSprintList = {
77116
78156
  totalCount: Scalars['Int']['output'];
77117
78157
  };
77118
78158
 
78159
+ /** One change to a sprint's planned start or end date (BOFF-7918). */
78160
+ export type PlanmagnetSprintPlanChange = {
78161
+ __typename?: 'PlanmagnetSprintPlanChange';
78162
+ changedAt: Scalars['DateTime']['output'];
78163
+ changedBy: Scalars['String']['output'];
78164
+ /** "startDate" or "endDate" */
78165
+ field: Scalars['String']['output'];
78166
+ fromValue?: Maybe<Scalars['DateTime']['output']>;
78167
+ id: Scalars['ID']['output'];
78168
+ /** The sprint's status when the plan changed: PLANNING is planning; ACTIVE is a replan of a commitment. */
78169
+ sprintStatus: SprintStatus;
78170
+ toValue?: Maybe<Scalars['DateTime']['output']>;
78171
+ };
78172
+
78173
+ export enum PlanmagnetSprintScope {
78174
+ Project = 'PROJECT',
78175
+ Team = 'TEAM'
78176
+ }
78177
+
77119
78178
  export type PlanmagnetSprintWorkItemsInput = {
77120
78179
  workItemIds: Array<Scalars['ID']['input']>;
77121
78180
  };
77122
78181
 
78182
+ /** Reporting group of a status. DONE and CANCELLED never change category. */
78183
+ export enum PlanmagnetStatusCategory {
78184
+ Backlog = 'BACKLOG',
78185
+ Cancelled = 'CANCELLED',
78186
+ Done = 'DONE',
78187
+ Started = 'STARTED',
78188
+ Unstarted = 'UNSTARTED'
78189
+ }
78190
+
77123
78191
  export type PlanmagnetSuggestWorkItemBreakdownInput = {
77124
78192
  /** Plain-text feature request or description to break down. */
77125
78193
  description: Scalars['String']['input'];
@@ -77178,6 +78246,79 @@ export enum PlanmagnetSyncStatus {
77178
78246
  Syncing = 'SYNCING'
77179
78247
  }
77180
78248
 
78249
+ export type PlanmagnetTeamFilter = {
78250
+ search?: InputMaybe<Scalars['String']['input']>;
78251
+ };
78252
+
78253
+ export type PlanmagnetTeamList = {
78254
+ __typename?: 'PlanmagnetTeamList';
78255
+ items: Array<Team>;
78256
+ pageInfo: PlanmagnetPageInfo;
78257
+ totalCount: Scalars['Int']['output'];
78258
+ };
78259
+
78260
+ export type PlanmagnetTeamMembersInput = {
78261
+ actorIds: Array<Scalars['ID']['input']>;
78262
+ };
78263
+
78264
+ export type PlanmagnetTeamProjectsInput = {
78265
+ projectIds: Array<Scalars['ID']['input']>;
78266
+ };
78267
+
78268
+ /** Velocity across the trailing N completed sprints of a team (BOFF-8044). */
78269
+ export type PlanmagnetTeamVelocity = {
78270
+ __typename?: 'PlanmagnetTeamVelocity';
78271
+ averageVelocity: Scalars['Float']['output'];
78272
+ forecastNextSprintPoints: Scalars['Float']['output'];
78273
+ sprints: Array<PlanmagnetTeamVelocitySprintPoint>;
78274
+ teamId: Scalars['ID']['output'];
78275
+ };
78276
+
78277
+ /** 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). */
78278
+ export type PlanmagnetTeamVelocityProjectShare = {
78279
+ __typename?: 'PlanmagnetTeamVelocityProjectShare';
78280
+ count: Scalars['Int']['output'];
78281
+ points: Scalars['Int']['output'];
78282
+ projectId: Scalars['ID']['output'];
78283
+ projectName: Scalars['String']['output'];
78284
+ };
78285
+
78286
+ /** 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. */
78287
+ export type PlanmagnetTeamVelocitySprintPoint = {
78288
+ __typename?: 'PlanmagnetTeamVelocitySprintPoint';
78289
+ byProject: Array<PlanmagnetTeamVelocityProjectShare>;
78290
+ completedCount: Scalars['Int']['output'];
78291
+ completedPoints: Scalars['Int']['output'];
78292
+ plannedPoints?: Maybe<Scalars['Int']['output']>;
78293
+ sequenceNumber: Scalars['Int']['output'];
78294
+ sprintId: Scalars['ID']['output'];
78295
+ sprintName: Scalars['String']['output'];
78296
+ };
78297
+
78298
+ /** 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. */
78299
+ export type PlanmagnetThroughput = {
78300
+ __typename?: 'PlanmagnetThroughput';
78301
+ bucket: PlanmagnetThroughputBucket;
78302
+ endDate: Scalars['DateTime']['output'];
78303
+ points: Array<PlanmagnetThroughputPoint>;
78304
+ projectId: Scalars['ID']['output'];
78305
+ startDate: Scalars['DateTime']['output'];
78306
+ };
78307
+
78308
+ export enum PlanmagnetThroughputBucket {
78309
+ Day = 'DAY',
78310
+ Week = 'WEEK'
78311
+ }
78312
+
78313
+ /** One bucket's completed work: item count and story points that reached DONE within it. */
78314
+ export type PlanmagnetThroughputPoint = {
78315
+ __typename?: 'PlanmagnetThroughputPoint';
78316
+ completedCount: Scalars['Int']['output'];
78317
+ completedPoints: Scalars['Int']['output'];
78318
+ /** Bucket start (UTC midnight; for WEEK, the Monday that starts the bucket). */
78319
+ periodStart: Scalars['DateTime']['output'];
78320
+ };
78321
+
77181
78322
  /** An individual time record capturing work performed on a specific work item during a time period. */
77182
78323
  export type PlanmagnetTimeEntry = {
77183
78324
  __typename?: 'PlanmagnetTimeEntry';
@@ -77195,8 +78336,6 @@ export type PlanmagnetTimeEntry = {
77195
78336
  description?: Maybe<Scalars['String']['output']>;
77196
78337
  /** Duration in minutes */
77197
78338
  durationMinutes: Scalars['Int']['output'];
77198
- /** End time (optional, for clock-in/clock-out) */
77199
- endTime?: Maybe<Scalars['DateTime']['output']>;
77200
78339
  /** Unique identifier */
77201
78340
  id: Scalars['ID']['output'];
77202
78341
  /** Arbitrary metadata */
@@ -77205,8 +78344,6 @@ export type PlanmagnetTimeEntry = {
77205
78344
  onBehalfOf?: Maybe<Scalars['String']['output']>;
77206
78345
  /** Project ID */
77207
78346
  projectId: Scalars['String']['output'];
77208
- /** Start time (optional, for clock-in/clock-out) */
77209
- startTime?: Maybe<Scalars['DateTime']['output']>;
77210
78347
  /** Current status */
77211
78348
  status: TimeEntryStatus;
77212
78349
  /** Timesheet this entry belongs to */
@@ -77225,7 +78362,9 @@ export type PlanmagnetTimeEntry = {
77225
78362
 
77226
78363
  export type PlanmagnetTimeEntryFilter = {
77227
78364
  billingType?: InputMaybe<BillingType>;
78365
+ /** Entries dated on or after this UTC day */
77228
78366
  dateFrom?: InputMaybe<Scalars['DateTime']['input']>;
78367
+ /** Entries dated on or before this UTC day (the whole day is included) */
77229
78368
  dateTo?: InputMaybe<Scalars['DateTime']['input']>;
77230
78369
  projectId?: InputMaybe<Scalars['String']['input']>;
77231
78370
  status?: InputMaybe<TimeEntryStatus>;
@@ -77279,7 +78418,9 @@ export type PlanmagnetTimesheet = {
77279
78418
  };
77280
78419
 
77281
78420
  export type PlanmagnetTimesheetFilter = {
78421
+ /** With periodStart: timesheets whose period OVERLAPS the window (inclusive by UTC day). Alone: periods starting on or before this day */
77282
78422
  periodEnd?: InputMaybe<Scalars['DateTime']['input']>;
78423
+ /** With periodEnd: timesheets whose period OVERLAPS the window (inclusive by UTC day). Alone: periods ending on or after this day */
77283
78424
  periodStart?: InputMaybe<Scalars['DateTime']['input']>;
77284
78425
  status?: InputMaybe<TimeEntryStatus>;
77285
78426
  userId?: InputMaybe<Scalars['String']['input']>;
@@ -77352,6 +78493,7 @@ export type PlanmagnetUpdateCustomFieldDefinitionInput = {
77352
78493
 
77353
78494
  export type PlanmagnetUpdateDependencyInput = {
77354
78495
  description?: InputMaybe<Scalars['String']['input']>;
78496
+ lagMinutes?: InputMaybe<Scalars['Int']['input']>;
77355
78497
  metadata?: InputMaybe<Scalars['JSON']['input']>;
77356
78498
  status?: InputMaybe<DependencyStatus>;
77357
78499
  type?: InputMaybe<DependencyType>;
@@ -77361,6 +78503,8 @@ export type PlanmagnetUpdateDocInput = {
77361
78503
  /** Optional note recorded on the new revision this update creates. */
77362
78504
  changeNote?: InputMaybe<Scalars['String']['input']>;
77363
78505
  content?: InputMaybe<Scalars['String']['input']>;
78506
+ /** 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. */
78507
+ expectedVersion?: InputMaybe<Scalars['Int']['input']>;
77364
78508
  status?: InputMaybe<DocStatus>;
77365
78509
  title?: InputMaybe<Scalars['String']['input']>;
77366
78510
  };
@@ -77390,6 +78534,7 @@ export type PlanmagnetUpdateFeatureRequestInput = {
77390
78534
  description?: InputMaybe<Scalars['String']['input']>;
77391
78535
  effortEstimate?: InputMaybe<Scalars['String']['input']>;
77392
78536
  metadata?: InputMaybe<Scalars['JSON']['input']>;
78537
+ productId?: InputMaybe<Scalars['String']['input']>;
77393
78538
  projectId?: InputMaybe<Scalars['String']['input']>;
77394
78539
  status?: InputMaybe<FeatureRequestStatus>;
77395
78540
  tags?: InputMaybe<Array<Scalars['String']['input']>>;
@@ -77447,6 +78592,16 @@ export type PlanmagnetUpdatePortfolioInput = {
77447
78592
  tags?: InputMaybe<Array<Scalars['String']['input']>>;
77448
78593
  };
77449
78594
 
78595
+ export type PlanmagnetUpdateProductInput = {
78596
+ description?: InputMaybe<Scalars['String']['input']>;
78597
+ lifecycleStage?: InputMaybe<PlanmagnetProductLifecycleStage>;
78598
+ metadata?: InputMaybe<Scalars['JSON']['input']>;
78599
+ name?: InputMaybe<Scalars['String']['input']>;
78600
+ northStar?: InputMaybe<PlanmagnetProductNorthStarInput>;
78601
+ ownerId?: InputMaybe<Scalars['String']['input']>;
78602
+ vision?: InputMaybe<Scalars['String']['input']>;
78603
+ };
78604
+
77450
78605
  export type PlanmagnetUpdateProgramInput = {
77451
78606
  budgetTotal?: InputMaybe<Scalars['Float']['input']>;
77452
78607
  currency?: InputMaybe<Scalars['String']['input']>;
@@ -77469,6 +78624,8 @@ export type PlanmagnetUpdateProjectInput = {
77469
78624
  methodology?: InputMaybe<ProjectMethodology>;
77470
78625
  name?: InputMaybe<Scalars['String']['input']>;
77471
78626
  ownerId?: InputMaybe<Scalars['String']['input']>;
78627
+ /** 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. */
78628
+ portfolioId?: InputMaybe<Scalars['String']['input']>;
77472
78629
  programId?: InputMaybe<Scalars['String']['input']>;
77473
78630
  startDate?: InputMaybe<Scalars['DateTime']['input']>;
77474
78631
  status?: InputMaybe<PlanmagnetProjectStatus>;
@@ -77491,6 +78648,14 @@ export type PlanmagnetUpdateProjectTemplateInput = {
77491
78648
  tags?: InputMaybe<Array<Scalars['String']['input']>>;
77492
78649
  };
77493
78650
 
78651
+ /** Omitted fields keep their current value; a list that is sent replaces the whole list */
78652
+ export type PlanmagnetUpdateProjectWorkflowInput = {
78653
+ enforceTransitions?: InputMaybe<Scalars['Boolean']['input']>;
78654
+ /** Statuses not listed return to their defaults */
78655
+ statuses?: InputMaybe<Array<PlanmagnetWorkflowStatusInput>>;
78656
+ transitions?: InputMaybe<Array<PlanmagnetWorkflowTransitionInput>>;
78657
+ };
78658
+
77494
78659
  export type PlanmagnetUpdateQualityGateInput = {
77495
78660
  criteria?: InputMaybe<Scalars['JSON']['input']>;
77496
78661
  description?: InputMaybe<Scalars['String']['input']>;
@@ -77498,6 +78663,8 @@ export type PlanmagnetUpdateQualityGateInput = {
77498
78663
  milestoneId?: InputMaybe<Scalars['String']['input']>;
77499
78664
  name?: InputMaybe<Scalars['String']['input']>;
77500
78665
  phase?: InputMaybe<Scalars['String']['input']>;
78666
+ /** The release this gate holds (a release of the same project, or one with no projects) */
78667
+ releaseId?: InputMaybe<Scalars['String']['input']>;
77501
78668
  sortOrder?: InputMaybe<Scalars['Int']['input']>;
77502
78669
  status?: InputMaybe<QualityGateStatus>;
77503
78670
  };
@@ -77508,6 +78675,7 @@ export type PlanmagnetUpdateReleaseInput = {
77508
78675
  name?: InputMaybe<Scalars['String']['input']>;
77509
78676
  ownerId?: InputMaybe<Scalars['String']['input']>;
77510
78677
  plannedDate?: InputMaybe<Scalars['DateTime']['input']>;
78678
+ productId?: InputMaybe<Scalars['String']['input']>;
77511
78679
  releaseNotes?: InputMaybe<Scalars['String']['input']>;
77512
78680
  releasedAt?: InputMaybe<Scalars['DateTime']['input']>;
77513
78681
  status?: InputMaybe<ReleaseStatus>;
@@ -77538,6 +78706,8 @@ export type PlanmagnetUpdateRoadmapInput = {
77538
78706
  metadata?: InputMaybe<Scalars['JSON']['input']>;
77539
78707
  name?: InputMaybe<Scalars['String']['input']>;
77540
78708
  ownerId?: InputMaybe<Scalars['String']['input']>;
78709
+ planningFocus?: InputMaybe<RoadmapPlanningFocus>;
78710
+ productId?: InputMaybe<Scalars['String']['input']>;
77541
78711
  type?: InputMaybe<RoadmapType>;
77542
78712
  };
77543
78713
 
@@ -77568,15 +78738,20 @@ export type PlanmagnetUpdateSprintInput = {
77568
78738
  velocity?: InputMaybe<Scalars['Int']['input']>;
77569
78739
  };
77570
78740
 
78741
+ export type PlanmagnetUpdateTeamInput = {
78742
+ capacity?: InputMaybe<Scalars['Int']['input']>;
78743
+ description?: InputMaybe<Scalars['String']['input']>;
78744
+ leadId?: InputMaybe<Scalars['String']['input']>;
78745
+ name?: InputMaybe<Scalars['String']['input']>;
78746
+ };
78747
+
77571
78748
  export type PlanmagnetUpdateTimeEntryInput = {
77572
78749
  billingRate?: InputMaybe<Scalars['Float']['input']>;
77573
78750
  billingType?: InputMaybe<BillingType>;
77574
78751
  date?: InputMaybe<Scalars['DateTime']['input']>;
77575
78752
  description?: InputMaybe<Scalars['String']['input']>;
77576
78753
  durationMinutes?: InputMaybe<Scalars['Int']['input']>;
77577
- endTime?: InputMaybe<Scalars['DateTime']['input']>;
77578
78754
  metadata?: InputMaybe<Scalars['JSON']['input']>;
77579
- startTime?: InputMaybe<Scalars['DateTime']['input']>;
77580
78755
  status?: InputMaybe<TimeEntryStatus>;
77581
78756
  workItemId?: InputMaybe<Scalars['String']['input']>;
77582
78757
  };
@@ -77628,16 +78803,53 @@ export type PlanmagnetVelocitySprintPoint = {
77628
78803
  completedPoints: Scalars['Int']['output'];
77629
78804
  /** Planned/committed points for the sprint, if set. */
77630
78805
  plannedPoints?: Maybe<Scalars['Int']['output']>;
78806
+ /** 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. */
78807
+ scope: PlanmagnetSprintScope;
77631
78808
  sequenceNumber: Scalars['Int']['output'];
77632
78809
  sprintId: Scalars['ID']['output'];
77633
78810
  sprintName: Scalars['String']['output'];
78811
+ /** Set only when scope is TEAM. */
78812
+ teamId?: Maybe<Scalars['ID']['output']>;
78813
+ /** Set only when scope is TEAM. */
78814
+ teamName?: Maybe<Scalars['String']['output']>;
77634
78815
  };
77635
78816
 
77636
78817
  export type PlanmagnetVoteOnFeatureInput = {
77637
78818
  comment?: InputMaybe<Scalars['String']['input']>;
78819
+ /** Whole number from 1 to 100 (default 1) */
77638
78820
  weight?: InputMaybe<Scalars['Int']['input']>;
77639
78821
  };
77640
78822
 
78823
+ export type PlanmagnetWorkItemActivity = {
78824
+ __typename?: 'PlanmagnetWorkItemActivity';
78825
+ /** Newest first */
78826
+ items: Array<PlanmagnetWorkItemActivityEvent>;
78827
+ /** Every recorded event */
78828
+ totalCount: Scalars['Int']['output'];
78829
+ /** True when more events exist than were returned */
78830
+ truncated: Scalars['Boolean']['output'];
78831
+ };
78832
+
78833
+ /** 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. */
78834
+ export type PlanmagnetWorkItemActivityEvent = {
78835
+ __typename?: 'PlanmagnetWorkItemActivityEvent';
78836
+ /** Actor who did it */
78837
+ actorId?: Maybe<Scalars['String']['output']>;
78838
+ at: Scalars['DateTime']['output'];
78839
+ /** The comment (COMMENTED) */
78840
+ commentId?: Maybe<Scalars['String']['output']>;
78841
+ /** The start of the comment (COMMENTED) */
78842
+ excerpt?: Maybe<Scalars['String']['output']>;
78843
+ /** Status before (STATUS_CHANGED) */
78844
+ fromStatus?: Maybe<Scalars['String']['output']>;
78845
+ /** Stable id, prefixed by source (transition:, comment:, created:) */
78846
+ id: Scalars['ID']['output'];
78847
+ /** CREATED, STATUS_CHANGED or COMMENTED */
78848
+ kind: Scalars['String']['output'];
78849
+ /** Status after (CREATED from the transition log, STATUS_CHANGED) */
78850
+ toStatus?: Maybe<Scalars['String']['output']>;
78851
+ };
78852
+
77641
78853
  export type PlanmagnetWorkItemBreakdownResult = {
77642
78854
  __typename?: 'PlanmagnetWorkItemBreakdownResult';
77643
78855
  /** Id of the PlanmagnetAgentRun ledger row this call was recorded as. */
@@ -77646,6 +78858,42 @@ export type PlanmagnetWorkItemBreakdownResult = {
77646
78858
  suggestions: Array<PlanmagnetWorkItemSuggestion>;
77647
78859
  };
77648
78860
 
78861
+ /** A comment on a work item. Visible to everyone who can read the work item; only its author can edit or delete it. */
78862
+ export type PlanmagnetWorkItemComment = {
78863
+ __typename?: 'PlanmagnetWorkItemComment';
78864
+ /** Actor who posted the comment */
78865
+ authorId: Scalars['String']['output'];
78866
+ body: Scalars['String']['output'];
78867
+ createdAt: Scalars['DateTime']['output'];
78868
+ /** Set when the author changed the body after posting */
78869
+ editedAt?: Maybe<Scalars['DateTime']['output']>;
78870
+ id: Scalars['ID']['output'];
78871
+ updatedAt: Scalars['DateTime']['output'];
78872
+ workItemId: Scalars['String']['output'];
78873
+ };
78874
+
78875
+ export type PlanmagnetWorkItemCommentList = {
78876
+ __typename?: 'PlanmagnetWorkItemCommentList';
78877
+ items: Array<PlanmagnetWorkItemComment>;
78878
+ pageInfo: PlanmagnetPageInfo;
78879
+ totalCount: Scalars['Int']['output'];
78880
+ };
78881
+
78882
+ /** 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. */
78883
+ export type PlanmagnetWorkItemCounts = {
78884
+ __typename?: 'PlanmagnetWorkItemCounts';
78885
+ /** Open matching work items held back by an active dependency whose predecessor is not done (the release readiness definition of blocked) */
78886
+ blocked: Scalars['Int']['output'];
78887
+ /** Matching work items per project and status */
78888
+ byProject: Array<PlanmagnetWorkItemProjectStatusCount>;
78889
+ /** Matching work items per status (statuses with no items are omitted) */
78890
+ byStatus: Array<PlanmagnetWorkItemStatusCount>;
78891
+ /** Sum of story points over every matching work item */
78892
+ points: Scalars['Int']['output'];
78893
+ /** Every matching work item */
78894
+ total: Scalars['Int']['output'];
78895
+ };
78896
+
77649
78897
  export type PlanmagnetWorkItemDependencyList = {
77650
78898
  __typename?: 'PlanmagnetWorkItemDependencyList';
77651
78899
  items: Array<WorkItemDependency>;
@@ -77655,6 +78903,8 @@ export type PlanmagnetWorkItemDependencyList = {
77655
78903
 
77656
78904
  export type PlanmagnetWorkItemFilter = {
77657
78905
  assigneeId?: InputMaybe<Scalars['String']['input']>;
78906
+ /** Leave these work items out (e.g. the ones already in a sprint or release), so a picker never pages first and excludes afterwards */
78907
+ excludeIds?: InputMaybe<Array<Scalars['String']['input']>>;
77658
78908
  parentId?: InputMaybe<Scalars['String']['input']>;
77659
78909
  priority?: InputMaybe<WorkItemPriority>;
77660
78910
  projectId?: InputMaybe<Scalars['String']['input']>;
@@ -77687,6 +78937,24 @@ export type PlanmagnetWorkItemList = {
77687
78937
  totalCount: Scalars['Int']['output'];
77688
78938
  };
77689
78939
 
78940
+ export type PlanmagnetWorkItemProjectStatusCount = {
78941
+ __typename?: 'PlanmagnetWorkItemProjectStatusCount';
78942
+ count: Scalars['Int']['output'];
78943
+ /** Sum of story points of these work items (items without an estimate count as 0) */
78944
+ points: Scalars['Int']['output'];
78945
+ projectId: Scalars['String']['output'];
78946
+ status: Scalars['String']['output'];
78947
+ };
78948
+
78949
+ export type PlanmagnetWorkItemStatusCount = {
78950
+ __typename?: 'PlanmagnetWorkItemStatusCount';
78951
+ count: Scalars['Int']['output'];
78952
+ /** Sum of story points of these work items (items without an estimate count as 0) */
78953
+ points: Scalars['Int']['output'];
78954
+ /** A WorkItemStatus value. A String, not the enum, so a stored status the API does not expose yet (BLOCKED) cannot fail the whole query */
78955
+ status: Scalars['String']['output'];
78956
+ };
78957
+
77690
78958
  export type PlanmagnetWorkItemSuggestion = {
77691
78959
  __typename?: 'PlanmagnetWorkItemSuggestion';
77692
78960
  description?: Maybe<Scalars['String']['output']>;
@@ -77696,6 +78964,37 @@ export type PlanmagnetWorkItemSuggestion = {
77696
78964
  type: WorkItemType;
77697
78965
  };
77698
78966
 
78967
+ /** How one canonical status appears and behaves in a project */
78968
+ export type PlanmagnetWorkflowStatus = {
78969
+ __typename?: 'PlanmagnetWorkflowStatus';
78970
+ category: PlanmagnetStatusCategory;
78971
+ /** Hidden statuses cannot be chosen for new moves; items already in one stay readable */
78972
+ hidden: Scalars['Boolean']['output'];
78973
+ /** The project's name for it */
78974
+ label: Scalars['String']['output'];
78975
+ status: WorkItemStatus;
78976
+ };
78977
+
78978
+ export type PlanmagnetWorkflowStatusInput = {
78979
+ /** Defaults to the status's standard category */
78980
+ category?: InputMaybe<PlanmagnetStatusCategory>;
78981
+ hidden?: InputMaybe<Scalars['Boolean']['input']>;
78982
+ label: Scalars['String']['input'];
78983
+ status: WorkItemStatus;
78984
+ };
78985
+
78986
+ /** An allowed status change */
78987
+ export type PlanmagnetWorkflowTransition = {
78988
+ __typename?: 'PlanmagnetWorkflowTransition';
78989
+ from: WorkItemStatus;
78990
+ to: WorkItemStatus;
78991
+ };
78992
+
78993
+ export type PlanmagnetWorkflowTransitionInput = {
78994
+ from: WorkItemStatus;
78995
+ to: WorkItemStatus;
78996
+ };
78997
+
77699
78998
  /** 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. */
77700
78999
  export type PlanmagnetWorkspaceEditor = {
77701
79000
  __typename?: 'PlanmagnetWorkspaceEditor';
@@ -78307,7 +79606,28 @@ export type ProduceWithdrawalStatus = {
78307
79606
 
78308
79607
  export type Product = {
78309
79608
  __typename?: 'Product';
79609
+ /** Domain lifecycle marker, distinct from deletedAt. Null = active. */
79610
+ archivedAt?: Maybe<Scalars['DateTime']['output']>;
79611
+ context?: Maybe<Scalars['JSON']['output']>;
79612
+ createdAt: Scalars['DateTime']['output'];
79613
+ createdBy: Scalars['String']['output'];
79614
+ deletedAt?: Maybe<Scalars['DateTime']['output']>;
79615
+ description?: Maybe<Scalars['String']['output']>;
79616
+ featureRequests: Array<FeatureRequest>;
78310
79617
  id: Scalars['ID']['output'];
79618
+ lifecycleStage: PlanmagnetProductLifecycleStage;
79619
+ metadata?: Maybe<Scalars['JSON']['output']>;
79620
+ name: Scalars['String']['output'];
79621
+ northStar?: Maybe<PlanmagnetProductNorthStar>;
79622
+ objectives: Array<PlanmagnetObjective>;
79623
+ onBehalfOf?: Maybe<Scalars['String']['output']>;
79624
+ ownerId: Scalars['String']['output'];
79625
+ releases: Array<Release>;
79626
+ roadmaps: Array<Roadmap>;
79627
+ updatedAt: Scalars['DateTime']['output'];
79628
+ updatedBy?: Maybe<Scalars['String']['output']>;
79629
+ vision: Scalars['String']['output'];
79630
+ workspaceId: Scalars['String']['output'];
78311
79631
  };
78312
79632
 
78313
79633
  export type ProductCount = {
@@ -79349,6 +80669,22 @@ export type ProviderList = {
79349
80669
  total: Scalars['Int']['output'];
79350
80670
  };
79351
80671
 
80672
+ /** An assistant sandbox for the caller, built by the service. */
80673
+ export type ProvisionAssistantSandboxInput = {
80674
+ context: ContextInput;
80675
+ /** At most AI_ASSISTANT_PRODUCT, HOSTNAME and WORKSPACE_ID, each with the value the request implies. Never a token. */
80676
+ env?: InputMaybe<Array<EnvVarInput>>;
80677
+ /** An org-published ai-assistant runtime image. */
80678
+ image: Scalars['String']['input'];
80679
+ mode: SandboxAssistantMode;
80680
+ /** The product whose docs and persona the assistant uses (e.g. vibecontrols). */
80681
+ product: Scalars['String']['input'];
80682
+ /** Requested lifetime; bounded by the plan and the workspace maximum. */
80683
+ ttlSeconds?: InputMaybe<Scalars['Int']['input']>;
80684
+ /** Take action only; Ask ignores it. */
80685
+ writeApproval?: InputMaybe<SandboxAssistantWriteApproval>;
80686
+ };
80687
+
79352
80688
  export type ProxySandboxRequestInput = {
79353
80689
  /** Request body as JSON (for POST/PUT/PATCH) */
79354
80690
  body?: InputMaybe<Scalars['JSON']['input']>;
@@ -80684,6 +82020,8 @@ export type QualityGate = {
80684
82020
  project?: Maybe<PlanmagnetProject>;
80685
82021
  /** Parent project ID */
80686
82022
  projectId: Scalars['String']['output'];
82023
+ /** The release this gate holds. The release cannot become RELEASED until this gate is PASSED or WAIVED */
82024
+ releaseId?: Maybe<Scalars['String']['output']>;
80687
82025
  /** Review results and notes */
80688
82026
  reviewNotes?: Maybe<Scalars['String']['output']>;
80689
82027
  /** Review timestamp */
@@ -80871,10 +82209,18 @@ export type Query = {
80871
82209
  assetRegister: Array<Asset>;
80872
82210
  assets: Array<Asset>;
80873
82211
  assignmentSuggestions: MtwAssignmentSuggestions;
80874
- /** The transcript of one of my assistant chats, oldest first. */
82212
+ /**
82213
+ * The transcript of one of my assistant chats, oldest first.
82214
+ * @deprecated Use the my* assistant-history fields (BOFF-7335).
82215
+ */
80875
82216
  assistantConversationMessages: Array<AssistantHistoryMessage>;
80876
- /** My assistant chats for one product, newest first. */
82217
+ /**
82218
+ * My assistant chats for one product, newest first.
82219
+ * @deprecated Use the my* assistant-history fields (BOFF-7335).
82220
+ */
80877
82221
  assistantConversations: Array<AssistantConversation>;
82222
+ /** Run one GraphQL query as the owner of the session the capability names. Queries only. */
82223
+ assistantSessionQuery: AssistantSessionRelayResult;
80878
82224
  /** A single AI decision execution log entry by id, scoped to the caller's workspace. */
80879
82225
  athAgentRun?: Maybe<AthAgentRun>;
80880
82226
  /** Paginated, workspace-scoped AI decision execution log, most recent first. */
@@ -82297,7 +83643,7 @@ export type Query = {
82297
83643
  /** Get aggregated ad performance metrics for the workspace */
82298
83644
  headshotmarketingAdMetrics: HeadshotmarketingAdMetrics;
82299
83645
  headshotmarketingAdPlatformConnections: HeadshotmarketingAdPlatformConnectionList;
82300
- /** Compute a deterministic first-touch + linear attribution report for a WON deal or a CONVERTED lead. Exactly one of dealId/leadId must be supplied. */
83646
+ /** 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). */
82301
83647
  headshotmarketingAttributionReport: HeadshotmarketingAttributionReport;
82302
83648
  /** Get a specific audience by ID */
82303
83649
  headshotmarketingAudience?: Maybe<HeadshotmarketingAudience>;
@@ -82395,6 +83741,8 @@ export type Query = {
82395
83741
  headshotmarketingPipelineOverview?: Maybe<HeadshotmarketingPipelineOverview>;
82396
83742
  /** List pipelines with optional filters */
82397
83743
  headshotmarketingPipelines: HeadshotmarketingPipelineList;
83744
+ /** 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. */
83745
+ headshotmarketingPublicLandingPage?: Maybe<HeadshotmarketingPublicLandingPage>;
82398
83746
  /** Get an SEO audit by ID */
82399
83747
  headshotmarketingSEOAudit?: Maybe<HeadshotmarketingSeoAudit>;
82400
83748
  /** List SEO audits with optional filters and pagination */
@@ -82904,6 +84252,12 @@ export type Query = {
82904
84252
  metrics: Array<Metric>;
82905
84253
  myAgentMessageBookmarks: AgentMessageBookmarkList;
82906
84254
  myApprovalRequests: Array<TimeApprovalRequest>;
84255
+ /** One of my conversations. Exactly one of clientConversationId / conversationId. Default: the newest 50. */
84256
+ myAssistantConversationEntries: AssistantHistoryEntryConnection;
84257
+ /** My live conversations, most recently changed first. */
84258
+ myAssistantConversations: AssistantHistoryConversationConnection;
84259
+ /** My conversations' changes in commit order, tombstones included. */
84260
+ myAssistantHistoryChanges: AssistantHistoryChangeConnection;
82907
84261
  myBalanceTargets: Array<TimeCampusBalanceTarget>;
82908
84262
  myContextSharingPolicy: TimeCampusContextSharingPolicy;
82909
84263
  myDeadTimeRadar: TimeCampusDeadTimeRadar;
@@ -83052,6 +84406,8 @@ export type Query = {
83052
84406
  planmagnetAutomationRules: PlanmagnetAutomationRuleList;
83053
84407
  /** Get a single board by ID */
83054
84408
  planmagnetBoard?: Maybe<Board>;
84409
+ /** One column's cards, a page at a time (a column shows its first 100; this pages past them). Same placement as BoardColumn.cards */
84410
+ planmagnetBoardColumnCards: PlanmagnetWorkItemList;
83055
84411
  /** List boards in a workspace */
83056
84412
  planmagnetBoards: PlanmagnetBoardList;
83057
84413
  /** Get a single budget by ID */
@@ -83101,6 +84457,10 @@ export type Query = {
83101
84457
  planmagnetMilestone?: Maybe<Milestone>;
83102
84458
  /** List milestones in a workspace */
83103
84459
  planmagnetMilestones: PlanmagnetMilestoneList;
84460
+ /** 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). */
84461
+ planmagnetMyAgentRuns: PlanmagnetAgentRunList;
84462
+ /** 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. */
84463
+ planmagnetMyWorkItems: PlanmagnetWorkItemList;
83104
84464
  planmagnetObjective?: Maybe<PlanmagnetObjective>;
83105
84465
  planmagnetObjectives: PlanmagnetObjectiveList;
83106
84466
  /** Get a single portfolio by ID */
@@ -83109,6 +84469,8 @@ export type Query = {
83109
84469
  planmagnetPortfolioOverview: PlanmagnetPortfolioOverview;
83110
84470
  /** List portfolios in a workspace */
83111
84471
  planmagnetPortfolios: PlanmagnetPortfolioList;
84472
+ planmagnetProduct?: Maybe<Product>;
84473
+ planmagnetProducts: PlanmagnetProductList;
83112
84474
  /** Get a single program by ID */
83113
84475
  planmagnetProgram?: Maybe<Program>;
83114
84476
  /** List programs in a workspace */
@@ -83119,6 +84481,8 @@ export type Query = {
83119
84481
  planmagnetProjectTemplate?: Maybe<ProjectTemplate>;
83120
84482
  /** List project templates in a workspace */
83121
84483
  planmagnetProjectTemplates: PlanmagnetProjectTemplateList;
84484
+ /** A project's workflow */
84485
+ planmagnetProjectWorkflow: PlanmagnetProjectWorkflow;
83122
84486
  /** List projects in a workspace */
83123
84487
  planmagnetProjects: PlanmagnetProjectList;
83124
84488
  /** Get a single quality gate by ID */
@@ -83127,6 +84491,8 @@ export type Query = {
83127
84491
  planmagnetQualityGates: PlanmagnetQualityGateList;
83128
84492
  /** Get a single release by ID */
83129
84493
  planmagnetRelease?: Maybe<Release>;
84494
+ /** 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. */
84495
+ planmagnetReleaseReadiness: PlanmagnetReleaseReadiness;
83130
84496
  /** List releases in a workspace */
83131
84497
  planmagnetReleases: PlanmagnetReleaseList;
83132
84498
  /** Get a single risk by ID */
@@ -83151,6 +84517,14 @@ export type Query = {
83151
84517
  planmagnetSprintCapacity: PlanmagnetSprintCapacity;
83152
84518
  /** List sprints in a workspace */
83153
84519
  planmagnetSprints: PlanmagnetSprintList;
84520
+ /** Get a single team by ID. */
84521
+ planmagnetTeam?: Maybe<Team>;
84522
+ /** Velocity (whole-sprint completed points, plus the per-project split) across the trailing N COMPLETED sprints of a team (BOFF-8044). */
84523
+ planmagnetTeamVelocity: PlanmagnetTeamVelocity;
84524
+ /** List teams in a workspace. */
84525
+ planmagnetTeams: PlanmagnetTeamList;
84526
+ /** 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(). */
84527
+ planmagnetThroughput: PlanmagnetThroughput;
83154
84528
  /** List time entries in a workspace */
83155
84529
  planmagnetTimeEntries: PlanmagnetTimeEntryList;
83156
84530
  /** Get a single time entry by ID */
@@ -83163,6 +84537,12 @@ export type Query = {
83163
84537
  planmagnetVelocity: PlanmagnetVelocity;
83164
84538
  /** Get a single work item by ID */
83165
84539
  planmagnetWorkItem?: Maybe<WorkItem>;
84540
+ /** A work item's recorded history, newest first */
84541
+ planmagnetWorkItemActivity: PlanmagnetWorkItemActivity;
84542
+ /** Comments on a work item, oldest first */
84543
+ planmagnetWorkItemComments: PlanmagnetWorkItemCommentList;
84544
+ /** Count work items matching a filter, in total, per status and per project, computed on the server */
84545
+ planmagnetWorkItemCounts: PlanmagnetWorkItemCounts;
83166
84546
  /** Docs currently linked to a given work item. */
83167
84547
  planmagnetWorkItemDocs: Array<PlanmagnetDoc>;
83168
84548
  /** Get a single work item link by ID */
@@ -84679,6 +86059,12 @@ export type QueryAssistantConversationsArgs = {
84679
86059
  };
84680
86060
 
84681
86061
 
86062
+ /** Base Query type with placeholder field. Extended by individual query files. */
86063
+ export type QueryAssistantSessionQueryArgs = {
86064
+ input: AssistantSessionRelayInput;
86065
+ };
86066
+
86067
+
84682
86068
  /** Base Query type with placeholder field. Extended by individual query files. */
84683
86069
  export type QueryAthAgentRunArgs = {
84684
86070
  id: Scalars['ID']['input'];
@@ -91434,6 +92820,7 @@ export type QueryHeadshotmarketingAdPlatformConnectionsArgs = {
91434
92820
  export type QueryHeadshotmarketingAttributionReportArgs = {
91435
92821
  dealId?: InputMaybe<Scalars['ID']['input']>;
91436
92822
  leadId?: InputMaybe<Scalars['ID']['input']>;
92823
+ timeDecayHalfLifeDays?: InputMaybe<Scalars['Float']['input']>;
91437
92824
  };
91438
92825
 
91439
92826
 
@@ -91745,6 +93132,12 @@ export type QueryHeadshotmarketingPipelinesArgs = {
91745
93132
  };
91746
93133
 
91747
93134
 
93135
+ /** Base Query type with placeholder field. Extended by individual query files. */
93136
+ export type QueryHeadshotmarketingPublicLandingPageArgs = {
93137
+ slug: Scalars['String']['input'];
93138
+ };
93139
+
93140
+
91748
93141
  /** Base Query type with placeholder field. Extended by individual query files. */
91749
93142
  export type QueryHeadshotmarketingSeoAuditArgs = {
91750
93143
  id: Scalars['ID']['input'];
@@ -94233,6 +95626,35 @@ export type QueryMyApprovalRequestsArgs = {
94233
95626
  };
94234
95627
 
94235
95628
 
95629
+ /** Base Query type with placeholder field. Extended by individual query files. */
95630
+ export type QueryMyAssistantConversationEntriesArgs = {
95631
+ after?: InputMaybe<Scalars['String']['input']>;
95632
+ before?: InputMaybe<Scalars['String']['input']>;
95633
+ clientConversationId?: InputMaybe<Scalars['ID']['input']>;
95634
+ conversationId?: InputMaybe<Scalars['ID']['input']>;
95635
+ first?: InputMaybe<Scalars['Int']['input']>;
95636
+ last?: InputMaybe<Scalars['Int']['input']>;
95637
+ productId: Scalars['String']['input'];
95638
+ sinceSeq?: InputMaybe<Scalars['Int']['input']>;
95639
+ };
95640
+
95641
+
95642
+ /** Base Query type with placeholder field. Extended by individual query files. */
95643
+ export type QueryMyAssistantConversationsArgs = {
95644
+ after?: InputMaybe<Scalars['String']['input']>;
95645
+ first?: InputMaybe<Scalars['Int']['input']>;
95646
+ productId: Scalars['String']['input'];
95647
+ };
95648
+
95649
+
95650
+ /** Base Query type with placeholder field. Extended by individual query files. */
95651
+ export type QueryMyAssistantHistoryChangesArgs = {
95652
+ after?: InputMaybe<Scalars['String']['input']>;
95653
+ first?: InputMaybe<Scalars['Int']['input']>;
95654
+ productId: Scalars['String']['input'];
95655
+ };
95656
+
95657
+
94236
95658
  /** Base Query type with placeholder field. Extended by individual query files. */
94237
95659
  export type QueryMyBalanceTargetsArgs = {
94238
95660
  pagination?: InputMaybe<PaginationInput>;
@@ -94781,6 +96203,14 @@ export type QueryPlanmagnetBoardArgs = {
94781
96203
  };
94782
96204
 
94783
96205
 
96206
+ /** Base Query type with placeholder field. Extended by individual query files. */
96207
+ export type QueryPlanmagnetBoardColumnCardsArgs = {
96208
+ boardId: Scalars['ID']['input'];
96209
+ columnId: Scalars['ID']['input'];
96210
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
96211
+ };
96212
+
96213
+
94784
96214
  /** Base Query type with placeholder field. Extended by individual query files. */
94785
96215
  export type QueryPlanmagnetBoardsArgs = {
94786
96216
  filter?: InputMaybe<PlanmagnetBoardFilter>;
@@ -94946,6 +96376,7 @@ export type QueryPlanmagnetFeatureRequestArgs = {
94946
96376
  /** Base Query type with placeholder field. Extended by individual query files. */
94947
96377
  export type QueryPlanmagnetFeatureRequestsArgs = {
94948
96378
  filter?: InputMaybe<PlanmagnetFeatureRequestFilter>;
96379
+ orderBy?: InputMaybe<PlanmagnetFeatureOrder>;
94949
96380
  pagination?: InputMaybe<PlanmagnetPaginationInput>;
94950
96381
  workspaceId: Scalars['ID']['input'];
94951
96382
  };
@@ -94966,6 +96397,23 @@ export type QueryPlanmagnetMilestoneArgs = {
94966
96397
  /** Base Query type with placeholder field. Extended by individual query files. */
94967
96398
  export type QueryPlanmagnetMilestonesArgs = {
94968
96399
  filter?: InputMaybe<PlanmagnetMilestoneFilter>;
96400
+ orderBy?: InputMaybe<PlanmagnetMilestoneOrder>;
96401
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
96402
+ workspaceId: Scalars['ID']['input'];
96403
+ };
96404
+
96405
+
96406
+ /** Base Query type with placeholder field. Extended by individual query files. */
96407
+ export type QueryPlanmagnetMyAgentRunsArgs = {
96408
+ filter?: InputMaybe<PlanmagnetAgentRunFilter>;
96409
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
96410
+ workspaceId: Scalars['ID']['input'];
96411
+ };
96412
+
96413
+
96414
+ /** Base Query type with placeholder field. Extended by individual query files. */
96415
+ export type QueryPlanmagnetMyWorkItemsArgs = {
96416
+ filter?: InputMaybe<PlanmagnetMyWorkItemFilter>;
94969
96417
  pagination?: InputMaybe<PlanmagnetPaginationInput>;
94970
96418
  workspaceId: Scalars['ID']['input'];
94971
96419
  };
@@ -95005,6 +96453,20 @@ export type QueryPlanmagnetPortfoliosArgs = {
95005
96453
  };
95006
96454
 
95007
96455
 
96456
+ /** Base Query type with placeholder field. Extended by individual query files. */
96457
+ export type QueryPlanmagnetProductArgs = {
96458
+ id: Scalars['ID']['input'];
96459
+ };
96460
+
96461
+
96462
+ /** Base Query type with placeholder field. Extended by individual query files. */
96463
+ export type QueryPlanmagnetProductsArgs = {
96464
+ filter?: InputMaybe<PlanmagnetProductFilter>;
96465
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
96466
+ workspaceId: Scalars['ID']['input'];
96467
+ };
96468
+
96469
+
95008
96470
  /** Base Query type with placeholder field. Extended by individual query files. */
95009
96471
  export type QueryPlanmagnetProgramArgs = {
95010
96472
  id: Scalars['ID']['input'];
@@ -95039,6 +96501,12 @@ export type QueryPlanmagnetProjectTemplatesArgs = {
95039
96501
  };
95040
96502
 
95041
96503
 
96504
+ /** Base Query type with placeholder field. Extended by individual query files. */
96505
+ export type QueryPlanmagnetProjectWorkflowArgs = {
96506
+ projectId: Scalars['ID']['input'];
96507
+ };
96508
+
96509
+
95042
96510
  /** Base Query type with placeholder field. Extended by individual query files. */
95043
96511
  export type QueryPlanmagnetProjectsArgs = {
95044
96512
  filter?: InputMaybe<PlanmagnetProjectFilter>;
@@ -95067,6 +96535,12 @@ export type QueryPlanmagnetReleaseArgs = {
95067
96535
  };
95068
96536
 
95069
96537
 
96538
+ /** Base Query type with placeholder field. Extended by individual query files. */
96539
+ export type QueryPlanmagnetReleaseReadinessArgs = {
96540
+ releaseId: Scalars['ID']['input'];
96541
+ };
96542
+
96543
+
95070
96544
  /** Base Query type with placeholder field. Extended by individual query files. */
95071
96545
  export type QueryPlanmagnetReleasesArgs = {
95072
96546
  filter?: InputMaybe<PlanmagnetReleaseFilter>;
@@ -95150,6 +96624,38 @@ export type QueryPlanmagnetSprintsArgs = {
95150
96624
  };
95151
96625
 
95152
96626
 
96627
+ /** Base Query type with placeholder field. Extended by individual query files. */
96628
+ export type QueryPlanmagnetTeamArgs = {
96629
+ id: Scalars['ID']['input'];
96630
+ };
96631
+
96632
+
96633
+ /** Base Query type with placeholder field. Extended by individual query files. */
96634
+ export type QueryPlanmagnetTeamVelocityArgs = {
96635
+ teamId: Scalars['ID']['input'];
96636
+ trailingSprintCount?: InputMaybe<Scalars['Int']['input']>;
96637
+ workspaceId: Scalars['ID']['input'];
96638
+ };
96639
+
96640
+
96641
+ /** Base Query type with placeholder field. Extended by individual query files. */
96642
+ export type QueryPlanmagnetTeamsArgs = {
96643
+ filter?: InputMaybe<PlanmagnetTeamFilter>;
96644
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
96645
+ workspaceId: Scalars['ID']['input'];
96646
+ };
96647
+
96648
+
96649
+ /** Base Query type with placeholder field. Extended by individual query files. */
96650
+ export type QueryPlanmagnetThroughputArgs = {
96651
+ bucket?: InputMaybe<PlanmagnetThroughputBucket>;
96652
+ endDate?: InputMaybe<Scalars['DateTime']['input']>;
96653
+ projectId: Scalars['ID']['input'];
96654
+ startDate?: InputMaybe<Scalars['DateTime']['input']>;
96655
+ workspaceId: Scalars['ID']['input'];
96656
+ };
96657
+
96658
+
95153
96659
  /** Base Query type with placeholder field. Extended by individual query files. */
95154
96660
  export type QueryPlanmagnetTimeEntriesArgs = {
95155
96661
  filter?: InputMaybe<PlanmagnetTimeEntryFilter>;
@@ -95192,6 +96698,27 @@ export type QueryPlanmagnetWorkItemArgs = {
95192
96698
  };
95193
96699
 
95194
96700
 
96701
+ /** Base Query type with placeholder field. Extended by individual query files. */
96702
+ export type QueryPlanmagnetWorkItemActivityArgs = {
96703
+ first?: InputMaybe<Scalars['Int']['input']>;
96704
+ workItemId: Scalars['ID']['input'];
96705
+ };
96706
+
96707
+
96708
+ /** Base Query type with placeholder field. Extended by individual query files. */
96709
+ export type QueryPlanmagnetWorkItemCommentsArgs = {
96710
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
96711
+ workItemId: Scalars['ID']['input'];
96712
+ };
96713
+
96714
+
96715
+ /** Base Query type with placeholder field. Extended by individual query files. */
96716
+ export type QueryPlanmagnetWorkItemCountsArgs = {
96717
+ filter?: InputMaybe<PlanmagnetWorkItemFilter>;
96718
+ workspaceId: Scalars['ID']['input'];
96719
+ };
96720
+
96721
+
95195
96722
  /** Base Query type with placeholder field. Extended by individual query files. */
95196
96723
  export type QueryPlanmagnetWorkItemDocsArgs = {
95197
96724
  workItemId: Scalars['ID']['input'];
@@ -99232,10 +100759,16 @@ export type Release = {
99232
100759
  ownerId?: Maybe<Scalars['String']['output']>;
99233
100760
  /** Planned release date */
99234
100761
  plannedDate?: Maybe<Scalars['DateTime']['output']>;
100762
+ /** The linked Product, when set. */
100763
+ product?: Maybe<Product>;
100764
+ /** Linked strategic Product (BOFF-8045). Null when never attached. */
100765
+ productId?: Maybe<Scalars['String']['output']>;
99235
100766
  /** Parent project */
99236
100767
  project?: Maybe<PlanmagnetProject>;
99237
100768
  /** Parent project ID */
99238
100769
  projectId: Scalars['String']['output'];
100770
+ /** Live quality gates holding this release. It cannot become RELEASED until every one is PASSED or WAIVED */
100771
+ qualityGates: Array<QualityGate>;
99239
100772
  /** Release notes (markdown) */
99240
100773
  releaseNotes?: Maybe<Scalars['String']['output']>;
99241
100774
  /** Actual release date */
@@ -99285,7 +100818,8 @@ export enum ReleaseStatus {
99285
100818
  Planning = 'PLANNING',
99286
100819
  Ready = 'READY',
99287
100820
  Released = 'RELEASED',
99288
- RolledBack = 'ROLLED_BACK'
100821
+ RolledBack = 'ROLLED_BACK',
100822
+ Staging = 'STAGING'
99289
100823
  }
99290
100824
 
99291
100825
  export enum ReminderChannel {
@@ -99541,6 +101075,14 @@ export type ReportAiTokenUsageInput = {
99541
101075
  totalTokens?: InputMaybe<Scalars['Int']['input']>;
99542
101076
  };
99543
101077
 
101078
+ /** A batch of finished turns from one page. */
101079
+ export type ReportAssistantTurnTimingsInput = {
101080
+ /** A random UUID per request, used only to ignore a repeated delivery. Never stored as a metric label. */
101081
+ nonce: Scalars['String']['input'];
101082
+ /** Between 1 and 20 turns. */
101083
+ turns: Array<AssistantTurnTimingInput>;
101084
+ };
101085
+
99544
101086
  export enum ReportFormat {
99545
101087
  Csv = 'CSV',
99546
101088
  Excel = 'EXCEL',
@@ -100278,6 +101820,12 @@ export type Roadmap = {
100278
101820
  onBehalfOf?: Maybe<Scalars['String']['output']>;
100279
101821
  /** Owner actor ID */
100280
101822
  ownerId: Scalars['String']['output'];
101823
+ /** What the roadmap is organised around. Null when never recorded — legacy roadmaps were not classified, and this is not guessed. */
101824
+ planningFocus?: Maybe<RoadmapPlanningFocus>;
101825
+ /** The linked Product, when set. */
101826
+ product?: Maybe<Product>;
101827
+ /** Linked strategic Product (BOFF-8045). Null when never attached — see the BOFF-8045 backfill for the migration path from a pre-existing roadmap. */
101828
+ productId?: Maybe<Scalars['String']['output']>;
100281
101829
  /** Roadmap visualization type */
100282
101830
  type: RoadmapType;
100283
101831
  /** Last update timestamp */
@@ -100338,6 +101886,15 @@ export enum RoadmapItemStatus {
100338
101886
  Planned = 'PLANNED'
100339
101887
  }
100340
101888
 
101889
+ /** What a roadmap is organised around. Independent of how it is displayed: a technology roadmap can be shown as a timeline. */
101890
+ export enum RoadmapPlanningFocus {
101891
+ Feature = 'FEATURE',
101892
+ Portfolio = 'PORTFOLIO',
101893
+ Technology = 'TECHNOLOGY',
101894
+ Theme = 'THEME'
101895
+ }
101896
+
101897
+ /** 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). */
100341
101898
  export enum RoadmapType {
100342
101899
  Custom = 'CUSTOM',
100343
101900
  Gantt = 'GANTT',
@@ -100729,6 +102286,22 @@ export type SandboxArtifactBytesInput = {
100729
102286
  sessionId: Scalars['String']['input'];
100730
102287
  };
100731
102288
 
102289
+ /** The assistant modes the dedicated path provisions. */
102290
+ export enum SandboxAssistantMode {
102291
+ /** Take action: prepares changes as proposals; only a workspace admin's session can run them. */
102292
+ ApiCalls = 'API_CALLS',
102293
+ /** Ask: answers and reads, as the user, through the read-only session relay. */
102294
+ Assistant = 'ASSISTANT'
102295
+ }
102296
+
102297
+ /** The write-approval flow a Take-action sandbox is asked to run. The service grants it to workspace admins only. */
102298
+ export enum SandboxAssistantWriteApproval {
102299
+ /** The pre-5a confirm-writes flow. */
102300
+ Legacy = 'LEGACY',
102301
+ /** Proposals confirmed with a button (5a). */
102302
+ ProposalV1 = 'PROPOSAL_V1'
102303
+ }
102304
+
100732
102305
  /** A tag available for selection (lightweight type for tag picker) */
100733
102306
  export type SandboxAvailableTag = {
100734
102307
  __typename?: 'SandboxAvailableTag';
@@ -101025,7 +102598,7 @@ export type SaveAssistantTurnInput = {
101025
102598
  agentSessionId?: InputMaybe<Scalars['String']['input']>;
101026
102599
  /** Conversation to append to. Omit to start a new one. */
101027
102600
  conversationId?: InputMaybe<Scalars['ID']['input']>;
101028
- /** Product that owns this chat, e.g. "bigconsole". */
102601
+ /** 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. */
101029
102602
  productId: Scalars['String']['input'];
101030
102603
  /** What the user asked. */
101031
102604
  prompt: Scalars['String']['input'];
@@ -101039,6 +102612,24 @@ export type SaveDraftInput = {
101039
102612
  parentMessageId?: InputMaybe<Scalars['ID']['input']>;
101040
102613
  };
101041
102614
 
102615
+ export type SaveMyAssistantHistoryEntriesInput = {
102616
+ clientConversationId: Scalars['ID']['input'];
102617
+ /** TURN / LOCAL_COMMAND: exactly [USER, ASSISTANT]. NOTE: exactly [NOTE]. */
102618
+ entries: Array<AssistantHistoryEntryInput>;
102619
+ kind: AssistantHistoryEntryKind;
102620
+ /** The owning product. A renamed product's spellings (botlit / botmanor) are one history scope. */
102621
+ productId: Scalars['String']['input'];
102622
+ };
102623
+
102624
+ export type SaveMyAssistantHistoryEntriesPayload = {
102625
+ __typename?: 'SaveMyAssistantHistoryEntriesPayload';
102626
+ conversation: AssistantHistoryConversation;
102627
+ /** 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. */
102628
+ droppedMetadataKeys: Array<Scalars['String']['output']>;
102629
+ entries: Array<AssistantHistoryEntry>;
102630
+ outcome: AssistantHistorySaveOutcome;
102631
+ };
102632
+
101042
102633
  export type SaveNavPreferencesInput = {
101043
102634
  activeViewId?: InputMaybe<Scalars['String']['input']>;
101044
102635
  /** JSON string: Record<viewId, Record<navItemId, "shown" | "hidden">>. */
@@ -104239,8 +105830,13 @@ export enum SortOrder {
104239
105830
  /** A time-boxed iteration within a project that groups work items for focused delivery during a fixed period. */
104240
105831
  export type Sprint = {
104241
105832
  __typename?: 'Sprint';
105833
+ baselineEndDate?: Maybe<Scalars['DateTime']['output']>;
105834
+ /** 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. */
105835
+ baselineStartDate?: Maybe<Scalars['DateTime']['output']>;
104242
105836
  /** Sprint capacity in story points */
104243
105837
  capacity?: Maybe<Scalars['Int']['output']>;
105838
+ /** When the sprint was actually completed. Null if not completed, or completed before 2026-09-26 (unknown). */
105839
+ completedAt?: Maybe<Scalars['DateTime']['output']>;
104244
105840
  /** Context information */
104245
105841
  context?: Maybe<Scalars['JSON']['output']>;
104246
105842
  /** Creation timestamp */
@@ -104249,7 +105845,7 @@ export type Sprint = {
104249
105845
  createdBy: Scalars['String']['output'];
104250
105846
  /** Soft-delete timestamp */
104251
105847
  deletedAt?: Maybe<Scalars['DateTime']['output']>;
104252
- /** Sprint end date */
105848
+ /** PLANNED end. Completing the sprint does not change it; see completedAt. For sprints completed before 2026-09-26 this holds the moment of Complete. */
104253
105849
  endDate?: Maybe<Scalars['DateTime']['output']>;
104254
105850
  /** Sprint goal description */
104255
105851
  goal?: Maybe<Scalars['String']['output']>;
@@ -104261,21 +105857,29 @@ export type Sprint = {
104261
105857
  name: Scalars['String']['output'];
104262
105858
  /** Actor on whose behalf this was created */
104263
105859
  onBehalfOf?: Maybe<Scalars['String']['output']>;
105860
+ /** Every change to the planned dates, oldest first. Append-only. */
105861
+ planChanges: Array<PlanmagnetSprintPlanChange>;
104264
105862
  /** Parent project */
104265
105863
  project?: Maybe<PlanmagnetProject>;
104266
- /** Parent project ID */
104267
- projectId: Scalars['String']['output'];
105864
+ /** Parent project ID. Set only for a project-scoped sprint — exactly one of projectId/teamId is ever set (BOFF-8044). */
105865
+ projectId?: Maybe<Scalars['String']['output']>;
104268
105866
  /** 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. */
104269
105867
  sortOrder: Scalars['Int']['output'];
104270
- /** Sprint start date */
105868
+ /** 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). */
104271
105869
  startDate?: Maybe<Scalars['DateTime']['output']>;
105870
+ /** 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). */
105871
+ startedAt?: Maybe<Scalars['DateTime']['output']>;
104272
105872
  /** Current status */
104273
105873
  status: SprintStatus;
105874
+ /** Parent team */
105875
+ team?: Maybe<Team>;
105876
+ /** Parent team ID. Set only for a team-scoped sprint (BOFF-8044) — see projectId above. */
105877
+ teamId?: Maybe<Scalars['String']['output']>;
104274
105878
  /** Last update timestamp */
104275
105879
  updatedAt: Scalars['DateTime']['output'];
104276
105880
  /** Actor who last updated this sprint */
104277
105881
  updatedBy?: Maybe<Scalars['String']['output']>;
104278
- /** Sprint velocity (completed story points). Backed by the Prisma `velocityActual` column via a field resolver — see sprint.resolvers.ts. */
105882
+ /** 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. */
104279
105883
  velocity?: Maybe<Scalars['Int']['output']>;
104280
105884
  /** Work items in this sprint */
104281
105885
  workItems: Array<WorkItem>;
@@ -107381,6 +108985,36 @@ export enum TcpVerificationStatus {
107381
108985
  Unverified = 'UNVERIFIED'
107382
108986
  }
107383
108987
 
108988
+ /** 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. */
108989
+ export type Team = {
108990
+ __typename?: 'Team';
108991
+ /** Story-point capacity for this team's own sprints, if set. */
108992
+ capacity?: Maybe<Scalars['Int']['output']>;
108993
+ createdAt: Scalars['DateTime']['output'];
108994
+ createdBy: Scalars['String']['output'];
108995
+ description?: Maybe<Scalars['String']['output']>;
108996
+ id: Scalars['ID']['output'];
108997
+ /** The team's lead — an actor id, or null. Backed by the `ownerId` column; see team.resolvers.ts. */
108998
+ leadId?: Maybe<Scalars['String']['output']>;
108999
+ /** Members of this team. */
109000
+ members: Array<TeamMember>;
109001
+ name: Scalars['String']['output'];
109002
+ onBehalfOf?: Maybe<Scalars['String']['output']>;
109003
+ /** Live projects on this team. A project soft-deleted elsewhere disappears from this list. */
109004
+ projects: Array<PlanmagnetProject>;
109005
+ updatedAt: Scalars['DateTime']['output'];
109006
+ updatedBy?: Maybe<Scalars['String']['output']>;
109007
+ workspaceId: Scalars['String']['output'];
109008
+ };
109009
+
109010
+ export type TeamMember = {
109011
+ __typename?: 'TeamMember';
109012
+ actorId: Scalars['String']['output'];
109013
+ createdAt: Scalars['DateTime']['output'];
109014
+ id: Scalars['ID']['output'];
109015
+ teamId: Scalars['String']['output'];
109016
+ };
109017
+
107384
109018
  /** 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. */
107385
109019
  export type TeamWorkPatternEntry = {
107386
109020
  __typename?: 'TeamWorkPatternEntry';
@@ -110413,6 +112047,12 @@ export type Transaction = {
110413
112047
  id: Scalars['ID']['output'];
110414
112048
  };
110415
112049
 
112050
+ export type TransferInventoryStockInput = {
112051
+ destinationInventoryItemId: Scalars['ID']['input'];
112052
+ quantity: Scalars['Int']['input'];
112053
+ sourceInventoryItemId: Scalars['ID']['input'];
112054
+ };
112055
+
110416
112056
  export type TransformRuntimeInfo = {
110417
112057
  __typename?: 'TransformRuntimeInfo';
110418
112058
  maxInputBytes: Scalars['Int']['output'];
@@ -112055,9 +113695,13 @@ export type UpdateDashboardEmbedPolicyInput = {
112055
113695
  allowedParentOrigins?: InputMaybe<Array<Scalars['String']['input']>>;
112056
113696
  expiresAt?: InputMaybe<Scalars['DateTime']['input']>;
112057
113697
  policyId: Scalars['ID']['input'];
112058
- /** Publish-time presentation options (BOFF-5735). Read live at view time, so a change reflects on the next render with no re-publish. */
113698
+ /** 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. */
112059
113699
  presentationTheme?: InputMaybe<DashboardEmbedTheme>;
112060
113700
  sessionTtlSeconds?: InputMaybe<Scalars['Int']['input']>;
113701
+ /**
113702
+ * Ignored. Every embed always shows the "Powered by BigConsole" footer. Accepted only so older clients that still send it keep working.
113703
+ * @deprecated Embeds always show the BigConsole footer; this setting is ignored.
113704
+ */
112061
113705
  showBrandingFooter?: InputMaybe<Scalars['Boolean']['input']>;
112062
113706
  showDashboardTitle?: InputMaybe<Scalars['Boolean']['input']>;
112063
113707
  };
@@ -112192,19 +113836,27 @@ export type UpdateDeliveryJobStatusInput = {
112192
113836
  };
112193
113837
 
112194
113838
  export type UpdateDriverInput = {
113839
+ baseSalary?: InputMaybe<Scalars['Float']['input']>;
113840
+ bonusYtd?: InputMaybe<Scalars['Float']['input']>;
112195
113841
  certifications?: InputMaybe<Scalars['JSON']['input']>;
112196
113842
  context?: InputMaybe<ContextInput>;
112197
113843
  currentLocation?: InputMaybe<Scalars['JSON']['input']>;
112198
113844
  email?: InputMaybe<Scalars['String']['input']>;
112199
113845
  firstName?: InputMaybe<Scalars['String']['input']>;
113846
+ hireDate?: InputMaybe<Scalars['DateTime']['input']>;
112200
113847
  lastName?: InputMaybe<Scalars['String']['input']>;
112201
113848
  licenseClass?: InputMaybe<Scalars['String']['input']>;
112202
113849
  licenseExpiry?: InputMaybe<Scalars['DateTime']['input']>;
112203
113850
  licenseNumber?: InputMaybe<Scalars['String']['input']>;
113851
+ notes?: InputMaybe<Scalars['String']['input']>;
113852
+ onLeaveUntil?: InputMaybe<Scalars['DateTime']['input']>;
113853
+ payCurrency?: InputMaybe<Scalars['String']['input']>;
112204
113854
  performanceMetrics?: InputMaybe<Scalars['JSON']['input']>;
112205
113855
  phone?: InputMaybe<Scalars['String']['input']>;
112206
113856
  rating?: InputMaybe<Scalars['Float']['input']>;
112207
113857
  status?: InputMaybe<DriverStatus>;
113858
+ terminatedAt?: InputMaybe<Scalars['DateTime']['input']>;
113859
+ terminationReason?: InputMaybe<Scalars['String']['input']>;
112208
113860
  userId?: InputMaybe<Scalars['String']['input']>;
112209
113861
  vehicleId?: InputMaybe<Scalars['String']['input']>;
112210
113862
  vehicleIds?: InputMaybe<Array<Scalars['ID']['input']>>;
@@ -112973,6 +114625,8 @@ export type UpdateHeadshotmarketingSocialAccountInput = {
112973
114625
  avatarUrl?: InputMaybe<Scalars['String']['input']>;
112974
114626
  deliveryMode?: InputMaybe<HeadshotmarketingSocialAccountDeliveryMode>;
112975
114627
  followerCount?: InputMaybe<Scalars['Int']['input']>;
114628
+ /** 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. */
114629
+ integrationConnectionId?: InputMaybe<Scalars['ID']['input']>;
112976
114630
  metadata?: InputMaybe<Scalars['JSON']['input']>;
112977
114631
  profileUrl?: InputMaybe<Scalars['String']['input']>;
112978
114632
  refreshToken?: InputMaybe<Scalars['String']['input']>;
@@ -114802,9 +116456,9 @@ export type UpdateVibecontrolsAgentInput = {
114802
116456
  agentApiKey?: InputMaybe<Scalars['String']['input']>;
114803
116457
  /** Custom AI context (markdown) surfaced to AI tools running on this agent */
114804
116458
  aiContext?: InputMaybe<Scalars['String']['input']>;
114805
- /** Auth-svc App clientId (for display/reference) */
116459
+ /** Auth-svc App clientId. Server-managed like `appId`: a non-null value is rejected with `BAD_USER_INPUT`. */
114806
116460
  appClientId?: InputMaybe<Scalars['String']['input']>;
114807
- /** Linked auth-svc App ID (OAuth2 identity for gateway access) */
116461
+ /** 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. */
114808
116462
  appId?: InputMaybe<Scalars['String']['input']>;
114809
116463
  capabilities?: InputMaybe<Scalars['JSON']['input']>;
114810
116464
  configuration?: InputMaybe<Scalars['JSON']['input']>;
@@ -115674,6 +117328,7 @@ export enum ValidationMethod {
115674
117328
  BasicAuth = 'BASIC_AUTH',
115675
117329
  BearerToken = 'BEARER_TOKEN',
115676
117330
  HmacSha256 = 'HMAC_SHA256',
117331
+ Jwt = 'JWT',
115677
117332
  None = 'NONE',
115678
117333
  Signature = 'SIGNATURE'
115679
117334
  }
@@ -116198,6 +117853,8 @@ export type VaultUpdatedPayload = {
116198
117853
 
116199
117854
  export type VehicleFilterInput = {
116200
117855
  driverId?: InputMaybe<Scalars['ID']['input']>;
117856
+ /** Fetch exactly these vehicles by id, regardless of how many. Ignores other filters/pagination when set. */
117857
+ ids?: InputMaybe<Array<Scalars['ID']['input']>>;
116201
117858
  search?: InputMaybe<Scalars['String']['input']>;
116202
117859
  status?: InputMaybe<VehicleStatus>;
116203
117860
  type?: InputMaybe<VehicleType>;
@@ -117083,9 +118740,9 @@ export type VibecontrolsAgentProfile = {
117083
118740
 
117084
118741
  /** 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. */
117085
118742
  export enum VibecontrolsAgentVisibility {
117086
- /** Only `ownerUserId` can see or use the agent. The default for an agent added by a user. */
118743
+ /** 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. */
117087
118744
  Private = 'PRIVATE',
117088
- /** 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). */
118745
+ /** 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). */
117089
118746
  Workspace = 'WORKSPACE'
117090
118747
  }
117091
118748
 
@@ -119067,10 +120724,14 @@ export type WorkItem = {
119067
120724
  description?: Maybe<Scalars['String']['output']>;
119068
120725
  /** Due date */
119069
120726
  dueDate?: Maybe<Scalars['DateTime']['output']>;
120727
+ /** 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. */
120728
+ dueGroup: PlanmagnetDueGroup;
119070
120729
  /** Original time estimate in minutes */
119071
120730
  estimateMinutes?: Maybe<Scalars['Int']['output']>;
119072
120731
  /** Unique identifier */
119073
120732
  id: Scalars['ID']['output'];
120733
+ /** 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. */
120734
+ isOverdue: Scalars['Boolean']['output'];
119074
120735
  /** Human-readable key (e.g. PROJ-123) */
119075
120736
  key: Scalars['String']['output'];
119076
120737
  /** Labels for categorization */
@@ -119099,6 +120760,8 @@ export type WorkItem = {
119099
120760
  sprintId?: Maybe<Scalars['String']['output']>;
119100
120761
  /** Current status */
119101
120762
  status: WorkItemStatus;
120763
+ /** 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 */
120764
+ statusSince?: Maybe<Scalars['DateTime']['output']>;
119102
120765
  /** Story points estimate */
119103
120766
  storyPoints?: Maybe<Scalars['Int']['output']>;
119104
120767
  /** Tags for categorization */
@@ -119128,20 +120791,22 @@ export type WorkItemDependency = {
119128
120791
  description?: Maybe<Scalars['String']['output']>;
119129
120792
  /** Unique identifier */
119130
120793
  id: Scalars['ID']['output'];
120794
+ /** 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. */
120795
+ lagMinutes?: Maybe<Scalars['Int']['output']>;
119131
120796
  /** Arbitrary metadata */
119132
120797
  metadata?: Maybe<Scalars['JSON']['output']>;
119133
120798
  /** Actor on whose behalf this was created */
119134
120799
  onBehalfOf?: Maybe<Scalars['String']['output']>;
119135
- /** Source work item */
119136
- sourceWorkItem?: Maybe<WorkItem>;
119137
- /** Source work item ID */
119138
- sourceWorkItemId: Scalars['String']['output'];
120800
+ /** The constraining work item */
120801
+ predecessor?: Maybe<WorkItem>;
120802
+ /** 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. */
120803
+ predecessorId: Scalars['String']['output'];
119139
120804
  /** Current status */
119140
120805
  status: DependencyStatus;
119141
- /** Target work item */
119142
- targetWorkItem?: Maybe<WorkItem>;
119143
- /** Target work item ID */
119144
- targetWorkItemId: Scalars['String']['output'];
120806
+ /** The constrained work item */
120807
+ successor?: Maybe<WorkItem>;
120808
+ /** The work item whose schedule is constrained. Renamed from `targetWorkItemId`. */
120809
+ successorId: Scalars['String']['output'];
119145
120810
  /** Type of dependency */
119146
120811
  type: DependencyType;
119147
120812
  /** Last update timestamp */
@@ -119185,9 +120850,16 @@ export type WorkItemLink = {
119185
120850
  workspaceId: Scalars['String']['output'];
119186
120851
  };
119187
120852
 
120853
+ /** 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`. */
119188
120854
  export enum WorkItemLinkRelation {
119189
120855
  Affects = 'AFFECTS',
120856
+ /** This work item is blocked by the linked one. Semantic only: it does NOT schedule. */
120857
+ BlockedBy = 'BLOCKED_BY',
119190
120858
  Blocks = 'BLOCKS',
120859
+ CausedBy = 'CAUSED_BY',
120860
+ Causes = 'CAUSES',
120861
+ DuplicatedBy = 'DUPLICATED_BY',
120862
+ Duplicates = 'DUPLICATES',
119191
120863
  Inspects = 'INSPECTS',
119192
120864
  Produces = 'PRODUCES',
119193
120865
  RelatedTo = 'RELATED_TO',
@@ -119346,6 +121018,31 @@ export type WorkerCompleteRunResponse = {
119346
121018
  totalNodes?: Maybe<Scalars['Int']['output']>;
119347
121019
  };
119348
121020
 
121021
+ /** Input for starting a Sub-workflow node's child run. */
121022
+ export type WorkerCreateChildRunInput = {
121023
+ /** Mapped data handed to the child as its trigger data. */
121024
+ input?: InputMaybe<Scalars['JSON']['input']>;
121025
+ parentNodeId: Scalars['String']['input'];
121026
+ parentRunId: Scalars['ID']['input'];
121027
+ /** Pinned version; omitted resolves the executable one (ACTIVE wins, else newest). */
121028
+ version?: InputMaybe<Scalars['String']['input']>;
121029
+ /** Target workflow, always resolved inside the parent's workspace. */
121030
+ workflowKey: Scalars['String']['input'];
121031
+ };
121032
+
121033
+ /** Result of starting a child run. */
121034
+ export type WorkerCreateChildRunResponse = {
121035
+ __typename?: 'WorkerCreateChildRunResponse';
121036
+ childRunId?: Maybe<Scalars['ID']['output']>;
121037
+ error?: Maybe<Scalars['String']['output']>;
121038
+ /** One of: PARENT_NOT_FOUND, WORKFLOW_NOT_FOUND, DEPTH_EXCEEDED, CYCLE_DETECTED, NO_ENTRY_NODE. */
121039
+ errorCode?: Maybe<Scalars['String']['output']>;
121040
+ success: Scalars['Boolean']['output'];
121041
+ triggerNodeId?: Maybe<Scalars['String']['output']>;
121042
+ version?: Maybe<Scalars['String']['output']>;
121043
+ workflowKey?: Maybe<Scalars['String']['output']>;
121044
+ };
121045
+
119349
121046
  /** Input for creating node state */
119350
121047
  export type WorkerCreateNodeStateInput = {
119351
121048
  context?: InputMaybe<Scalars['JSON']['input']>;
@@ -119618,6 +121315,7 @@ export type WorkerToolApprovalRequestResponse = {
119618
121315
  /** Input for updating node state */
119619
121316
  export type WorkerUpdateNodeStateInput = {
119620
121317
  attemptCount?: InputMaybe<Scalars['Int']['input']>;
121318
+ context?: InputMaybe<Scalars['JSON']['input']>;
119621
121319
  duration?: InputMaybe<Scalars['Float']['input']>;
119622
121320
  endTime?: InputMaybe<Scalars['DateTime']['input']>;
119623
121321
  error?: InputMaybe<Scalars['String']['input']>;