@burdenoff/microfe-planmagnet 2026.923.5 → 2026.924.2

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.
@@ -285,14 +285,27 @@ export declare enum DependencyStatus {
285
285
  Removed = "REMOVED",
286
286
  Resolved = "RESOLVED"
287
287
  }
288
+ /**
289
+ * How one work item constrains the SCHEDULE of another.
290
+ *
291
+ * These four are the standard CPM relationships; `lagMinutes` offsets them. This
292
+ * enum used to carry issue-link verbs (BLOCKS, DUPLICATES, RELATES_TO, ...) while
293
+ * the database carried these four — one name, ZERO overlapping values — so every
294
+ * `planmagnetCreateDependency` passed gateway validation and then failed the
295
+ * write. The semantic verbs now live on `WorkItemLink.relationType`, which is
296
+ * where they belong: "A relates to B" says nothing about when either one starts.
297
+ *
298
+ * Only these relationships take part in critical-path analysis.
299
+ */
288
300
  export declare enum DependencyType {
289
- BlockedBy = "BLOCKED_BY",
290
- Blocks = "BLOCKS",
291
- CausedBy = "CAUSED_BY",
292
- Causes = "CAUSES",
293
- DuplicatedBy = "DUPLICATED_BY",
294
- Duplicates = "DUPLICATES",
295
- RelatesTo = "RELATES_TO"
301
+ /** The successor finishes after the predecessor finishes. */
302
+ FinishToFinish = "FINISH_TO_FINISH",
303
+ /** The successor starts after the predecessor finishes. The usual case. */
304
+ FinishToStart = "FINISH_TO_START",
305
+ /** The successor finishes after the predecessor starts. Rare. */
306
+ StartToFinish = "START_TO_FINISH",
307
+ /** The successor starts after the predecessor starts. */
308
+ StartToStart = "START_TO_START"
296
309
  }
297
310
  export declare enum DocStatus {
298
311
  Archived = "ARCHIVED",
@@ -527,10 +540,14 @@ export type Mutation = {
527
540
  _planmagnetPing?: Maybe<Scalars['String']['output']>;
528
541
  /** Add work items to a sprint */
529
542
  planmagnetAddWorkItemsToSprint: Sprint;
543
+ /**
544
+ * Grant a user billable editor access to a PlanMagnet workspace. Rejected
545
+ * once the workspace is at its plan's editor limit (Free tier: 10).
546
+ * Idempotent: granting an already-active editor returns the existing seat.
547
+ */
548
+ planmagnetAddWorkspaceEditor: PlanmagnetWorkspaceEditor;
530
549
  /** Apply a template to create a new project */
531
550
  planmagnetApplyTemplate: PlanmagnetProject;
532
- /** Approve an adapter submission. */
533
- planmagnetApproveAdapter: PlanmagnetAdapterSubmission;
534
551
  /** Approve a budget */
535
552
  planmagnetApproveBudget: PlanmagnetBudget;
536
553
  /** Approve a submitted timesheet */
@@ -557,17 +574,14 @@ export type Mutation = {
557
574
  planmagnetCreateCustomFieldDefinition: CustomFieldDefinition;
558
575
  /** Create a new dependency between work items */
559
576
  planmagnetCreateDependency: WorkItemDependency;
560
- /** Create a new doc */
561
577
  planmagnetCreateDoc: PlanmagnetDoc;
562
578
  /** Create a new external sync configuration */
563
579
  planmagnetCreateExternalSync: ExternalSync;
564
580
  /** Create a new feature request */
565
581
  planmagnetCreateFeatureRequest: FeatureRequest;
566
- /** Create a new key result */
567
582
  planmagnetCreateKeyResult: PlanmagnetKeyResult;
568
583
  /** Create a new milestone */
569
584
  planmagnetCreateMilestone: Milestone;
570
- /** Create a new objective */
571
585
  planmagnetCreateObjective: PlanmagnetObjective;
572
586
  /** Create a new portfolio */
573
587
  planmagnetCreatePortfolio: Portfolio;
@@ -611,7 +625,6 @@ export type Mutation = {
611
625
  planmagnetDeleteCustomFieldDefinition: Scalars['Boolean']['output'];
612
626
  /** Remove a dependency */
613
627
  planmagnetDeleteDependency: Scalars['Boolean']['output'];
614
- /** Delete a doc */
615
628
  planmagnetDeleteDoc: Scalars['Boolean']['output'];
616
629
  /** Delete an expense */
617
630
  planmagnetDeleteExpense: Scalars['Boolean']['output'];
@@ -619,7 +632,10 @@ export type Mutation = {
619
632
  planmagnetDeleteExternalSync: Scalars['Boolean']['output'];
620
633
  /** Delete a feature request */
621
634
  planmagnetDeleteFeatureRequest: Scalars['Boolean']['output'];
622
- /** Only the key result's owner, its objective's owner, or its creator may delete it. */
635
+ /**
636
+ * Only the key result's owner, its objective's owner, or its creator may
637
+ * delete it.
638
+ */
623
639
  planmagnetDeleteKeyResult: Scalars['Boolean']['output'];
624
640
  /** Delete a milestone */
625
641
  planmagnetDeleteMilestone: Scalars['Boolean']['output'];
@@ -650,36 +666,53 @@ export type Mutation = {
650
666
  /** Soft-delete a work item */
651
667
  planmagnetDeleteWorkItem: Scalars['Boolean']['output'];
652
668
  /**
653
- * Manually request execution of an automation rule.
669
+ * Manually run an automation rule (BOFF-4445) against a specific work item.
654
670
  *
655
- * NOT YET IMPLEMENTED: PlanMagnet has no automation execution engine. This
656
- * mutation records an execution attempt with status FAILURE and an
657
- * `errorMessage` of `NOT_IMPLEMENTED: ...`; it evaluates no `conditions`,
658
- * dispatches no `actions`, and does not advance the rule's `executionCount` or
659
- * `lastExecutedAt`.
671
+ * `triggerData` MUST include `workItemId` — every supported action type
672
+ * (`ASSIGN_TO_USER`/`ADD_LABEL`/`SET_STATUS`/`SET_PRIORITY`) mutates a
673
+ * specific WorkItem, and a manual run with no target records a FAILURE
674
+ * execution explaining that instead of evaluating anything. When a WorkItem is
675
+ * given, the rule's `conditions` are evaluated against a live snapshot of that
676
+ * item (merged with any extra fields in `triggerData`) and, if they pass, its
677
+ * `actions` are dispatched for real — this always records an
678
+ * `AutomationExecution` row, including a non-matching run.
660
679
  *
661
- * Because it performs no billable work it deliberately carries NO `@usage`
662
- * directive — it previously declared
663
- * `@usage(quotaName: "planmagnet.automation.runs_monthly", checkQuota: true, trackUsage: true)`
664
- * and so consumed a customer's metered monthly automation runs for a no-op.
665
- * Restore the `@usage` directive in the same change that lands a real
666
- * evaluation + dispatch engine, not before.
680
+ * Carries `@usage` again as of BOFF-4445: PlanMagnet now has a real evaluation
681
+ * + dispatch engine (see `automation-engine.ts`), so a manual run is real
682
+ * billable work.
667
683
  */
668
684
  planmagnetExecuteAutomationRule: PlanmagnetAutomationExecution;
669
- /** Export items to external tool */
685
+ /**
686
+ * Export items to the external tool. Real for `provider: GITHUB` (BOFF-4446):
687
+ * creates/updates real GitHub Issues for the given `internalIds` (WorkItem
688
+ * ids), or one bounded page of every WorkItem in the sync's project when
689
+ * omitted. Every other provider records an honest `NOT_IMPLEMENTED` outcome.
690
+ */
670
691
  planmagnetExportToExternal: PlanmagnetSyncResult;
692
+ /**
693
+ * Generate release notes from the closed work items linked to a release
694
+ * (by `workItemIds`, falling back to the release's `projectIds`).
695
+ * Persists the generated markdown on `Release.releaseNotes` so it remains
696
+ * editable via `planmagnetUpdateRelease`. When `persist` is false the notes
697
+ * are computed and returned without writing to the database.
698
+ */
699
+ planmagnetGenerateReleaseNotes: PlanmagnetGenerateReleaseNotesPayload;
671
700
  /**
672
701
  * Import issues exported from an external tool (e.g. a Linear CSV/JSON export)
673
702
  * into a project as WorkItems. Idempotent — already-imported issues are skipped.
674
703
  */
675
704
  planmagnetImportExternalIssues: PlanmagnetImportResult;
676
- /** Import items from external tool */
705
+ /**
706
+ * Import items from the external tool. Real for `provider: GITHUB`
707
+ * (BOFF-4446): fetches real GitHub Issues (specific `externalIds`, i.e. issue
708
+ * numbers, or one bounded page of all issues) and creates/updates the
709
+ * matching PlanMagnet WorkItems. Every other provider records an honest
710
+ * `NOT_IMPLEMENTED` outcome.
711
+ */
677
712
  planmagnetImportFromExternal: PlanmagnetSyncResult;
678
713
  /** Link a competitor to a feature request */
679
714
  planmagnetLinkCompetitorToFeature: FeatureRequest;
680
- /** Link a doc to a work item */
681
715
  planmagnetLinkDocToWorkItem: PlanmagnetDoc;
682
- /** Link a key result to a work item (informational rollup only) */
683
716
  planmagnetLinkKeyResultToWorkItem: PlanmagnetKeyResult;
684
717
  /** Link a work item to an external product entity */
685
718
  planmagnetLinkWorkItem: WorkItemLink;
@@ -687,16 +720,12 @@ export type Mutation = {
687
720
  planmagnetLogExpense: BudgetExpense;
688
721
  /** Quick log time against a work item */
689
722
  planmagnetLogTime: PlanmagnetTimeEntry;
690
- /** Moderate a reported marketplace listing. */
691
- planmagnetModerateListing: PlanmagnetMarketplaceReport;
692
723
  /** Move a card (work item) to a different column and/or position */
693
724
  planmagnetMoveCard: Board;
694
725
  /** Move a work item to a different status, sprint, or position */
695
726
  planmagnetMoveWorkItem: WorkItem;
696
727
  /** Pause a sync */
697
728
  planmagnetPauseExternalSync: ExternalSync;
698
- /** Reject an adapter submission. */
699
- planmagnetRejectAdapter: PlanmagnetAdapterSubmission;
700
729
  /** Reject a submitted timesheet */
701
730
  planmagnetRejectTimesheet: PlanmagnetTimesheet;
702
731
  /** Remove a custom field value from a work item */
@@ -705,6 +734,11 @@ export type Mutation = {
705
734
  planmagnetRemoveFeatureVote: Scalars['Boolean']['output'];
706
735
  /** Remove work items from a sprint */
707
736
  planmagnetRemoveWorkItemsFromSprint: Sprint;
737
+ /**
738
+ * Revoke a user's editor access to a PlanMagnet workspace, freeing the slot.
739
+ * Idempotent: revoking a user who is not currently an editor returns false.
740
+ */
741
+ planmagnetRemoveWorkspaceEditor: Scalars['Boolean']['output'];
708
742
  /** Reorder columns on a board */
709
743
  planmagnetReorderColumns: Board;
710
744
  /** Resume a paused sync */
@@ -720,17 +754,27 @@ export type Mutation = {
720
754
  planmagnetSetCustomFieldValue: CustomFieldValue;
721
755
  /** Start a sprint (transition to ACTIVE) */
722
756
  planmagnetStartSprint: Sprint;
723
- /** Start a sync operation */
757
+ /**
758
+ * Start a sync operation in the direction `ExternalSync.direction` already
759
+ * records. Real for `provider: GITHUB` (BOFF-4446) — pulls/pushes real GitHub
760
+ * Issues, bounded to one REST page each way. Every other provider records an
761
+ * honest `NOT_IMPLEMENTED` outcome instead of a fabricated success.
762
+ */
724
763
  planmagnetStartSync: PlanmagnetSyncResult;
725
764
  /** Submit a timesheet for approval */
726
765
  planmagnetSubmitTimesheet: PlanmagnetTimesheet;
766
+ /**
767
+ * Calls the configured LLM provider to suggest a work-item breakdown for a
768
+ * plain-text description. Fails clearly (GraphQL error) when no provider key
769
+ * is configured or the model response can't be parsed — never returns
770
+ * fabricated suggestions.
771
+ */
772
+ planmagnetSuggestWorkItemBreakdown: PlanmagnetWorkItemBreakdownResult;
727
773
  /** Toggle an automation rule (activate/pause) */
728
774
  planmagnetToggleAutomationRule: PlanmagnetAutomationRule;
729
775
  /** Unlink a competitor from a feature request */
730
776
  planmagnetUnlinkCompetitorFromFeature: FeatureRequest;
731
- /** Unlink a doc from a work item */
732
777
  planmagnetUnlinkDocFromWorkItem: Scalars['Boolean']['output'];
733
- /** Unlink a key result from a work item */
734
778
  planmagnetUnlinkKeyResultFromWorkItem: Scalars['Boolean']['output'];
735
779
  /** Remove a work item link */
736
780
  planmagnetUnlinkWorkItem: Scalars['Boolean']['output'];
@@ -748,10 +792,6 @@ export type Mutation = {
748
792
  planmagnetUpdateCustomFieldDefinition: CustomFieldDefinition;
749
793
  /** Update an existing dependency */
750
794
  planmagnetUpdateDependency: WorkItemDependency;
751
- /**
752
- * Update a doc (creates a new version + revision); title/content/status are
753
- * independently optional.
754
- */
755
795
  planmagnetUpdateDoc: PlanmagnetDoc;
756
796
  /** Update an expense */
757
797
  planmagnetUpdateExpense: BudgetExpense;
@@ -760,9 +800,10 @@ export type Mutation = {
760
800
  /** Update an existing feature request */
761
801
  planmagnetUpdateFeatureRequest: FeatureRequest;
762
802
  /**
763
- * Progress is updated manually here via `currentValue` -- see module deferral note
764
- * re: automated roll-up from linked work item completion. Only the key result's
765
- * owner, its objective's owner, or its creator may update it.
803
+ * Progress is updated manually here via `currentValue` -- see module
804
+ * deferral note re: automated roll-up from linked work item completion.
805
+ * Only the key result's owner, its objective's owner, or its creator may
806
+ * update it.
766
807
  */
767
808
  planmagnetUpdateKeyResult: PlanmagnetKeyResult;
768
809
  /** Update an existing milestone */
@@ -802,13 +843,13 @@ export type MutationPlanmagnetAddWorkItemsToSprintArgs = {
802
843
  id: Scalars['ID']['input'];
803
844
  input: PlanmagnetSprintWorkItemsInput;
804
845
  };
846
+ export type MutationPlanmagnetAddWorkspaceEditorArgs = {
847
+ userId: Scalars['ID']['input'];
848
+ workspaceId: Scalars['ID']['input'];
849
+ };
805
850
  export type MutationPlanmagnetApplyTemplateArgs = {
806
851
  input: PlanmagnetApplyTemplateInput;
807
852
  };
808
- export type MutationPlanmagnetApproveAdapterArgs = {
809
- id: Scalars['ID']['input'];
810
- notes?: InputMaybe<Scalars['String']['input']>;
811
- };
812
853
  export type MutationPlanmagnetApproveBudgetArgs = {
813
854
  id: Scalars['ID']['input'];
814
855
  };
@@ -996,6 +1037,10 @@ export type MutationPlanmagnetExecuteAutomationRuleArgs = {
996
1037
  export type MutationPlanmagnetExportToExternalArgs = {
997
1038
  input: PlanmagnetExportToExternalInput;
998
1039
  };
1040
+ export type MutationPlanmagnetGenerateReleaseNotesArgs = {
1041
+ id: Scalars['ID']['input'];
1042
+ persist?: InputMaybe<Scalars['Boolean']['input']>;
1043
+ };
999
1044
  export type MutationPlanmagnetImportExternalIssuesArgs = {
1000
1045
  input: PlanmagnetImportExternalIssuesInput;
1001
1046
  };
@@ -1022,11 +1067,6 @@ export type MutationPlanmagnetLogExpenseArgs = {
1022
1067
  export type MutationPlanmagnetLogTimeArgs = {
1023
1068
  input: PlanmagnetLogTimeInput;
1024
1069
  };
1025
- export type MutationPlanmagnetModerateListingArgs = {
1026
- action: PlanmagnetModerationAction;
1027
- id: Scalars['ID']['input'];
1028
- reason: Scalars['String']['input'];
1029
- };
1030
1070
  export type MutationPlanmagnetMoveCardArgs = {
1031
1071
  boardId: Scalars['ID']['input'];
1032
1072
  input: PlanmagnetMoveCardInput;
@@ -1038,10 +1078,6 @@ export type MutationPlanmagnetMoveWorkItemArgs = {
1038
1078
  export type MutationPlanmagnetPauseExternalSyncArgs = {
1039
1079
  id: Scalars['ID']['input'];
1040
1080
  };
1041
- export type MutationPlanmagnetRejectAdapterArgs = {
1042
- id: Scalars['ID']['input'];
1043
- reason: Scalars['String']['input'];
1044
- };
1045
1081
  export type MutationPlanmagnetRejectTimesheetArgs = {
1046
1082
  id: Scalars['ID']['input'];
1047
1083
  reason?: InputMaybe<Scalars['String']['input']>;
@@ -1057,6 +1093,10 @@ export type MutationPlanmagnetRemoveWorkItemsFromSprintArgs = {
1057
1093
  id: Scalars['ID']['input'];
1058
1094
  input: PlanmagnetSprintWorkItemsInput;
1059
1095
  };
1096
+ export type MutationPlanmagnetRemoveWorkspaceEditorArgs = {
1097
+ userId: Scalars['ID']['input'];
1098
+ workspaceId: Scalars['ID']['input'];
1099
+ };
1060
1100
  export type MutationPlanmagnetReorderColumnsArgs = {
1061
1101
  boardId: Scalars['ID']['input'];
1062
1102
  input: PlanmagnetReorderColumnsInput;
@@ -1084,6 +1124,9 @@ export type MutationPlanmagnetStartSyncArgs = {
1084
1124
  export type MutationPlanmagnetSubmitTimesheetArgs = {
1085
1125
  id: Scalars['ID']['input'];
1086
1126
  };
1127
+ export type MutationPlanmagnetSuggestWorkItemBreakdownArgs = {
1128
+ input: PlanmagnetSuggestWorkItemBreakdownInput;
1129
+ };
1087
1130
  export type MutationPlanmagnetToggleAutomationRuleArgs = {
1088
1131
  id: Scalars['ID']['input'];
1089
1132
  status: PlanmagnetAutomationStatus;
@@ -1220,31 +1263,6 @@ export declare enum ObjectiveStatus {
1220
1263
  Completed = "COMPLETED",
1221
1264
  Draft = "DRAFT"
1222
1265
  }
1223
- /** A submitted adapter awaiting admin approval. */
1224
- export type PlanmagnetAdapterSubmission = {
1225
- __typename?: 'PlanmagnetAdapterSubmission';
1226
- /** Adapter identifier */
1227
- adapterId: Scalars['String']['output'];
1228
- /** Creation timestamp */
1229
- createdAt: Scalars['DateTime']['output'];
1230
- /** Unique identifier */
1231
- id: Scalars['ID']['output'];
1232
- /** Admin notes */
1233
- notes?: Maybe<Scalars['String']['output']>;
1234
- /** Current review status */
1235
- status: PlanmagnetSubmissionStatus;
1236
- /** Workspace that submitted the adapter */
1237
- submitterWorkspaceId: Scalars['String']['output'];
1238
- /** Last update timestamp */
1239
- updatedAt: Scalars['DateTime']['output'];
1240
- };
1241
- /** Paginated list of adapter submissions. */
1242
- export type PlanmagnetAdapterSubmissionConnection = {
1243
- __typename?: 'PlanmagnetAdapterSubmissionConnection';
1244
- items: Array<PlanmagnetAdapterSubmission>;
1245
- pageInfo: PlanmagnetPageInfo;
1246
- totalCount: Scalars['Int']['output'];
1247
- };
1248
1266
  export type PlanmagnetApplyTemplateInput = {
1249
1267
  ownerId: Scalars['String']['input'];
1250
1268
  projectDescription?: InputMaybe<Scalars['String']['input']>;
@@ -1290,10 +1308,21 @@ export type PlanmagnetAutomationExecutionList = {
1290
1308
  pageInfo: PlanmagnetPageInfo;
1291
1309
  totalCount: Scalars['Int']['output'];
1292
1310
  };
1311
+ /**
1312
+ * The outcome of one automation run.
1313
+ *
1314
+ * PARTIAL_FAILURE exists because a run that dispatched some actions and could not
1315
+ * dispatch others is neither a success nor a plain failure, and an operator needs
1316
+ * to tell those apart. Before the status column existed the backing store was a
1317
+ * single boolean, so this distinction could not be represented at all.
1318
+ */
1293
1319
  export declare enum PlanmagnetAutomationExecutionStatus {
1294
1320
  Failure = "FAILURE",
1321
+ /** Some actions ran, others failed or could not be dispatched. */
1322
+ PartialFailure = "PARTIAL_FAILURE",
1295
1323
  Pending = "PENDING",
1296
1324
  Running = "RUNNING",
1325
+ /** Nothing ran — no action the rule declared is supported by this engine. */
1297
1326
  Skipped = "SKIPPED",
1298
1327
  Success = "SUCCESS"
1299
1328
  }
@@ -1316,9 +1345,11 @@ export type PlanmagnetAutomationRule = {
1316
1345
  /** Rule description */
1317
1346
  description?: Maybe<Scalars['String']['output']>;
1318
1347
  /**
1319
- * Number of times this rule's actions have actually been dispatched.
1320
- * Manual `planmagnetExecuteAutomationRule` calls do NOT increment this while
1321
- * the execution engine is unimplemented — see that mutation's description.
1348
+ * Number of times this rule's actions have actually been dispatched — bumped
1349
+ * by the real engine (BOFF-4445) on a matched run, whether triggered
1350
+ * automatically (WORK_ITEM_CREATED/STATUS_CHANGED) or manually via
1351
+ * `planmagnetExecuteAutomationRule`. A manual run whose conditions did not
1352
+ * match does NOT increment this — see that mutation's description.
1322
1353
  */
1323
1354
  executionCount: Scalars['Int']['output'];
1324
1355
  /** Unique identifier */
@@ -1509,9 +1540,9 @@ export type PlanmagnetBulkUpdateWorkItemsInput = {
1509
1540
  */
1510
1541
  export type PlanmagnetBurndownPoint = {
1511
1542
  __typename?: 'PlanmagnetBurndownPoint';
1512
- /** Story points DONE as of end of this day. */
1513
- completedCount: Scalars['Int']['output'];
1514
1543
  /** Work item count DONE as of end of this day. */
1544
+ completedCount: Scalars['Int']['output'];
1545
+ /** Story points DONE as of end of this day. */
1515
1546
  completedPoints: Scalars['Int']['output'];
1516
1547
  /** Calendar day (UTC midnight) this reading is as-of. */
1517
1548
  date: Scalars['DateTime']['output'];
@@ -1599,9 +1630,10 @@ export type PlanmagnetCreateCustomFieldDefinitionInput = {
1599
1630
  };
1600
1631
  export type PlanmagnetCreateDependencyInput = {
1601
1632
  description?: InputMaybe<Scalars['String']['input']>;
1633
+ lagMinutes?: InputMaybe<Scalars['Int']['input']>;
1602
1634
  metadata?: InputMaybe<Scalars['JSON']['input']>;
1603
- sourceWorkItemId: Scalars['String']['input'];
1604
- targetWorkItemId: Scalars['String']['input'];
1635
+ predecessorId: Scalars['String']['input'];
1636
+ successorId: Scalars['String']['input'];
1605
1637
  type: DependencyType;
1606
1638
  };
1607
1639
  export type PlanmagnetCreateDocInput = {
@@ -1637,6 +1669,7 @@ export type PlanmagnetCreateKeyResultInput = {
1637
1669
  metricType?: InputMaybe<KeyResultMetricType>;
1638
1670
  objectiveId: Scalars['String']['input'];
1639
1671
  ownerId?: InputMaybe<Scalars['String']['input']>;
1672
+ startValue?: InputMaybe<Scalars['Float']['input']>;
1640
1673
  status?: InputMaybe<KeyResultStatus>;
1641
1674
  targetValue: Scalars['Float']['input'];
1642
1675
  title: Scalars['String']['input'];
@@ -1786,6 +1819,11 @@ export type PlanmagnetCreateSprintInput = {
1786
1819
  metadata?: InputMaybe<Scalars['JSON']['input']>;
1787
1820
  name: Scalars['String']['input'];
1788
1821
  projectId: Scalars['String']['input'];
1822
+ /**
1823
+ * Accepted for API compatibility but not honored: sort position is always
1824
+ * the auto-assigned, per-project-unique `sequenceNumber` — see
1825
+ * sprint.service.ts.
1826
+ */
1789
1827
  sortOrder?: InputMaybe<Scalars['Int']['input']>;
1790
1828
  startDate?: InputMaybe<Scalars['DateTime']['input']>;
1791
1829
  };
@@ -1836,6 +1874,28 @@ export type PlanmagnetCreateWorkItemLinkInput = {
1836
1874
  sourceProduct: Scalars['String']['input'];
1837
1875
  workItemId: Scalars['String']['input'];
1838
1876
  };
1877
+ /**
1878
+ * Critical path through the dependency graph: the longest chain of
1879
+ * constrained work items, weighted by `lagDays`. Any delay on the nodes
1880
+ * returned in `path` pushes the project end date.
1881
+ */
1882
+ export type PlanmagnetCriticalPath = {
1883
+ __typename?: 'PlanmagnetCriticalPath';
1884
+ path: Array<PlanmagnetDependencyNode>;
1885
+ /** Per-node slack in days. Nodes on the critical path have slack 0. */
1886
+ slack: Scalars['JSON']['output'];
1887
+ /**
1888
+ * Length of the critical chain in MINUTES — WORK PLUS LAG.
1889
+ *
1890
+ * This field has been wrong twice, in two different ways. As `totalLagDays` it
1891
+ * summed lag expressed in days; the column rename made it minutes without
1892
+ * renaming the field, so a two-day lag read as 2880 "days". And summing lag at
1893
+ * all was the deeper error: A(5d) → B(3d) with FINISH_TO_START and no lag is an
1894
+ * eight-day chain, and a lag-only total reports ZERO. It now measures what the
1895
+ * name says. No consumer in the repo, MFE, SDK or CLI selects it.
1896
+ */
1897
+ totalDurationMinutes: Scalars['Int']['output'];
1898
+ };
1839
1899
  /** Cumulative flow diagram data for a project over a date range. */
1840
1900
  export type PlanmagnetCumulativeFlow = {
1841
1901
  __typename?: 'PlanmagnetCumulativeFlow';
@@ -1868,7 +1928,9 @@ export type PlanmagnetCustomFieldValueList = {
1868
1928
  };
1869
1929
  /**
1870
1930
  * Cycle-time distribution for a project over a date range. Only work items
1871
- * with a recorded transition INTO DONE within the range are counted.
1931
+ * with a recorded transition INTO DONE within the range are counted — an item
1932
+ * that already sat at DONE before status-transition recording began
1933
+ * contributes no sample (see analytics.service.ts).
1872
1934
  */
1873
1935
  export type PlanmagnetCycleTime = {
1874
1936
  __typename?: 'PlanmagnetCycleTime';
@@ -1887,43 +1949,63 @@ export type PlanmagnetCycleTimeItem = {
1887
1949
  title: Scalars['String']['output'];
1888
1950
  workItemId: Scalars['ID']['output'];
1889
1951
  };
1952
+ /**
1953
+ * A single chain of dependencies rooted at a starting work item. The chain
1954
+ * is built by following outgoing `BLOCKS` / `BLOCKED_BY` edges until the
1955
+ * graph ends (or a cycle is reached).
1956
+ */
1957
+ export type PlanmagnetDependencyChain = {
1958
+ __typename?: 'PlanmagnetDependencyChain';
1959
+ chain: Array<PlanmagnetDependencyNode>;
1960
+ depth: Scalars['Int']['output'];
1961
+ workItemId: Scalars['ID']['output'];
1962
+ };
1963
+ /**
1964
+ * A detected cycle in the dependency graph. Each cycle is the list of
1965
+ * work-item ids in traversal order.
1966
+ */
1967
+ export type PlanmagnetDependencyCycle = {
1968
+ __typename?: 'PlanmagnetDependencyCycle';
1969
+ length: Scalars['Int']['output'];
1970
+ workItemIds: Array<Scalars['ID']['output']>;
1971
+ };
1890
1972
  export type PlanmagnetDependencyFilter = {
1891
- sourceWorkItemId?: InputMaybe<Scalars['String']['input']>;
1973
+ predecessorId?: InputMaybe<Scalars['String']['input']>;
1892
1974
  status?: InputMaybe<DependencyStatus>;
1893
- targetWorkItemId?: InputMaybe<Scalars['String']['input']>;
1975
+ successorId?: InputMaybe<Scalars['String']['input']>;
1894
1976
  type?: InputMaybe<DependencyType>;
1895
1977
  };
1978
+ /**
1979
+ * A node participating in a dependency chain / critical path. Holds the
1980
+ * resolved work-item title and key so the client can render the chain
1981
+ * without a follow-up N+1 query.
1982
+ */
1983
+ export type PlanmagnetDependencyNode = {
1984
+ __typename?: 'PlanmagnetDependencyNode';
1985
+ id: Scalars['ID']['output'];
1986
+ key?: Maybe<Scalars['String']['output']>;
1987
+ title?: Maybe<Scalars['String']['output']>;
1988
+ };
1896
1989
  /**
1897
1990
  * A workspace-scoped, versioned markdown doc. `title`/`content`/`version`
1898
1991
  * always reflect the latest revision — use `revisions` for full history.
1899
1992
  */
1900
1993
  export type PlanmagnetDoc = {
1901
1994
  __typename?: 'PlanmagnetDoc';
1902
- /** Latest content */
1903
1995
  content: Scalars['String']['output'];
1904
- /** Creation timestamp */
1905
1996
  createdAt: Scalars['DateTime']['output'];
1906
- /** Actor who created this doc */
1907
1997
  createdBy: Scalars['String']['output'];
1908
- /** Unique identifier */
1909
1998
  id: Scalars['ID']['output'];
1910
1999
  /** Work items this doc is currently linked to. */
1911
2000
  linkedWorkItems: Array<WorkItem>;
1912
- /** Actor on whose behalf this was created */
1913
2001
  onBehalfOf?: Maybe<Scalars['String']['output']>;
1914
2002
  /** Full version history, including the current version, oldest first. */
1915
2003
  revisions: Array<PlanmagnetDocRevision>;
1916
- /** Current status */
1917
2004
  status: DocStatus;
1918
- /** Latest title */
1919
2005
  title: Scalars['String']['output'];
1920
- /** Last update timestamp */
1921
2006
  updatedAt: Scalars['DateTime']['output'];
1922
- /** Actor who last updated this doc */
1923
2007
  updatedBy?: Maybe<Scalars['String']['output']>;
1924
- /** Current version number */
1925
2008
  version: Scalars['Int']['output'];
1926
- /** Associated workspace ID */
1927
2009
  workspaceId: Scalars['String']['output'];
1928
2010
  };
1929
2011
  export type PlanmagnetDocFilter = {
@@ -1939,21 +2021,13 @@ export type PlanmagnetDocList = {
1939
2021
  /** An immutable snapshot of a PlanmagnetDoc at a given version. */
1940
2022
  export type PlanmagnetDocRevision = {
1941
2023
  __typename?: 'PlanmagnetDocRevision';
1942
- /** Optional note recorded for this revision */
1943
2024
  changeNote?: Maybe<Scalars['String']['output']>;
1944
- /** Content at this version */
1945
2025
  content: Scalars['String']['output'];
1946
- /** Creation timestamp */
1947
2026
  createdAt: Scalars['DateTime']['output'];
1948
- /** Actor who created this revision */
1949
2027
  createdBy: Scalars['String']['output'];
1950
- /** Parent doc ID */
1951
2028
  docId: Scalars['String']['output'];
1952
- /** Unique identifier */
1953
2029
  id: Scalars['ID']['output'];
1954
- /** Title at this version */
1955
2030
  title: Scalars['String']['output'];
1956
- /** Version number */
1957
2031
  version: Scalars['Int']['output'];
1958
2032
  };
1959
2033
  export type PlanmagnetExportToExternalInput = {
@@ -1999,6 +2073,18 @@ export type PlanmagnetFeatureRequestList = {
1999
2073
  pageInfo: PlanmagnetPageInfo;
2000
2074
  totalCount: Scalars['Int']['output'];
2001
2075
  };
2076
+ /**
2077
+ * Result of `planmagnetGenerateReleaseNotes`: the generated markdown, the
2078
+ * counts the UI needs to render a "X features / Y bug fixes" summary, and the
2079
+ * release row in its post-update state (or pre-update state when `persist`
2080
+ * was false).
2081
+ */
2082
+ export type PlanmagnetGenerateReleaseNotesPayload = {
2083
+ __typename?: 'PlanmagnetGenerateReleaseNotesPayload';
2084
+ counts: PlanmagnetReleaseNotesCounts;
2085
+ markdown: Scalars['String']['output'];
2086
+ release: Release;
2087
+ };
2002
2088
  /**
2003
2089
  * Import issues exported from an external tool (e.g. Linear) as WorkItems.
2004
2090
  * The caller supplies the exported payload directly (no external API credentials).
@@ -2033,7 +2119,7 @@ export type PlanmagnetImportResult = {
2033
2119
  skipped: Scalars['Int']['output'];
2034
2120
  workItemIds: Array<Scalars['String']['output']>;
2035
2121
  };
2036
- /** A measurable target belonging to exactly one Objective (BOFF-4441). */
2122
+ /** A measurable target belonging to exactly one Objective. */
2037
2123
  export type PlanmagnetKeyResult = {
2038
2124
  __typename?: 'PlanmagnetKeyResult';
2039
2125
  createdAt: Scalars['DateTime']['output'];
@@ -2041,7 +2127,10 @@ export type PlanmagnetKeyResult = {
2041
2127
  currentValue: Scalars['Float']['output'];
2042
2128
  description?: Maybe<Scalars['String']['output']>;
2043
2129
  id: Scalars['ID']['output'];
2044
- /** Live rollup of linked work item completion -- informational only; it does NOT drive `currentValue`. */
2130
+ /**
2131
+ * Live rollup of linked work item completion -- informational only; it does
2132
+ * NOT drive `currentValue` (see module deferral note).
2133
+ */
2045
2134
  linkedWorkItemRollup: PlanmagnetKeyResultRollup;
2046
2135
  /** Work items currently linked to this key result. */
2047
2136
  linkedWorkItems: Array<WorkItem>;
@@ -2089,33 +2178,6 @@ export type PlanmagnetLogTimeInput = {
2089
2178
  projectId: Scalars['String']['input'];
2090
2179
  workItemId: Scalars['String']['input'];
2091
2180
  };
2092
- /** A marketplace listing report awaiting admin moderation. */
2093
- export type PlanmagnetMarketplaceReport = {
2094
- __typename?: 'PlanmagnetMarketplaceReport';
2095
- /** Creation timestamp */
2096
- createdAt: Scalars['DateTime']['output'];
2097
- /** Unique identifier */
2098
- id: Scalars['ID']['output'];
2099
- /** Reported listing identifier */
2100
- listingId: Scalars['String']['output'];
2101
- /** Report reason */
2102
- reason: Scalars['String']['output'];
2103
- /** Workspace that filed the report */
2104
- reporterWorkspaceId: Scalars['String']['output'];
2105
- /** Resolution notes (populated on moderation) */
2106
- resolution?: Maybe<Scalars['String']['output']>;
2107
- /** Current moderation status */
2108
- status: PlanmagnetReportStatus;
2109
- /** Last update timestamp */
2110
- updatedAt: Scalars['DateTime']['output'];
2111
- };
2112
- /** Paginated list of marketplace reports. */
2113
- export type PlanmagnetMarketplaceReportConnection = {
2114
- __typename?: 'PlanmagnetMarketplaceReportConnection';
2115
- items: Array<PlanmagnetMarketplaceReport>;
2116
- pageInfo: PlanmagnetPageInfo;
2117
- totalCount: Scalars['Int']['output'];
2118
- };
2119
2181
  export type PlanmagnetMilestoneFilter = {
2120
2182
  ownerId?: InputMaybe<Scalars['String']['input']>;
2121
2183
  projectId?: InputMaybe<Scalars['String']['input']>;
@@ -2128,12 +2190,6 @@ export type PlanmagnetMilestoneList = {
2128
2190
  pageInfo: PlanmagnetPageInfo;
2129
2191
  totalCount: Scalars['Int']['output'];
2130
2192
  };
2131
- export declare enum PlanmagnetModerationAction {
2132
- Approve = "APPROVE",
2133
- Escalate = "ESCALATE",
2134
- Hide = "HIDE",
2135
- Reject = "REJECT"
2136
- }
2137
2193
  export type PlanmagnetMoveCardInput = {
2138
2194
  sortOrder?: InputMaybe<Scalars['Int']['input']>;
2139
2195
  targetColumnId: Scalars['ID']['input'];
@@ -2145,9 +2201,8 @@ export type PlanmagnetMoveWorkItemInput = {
2145
2201
  status?: InputMaybe<WorkItemStatus>;
2146
2202
  };
2147
2203
  /**
2148
- * A workspace-scoped goal for a given time period (BOFF-4441). `progress` is
2149
- * the average of its non-deleted KeyResults' progress (0 when it has none),
2150
- * computed live -- never stored.
2204
+ * A workspace-scoped goal for a given time period. `progress` is the average
2205
+ * of its non-deleted KeyResults' progress (0 when it has none).
2151
2206
  */
2152
2207
  export type PlanmagnetObjective = {
2153
2208
  __typename?: 'PlanmagnetObjective';
@@ -2160,7 +2215,10 @@ export type PlanmagnetObjective = {
2160
2215
  onBehalfOf?: Maybe<Scalars['String']['output']>;
2161
2216
  ownerId: Scalars['String']['output'];
2162
2217
  periodLabel: Scalars['String']['output'];
2163
- /** Average progress (0-100) across this objective's non-deleted key results. */
2218
+ /**
2219
+ * Average progress (0-100) across this objective's non-deleted key results.
2220
+ * Computed live -- never stored.
2221
+ */
2164
2222
  progress: Scalars['Float']['output'];
2165
2223
  startDate?: Maybe<Scalars['DateTime']['output']>;
2166
2224
  status: ObjectiveStatus;
@@ -2369,6 +2427,10 @@ export type PlanmagnetQuotaOverview = {
2369
2427
  boardCount: Scalars['Int']['output'];
2370
2428
  /** Board quota limit (null when unlimited or unassigned) */
2371
2429
  boardLimit?: Maybe<Scalars['Int']['output']>;
2430
+ /** Number of active editor seats in the workspace (BOFF-5094) */
2431
+ editorCount: Scalars['Int']['output'];
2432
+ /** Editor quota limit (null when unlimited or unassigned) */
2433
+ editorLimit?: Maybe<Scalars['Int']['output']>;
2372
2434
  /** Number of active projects in the workspace */
2373
2435
  projectCount: Scalars['Int']['output'];
2374
2436
  /** Project quota limit (null when unlimited or unassigned) */
@@ -2388,14 +2450,17 @@ export type PlanmagnetReleaseList = {
2388
2450
  pageInfo: PlanmagnetPageInfo;
2389
2451
  totalCount: Scalars['Int']['output'];
2390
2452
  };
2453
+ export type PlanmagnetReleaseNotesCounts = {
2454
+ __typename?: 'PlanmagnetReleaseNotesCounts';
2455
+ bugFixes: Scalars['Int']['output'];
2456
+ features: Scalars['Int']['output'];
2457
+ improvements: Scalars['Int']['output'];
2458
+ other: Scalars['Int']['output'];
2459
+ total: Scalars['Int']['output'];
2460
+ };
2391
2461
  export type PlanmagnetReorderColumnsInput = {
2392
2462
  columnIds: Array<Scalars['ID']['input']>;
2393
2463
  };
2394
- export declare enum PlanmagnetReportStatus {
2395
- Dismissed = "DISMISSED",
2396
- Pending = "PENDING",
2397
- Resolved = "RESOLVED"
2398
- }
2399
2464
  export type PlanmagnetReviewQualityGateInput = {
2400
2465
  reviewNotes?: InputMaybe<Scalars['String']['input']>;
2401
2466
  status: QualityGateStatus;
@@ -2476,34 +2541,72 @@ export type PlanmagnetSprintBurndown = {
2476
2541
  /** Total story points across all items currently in the sprint. */
2477
2542
  totalPoints: Scalars['Int']['output'];
2478
2543
  };
2479
- /**
2480
- * Real cross-layer CrewFoundry workforce capacity for one sprint (BOFF-4444),
2481
- * sourced live from wspace-crewfoundry-svc via the internal wspace gateway.
2482
- */
2544
+ /** Cross-layer sprint capacity snapshot (BOFF-4444). */
2483
2545
  export type PlanmagnetSprintCapacity = {
2484
2546
  __typename?: 'PlanmagnetSprintCapacity';
2547
+ /**
2548
+ * True when the CrewFoundry roster lookup itself returned nothing — either
2549
+ * a live lookup failure (service unreachable/timeout) or a workspace with no
2550
+ * CrewFoundry data. `members`/`unmatchedAssigneeIds` cannot distinguish the
2551
+ * two cases from PlanMagnet's side; this flag exists so callers can render
2552
+ * "capacity data unavailable" instead of silently showing an empty list.
2553
+ */
2485
2554
  crewfoundryUnavailable: Scalars['Boolean']['output'];
2555
+ /**
2556
+ * One entry per work-item assignee who was successfully matched to a real
2557
+ * CrewFoundry employee record
2558
+ */
2486
2559
  members: Array<PlanmagnetSprintCapacityMember>;
2487
2560
  rangeEnd: Scalars['DateTime']['output'];
2561
+ /**
2562
+ * Window the capacity figures were computed over — the sprint's own
2563
+ * startDate/endDate, or a trailing 14-day default when the sprint has no
2564
+ * dates set (e.g. still PLANNING)
2565
+ */
2488
2566
  rangeStart: Scalars['DateTime']['output'];
2489
2567
  sprintId: Scalars['ID']['output'];
2568
+ /**
2569
+ * Work-item assignees (actor ids) who could NOT be matched to a CrewFoundry
2570
+ * employee — no workspace identity, or no CrewFoundry roster match by
2571
+ * e-mail. This is the expected outcome for a workspace with no CrewFoundry
2572
+ * module provisioned, or for a non-employee collaborator, not an error.
2573
+ */
2490
2574
  unmatchedAssigneeIds: Array<Scalars['String']['output']>;
2491
2575
  };
2492
2576
  /**
2493
2577
  * Real CrewFoundry capacity/allocation for one sprint work-item assignee
2494
- * (BOFF-4444) — sourced live, cross-layer, from wspace-crewfoundry-svc.
2578
+ * (BOFF-4444) — sourced live, cross-layer, from `wspace-crewfoundry-svc`.
2495
2579
  */
2496
2580
  export type PlanmagnetSprintCapacityMember = {
2497
2581
  __typename?: 'PlanmagnetSprintCapacityMember';
2582
+ /** Platform actor id (the same value as `WorkItem.assigneeId`) */
2498
2583
  actorId: Scalars['String']['output'];
2584
+ /**
2585
+ * Real CrewFoundry-tracked hours allocated across all projects over the
2586
+ * sprint's date window (`crewEmployeeAllocation.totalHours`)
2587
+ */
2499
2588
  allocatedHours: Scalars['Float']['output'];
2589
+ /** Sum of story points on this person's assigned work items in this sprint */
2500
2590
  assignedStoryPoints: Scalars['Int']['output'];
2591
+ /** Work items in this sprint assigned to this person */
2501
2592
  assignedWorkItemCount: Scalars['Int']['output'];
2593
+ /**
2594
+ * Real CrewFoundry-tracked billable hours over the same window
2595
+ * (`crewEmployeeAllocation.billableHours`)
2596
+ */
2502
2597
  billableHours: Scalars['Float']['output'];
2598
+ /** CrewFoundry department */
2503
2599
  department: Scalars['String']['output'];
2600
+ /** Matched CrewFoundry `CrewEmployee.id` */
2504
2601
  employeeId: Scalars['ID']['output'];
2602
+ /** CrewFoundry employee's full name */
2505
2603
  employeeName: Scalars['String']['output'];
2604
+ /** CrewFoundry position/title */
2506
2605
  position: Scalars['String']['output'];
2606
+ /**
2607
+ * `billableHours / allocatedHours * 100`, rounded to 1 decimal place. Null
2608
+ * when `allocatedHours` is 0 (nothing to divide by).
2609
+ */
2507
2610
  utilizationPercent?: Maybe<Scalars['Float']['output']>;
2508
2611
  };
2509
2612
  export type PlanmagnetSprintFilter = {
@@ -2520,11 +2623,15 @@ export type PlanmagnetSprintList = {
2520
2623
  export type PlanmagnetSprintWorkItemsInput = {
2521
2624
  workItemIds: Array<Scalars['ID']['input']>;
2522
2625
  };
2523
- export declare enum PlanmagnetSubmissionStatus {
2524
- Approved = "APPROVED",
2525
- Pending = "PENDING",
2526
- Rejected = "REJECTED"
2527
- }
2626
+ export type PlanmagnetSuggestWorkItemBreakdownInput = {
2627
+ /** Plain-text feature request or description to break down. */
2628
+ description: Scalars['String']['input'];
2629
+ /**
2630
+ * Optional explicit provider override ("gemini" | "openai" | "anthropic").
2631
+ * Omit to use the platform's default provider chain.
2632
+ */
2633
+ requestedProvider?: InputMaybe<Scalars['String']['input']>;
2634
+ };
2528
2635
  export declare enum PlanmagnetSyncDirection {
2529
2636
  Bidirectional = "BIDIRECTIONAL",
2530
2637
  Inbound = "INBOUND",
@@ -2740,11 +2847,13 @@ export type PlanmagnetUpdateCustomFieldDefinitionInput = {
2740
2847
  };
2741
2848
  export type PlanmagnetUpdateDependencyInput = {
2742
2849
  description?: InputMaybe<Scalars['String']['input']>;
2850
+ lagMinutes?: InputMaybe<Scalars['Int']['input']>;
2743
2851
  metadata?: InputMaybe<Scalars['JSON']['input']>;
2744
2852
  status?: InputMaybe<DependencyStatus>;
2745
2853
  type?: InputMaybe<DependencyType>;
2746
2854
  };
2747
2855
  export type PlanmagnetUpdateDocInput = {
2856
+ /** Optional note recorded on the new revision this update creates. */
2748
2857
  changeNote?: InputMaybe<Scalars['String']['input']>;
2749
2858
  content?: InputMaybe<Scalars['String']['input']>;
2750
2859
  status?: InputMaybe<DocStatus>;
@@ -2783,6 +2892,7 @@ export type PlanmagnetUpdateKeyResultInput = {
2783
2892
  currentValue?: InputMaybe<Scalars['Float']['input']>;
2784
2893
  description?: InputMaybe<Scalars['String']['input']>;
2785
2894
  ownerId?: InputMaybe<Scalars['String']['input']>;
2895
+ startValue?: InputMaybe<Scalars['Float']['input']>;
2786
2896
  status?: InputMaybe<KeyResultStatus>;
2787
2897
  targetValue?: InputMaybe<Scalars['Float']['input']>;
2788
2898
  title?: InputMaybe<Scalars['String']['input']>;
@@ -2931,6 +3041,11 @@ export type PlanmagnetUpdateSprintInput = {
2931
3041
  goal?: InputMaybe<Scalars['String']['input']>;
2932
3042
  metadata?: InputMaybe<Scalars['JSON']['input']>;
2933
3043
  name?: InputMaybe<Scalars['String']['input']>;
3044
+ /**
3045
+ * Accepted for API compatibility but not honored: sort position is always
3046
+ * the auto-assigned, per-project-unique `sequenceNumber` — see
3047
+ * sprint.service.ts.
3048
+ */
2934
3049
  sortOrder?: InputMaybe<Scalars['Int']['input']>;
2935
3050
  startDate?: InputMaybe<Scalars['DateTime']['input']>;
2936
3051
  velocity?: InputMaybe<Scalars['Int']['input']>;
@@ -2977,7 +3092,11 @@ export type PlanmagnetVelocity = {
2977
3092
  __typename?: 'PlanmagnetVelocity';
2978
3093
  /** Mean completed points across the returned sprints. */
2979
3094
  averageVelocity: Scalars['Float']['output'];
2980
- /** Simple forecast for the next sprint's likely capacity (trailing average). */
3095
+ /**
3096
+ * Simple forecast for the next sprint's likely capacity: the trailing
3097
+ * average above. Deliberately simple (moving average, not a full
3098
+ * probabilistic model) — see analytics.service.ts.
3099
+ */
2981
3100
  forecastNextSprintPoints: Scalars['Float']['output'];
2982
3101
  projectId: Scalars['ID']['output'];
2983
3102
  sprints: Array<PlanmagnetVelocitySprintPoint>;
@@ -2999,6 +3118,13 @@ export type PlanmagnetVoteOnFeatureInput = {
2999
3118
  comment?: InputMaybe<Scalars['String']['input']>;
3000
3119
  weight?: InputMaybe<Scalars['Int']['input']>;
3001
3120
  };
3121
+ export type PlanmagnetWorkItemBreakdownResult = {
3122
+ __typename?: 'PlanmagnetWorkItemBreakdownResult';
3123
+ /** Id of the PlanmagnetAgentRun ledger row this call was recorded as. */
3124
+ agentRunId: Scalars['ID']['output'];
3125
+ provider: Scalars['String']['output'];
3126
+ suggestions: Array<PlanmagnetWorkItemSuggestion>;
3127
+ };
3002
3128
  export type PlanmagnetWorkItemDependencyList = {
3003
3129
  __typename?: 'PlanmagnetWorkItemDependencyList';
3004
3130
  items: Array<WorkItemDependency>;
@@ -3035,6 +3161,39 @@ export type PlanmagnetWorkItemList = {
3035
3161
  pageInfo: PlanmagnetPageInfo;
3036
3162
  totalCount: Scalars['Int']['output'];
3037
3163
  };
3164
+ export type PlanmagnetWorkItemSuggestion = {
3165
+ __typename?: 'PlanmagnetWorkItemSuggestion';
3166
+ description?: Maybe<Scalars['String']['output']>;
3167
+ estimatedHours?: Maybe<Scalars['Float']['output']>;
3168
+ priority: WorkItemPriority;
3169
+ title: Scalars['String']['output'];
3170
+ type: WorkItemType;
3171
+ };
3172
+ /**
3173
+ * A user who currently holds billable "editor" access to a PlanMagnet
3174
+ * workspace -- counted against the Free-tier `planmagnet.editors.count`
3175
+ * quota (10 editors). Viewers/commenters are not tracked here and are free.
3176
+ */
3177
+ export type PlanmagnetWorkspaceEditor = {
3178
+ __typename?: 'PlanmagnetWorkspaceEditor';
3179
+ /** Timestamp when this editor seat was granted */
3180
+ createdAt: Scalars['DateTime']['output'];
3181
+ /** Actor who granted this editor seat */
3182
+ createdBy: Scalars['ID']['output'];
3183
+ /** Unique identifier */
3184
+ id: Scalars['ID']['output'];
3185
+ /** User ID granted editor access */
3186
+ userId: Scalars['ID']['output'];
3187
+ /** Workspace ID */
3188
+ workspaceId: Scalars['ID']['output'];
3189
+ };
3190
+ /** Paginated list of workspace editor seats. */
3191
+ export type PlanmagnetWorkspaceEditorList = {
3192
+ __typename?: 'PlanmagnetWorkspaceEditorList';
3193
+ items: Array<PlanmagnetWorkspaceEditor>;
3194
+ pageInfo: PlanmagnetPageInfo;
3195
+ totalCount: Scalars['Int']['output'];
3196
+ };
3038
3197
  /**
3039
3198
  * A strategic grouping of programs and projects for executive-level
3040
3199
  * oversight, resource allocation, and alignment tracking.
@@ -3280,7 +3439,16 @@ export type Query = {
3280
3439
  planmagnetCompetitor?: Maybe<Competitor>;
3281
3440
  /** List competitors in a workspace */
3282
3441
  planmagnetCompetitors: PlanmagnetCompetitorList;
3283
- /** Cumulative flow diagram data for a project over a date range (defaults to the trailing 30 days). */
3442
+ /**
3443
+ * Compute the critical path (longest dependency chain) for a workspace.
3444
+ * When `projectId` is supplied, the path is scoped to the work items in
3445
+ * that project; otherwise the entire workspace dependency graph is used.
3446
+ */
3447
+ planmagnetCriticalPath: PlanmagnetCriticalPath;
3448
+ /**
3449
+ * Cumulative flow diagram data for a project: work item counts per status,
3450
+ * per day, over a date range (defaults to the trailing 30 days).
3451
+ */
3284
3452
  planmagnetCumulativeFlow: PlanmagnetCumulativeFlow;
3285
3453
  /** Get a single custom field definition by ID */
3286
3454
  planmagnetCustomFieldDefinition?: Maybe<CustomFieldDefinition>;
@@ -3288,15 +3456,26 @@ export type Query = {
3288
3456
  planmagnetCustomFieldDefinitions: PlanmagnetCustomFieldDefinitionList;
3289
3457
  /** List custom field values */
3290
3458
  planmagnetCustomFieldValues: PlanmagnetCustomFieldValueList;
3291
- /** Cycle-time distribution for a project's work items reaching DONE within a date range (defaults to the trailing 90 days). */
3459
+ /**
3460
+ * Cycle-time distribution for a project's work items that reached DONE
3461
+ * within a date range (defaults to the trailing 90 days).
3462
+ */
3292
3463
  planmagnetCycleTime: PlanmagnetCycleTime;
3293
3464
  /** List dependencies in a workspace */
3294
3465
  planmagnetDependencies: PlanmagnetWorkItemDependencyList;
3295
3466
  /** Get a single dependency by ID */
3296
3467
  planmagnetDependency?: Maybe<WorkItemDependency>;
3297
- /** Get a single doc by ID */
3468
+ /**
3469
+ * Walk the dependency graph from a starting work item and return the
3470
+ * reachable chain. Optional `maxDepth` bounds the traversal (default 50).
3471
+ */
3472
+ planmagnetDependencyChain: PlanmagnetDependencyChain;
3473
+ /**
3474
+ * List every distinct cycle in the workspace's dependency graph. Returns
3475
+ * an empty array when the graph is acyclic.
3476
+ */
3477
+ planmagnetDependencyCycles: Array<PlanmagnetDependencyCycle>;
3298
3478
  planmagnetDoc?: Maybe<PlanmagnetDoc>;
3299
- /** List docs in a workspace */
3300
3479
  planmagnetDocs: PlanmagnetDocList;
3301
3480
  /** List external mappings */
3302
3481
  planmagnetExternalMappings: PlanmagnetExternalMappingList;
@@ -3308,19 +3487,12 @@ export type Query = {
3308
3487
  planmagnetFeatureRequest?: Maybe<FeatureRequest>;
3309
3488
  /** List feature requests in a workspace */
3310
3489
  planmagnetFeatureRequests: PlanmagnetFeatureRequestList;
3311
- /** Get a single key result by ID */
3312
3490
  planmagnetKeyResult?: Maybe<PlanmagnetKeyResult>;
3313
- /** List adapter submissions for admin review. */
3314
- planmagnetListAdapterSubmissions: PlanmagnetAdapterSubmissionConnection;
3315
- /** List marketplace reports for admin moderation. */
3316
- planmagnetListMarketplaceReports: PlanmagnetMarketplaceReportConnection;
3317
3491
  /** Get a single milestone by ID */
3318
3492
  planmagnetMilestone?: Maybe<Milestone>;
3319
3493
  /** List milestones in a workspace */
3320
3494
  planmagnetMilestones: PlanmagnetMilestoneList;
3321
- /** Get a single objective by ID */
3322
3495
  planmagnetObjective?: Maybe<PlanmagnetObjective>;
3323
- /** List objectives in a workspace */
3324
3496
  planmagnetObjectives: PlanmagnetObjectiveList;
3325
3497
  /** Get a single portfolio by ID */
3326
3498
  planmagnetPortfolio?: Maybe<Portfolio>;
@@ -3364,9 +3536,18 @@ export type Query = {
3364
3536
  planmagnetRoadmaps: PlanmagnetRoadmapList;
3365
3537
  /** Get a single sprint by ID */
3366
3538
  planmagnetSprint?: Maybe<Sprint>;
3367
- /** Burndown chart data for a sprint: remaining vs completed points/count per day. */
3539
+ /**
3540
+ * Burndown chart data for a sprint: remaining vs completed points/count per
3541
+ * day across the sprint's date range. Returns null if the sprint does not
3542
+ * exist in the workspace.
3543
+ */
3368
3544
  planmagnetSprintBurndown?: Maybe<PlanmagnetSprintBurndown>;
3369
- /** Real cross-layer CrewFoundry workforce capacity for a sprint (BOFF-4444). */
3545
+ /**
3546
+ * Real cross-layer sprint-planning capacity view (BOFF-4444): for each
3547
+ * work-item assignee in this sprint who matches a CrewFoundry employee
3548
+ * record, surfaces live workforce allocation/availability queried from
3549
+ * `wspace-crewfoundry-svc` via the internal wspace gateway.
3550
+ */
3370
3551
  planmagnetSprintCapacity: PlanmagnetSprintCapacity;
3371
3552
  /** List sprints in a workspace */
3372
3553
  planmagnetSprints: PlanmagnetSprintList;
@@ -3378,7 +3559,10 @@ export type Query = {
3378
3559
  planmagnetTimesheet?: Maybe<PlanmagnetTimesheet>;
3379
3560
  /** List timesheets in a workspace */
3380
3561
  planmagnetTimesheets: PlanmagnetTimesheetList;
3381
- /** Velocity across the trailing N COMPLETED sprints of a project, plus a simple next-sprint forecast. */
3562
+ /**
3563
+ * Velocity (completed story points per sprint) across the trailing N
3564
+ * COMPLETED sprints of a project, plus a simple next-sprint forecast.
3565
+ */
3382
3566
  planmagnetVelocity: PlanmagnetVelocity;
3383
3567
  /** Get a single work item by ID */
3384
3568
  planmagnetWorkItem?: Maybe<WorkItem>;
@@ -3390,6 +3574,8 @@ export type Query = {
3390
3574
  planmagnetWorkItemLinks: PlanmagnetWorkItemLinkList;
3391
3575
  /** List work items in a workspace */
3392
3576
  planmagnetWorkItems: PlanmagnetWorkItemList;
3577
+ /** List the users who currently hold billable editor access to a workspace. */
3578
+ planmagnetWorkspaceEditors: PlanmagnetWorkspaceEditorList;
3393
3579
  /** Get a PlanMagnet workspace quota overview (counts + billing limits). */
3394
3580
  planmagnetWorkspaceQuotaOverview: PlanmagnetQuotaOverview;
3395
3581
  };
@@ -3439,6 +3625,10 @@ export type QueryPlanmagnetCompetitorsArgs = {
3439
3625
  pagination?: InputMaybe<PlanmagnetPaginationInput>;
3440
3626
  workspaceId: Scalars['ID']['input'];
3441
3627
  };
3628
+ export type QueryPlanmagnetCriticalPathArgs = {
3629
+ projectId?: InputMaybe<Scalars['ID']['input']>;
3630
+ workspaceId: Scalars['ID']['input'];
3631
+ };
3442
3632
  export type QueryPlanmagnetCumulativeFlowArgs = {
3443
3633
  endDate?: InputMaybe<Scalars['DateTime']['input']>;
3444
3634
  projectId: Scalars['ID']['input'];
@@ -3472,13 +3662,22 @@ export type QueryPlanmagnetDependenciesArgs = {
3472
3662
  export type QueryPlanmagnetDependencyArgs = {
3473
3663
  id: Scalars['ID']['input'];
3474
3664
  };
3665
+ export type QueryPlanmagnetDependencyChainArgs = {
3666
+ maxDepth?: InputMaybe<Scalars['Int']['input']>;
3667
+ workItemId: Scalars['ID']['input'];
3668
+ workspaceId: Scalars['ID']['input'];
3669
+ };
3670
+ export type QueryPlanmagnetDependencyCyclesArgs = {
3671
+ projectId?: InputMaybe<Scalars['ID']['input']>;
3672
+ workspaceId: Scalars['ID']['input'];
3673
+ };
3475
3674
  export type QueryPlanmagnetDocArgs = {
3476
3675
  id: Scalars['ID']['input'];
3477
3676
  };
3478
3677
  export type QueryPlanmagnetDocsArgs = {
3479
3678
  filter?: InputMaybe<PlanmagnetDocFilter>;
3480
3679
  pagination?: InputMaybe<PlanmagnetPaginationInput>;
3481
- workspaceId: Scalars['ID']['input'];
3680
+ workspaceId?: InputMaybe<Scalars['String']['input']>;
3482
3681
  };
3483
3682
  export type QueryPlanmagnetExternalMappingsArgs = {
3484
3683
  filter?: InputMaybe<PlanmagnetExternalMappingFilter>;
@@ -3504,14 +3703,6 @@ export type QueryPlanmagnetFeatureRequestsArgs = {
3504
3703
  export type QueryPlanmagnetKeyResultArgs = {
3505
3704
  id: Scalars['ID']['input'];
3506
3705
  };
3507
- export type QueryPlanmagnetListAdapterSubmissionsArgs = {
3508
- pagination?: InputMaybe<PlanmagnetPaginationInput>;
3509
- status?: InputMaybe<PlanmagnetSubmissionStatus>;
3510
- };
3511
- export type QueryPlanmagnetListMarketplaceReportsArgs = {
3512
- pagination?: InputMaybe<PlanmagnetPaginationInput>;
3513
- status?: InputMaybe<PlanmagnetReportStatus>;
3514
- };
3515
3706
  export type QueryPlanmagnetMilestoneArgs = {
3516
3707
  id: Scalars['ID']['input'];
3517
3708
  };
@@ -3661,6 +3852,10 @@ export type QueryPlanmagnetWorkItemsArgs = {
3661
3852
  pagination?: InputMaybe<PlanmagnetPaginationInput>;
3662
3853
  workspaceId: Scalars['ID']['input'];
3663
3854
  };
3855
+ export type QueryPlanmagnetWorkspaceEditorsArgs = {
3856
+ pagination?: InputMaybe<PlanmagnetPaginationInput>;
3857
+ workspaceId: Scalars['ID']['input'];
3858
+ };
3664
3859
  export type QueryPlanmagnetWorkspaceQuotaOverviewArgs = {
3665
3860
  workspaceId: Scalars['ID']['input'];
3666
3861
  };
@@ -3722,7 +3917,8 @@ export declare enum ReleaseStatus {
3722
3917
  Planning = "PLANNING",
3723
3918
  Ready = "READY",
3724
3919
  Released = "RELEASED",
3725
- RolledBack = "ROLLED_BACK"
3920
+ RolledBack = "ROLLED_BACK",
3921
+ Staging = "STAGING"
3726
3922
  }
3727
3923
  /**
3728
3924
  * A potential threat or issue that could impact project delivery,
@@ -3926,7 +4122,12 @@ export type Sprint = {
3926
4122
  project?: Maybe<PlanmagnetProject>;
3927
4123
  /** Parent project ID */
3928
4124
  projectId: Scalars['String']['output'];
3929
- /** Sort order */
4125
+ /**
4126
+ * Sort order. Backed by the Prisma `sequenceNumber` column (the only ordering
4127
+ * primitive Sprint has) via a field resolver — see sprint.resolvers.ts. Not
4128
+ * independently settable; see PlanmagnetCreateSprintInput/
4129
+ * PlanmagnetUpdateSprintInput below.
4130
+ */
3930
4131
  sortOrder: Scalars['Int']['output'];
3931
4132
  /** Sprint start date */
3932
4133
  startDate?: Maybe<Scalars['DateTime']['output']>;
@@ -3936,7 +4137,10 @@ export type Sprint = {
3936
4137
  updatedAt: Scalars['DateTime']['output'];
3937
4138
  /** Actor who last updated this sprint */
3938
4139
  updatedBy?: Maybe<Scalars['String']['output']>;
3939
- /** Sprint velocity (completed story points) */
4140
+ /**
4141
+ * Sprint velocity (completed story points). Backed by the Prisma
4142
+ * `velocityActual` column via a field resolver — see sprint.resolvers.ts.
4143
+ */
3940
4144
  velocity?: Maybe<Scalars['Int']['output']>;
3941
4145
  /** Work items in this sprint */
3942
4146
  workItems: Array<WorkItem>;
@@ -4061,20 +4265,30 @@ export type WorkItemDependency = {
4061
4265
  description?: Maybe<Scalars['String']['output']>;
4062
4266
  /** Unique identifier */
4063
4267
  id: Scalars['ID']['output'];
4268
+ /**
4269
+ * Offset applied to the constraint, in minutes. Negative means lead (overlap)
4270
+ * rather than lag. The column has always existed as `lagDays`; the SDL never
4271
+ * exposed it, so a lagged constraint could not be expressed at all.
4272
+ */
4273
+ lagMinutes?: Maybe<Scalars['Int']['output']>;
4064
4274
  /** Arbitrary metadata */
4065
4275
  metadata?: Maybe<Scalars['JSON']['output']>;
4066
4276
  /** Actor on whose behalf this was created */
4067
4277
  onBehalfOf?: Maybe<Scalars['String']['output']>;
4068
- /** Source work item */
4069
- sourceWorkItem?: Maybe<WorkItem>;
4070
- /** Source work item ID */
4071
- sourceWorkItemId: Scalars['String']['output'];
4278
+ /** The constraining work item */
4279
+ predecessor?: Maybe<WorkItem>;
4280
+ /**
4281
+ * The work item that constrains the other. Renamed from `sourceWorkItemId`:
4282
+ * with `type` now purely a scheduling relationship, source/target read as a
4283
+ * generic graph edge while predecessor/successor state the actual meaning.
4284
+ */
4285
+ predecessorId: Scalars['String']['output'];
4072
4286
  /** Current status */
4073
4287
  status: DependencyStatus;
4074
- /** Target work item */
4075
- targetWorkItem?: Maybe<WorkItem>;
4076
- /** Target work item ID */
4077
- targetWorkItemId: Scalars['String']['output'];
4288
+ /** The constrained work item */
4289
+ successor?: Maybe<WorkItem>;
4290
+ /** The work item whose schedule is constrained. Renamed from `targetWorkItemId`. */
4291
+ successorId: Scalars['String']['output'];
4078
4292
  /** Type of dependency */
4079
4293
  type: DependencyType;
4080
4294
  /** Last update timestamp */
@@ -4116,9 +4330,28 @@ export type WorkItemLink = {
4116
4330
  /** Associated workspace ID */
4117
4331
  workspaceId: Scalars['String']['output'];
4118
4332
  };
4333
+ /**
4334
+ * How a work item relates to the thing it is linked to.
4335
+ *
4336
+ * The first six are cross-product verbs: a work item INSPECTS a HealthyBowl
4337
+ * sensor, PRODUCES an artifact. The five added in 20260924130000 are the
4338
+ * work-item-to-work-item issue-link verbs that used to sit on
4339
+ * `WorkItemDependency.type`, where they were indistinguishable from scheduling
4340
+ * constraints and dragged semantic links into critical-path maths.
4341
+ *
4342
+ * For a link between two PlanMagnet work items, use `sourceProduct: "planmagnet"`
4343
+ * and `entityType: "WorkItem"`. **None of these relations affect scheduling** —
4344
+ * that is `WorkItemDependency` and only `WorkItemDependency`.
4345
+ */
4119
4346
  export declare enum WorkItemLinkRelation {
4120
4347
  Affects = "AFFECTS",
4348
+ /** This work item is blocked by the linked one. Semantic only: it does NOT schedule. */
4349
+ BlockedBy = "BLOCKED_BY",
4121
4350
  Blocks = "BLOCKS",
4351
+ CausedBy = "CAUSED_BY",
4352
+ Causes = "CAUSES",
4353
+ DuplicatedBy = "DUPLICATED_BY",
4354
+ Duplicates = "DUPLICATES",
4122
4355
  Inspects = "INSPECTS",
4123
4356
  Produces = "PRODUCES",
4124
4357
  RelatedTo = "RELATED_TO",