@burdenoff/microfe-movethewheels 2026.920.2 → 2026.921.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/components/CarbonFootprintPanel.js +1 -1
  2. package/dist/components/CustomerPicker.js +271 -0
  3. package/dist/components/DataTable.js +140 -139
  4. package/dist/components/DocumentsCard.js +14 -8
  5. package/dist/generated/wspace-types.d.ts +1043 -5
  6. package/dist/hooks/useAnalytics.js +21 -1
  7. package/dist/hooks/useCustomers.js +94 -78
  8. package/dist/hooks/useDebouncedValue.js +11 -0
  9. package/dist/hooks/useEntityDocuments.js +28 -18
  10. package/dist/hooks/useEpod.js +24 -17
  11. package/dist/hooks/useFleet.js +146 -125
  12. package/dist/hooks/useInventory.js +255 -186
  13. package/dist/hooks/useMultiModalShipments.js +35 -27
  14. package/dist/hooks/useOrders.js +73 -73
  15. package/dist/hooks/useRoutes.js +97 -75
  16. package/dist/hooks/useTracking.js +100 -88
  17. package/dist/movethewheels/components/CustomerPicker.d.ts +19 -0
  18. package/dist/movethewheels/components/DataTable.d.ts +5 -1
  19. package/dist/movethewheels/hooks/useCustomers.d.ts +0 -1
  20. package/dist/movethewheels/hooks/useDebouncedValue.d.ts +1 -0
  21. package/dist/movethewheels/hooks/useEntityDocuments.d.ts +2 -0
  22. package/dist/movethewheels/hooks/useEpod.d.ts +6 -1
  23. package/dist/movethewheels/hooks/useFleet.d.ts +49 -5
  24. package/dist/movethewheels/hooks/useInventory.d.ts +24 -17
  25. package/dist/movethewheels/hooks/useMultiModalShipments.d.ts +6 -1
  26. package/dist/movethewheels/hooks/useOrders.d.ts +33 -5
  27. package/dist/movethewheels/hooks/useRoutes.d.ts +2 -1
  28. package/dist/movethewheels/hooks/useTracking.d.ts +12 -11
  29. package/dist/movethewheels/types/index.d.ts +7 -5
  30. package/dist/movethewheels/utils/navigation.d.ts +14 -0
  31. package/dist/pages/CreateOrderPage.js +228 -217
  32. package/dist/pages/CustomerDetailsPage.js +220 -220
  33. package/dist/pages/CustomersPage.js +61 -54
  34. package/dist/pages/DeliveryCapturePage.js +131 -109
  35. package/dist/pages/DriversPage.js +100 -92
  36. package/dist/pages/InventoryPage.js +239 -236
  37. package/dist/pages/MultiModalShipmentPage.js +163 -130
  38. package/dist/pages/OrderDetailsPage.js +224 -208
  39. package/dist/pages/OrdersListPage.js +66 -60
  40. package/dist/pages/ProductDetailsPage.js +241 -200
  41. package/dist/pages/ProductsPage.js +59 -52
  42. package/dist/pages/RouteDetailsPage.js +343 -321
  43. package/dist/pages/RoutesPage.js +55 -48
  44. package/dist/pages/VehiclesPage.js +63 -56
  45. package/dist/pages/WarehousesPage.js +60 -53
  46. package/dist/utils/navigation.js +22 -1
  47. package/package.json +1 -1
  48. package/src/generated/wspace-types.ts +1188 -5
  49. package/src/movethewheels/components/CarbonFootprintPanel.tsx +0 -1
  50. package/src/movethewheels/components/CustomerPicker.tsx +321 -0
  51. package/src/movethewheels/components/DataTable.tsx +34 -18
  52. package/src/movethewheels/components/DocumentsCard.tsx +6 -1
  53. package/src/movethewheels/components/maps/leaflet-setup.ts +1 -8
  54. package/src/movethewheels/hooks/useAnalytics.ts +27 -0
  55. package/src/movethewheels/hooks/useCustomers.ts +64 -24
  56. package/src/movethewheels/hooks/useDebouncedValue.ts +12 -0
  57. package/src/movethewheels/hooks/useEntityDocuments.ts +43 -25
  58. package/src/movethewheels/hooks/useEpod.ts +14 -7
  59. package/src/movethewheels/hooks/useFleet.ts +58 -37
  60. package/src/movethewheels/hooks/useFleetIntelligence.ts +1 -4
  61. package/src/movethewheels/hooks/useInventory.ts +211 -90
  62. package/src/movethewheels/hooks/useMultiModalShipments.ts +15 -11
  63. package/src/movethewheels/hooks/useOrders.ts +13 -14
  64. package/src/movethewheels/hooks/useRoutes.ts +80 -23
  65. package/src/movethewheels/hooks/useTracking.ts +130 -98
  66. package/src/movethewheels/pages/CreateOrderPage.tsx +92 -31
  67. package/src/movethewheels/pages/CustomerDetailsPage.tsx +15 -6
  68. package/src/movethewheels/pages/CustomersPage.tsx +11 -1
  69. package/src/movethewheels/pages/DeliveryCapturePage.tsx +31 -1
  70. package/src/movethewheels/pages/DriversPage.tsx +24 -12
  71. package/src/movethewheels/pages/InventoryPage.tsx +57 -32
  72. package/src/movethewheels/pages/MultiModalShipmentPage.tsx +52 -3
  73. package/src/movethewheels/pages/OrderDetailsPage.tsx +17 -1
  74. package/src/movethewheels/pages/OrdersListPage.tsx +20 -3
  75. package/src/movethewheels/pages/ProductDetailsPage.tsx +52 -3
  76. package/src/movethewheels/pages/ProductsPage.tsx +11 -1
  77. package/src/movethewheels/pages/RouteDetailsPage.tsx +35 -5
  78. package/src/movethewheels/pages/RoutesPage.tsx +11 -1
  79. package/src/movethewheels/pages/VehiclesPage.tsx +19 -2
  80. package/src/movethewheels/pages/WarehousesPage.tsx +11 -1
  81. package/src/movethewheels/types/index.ts +7 -5
  82. package/src/movethewheels/utils/navigation.ts +32 -0
@@ -2124,6 +2124,68 @@ export enum AgentVisibility {
2124
2124
  Workspace = 'WORKSPACE'
2125
2125
  }
2126
2126
 
2127
+ /** A decision the engine proposed, with the evidence and rails behind it. */
2128
+ export type AgronomyDecision = {
2129
+ __typename?: 'AgronomyDecision';
2130
+ /** Why a rail blocked it, in words a farmer can act on. Null unless BLOCKED. */
2131
+ blockedReason?: Maybe<Scalars['String']['output']>;
2132
+ /** 0..1, or null when nothing honest could be reported. */
2133
+ confidence?: Maybe<Scalars['Float']['output']>;
2134
+ createdAt: Scalars['String']['output'];
2135
+ decidedAt?: Maybe<Scalars['String']['output']>;
2136
+ decidedBy?: Maybe<Scalars['String']['output']>;
2137
+ /** One of: IRRIGATION | TREATMENT. */
2138
+ decisionType: Scalars['String']['output'];
2139
+ fieldId?: Maybe<Scalars['ID']['output']>;
2140
+ id: Scalars['ID']['output'];
2141
+ /** The real records this rests on — probe code, reading timestamp, scan id. Never a summary: every card must cite something the farmer can go and look at. */
2142
+ inputs?: Maybe<Scalars['JSON']['output']>;
2143
+ modelName?: Maybe<Scalars['String']['output']>;
2144
+ modelProvider?: Maybe<Scalars['String']['output']>;
2145
+ plantScanId?: Maybe<Scalars['ID']['output']>;
2146
+ railChecks: Array<AgronomyRailCheck>;
2147
+ rationale: Scalars['String']['output'];
2148
+ /** Recommended irrigation depth in mm. Null for non-irrigation decisions, and zero when the recommendation is to hold off. */
2149
+ recommendedMm?: Maybe<Scalars['Int']['output']>;
2150
+ /** MODEL | HEURISTIC — whether a model actually produced this wording. */
2151
+ source: Scalars['String']['output'];
2152
+ /** One of: PROPOSED | ACCEPTED | REJECTED | BLOCKED. BLOCKED is a compliance rail's verdict, not a suggestion — it can never be accepted. If the rule is wrong, the fix is to correct the substance rulebook, which leaves a record. */
2153
+ status: Scalars['String']['output'];
2154
+ /** The field or plant scan this is about. */
2155
+ subjectId: Scalars['ID']['output'];
2156
+ /** FIELD | PLANT_SCAN. */
2157
+ subjectType: Scalars['String']['output'];
2158
+ title: Scalars['String']['output'];
2159
+ updatedAt: Scalars['String']['output'];
2160
+ };
2161
+
2162
+ export type AgronomyDecisionFilterInput = {
2163
+ /** IRRIGATION | TREATMENT. */
2164
+ decisionType?: InputMaybe<Scalars['String']['input']>;
2165
+ limit?: InputMaybe<Scalars['Int']['input']>;
2166
+ /** PROPOSED | ACCEPTED | REJECTED | BLOCKED. */
2167
+ status?: InputMaybe<Scalars['String']['input']>;
2168
+ };
2169
+
2170
+ /** Result of a sweep. */
2171
+ export type AgronomyDecisionSweepResult = {
2172
+ __typename?: 'AgronomyDecisionSweepResult';
2173
+ decisions: Array<AgronomyDecision>;
2174
+ /** Subjects the sweep did not reach, so "no proposals" is never confused with "not looked at". */
2175
+ skipped: Scalars['Int']['output'];
2176
+ skippedReason?: Maybe<Scalars['String']['output']>;
2177
+ };
2178
+
2179
+ /** One compliance rail and what it concluded (HB-UC-19). `NOT_APPLICABLE` is recorded rather than omitted: on a card read six months from now, "this rail does not apply here" and "nobody remembered to run it" look identical, and only one of them is safe. */
2180
+ export type AgronomyRailCheck = {
2181
+ __typename?: 'AgronomyRailCheck';
2182
+ detail: Scalars['String']['output'];
2183
+ /** One of: PASS | BLOCKED | NOT_APPLICABLE. */
2184
+ outcome: Scalars['String']['output'];
2185
+ /** Rail identifier, e.g. PROHIBITED_SUBSTANCE | MEDICATION_WITHDRAWAL. */
2186
+ rail: Scalars['String']['output'];
2187
+ };
2188
+
2127
2189
  export type AiContext = {
2128
2190
  __typename?: 'AiContext';
2129
2191
  content: Scalars['String']['output'];
@@ -4623,6 +4685,8 @@ export type Auction = {
4623
4685
  export type Audit = {
4624
4686
  __typename?: 'Audit';
4625
4687
  auditor: Scalars['String']['output'];
4688
+ /** The certification this audit was carried out against, or null when it was not carried out against one (BOFF-6107). An audit linked here with open critical findings blocks that certificate from being marked Active. */
4689
+ certificationId?: Maybe<Scalars['ID']['output']>;
4626
4690
  completedDate?: Maybe<Scalars['String']['output']>;
4627
4691
  criticalFindings: Scalars['Int']['output'];
4628
4692
  findings: Scalars['Int']['output'];
@@ -11071,6 +11135,18 @@ export type ComplianceDocument = {
11071
11135
  uploadedDate: Scalars['String']['output'];
11072
11136
  };
11073
11137
 
11138
+ /** BOFF-6043 — a rendered audit document, returned inline as base64. Same shape as `HealthyBowlAccountingExport`: the client decodes and downloads, or hands the bytes to Files to archive. Inline rather than a signed URL because the bytes are built per request from live rows — there is nothing to store, and a stored copy would go stale the moment a checklist moved. */
11139
+ export type ComplianceExportFile = {
11140
+ __typename?: 'ComplianceExportFile';
11141
+ byteSize: Scalars['Int']['output'];
11142
+ /** Base64-encoded file bytes. */
11143
+ contentBase64: Scalars['String']['output'];
11144
+ filename: Scalars['String']['output'];
11145
+ /** PDF */
11146
+ format: Scalars['String']['output'];
11147
+ mimeType: Scalars['String']['output'];
11148
+ };
11149
+
11074
11150
  /** A compliance finding: a domain observation, not a notification. Alerts are dispatched via the platform notification service. */
11075
11151
  export type ComplianceFlag = {
11076
11152
  __typename?: 'ComplianceFlag';
@@ -11445,6 +11521,15 @@ export type ConsoleValidationResult = {
11445
11521
  valid: Scalars['Boolean']['output'];
11446
11522
  };
11447
11523
 
11524
+ /** A bookable appointment window (BOFF-6030). */
11525
+ export type ConsultSlot = {
11526
+ __typename?: 'ConsultSlot';
11527
+ /** False when someone already holds this time. Taken slots are returned rather than omitted: a picker that hides 10:00 looks like a consultant who does not work then, where a disabled 10:00 says someone else got there first. */
11528
+ available: Scalars['Boolean']['output'];
11529
+ end: Scalars['String']['output'];
11530
+ start: Scalars['String']['output'];
11531
+ };
11532
+
11448
11533
  export type Consultation = {
11449
11534
  __typename?: 'Consultation';
11450
11535
  consultantId: Scalars['String']['output'];
@@ -11455,7 +11540,11 @@ export type Consultation = {
11455
11540
  id: Scalars['ID']['output'];
11456
11541
  mode: Scalars['String']['output'];
11457
11542
  notes?: Maybe<Scalars['String']['output']>;
11543
+ /** The requested day. Kept alongside `slotStart`: consultations booked before BOFF-6030 carry a day and no time, and must keep rendering. */
11458
11544
  requestedDate: Scalars['String']['output'];
11545
+ slotEnd?: Maybe<Scalars['String']['output']>;
11546
+ /** BOFF-6030 — the agreed appointment window. Null on a consultation booked before slots existed. */
11547
+ slotStart?: Maybe<Scalars['String']['output']>;
11459
11548
  status: ConsultationStatus;
11460
11549
  topic: Scalars['String']['output'];
11461
11550
  };
@@ -13530,6 +13619,8 @@ export type CreateAssetTransactionInput = {
13530
13619
 
13531
13620
  export type CreateAuditInput = {
13532
13621
  auditor: Scalars['String']['input'];
13622
+ /** The certification this audit is being carried out against, if any. An id belonging to another workspace is stored as null rather than rejected — the audit itself is still valid, it is simply not attributable to a certificate this workspace owns. */
13623
+ certificationId?: InputMaybe<Scalars['ID']['input']>;
13533
13624
  context: ContextInput;
13534
13625
  scheduledDate: Scalars['String']['input'];
13535
13626
  title: Scalars['String']['input'];
@@ -14036,6 +14127,8 @@ export type CreateConsultationInput = {
14036
14127
  /** BOFF-6081 — link this booking back to an AI plant scan (the INCONCLUSIVE hand-off). The scan's context is stamped with the created consultation id. */
14037
14128
  plantScanId?: InputMaybe<Scalars['ID']['input']>;
14038
14129
  requestedDate: Scalars['String']['input'];
14130
+ /** BOFF-6030 — ISO instant for the chosen slot. Optional; `slotEnd` is derived from the rule. */
14131
+ slotStart?: InputMaybe<Scalars['String']['input']>;
14039
14132
  topic: Scalars['String']['input'];
14040
14133
  };
14041
14134
 
@@ -14494,6 +14587,20 @@ export type CreateDigitalTwinInput = {
14494
14587
  properties?: InputMaybe<Scalars['JSONObject']['input']>;
14495
14588
  };
14496
14589
 
14590
+ /** Input for createDisposableWorkspace (BOFF-6560, service-actor-only). No gateway-injected tenant/org/actor context exists for an M2M caller, so every identity field is explicit here — mirrors SyncFromGlobalInput's service-to-service shape rather than CreateWorkspaceInput's user-session one. */
14591
+ export type CreateDisposableWorkspaceInput = {
14592
+ /** Display name of the disposable workspace */
14593
+ name: Scalars['String']['input'];
14594
+ /** Organization ID this disposable workspace belongs to */
14595
+ orgId: Scalars['ID']['input'];
14596
+ /** Owner user ID for the disposable workspace (the operator/service identity responsible for its lifecycle, not necessarily an end-user) */
14597
+ ownerId: Scalars['ID']['input'];
14598
+ /** Tenant ID this disposable workspace belongs to */
14599
+ tenantId: Scalars['ID']['input'];
14600
+ /** Type of workspace (defaults to WORKSPACE) */
14601
+ type?: InputMaybe<WorkspaceType>;
14602
+ };
14603
+
14497
14604
  export type CreateDriverInput = {
14498
14605
  certifications?: InputMaybe<Scalars['JSON']['input']>;
14499
14606
  context?: InputMaybe<ContextInput>;
@@ -15636,6 +15743,14 @@ export type CreateHealthyBowlCostCenterInput = {
15636
15743
  yieldUnit?: InputMaybe<Scalars['String']['input']>;
15637
15744
  };
15638
15745
 
15746
+ export type CreateHealthyBowlCrewInput = {
15747
+ context: ContextInput;
15748
+ isActive?: InputMaybe<Scalars['Boolean']['input']>;
15749
+ leadWorkerId?: InputMaybe<Scalars['ID']['input']>;
15750
+ name: Scalars['String']['input'];
15751
+ workerIds?: InputMaybe<Array<Scalars['ID']['input']>>;
15752
+ };
15753
+
15639
15754
  export type CreateHealthyBowlCsaPickupLocationInput = {
15640
15755
  /** Same JSON shape as CsaMembership.deliveryAddress. */
15641
15756
  address?: InputMaybe<Scalars['JSON']['input']>;
@@ -15685,9 +15800,15 @@ export type CreateHealthyBowlDiseaseWarningRuleInput = {
15685
15800
  };
15686
15801
 
15687
15802
  export type CreateHealthyBowlFarmRecommendationInput = {
15803
+ /** BOFF-3676 — HUMAN (default) or MODEL. Omitting it means HUMAN: a caller that does not say otherwise IS one, and inferring MODEL would attach a machine's authority to a person's advice. */
15804
+ authorKind?: InputMaybe<Scalars['String']['input']>;
15805
+ confidence?: InputMaybe<Scalars['Float']['input']>;
15688
15806
  detail: Scalars['String']['input'];
15689
15807
  domain: Scalars['String']['input'];
15808
+ /** Only meaningful when authorKind is MODEL; ignored otherwise. */
15809
+ modelName?: InputMaybe<Scalars['String']['input']>;
15690
15810
  priority?: InputMaybe<HealthyBowlFarmRecommendationPriority>;
15811
+ rationale?: InputMaybe<Scalars['String']['input']>;
15691
15812
  title: Scalars['String']['input'];
15692
15813
  /** The CLIENT workspace this recommendation is written onto (the consultant must hold an active assignment to it). */
15693
15814
  workspaceId: Scalars['ID']['input'];
@@ -15738,6 +15859,7 @@ export type CreateHealthyBowlInputPlanInput = {
15738
15859
  };
15739
15860
 
15740
15861
  export type CreateHealthyBowlIrrigationAutomationInput = {
15862
+ autoTaskEnabled?: InputMaybe<Scalars['Boolean']['input']>;
15741
15863
  context: ContextInput;
15742
15864
  notifyInApp?: InputMaybe<Scalars['Boolean']['input']>;
15743
15865
  rainProbThreshold?: InputMaybe<Scalars['Int']['input']>;
@@ -15768,6 +15890,16 @@ export type CreateHealthyBowlLedgerAccountInput = {
15768
15890
  sortOrder?: InputMaybe<Scalars['Int']['input']>;
15769
15891
  };
15770
15892
 
15893
+ export type CreateHealthyBowlLoanMilestoneInput = {
15894
+ context: ContextInput;
15895
+ description?: InputMaybe<Scalars['String']['input']>;
15896
+ /** HARVEST or PLANTING_ACTIVITY. Optional at creation; required by the time it is released. */
15897
+ evidenceType?: InputMaybe<Scalars['String']['input']>;
15898
+ label: Scalars['String']['input'];
15899
+ loanId: Scalars['ID']['input'];
15900
+ releaseAmount: Scalars['Float']['input'];
15901
+ };
15902
+
15771
15903
  export type CreateHealthyBowlMapFeatureInput = {
15772
15904
  color?: InputMaybe<Scalars['String']['input']>;
15773
15905
  context: ContextInput;
@@ -15907,6 +16039,7 @@ export type CreateHealthyBowlStorageLocationInput = {
15907
16039
  export type CreateHealthyBowlSuccessionPlanInput = {
15908
16040
  /** Optional loose link to a Bed (no FK). */
15909
16041
  bedId?: InputMaybe<Scalars['ID']['input']>;
16042
+ bedWidthM?: InputMaybe<Scalars['Float']['input']>;
15910
16043
  context: ContextInput;
15911
16044
  /** Number of successions to generate (>= 1). */
15912
16045
  count: Scalars['Int']['input'];
@@ -15916,9 +16049,13 @@ export type CreateHealthyBowlSuccessionPlanInput = {
15916
16049
  /** Days between successive sowings. */
15917
16050
  intervalDays: Scalars['Int']['input'];
15918
16051
  notes?: InputMaybe<Scalars['String']['input']>;
16052
+ pathWidthM?: InputMaybe<Scalars['Float']['input']>;
15919
16053
  /** Optional loose link to a PlantCatalog entry (no FK). */
15920
16054
  plantCatalogId?: InputMaybe<Scalars['ID']['input']>;
16055
+ /** BOFF-6100 — geometry supplied by the succession form; server derives one set of figures for every child. */
16056
+ plantSpacingCm?: InputMaybe<Scalars['Float']['input']>;
15921
16057
  plantsNeeded?: InputMaybe<Scalars['Int']['input']>;
16058
+ rowSpacingCm?: InputMaybe<Scalars['Float']['input']>;
15922
16059
  /** Growing season. Must be one of: KHARIF, RABI, ZAID, PERENNIAL (case-insensitive). */
15923
16060
  season?: InputMaybe<Scalars['String']['input']>;
15924
16061
  seedGrams?: InputMaybe<Scalars['Float']['input']>;
@@ -15996,6 +16133,19 @@ export type CreateHealthyBowlWholesaleOrderInput = {
15996
16133
  quantityKg: Scalars['Float']['input'];
15997
16134
  };
15998
16135
 
16136
+ export type CreateHealthyBowlWorkerInput = {
16137
+ context: ContextInput;
16138
+ dailyWage?: InputMaybe<Scalars['Float']['input']>;
16139
+ employmentType?: InputMaybe<Scalars['String']['input']>;
16140
+ hourlyRate?: InputMaybe<Scalars['Float']['input']>;
16141
+ isActive?: InputMaybe<Scalars['Boolean']['input']>;
16142
+ linkedActorId?: InputMaybe<Scalars['String']['input']>;
16143
+ name: Scalars['String']['input'];
16144
+ phone?: InputMaybe<Scalars['String']['input']>;
16145
+ piecePrice?: InputMaybe<Scalars['Float']['input']>;
16146
+ skills?: InputMaybe<Array<Scalars['String']['input']>>;
16147
+ };
16148
+
15999
16149
  export type CreateIcsGroupInput = {
16000
16150
  certificationId?: InputMaybe<Scalars['ID']['input']>;
16001
16151
  /** Unique within the workspace. */
@@ -16384,23 +16534,30 @@ export type CreatePipelineStageInput = {
16384
16534
  export type CreatePlantingPlanInput = {
16385
16535
  /** Optional loose link to a Bed (no FK). */
16386
16536
  bedId?: InputMaybe<Scalars['ID']['input']>;
16537
+ bedWidthM?: InputMaybe<Scalars['Float']['input']>;
16387
16538
  context: ContextInput;
16388
16539
  cropId?: InputMaybe<Scalars['ID']['input']>;
16540
+ /** BOFF-6100 — caller fallback only for non-bed/no-area fields; server-derived otherwise. */
16541
+ density?: InputMaybe<Scalars['Float']['input']>;
16389
16542
  endDate?: InputMaybe<Scalars['String']['input']>;
16390
16543
  expectedYield?: InputMaybe<Scalars['Float']['input']>;
16391
16544
  fertilizers?: InputMaybe<Array<Scalars['String']['input']>>;
16392
16545
  fieldId: Scalars['ID']['input'];
16546
+ pathWidthM?: InputMaybe<Scalars['Float']['input']>;
16393
16547
  /** Optional loose link to a PlantCatalog entry (no FK). */
16394
16548
  plantCatalogId?: InputMaybe<Scalars['ID']['input']>;
16395
- /** I-5 seed-rate result — total plants required. */
16549
+ /** BOFF-6100 — bed geometry, so the server can reproduce the numbers the farmer saw on screen. Without these the server would re-derive against the defaults (1.2m beds, 0.45m paths) and quietly disagree with a form where the farmer had typed something else. */
16550
+ plantSpacingCm?: InputMaybe<Scalars['Float']['input']>;
16551
+ /** I-5 seed-rate result — total plants required. BOFF-6100: the server now derives this from the field and spacing and **overrides** what is sent, wherever it can derive it. The value here is still honoured for a field the bed calculators do not model (a greenhouse, an orchard) — there, a hand-entered figure is the only figure anyone has. */
16396
16552
  plantsNeeded?: InputMaybe<Scalars['Int']['input']>;
16397
16553
  priority?: InputMaybe<Scalars['String']['input']>;
16554
+ rowSpacingCm?: InputMaybe<Scalars['Float']['input']>;
16398
16555
  /** Growing season. Must be one of: KHARIF, RABI, ZAID, PERENNIAL (case-insensitive). */
16399
16556
  season: Scalars['String']['input'];
16400
- /** I-5 seed-rate result — grams of seed required. */
16557
+ /** I-5 seed-rate result — grams of seed required. Server-derived where possible; see plantsNeeded. */
16401
16558
  seedGrams?: InputMaybe<Scalars['Float']['input']>;
16402
16559
  seedRequired?: InputMaybe<Scalars['Float']['input']>;
16403
- /** I-5 seed-rate result — seedlings/transplants to raise. */
16560
+ /** I-5 seed-rate result — seedlings/transplants to raise. Server-derived where possible. */
16404
16561
  seedlingsToRaise?: InputMaybe<Scalars['Int']['input']>;
16405
16562
  /** Sow/nursery-start date (ISO); distinct from the transplant startDate. */
16406
16563
  sowDate?: InputMaybe<Scalars['String']['input']>;
@@ -16748,6 +16905,8 @@ export type CreateSchemeApplicationInput = {
16748
16905
  context: ContextInput;
16749
16906
  /** Must be true for a new submission; omitted values are rejected server-side. */
16750
16907
  declarationAccepted?: InputMaybe<Scalars['Boolean']['input']>;
16908
+ /** Supporting evidence. When a scheme publishes `requiredDocuments`, attached evidence must cover that selected checklist; otherwise the default ownership, government ID and bank-detail slots apply. At most one document per slot (the last wins) and at most 12 raw entries are accepted. */
16909
+ documents?: InputMaybe<Array<SchemeApplicationDocumentInput>>;
16751
16910
  /** Farm identity is validated server-side; whitespace-only or omitted values are rejected. */
16752
16911
  farmName?: InputMaybe<Scalars['String']['input']>;
16753
16912
  notes?: InputMaybe<Scalars['String']['input']>;
@@ -17273,10 +17432,13 @@ export type CreateVehicleInput = {
17273
17432
  fuelEfficiencyLPer100Km?: InputMaybe<Scalars['Float']['input']>;
17274
17433
  fuelLevel?: InputMaybe<Scalars['Float']['input']>;
17275
17434
  fuelType?: InputMaybe<FuelType>;
17435
+ lastServiceDate?: InputMaybe<Scalars['DateTime']['input']>;
17276
17436
  licensePlate?: InputMaybe<Scalars['String']['input']>;
17277
17437
  make?: InputMaybe<Scalars['String']['input']>;
17278
17438
  mileage?: InputMaybe<Scalars['Float']['input']>;
17279
17439
  model?: InputMaybe<Scalars['String']['input']>;
17440
+ nextServiceDueDate?: InputMaybe<Scalars['DateTime']['input']>;
17441
+ nextServiceDueMileage?: InputMaybe<Scalars['Float']['input']>;
17280
17442
  ownershipType?: InputMaybe<Scalars['String']['input']>;
17281
17443
  status?: InputMaybe<VehicleStatus>;
17282
17444
  type: VehicleType;
@@ -18481,6 +18643,12 @@ export type CsaDelivery = {
18481
18643
  notes?: Maybe<Scalars['String']['output']>;
18482
18644
  notificationSentAt?: Maybe<Scalars['String']['output']>;
18483
18645
  orderId?: Maybe<Scalars['ID']['output']>;
18646
+ /** When the linked Order settled, null until paid. */
18647
+ paidAt?: Maybe<Scalars['String']['output']>;
18648
+ /** Gateway-verified payment reference, null until the linked Order settles. */
18649
+ paymentReference?: Maybe<Scalars['String']['output']>;
18650
+ /** PENDING | PAID | FAILED — mirrored from the linked Order; the UI never writes this. */
18651
+ paymentStatus?: Maybe<Scalars['String']['output']>;
18484
18652
  /** The location this box went to. Null for a home delivery. */
18485
18653
  pickupLocationId?: Maybe<Scalars['ID']['output']>;
18486
18654
  /** The stand's name AS IT WAS. Names get re-used between seasons, so a manifest reprinted for a past date and keyed on the live name could label the box with a different stand. */
@@ -19806,6 +19974,20 @@ export type DeadLetterQueueConnection = {
19806
19974
  total: Scalars['Int']['output'];
19807
19975
  };
19808
19976
 
19977
+ export type DecideAgronomyDecisionInput = {
19978
+ context: ContextInput;
19979
+ id: Scalars['ID']['input'];
19980
+ /** ACCEPTED | REJECTED. */
19981
+ verdict: Scalars['String']['input'];
19982
+ };
19983
+
19984
+ export type DecideHealthyBowlFarmRecommendationInput = {
19985
+ context: ContextInput;
19986
+ /** ACCEPTED | REJECTED | ESCALATED */
19987
+ decision: Scalars['String']['input'];
19988
+ id: Scalars['ID']['input'];
19989
+ };
19990
+
19809
19991
  /** Returned when explicitly decrypting a secret value. */
19810
19992
  export type DecryptedSecret = {
19811
19993
  __typename?: 'DecryptedSecret';
@@ -19867,6 +20049,7 @@ export type DeliveryJobFilterInput = {
19867
20049
  search?: InputMaybe<Scalars['String']['input']>;
19868
20050
  status?: InputMaybe<DeliveryJobStatus>;
19869
20051
  storeOrderId?: InputMaybe<Scalars['ID']['input']>;
20052
+ unassigned?: InputMaybe<Scalars['Boolean']['input']>;
19870
20053
  vehicleId?: InputMaybe<Scalars['ID']['input']>;
19871
20054
  };
19872
20055
 
@@ -20168,6 +20351,13 @@ export type DispatchHealthyBowlAuctionSweepInput = {
20168
20351
  workspaceId: Scalars['ID']['input'];
20169
20352
  };
20170
20353
 
20354
+ /** Authorization envelope for the anonymous consultation-reminder sweep callback. */
20355
+ export type DispatchHealthyBowlConsultReminderSweepInput = {
20356
+ /** Domain-separated HMAC-SHA256(INTERNAL_SERVICE_TOKEN, `consult-reminder:${workspaceId}`). */
20357
+ dispatchSecret: Scalars['String']['input'];
20358
+ workspaceId: Scalars['ID']['input'];
20359
+ };
20360
+
20171
20361
  export type DispatchHealthyBowlCsaNotificationInput = {
20172
20362
  /** CsaDelivery id. */
20173
20363
  csaDeliveryId: Scalars['ID']['input'];
@@ -20280,6 +20470,7 @@ export type DraftMessage = {
20280
20470
  };
20281
20471
 
20282
20472
  export type DriverFilterInput = {
20473
+ licenseClass?: InputMaybe<Scalars['String']['input']>;
20283
20474
  search?: InputMaybe<Scalars['String']['input']>;
20284
20475
  status?: InputMaybe<DriverStatus>;
20285
20476
  vehicleId?: InputMaybe<Scalars['ID']['input']>;
@@ -23873,6 +24064,8 @@ export type File = {
23873
24064
  marketingWidth?: Maybe<Scalars['Int']['output']>;
23874
24065
  mimeType: Scalars['String']['output'];
23875
24066
  name: Scalars['String']['output'];
24067
+ /** Permanent, non-expiring CDN URL — only set when visibility is PUBLIC. Unlike downloadUrl (a fresh presigned URL on every query, ~1 hour TTL), this is safe to persist and embed permanently (e.g. a product catalog image), since it never expires and needs no re-signing. */
24068
+ publicUrl?: Maybe<Scalars['String']['output']>;
23876
24069
  s3Bucket: Scalars['String']['output'];
23877
24070
  s3Key: Scalars['String']['output'];
23878
24071
  sha256Hash?: Maybe<Scalars['String']['output']>;
@@ -33553,6 +33746,25 @@ export type HealthyBowlAnimalGroup = {
33553
33746
  updatedAt: Scalars['String']['output'];
33554
33747
  };
33555
33748
 
33749
+ /** An animal's pedigree: ancestors walked up, offspring walked down. Both walks are breadth-first over `Animal.damId` / `Animal.sireId`, which are the only parentage edges that exist — `BreedingRecord` records offspring COUNTS and never points at a child row. */
33750
+ export type HealthyBowlAnimalPedigree = {
33751
+ __typename?: 'HealthyBowlAnimalPedigree';
33752
+ /** Ancestor depth actually applied after clamping (1..8). */
33753
+ ancestorDepth: Scalars['Int']['output'];
33754
+ /** Ancestors, nearest generation first; within a generation, ordered by `tagNumber`. Grouping dam before sire is the client's job — the server does not promise that order. */
33755
+ ancestors: Array<HealthyBowlPedigreeNode>;
33756
+ /** True when the walk re-entered an animal it had already visited. Reachable today, not hypothetical: `validateParentRef` compares birth order only when BOTH animals carry a `dateOfBirth`, and that column is nullable — so A-is-B's-dam and B-is-A's-dam both save cleanly on undated rows. The walk stops that branch rather than looping forever. */
33757
+ cycleDetected: Scalars['Boolean']['output'];
33758
+ /** Recorded offspring, oldest first. */
33759
+ offspring: Array<HealthyBowlOffspringNode>;
33760
+ /** Offspring depth actually applied after clamping (1..4). */
33761
+ offspringDepth: Scalars['Int']['output'];
33762
+ /** The animal the walk started from, at generation 0. */
33763
+ root: HealthyBowlPedigreeNode;
33764
+ /** True when a depth or node cap stopped the walk, so the tree shown is incomplete. Show it — a truncated pedigree is wrong with no other sign that it is wrong. */
33765
+ truncated: Scalars['Boolean']['output'];
33766
+ };
33767
+
33556
33768
  /** Per-animal medication-withdrawal roll-up (reused from BOFF-2885), for the compliance badge. */
33557
33769
  export type HealthyBowlAnimalWithdrawalBadge = {
33558
33770
  __typename?: 'HealthyBowlAnimalWithdrawalBadge';
@@ -34174,6 +34386,27 @@ export type HealthyBowlCostCenter = {
34174
34386
  yieldUnit: Scalars['String']['output'];
34175
34387
  };
34176
34388
 
34389
+ export type HealthyBowlCrew = {
34390
+ __typename?: 'HealthyBowlCrew';
34391
+ createdAt: Scalars['String']['output'];
34392
+ id: Scalars['ID']['output'];
34393
+ isActive: Scalars['Boolean']['output'];
34394
+ leadWorkerId?: Maybe<Scalars['ID']['output']>;
34395
+ name: Scalars['String']['output'];
34396
+ workerIds: Array<Scalars['ID']['output']>;
34397
+ };
34398
+
34399
+ export type HealthyBowlCrewTimesheet = {
34400
+ __typename?: 'HealthyBowlCrewTimesheet';
34401
+ crewId: Scalars['ID']['output'];
34402
+ crewName: Scalars['String']['output'];
34403
+ rows: Array<HealthyBowlWeeklyTimesheetRow>;
34404
+ totalCost: Scalars['Float']['output'];
34405
+ totalHours: Scalars['Float']['output'];
34406
+ weekEnd: Scalars['String']['output'];
34407
+ weekStart: Scalars['String']['output'];
34408
+ };
34409
+
34177
34410
  export type HealthyBowlCropProfitability = {
34178
34411
  __typename?: 'HealthyBowlCropProfitability';
34179
34412
  code: Scalars['String']['output'];
@@ -34275,18 +34508,40 @@ export type HealthyBowlDueSoon = {
34275
34508
  tagNumber?: Maybe<Scalars['String']['output']>;
34276
34509
  };
34277
34510
 
34511
+ export type HealthyBowlExpertAvailabilityInput = {
34512
+ consultantId: Scalars['String']['input'];
34513
+ /** How many days forward. Defaults to 14, capped at 60 — a farmer picking a time does not scroll a year. */
34514
+ days?: InputMaybe<Scalars['Int']['input']>;
34515
+ /** First day to offer, ISO. Defaults to today. */
34516
+ from?: InputMaybe<Scalars['String']['input']>;
34517
+ };
34518
+
34278
34519
  export type HealthyBowlFarmRecommendation = {
34279
34520
  __typename?: 'HealthyBowlFarmRecommendation';
34280
34521
  authorActorId: Scalars['String']['output'];
34522
+ /** BOFF-3676 — HUMAN or MODEL. A farmer deciding whether to act on advice is entitled to know whether a person or a model wrote it. */
34523
+ authorKind: Scalars['String']['output'];
34281
34524
  authorName?: Maybe<Scalars['String']['output']>;
34525
+ /** Model confidence in [0,1]. **Null means the model reported none** — it is never defaulted to a number, because a fabricated confidence is what a decision card exists to prevent. */
34526
+ confidence?: Maybe<Scalars['Float']['output']>;
34282
34527
  createdAt: Scalars['String']['output'];
34528
+ decidedAt?: Maybe<Scalars['String']['output']>;
34529
+ decidedBy?: Maybe<Scalars['String']['output']>;
34530
+ /** ACCEPTED | REJECTED | ESCALATED — the human's verdict. Null until someone decides. */
34531
+ decision?: Maybe<Scalars['String']['output']>;
34283
34532
  detail: Scalars['String']['output'];
34284
34533
  domain: Scalars['String']['output'];
34285
34534
  id: Scalars['ID']['output'];
34535
+ /** The model that produced it, when authorKind is MODEL. */
34536
+ modelName?: Maybe<Scalars['String']['output']>;
34286
34537
  priority: Scalars['String']['output'];
34538
+ /** Why the model suggested this. A recommendation with no rationale is one a farmer cannot evaluate. */
34539
+ rationale?: Maybe<Scalars['String']['output']>;
34287
34540
  status: Scalars['String']['output'];
34288
34541
  title: Scalars['String']['output'];
34289
34542
  updatedAt: Scalars['String']['output'];
34543
+ /** Caveats the card should show, computed on read — e.g. a model suggestion with no reasoning, or with no reported confidence. Empty for human-authored advice. */
34544
+ warnings: Array<Scalars['String']['output']>;
34290
34545
  workspaceId: Scalars['ID']['output'];
34291
34546
  };
34292
34547
 
@@ -34450,6 +34705,14 @@ export type HealthyBowlGeneralLedgerRow = {
34450
34705
  runningBalance: Scalars['Float']['output'];
34451
34706
  };
34452
34707
 
34708
+ /** The report types the generator can build today (BOFF-6022). Deliberately NOT every member of the Prisma `AnalyticsReportType` enum. LIVESTOCK, WEATHER and MARKETPLACE exist on the model and have no builder, so listing them here would let a client send a schema-valid value that is refused at runtime — the "not available yet" toast this ticket removes, one layer down. Adding a member later is an additive schema change and safe. */
34709
+ export enum HealthyBowlGeneratableReportType {
34710
+ /** Harvest yield by crop, over recorded harvests. */
34711
+ Crop = 'CROP',
34712
+ /** Cost by crop, over posted ledger lines. */
34713
+ Financial = 'FINANCIAL'
34714
+ }
34715
+
34453
34716
  export type HealthyBowlGovernmentDataPayload = {
34454
34717
  __typename?: 'HealthyBowlGovernmentDataPayload';
34455
34718
  activity: Array<GovernmentActivityItem>;
@@ -34609,6 +34872,7 @@ export type HealthyBowlHerdComplianceSummary = {
34609
34872
  animalsInWithdrawal: Scalars['Int']['output'];
34610
34873
  /** e.g. '2 animals in medication withdrawal — do not sell milk'. Empty when none are withdrawn. */
34611
34874
  complianceMessage: Scalars['String']['output'];
34875
+ /** Animals MATCHING the current `groupId`/`search` filters — not the herd total. The herd totals are on `groups[].animalCount`. */
34612
34876
  totalAnimals: Scalars['Int']['output'];
34613
34877
  };
34614
34878
 
@@ -34645,6 +34909,8 @@ export type HealthyBowlHerdDepthRow = {
34645
34909
  /** Average daily gain (kg/day) from weight history; null with < 2 weight records. */
34646
34910
  adgKgPerDay?: Maybe<Scalars['Float']['output']>;
34647
34911
  animalId: Scalars['ID']['output'];
34912
+ /** True when this animal has left the herd (soft-deleted). Only ever true for a caller that passed `includeArchived: true` — see `healthyBowlHerdDepth`. Show the row muted rather than dropping it: a culled or sold animal is still a valid dam or sire (BOFF-6011), which is the whole reason these rows can be asked for. */
34913
+ archived: Scalars['Boolean']['output'];
34648
34914
  bodyConditionScore?: Maybe<Scalars['Float']['output']>;
34649
34915
  eidTag?: Maybe<Scalars['String']['output']>;
34650
34916
  groupId?: Maybe<Scalars['ID']['output']>;
@@ -34664,6 +34930,8 @@ export type HealthyBowlHerdDepthView = {
34664
34930
  groups: Array<HealthyBowlAnimalGroup>;
34665
34931
  rows: Array<HealthyBowlHerdDepthRow>;
34666
34932
  summary: HealthyBowlHerdComplianceSummary;
34933
+ /** True when the read hit a row cap and this payload is incomplete — either the row list was cut at the page size, or the herd is larger than the group counts could read. Show it: a herd list that quietly stops being the herd is wrong with no other sign that it is wrong. */
34934
+ truncated: Scalars['Boolean']['output'];
34667
34935
  };
34668
34936
 
34669
34937
  /** Output per head for one production type measured in one unit. Never summed across types or units. `ProductionRecord.unit` is free text and the types are not commensurable — litres of milk, dozens of eggs and kilograms of wool have no common total, and unlike feed there is no mass basis to convert onto. */
@@ -35041,6 +35309,42 @@ export type HealthyBowlJournalLineInput = {
35041
35309
  description?: InputMaybe<Scalars['String']['input']>;
35042
35310
  };
35043
35311
 
35312
+ export type HealthyBowlLabourEntry = {
35313
+ __typename?: 'HealthyBowlLabourEntry';
35314
+ computedCost: Scalars['Float']['output'];
35315
+ /** Mandatory: cost-by-crop ignores journal lines without it. */
35316
+ costCenterId: Scalars['ID']['output'];
35317
+ crewId?: Maybe<Scalars['ID']['output']>;
35318
+ cropId?: Maybe<Scalars['ID']['output']>;
35319
+ date: Scalars['String']['output'];
35320
+ fieldId?: Maybe<Scalars['ID']['output']>;
35321
+ hours: Scalars['Float']['output'];
35322
+ id: Scalars['ID']['output'];
35323
+ journalEntryId?: Maybe<Scalars['ID']['output']>;
35324
+ note?: Maybe<Scalars['String']['output']>;
35325
+ quantity?: Maybe<Scalars['Float']['output']>;
35326
+ rateAmount: Scalars['Float']['output'];
35327
+ /** DAY | HOUR | PIECE */
35328
+ rateType: Scalars['String']['output'];
35329
+ /** DRAFT | APPROVED. Only APPROVED has reached the ledger. */
35330
+ status: Scalars['String']['output'];
35331
+ /** Opaque PlanMagnet task id; not a HealthyBowl UUID. */
35332
+ taskId?: Maybe<Scalars['String']['output']>;
35333
+ workerId: Scalars['ID']['output'];
35334
+ workerName: Scalars['String']['output'];
35335
+ };
35336
+
35337
+ export type HealthyBowlLabourSummary = {
35338
+ __typename?: 'HealthyBowlLabourSummary';
35339
+ approvedEntries: Scalars['Int']['output'];
35340
+ draftEntries: Scalars['Int']['output'];
35341
+ /** Cost from APPROVED entries only; this agrees with the ledger. */
35342
+ totalCost: Scalars['Float']['output'];
35343
+ totalEntries: Scalars['Int']['output'];
35344
+ /** Hours from APPROVED entries only; draft work is not yet financial history. */
35345
+ totalHours: Scalars['Float']['output'];
35346
+ };
35347
+
35044
35348
  export type HealthyBowlLedgerAccount = {
35045
35349
  __typename?: 'HealthyBowlLedgerAccount';
35046
35350
  /** ASSET | LIABILITY | EQUITY | INCOME | EXPENSE */
@@ -35191,6 +35495,9 @@ export type HealthyBowlLoanFacilitation = {
35191
35495
  communityFunded: Scalars['Boolean']['output'];
35192
35496
  createdAt: Scalars['String']['output'];
35193
35497
  currency: Scalars['String']['output'];
35498
+ /** BOFF-6077 — what the lender has AUTHORISED for milestone release, and what has been released. Authorisation figures, not a balance. Nothing holds this money; see `HealthyBowlLoanMilestone`. */
35499
+ escrowCommitted: Scalars['Float']['output'];
35500
+ escrowReleased: Scalars['Float']['output'];
35194
35501
  expiresAt?: Maybe<Scalars['String']['output']>;
35195
35502
  financierActorId?: Maybe<Scalars['String']['output']>;
35196
35503
  /** FinancierAccessGrant that backs this loan's consent (time-bounded, revocable). */
@@ -35246,6 +35553,27 @@ export type HealthyBowlLoanInstallment = {
35246
35553
  totalDue: Scalars['String']['output'];
35247
35554
  };
35248
35555
 
35556
+ /** BOFF-6077 — one tranche of a facilitated loan's release schedule. ### Read this before writing UI copy This is an **authorisation** record, not custody. HealthyBowl holds no money and `global-billing-svc` has no hold/capture primitive, so a RELEASED milestone means "the farm proved the condition and the lender's release is on record" — **not** that funds moved. Labelling it "escrow held" or showing it as a balance would put a claim on screen the system cannot honour. The money leg is BOFF-6076's disbursement rail. */
35557
+ export type HealthyBowlLoanMilestone = {
35558
+ __typename?: 'HealthyBowlLoanMilestone';
35559
+ createdAt: Scalars['String']['output'];
35560
+ description?: Maybe<Scalars['String']['output']>;
35561
+ evidenceId?: Maybe<Scalars['ID']['output']>;
35562
+ /** HARVEST | PLANTING_ACTIVITY — the kind of farm record that proves this milestone. */
35563
+ evidenceType?: Maybe<Scalars['String']['output']>;
35564
+ id: Scalars['ID']['output'];
35565
+ label: Scalars['String']['output'];
35566
+ loanId: Scalars['ID']['output'];
35567
+ releaseAmount: Scalars['Float']['output'];
35568
+ releasedAt?: Maybe<Scalars['String']['output']>;
35569
+ releasedBy?: Maybe<Scalars['String']['output']>;
35570
+ /** 1-based position in the release sequence. */
35571
+ sequence: Scalars['Int']['output'];
35572
+ /** PENDING | RELEASED | CANCELLED */
35573
+ status: Scalars['String']['output'];
35574
+ updatedAt: Scalars['String']['output'];
35575
+ };
35576
+
35249
35577
  /** An immutable allocation for a repayment completed outside HealthyBowl; POSTED may only become VOID. */
35250
35578
  export type HealthyBowlLoanRepayment = {
35251
35579
  __typename?: 'HealthyBowlLoanRepayment';
@@ -35389,6 +35717,26 @@ export type HealthyBowlNotifyMentionInput = {
35389
35717
  taskTitle?: InputMaybe<Scalars['String']['input']>;
35390
35718
  };
35391
35719
 
35720
+ /** One recorded offspring of the root animal. */
35721
+ export type HealthyBowlOffspringNode = {
35722
+ __typename?: 'HealthyBowlOffspringNode';
35723
+ animalId: Scalars['ID']['output'];
35724
+ /** Offspring are read live-only, so this is always false. Present for symmetry with the ancestors. */
35725
+ archived: Scalars['Boolean']['output'];
35726
+ dateOfBirth?: Maybe<Scalars['String']['output']>;
35727
+ gender: Scalars['String']['output'];
35728
+ generation: Scalars['Int']['output'];
35729
+ name: Scalars['String']['output'];
35730
+ /** The immediately preceding descendant in the walk. Null at generation 1, where the root is implicit. */
35731
+ parentAnimalId?: Maybe<Scalars['ID']['output']>;
35732
+ /** All immediately preceding descendants that match this node's dam/sire links. Empty at generation 1. */
35733
+ parentAnimalIds: Array<Scalars['ID']['output']>;
35734
+ tagNumber: Scalars['String']['output'];
35735
+ type: Scalars['String']['output'];
35736
+ /** DAM | SIRE — the parent link followed to reach this node: root for direct offspring, or its preceding descendant later in the walk. BOTH when both links match. */
35737
+ viaParent: Scalars['String']['output'];
35738
+ };
35739
+
35392
35740
  /** Everything the client needs to open the payment provider's checkout for an order. Returned by checkoutHealthyBowlOrder; the amounts are billing's (tax is computed there, not here). */
35393
35741
  export type HealthyBowlOrderCheckout = {
35394
35742
  __typename?: 'HealthyBowlOrderCheckout';
@@ -35500,6 +35848,31 @@ export type HealthyBowlPaginationInput = {
35500
35848
  sortOrder?: InputMaybe<Scalars['String']['input']>;
35501
35849
  };
35502
35850
 
35851
+ /** One animal in a pedigree, seen from the root animal. `generation` counts hops from the root: 1 = a parent, 2 = a grandparent. The root itself is generation 0. */
35852
+ export type HealthyBowlPedigreeNode = {
35853
+ __typename?: 'HealthyBowlPedigreeNode';
35854
+ animalId: Scalars['ID']['output'];
35855
+ /** True when this animal has left the herd (soft-deleted). The branch is still returned: a culled parent is still the parent (BOFF-6011). Render it greyed and NOT as a link — `healthyBowlAnimalDepth` filters `deletedAt`, so navigating to an archived animal's page dead-ends on NOT_FOUND. */
35856
+ archived: Scalars['Boolean']['output'];
35857
+ breed?: Maybe<Scalars['String']['output']>;
35858
+ /** ONE of the animals a generation closer to the root that this node is a parent of. Null at generation 1 and on the root. Deliberately not "the" child: a line-bred herd reuses the same bull on both sides, and this walk emits each ancestor once. Read `childAnimalIds` for every edge — this field keeps only the first, for backward compatibility. */
35859
+ childAnimalId?: Maybe<Scalars['ID']['output']>;
35860
+ /** Every descendant edge this ancestor was reached by, not just the first. Line breeding makes one animal the parent of several others in the same tree — a bull that sired both the dam and the sire of the root is ONE node with TWO child edges. `childAnimalId` keeps only the first for backward compatibility; read this to render the full genealogy. Empty at generation 1, where the child is the root and so implicit — the same boundary `parentAnimalIds` keeps for direct offspring. */
35861
+ childAnimalIds: Array<Scalars['ID']['output']>;
35862
+ /** ISO date, or null — `Animal.dateOfBirth` is nullable and a missing date is not a claim. */
35863
+ dateOfBirth?: Maybe<Scalars['String']['output']>;
35864
+ /** MALE | FEMALE. */
35865
+ gender: Scalars['String']['output'];
35866
+ /** Hops from the root animal. 0 on the root, >= 1 on every ancestor. */
35867
+ generation: Scalars['Int']['output'];
35868
+ name: Scalars['String']['output'];
35869
+ /** DAM | SIRE — which side of THIS node's own child it sits on. SELF on the root. */
35870
+ relation: Scalars['String']['output'];
35871
+ tagNumber: Scalars['String']['output'];
35872
+ /** Species (CATTLE|BUFFALO|GOAT|SHEEP|PIG|POULTRY). */
35873
+ type: Scalars['String']['output'];
35874
+ };
35875
+
35503
35876
  export type HealthyBowlPestDataPayload = {
35504
35877
  __typename?: 'HealthyBowlPestDataPayload';
35505
35878
  pestIssues: Array<PestIssue>;
@@ -35658,6 +36031,52 @@ export type HealthyBowlPlannedVsSpentPoint = {
35658
36031
  spent: Scalars['Float']['output'];
35659
36032
  };
35660
36033
 
36034
+ /** Bed-geometry capacity for a field (BOFF-6100). */
36035
+ export type HealthyBowlPlantingCapacity = {
36036
+ __typename?: 'HealthyBowlPlantingCapacity';
36037
+ areaSqm: Scalars['Float']['output'];
36038
+ bedCount: Scalars['Int']['output'];
36039
+ bedLengthM: Scalars['Float']['output'];
36040
+ bedWidthM: Scalars['Float']['output'];
36041
+ cultivableAreaSqm: Scalars['Float']['output'];
36042
+ densityPlantsPerSqm: Scalars['Float']['output'];
36043
+ pathWidthM: Scalars['Float']['output'];
36044
+ plantSpacingCm: Scalars['Float']['output'];
36045
+ plantsPerBed: Scalars['Int']['output'];
36046
+ plantsPerRow: Scalars['Int']['output'];
36047
+ rowSpacingCm: Scalars['Float']['output'];
36048
+ rowsPerBed: Scalars['Int']['output'];
36049
+ seedlingTarget: Scalars['Int']['output'];
36050
+ totalPlants: Scalars['Int']['output'];
36051
+ };
36052
+
36053
+ /** The estimate, or a reasoned refusal (BOFF-6100). A greenhouse, orchard or pasture is not planted in beds, so `appliesToBedGeometry` is false and both payloads are null — **not zeroed**. A farmer reading "0 seeds required" orders nothing. */
36054
+ export type HealthyBowlPlantingEstimate = {
36055
+ __typename?: 'HealthyBowlPlantingEstimate';
36056
+ appliesToBedGeometry: Scalars['Boolean']['output'];
36057
+ capacity?: Maybe<HealthyBowlPlantingCapacity>;
36058
+ /** Why there are no numbers. Null when the estimate is real. */
36059
+ notApplicableReason?: Maybe<Scalars['String']['output']>;
36060
+ seedRate?: Maybe<HealthyBowlSeedRate>;
36061
+ /** The spacing preset actually used, so the caller can show what was assumed. */
36062
+ spacingPresetLabel: Scalars['String']['output'];
36063
+ };
36064
+
36065
+ /** BOFF-6100 — inputs for a server-derived planting estimate. Only `fieldId` is required: area, unit and grow-location type come off the field, and spacing comes from the catalog entry or a crop-name preset. Everything else overrides, in that order, so a farmer who knows their own bed layout is not overruled by a lookup table. */
36066
+ export type HealthyBowlPlantingEstimateInput = {
36067
+ /** Optional unsaved drawn-boundary area in the Field's stored unit. Used only when positive; never persisted by this estimate read. */
36068
+ areaOverride?: InputMaybe<Scalars['Float']['input']>;
36069
+ bedWidthM?: InputMaybe<Scalars['Float']['input']>;
36070
+ /** Crop whose name/category/variety selects a spacing preset when no catalog entry is given. */
36071
+ cropId?: InputMaybe<Scalars['ID']['input']>;
36072
+ fieldId: Scalars['ID']['input'];
36073
+ pathWidthM?: InputMaybe<Scalars['Float']['input']>;
36074
+ /** Master Plant List entry, for seeds/gram, germination rate and its recorded spacing. */
36075
+ plantCatalogId?: InputMaybe<Scalars['ID']['input']>;
36076
+ plantSpacingCm?: InputMaybe<Scalars['Float']['input']>;
36077
+ rowSpacingCm?: InputMaybe<Scalars['Float']['input']>;
36078
+ };
36079
+
35661
36080
  export type HealthyBowlPooledCropVolume = {
35662
36081
  __typename?: 'HealthyBowlPooledCropVolume';
35663
36082
  crop: Scalars['String']['output'];
@@ -35834,6 +36253,16 @@ export type HealthyBowlSavedTraceLabel = {
35834
36253
  fileName: Scalars['String']['output'];
35835
36254
  };
35836
36255
 
36256
+ /** Seed and nursery quantities for a plant target (BOFF-6100). */
36257
+ export type HealthyBowlSeedRate = {
36258
+ __typename?: 'HealthyBowlSeedRate';
36259
+ /** Null when the variety has no seeds-per-gram recorded. A guessed weight is worse than none. */
36260
+ seedGrams?: Maybe<Scalars['Float']['output']>;
36261
+ seedlingsToRaise: Scalars['Int']['output'];
36262
+ seedsNeeded: Scalars['Int']['output'];
36263
+ trays?: Maybe<Scalars['Int']['output']>;
36264
+ };
36265
+
35837
36266
  export type HealthyBowlSettlementDeductionInput = {
35838
36267
  amount: Scalars['Float']['input'];
35839
36268
  label: Scalars['String']['input'];
@@ -36219,6 +36648,17 @@ export type HealthyBowlWeatherDataPayload = {
36219
36648
  weather: WeatherData;
36220
36649
  };
36221
36650
 
36651
+ export type HealthyBowlWeeklyTimesheetRow = {
36652
+ __typename?: 'HealthyBowlWeeklyTimesheetRow';
36653
+ /** Seven buckets, Monday first. */
36654
+ hoursByDay: Array<Scalars['Float']['output']>;
36655
+ /** Approved labour only, so this agrees with the ledger. */
36656
+ totalCost: Scalars['Float']['output'];
36657
+ totalHours: Scalars['Float']['output'];
36658
+ workerId: Scalars['ID']['output'];
36659
+ workerName: Scalars['String']['output'];
36660
+ };
36661
+
36222
36662
  /** A single weight measurement in an animal's history. */
36223
36663
  export type HealthyBowlWeightRecord = {
36224
36664
  __typename?: 'HealthyBowlWeightRecord';
@@ -36232,6 +36672,23 @@ export type HealthyBowlWeightRecord = {
36232
36672
  weightKg: Scalars['Float']['output'];
36233
36673
  };
36234
36674
 
36675
+ /** Labour, crews and costed timesheets (BOFF-6024). Workers need no email or login: a seasonal farm hand must be recordable even when they never sign into the platform. Approval posts through the existing accounting provider; this module NEVER writes a journal row directly. */
36676
+ export type HealthyBowlWorker = {
36677
+ __typename?: 'HealthyBowlWorker';
36678
+ createdAt: Scalars['String']['output'];
36679
+ dailyWage?: Maybe<Scalars['Float']['output']>;
36680
+ /** PERMANENT | SEASONAL | CONTRACT | FAMILY | GIG */
36681
+ employmentType: Scalars['String']['output'];
36682
+ hourlyRate?: Maybe<Scalars['Float']['output']>;
36683
+ id: Scalars['ID']['output'];
36684
+ isActive: Scalars['Boolean']['output'];
36685
+ linkedActorId?: Maybe<Scalars['String']['output']>;
36686
+ name: Scalars['String']['output'];
36687
+ phone?: Maybe<Scalars['String']['output']>;
36688
+ piecePrice?: Maybe<Scalars['Float']['output']>;
36689
+ skills: Array<Scalars['String']['output']>;
36690
+ };
36691
+
36235
36692
  /** A single (bucket-key -> aggregate) row for a device/territory/language breakdown. */
36236
36693
  export type HokAnalyticsBucket = {
36237
36694
  __typename?: 'HokAnalyticsBucket';
@@ -40633,6 +41090,7 @@ export type InvalidateDataSinkCacheResult = {
40633
41090
  export type InventoryFilterInput = {
40634
41091
  cargoItemId?: InputMaybe<Scalars['ID']['input']>;
40635
41092
  locationId?: InputMaybe<Scalars['ID']['input']>;
41093
+ lowStock?: InputMaybe<Scalars['Boolean']['input']>;
40636
41094
  search?: InputMaybe<Scalars['String']['input']>;
40637
41095
  warehouseId?: InputMaybe<Scalars['ID']['input']>;
40638
41096
  };
@@ -41163,6 +41621,8 @@ export type IotThresholdRuleInput = {
41163
41621
  /** A soil/weather-conditional automation rule for an irrigation schedule (Phase B — "EXTEND FluidGrids"). HB owns the thresholds; wspace-workflow-svc (FluidGrids) is provisioned per-rule to fire the cron and call back into HB. */
41164
41622
  export type IrrigationAutomation = {
41165
41623
  __typename?: 'IrrigationAutomation';
41624
+ /** BOFF-6123 — raise a Farm Tasks card when a run actually waters this field. Off by default. A skipped run raises nothing: that is the automation deciding there is no work, and a card for it would train farmers to ignore the board. */
41625
+ autoTaskEnabled: Scalars['Boolean']['output'];
41166
41626
  fieldId: Scalars['ID']['output'];
41167
41627
  id: Scalars['ID']['output'];
41168
41628
  /** Timestamp of the last evaluation as an ISO-8601 string. */
@@ -43262,8 +43722,14 @@ export type ListWorkflowDefinitionsInput = {
43262
43722
 
43263
43723
  /** Input for listing runs */
43264
43724
  export type ListWorkflowRunsInput = {
43725
+ /** Filter runs created at-or-before this instant (inclusive). Bound to `createdAt` on WorkflowRun. */
43726
+ endDate?: InputMaybe<Scalars['DateTime']['input']>;
43265
43727
  limit?: InputMaybe<Scalars['Int']['input']>;
43266
43728
  offset?: InputMaybe<Scalars['Int']['input']>;
43729
+ /** Free-text filter for the Runs screen's search box. Case-insensitive; matches a run whose id starts with the term, or whose workflow key or workflow name contains it. Blank or whitespace-only is treated as no filter. */
43730
+ search?: InputMaybe<Scalars['String']['input']>;
43731
+ /** Filter runs created at-or-after this instant (inclusive). Bound to `createdAt` on WorkflowRun. */
43732
+ startDate?: InputMaybe<Scalars['DateTime']['input']>;
43267
43733
  status?: InputMaybe<RunStatus>;
43268
43734
  workflowKey?: InputMaybe<Scalars['String']['input']>;
43269
43735
  };
@@ -43365,6 +43831,22 @@ export type LogFilterInput = {
43365
43831
  startDate?: InputMaybe<Scalars['DateTime']['input']>;
43366
43832
  };
43367
43833
 
43834
+ export type LogHealthyBowlLabourEntryInput = {
43835
+ context: ContextInput;
43836
+ costCenterId: Scalars['ID']['input'];
43837
+ crewId?: InputMaybe<Scalars['ID']['input']>;
43838
+ cropId?: InputMaybe<Scalars['ID']['input']>;
43839
+ date?: InputMaybe<Scalars['String']['input']>;
43840
+ fieldId?: InputMaybe<Scalars['ID']['input']>;
43841
+ hours?: InputMaybe<Scalars['Float']['input']>;
43842
+ note?: InputMaybe<Scalars['String']['input']>;
43843
+ quantity?: InputMaybe<Scalars['Float']['input']>;
43844
+ rateAmount?: InputMaybe<Scalars['Float']['input']>;
43845
+ rateType?: InputMaybe<Scalars['String']['input']>;
43846
+ taskId?: InputMaybe<Scalars['String']['input']>;
43847
+ workerId: Scalars['ID']['input'];
43848
+ };
43849
+
43368
43850
  export enum LogLevel {
43369
43851
  Debug = 'DEBUG',
43370
43852
  Error = 'ERROR',
@@ -45481,6 +45963,14 @@ export type MtwAnalyticsSeries = {
45481
45963
  revenueTrend: Array<MtwAnalyticsPoint>;
45482
45964
  };
45483
45965
 
45966
+ /** Ranked vehicles and drivers that can take a route right now, best first. */
45967
+ export type MtwAssignmentSuggestions = {
45968
+ __typename?: 'MtwAssignmentSuggestions';
45969
+ drivers: Array<MtwDriverSuggestion>;
45970
+ routeId: Scalars['ID']['output'];
45971
+ vehicles: Array<MtwVehicleSuggestion>;
45972
+ };
45973
+
45484
45974
  /** MoveTheWheels-owned cargo/item master used for warehouse inventory and shipment payloads. This is not a sellable storefront product; commerce SKUs must live in global-store-svc (StoreProduct) and be referenced by storeProductId when needed. */
45485
45975
  export type MtwCargoItem = {
45486
45976
  __typename?: 'MtwCargoItem';
@@ -45506,6 +45996,31 @@ export type MtwCargoItem = {
45506
45996
  workspaceId: Scalars['ID']['output'];
45507
45997
  };
45508
45998
 
45999
+ export type MtwCargoItemStats = {
46000
+ __typename?: 'MtwCargoItemStats';
46001
+ specialHandling: Scalars['Int']['output'];
46002
+ temperatureControlled: Scalars['Int']['output'];
46003
+ total: Scalars['Int']['output'];
46004
+ };
46005
+
46006
+ /** How one carrier fared for a quote request. */
46007
+ export type MtwCarrierOutcome = {
46008
+ __typename?: 'MtwCarrierOutcome';
46009
+ errorMessage?: Maybe<Scalars['String']['output']>;
46010
+ ok: Scalars['Boolean']['output'];
46011
+ provider: MtwCarrierProvider;
46012
+ quoteCount: Scalars['Int']['output'];
46013
+ };
46014
+
46015
+ export enum MtwCarrierProvider {
46016
+ Shiprocket = 'SHIPROCKET'
46017
+ }
46018
+
46019
+ export enum MtwCarrierServiceMode {
46020
+ Air = 'AIR',
46021
+ Surface = 'SURFACE'
46022
+ }
46023
+
45509
46024
  export type MtwCustomer = {
45510
46025
  __typename?: 'MtwCustomer';
45511
46026
  address?: Maybe<Scalars['JSON']['output']>;
@@ -45528,6 +46043,16 @@ export type MtwCustomer = {
45528
46043
  workspaceId: Scalars['ID']['output'];
45529
46044
  };
45530
46045
 
46046
+ export type MtwCustomerStats = {
46047
+ __typename?: 'MtwCustomerStats';
46048
+ active: Scalars['Int']['output'];
46049
+ avgRating: Scalars['Float']['output'];
46050
+ b2b: Scalars['Int']['output'];
46051
+ b2c: Scalars['Int']['output'];
46052
+ inactive: Scalars['Int']['output'];
46053
+ total: Scalars['Int']['output'];
46054
+ };
46055
+
45531
46056
  export type MtwDashboardMetrics = {
45532
46057
  __typename?: 'MtwDashboardMetrics';
45533
46058
  activeDeliveries: Scalars['Int']['output'];
@@ -45583,11 +46108,16 @@ export type MtwDeliveryJobStatusHistoryArgs = {
45583
46108
 
45584
46109
  export type MtwDeliveryJobStats = {
45585
46110
  __typename?: 'MtwDeliveryJobStats';
46111
+ assigned: Scalars['Int']['output'];
45586
46112
  cancelled: Scalars['Int']['output'];
46113
+ confirmed: Scalars['Int']['output'];
45587
46114
  delivered: Scalars['Int']['output'];
45588
46115
  failed: Scalars['Int']['output'];
45589
46116
  inTransit: Scalars['Int']['output'];
46117
+ outForDelivery: Scalars['Int']['output'];
45590
46118
  pending: Scalars['Int']['output'];
46119
+ pickedUp: Scalars['Int']['output'];
46120
+ returned: Scalars['Int']['output'];
45591
46121
  total: Scalars['Int']['output'];
45592
46122
  };
45593
46123
 
@@ -45664,6 +46194,13 @@ export type MtwDriver = {
45664
46194
  workspaceId: Scalars['ID']['output'];
45665
46195
  };
45666
46196
 
46197
+ export type MtwDriverSuggestion = {
46198
+ __typename?: 'MtwDriverSuggestion';
46199
+ driver: MtwDriver;
46200
+ reasons: Array<Scalars['String']['output']>;
46201
+ score: Scalars['Int']['output'];
46202
+ };
46203
+
45667
46204
  export type MtwEmissionsBreakdown = {
45668
46205
  __typename?: 'MtwEmissionsBreakdown';
45669
46206
  co2eKg: Scalars['Float']['output'];
@@ -45703,6 +46240,40 @@ export type MtwFinanceMetrics = {
45703
46240
  revenue: MtwRevenueMetrics;
45704
46241
  };
45705
46242
 
46243
+ /** A compliance or maintenance item that needs attention, computed live from vehicle service markers and driver licence expiry. */
46244
+ export type MtwFleetAlert = {
46245
+ __typename?: 'MtwFleetAlert';
46246
+ /** Negative when already past due. */
46247
+ daysUntilDue?: Maybe<Scalars['Int']['output']>;
46248
+ dueDate?: Maybe<Scalars['DateTime']['output']>;
46249
+ id: Scalars['ID']['output'];
46250
+ /** Negative when the due mileage has already been passed. Vehicles only. */
46251
+ kmUntilDue?: Maybe<Scalars['Float']['output']>;
46252
+ message: Scalars['String']['output'];
46253
+ severity: MtwFleetAlertSeverity;
46254
+ subjectId: Scalars['ID']['output'];
46255
+ subjectName: Scalars['String']['output'];
46256
+ subjectType: MtwFleetAlertSubjectType;
46257
+ type: MtwFleetAlertType;
46258
+ };
46259
+
46260
+ export enum MtwFleetAlertSeverity {
46261
+ Critical = 'CRITICAL',
46262
+ Warning = 'WARNING'
46263
+ }
46264
+
46265
+ export enum MtwFleetAlertSubjectType {
46266
+ Driver = 'DRIVER',
46267
+ Vehicle = 'VEHICLE'
46268
+ }
46269
+
46270
+ export enum MtwFleetAlertType {
46271
+ LicenseExpired = 'LICENSE_EXPIRED',
46272
+ LicenseExpiring = 'LICENSE_EXPIRING',
46273
+ MaintenanceDueSoon = 'MAINTENANCE_DUE_SOON',
46274
+ MaintenanceOverdue = 'MAINTENANCE_OVERDUE'
46275
+ }
46276
+
45706
46277
  export type MtwFleetStats = {
45707
46278
  __typename?: 'MtwFleetStats';
45708
46279
  activeVehicles: Scalars['Int']['output'];
@@ -45841,6 +46412,20 @@ export type MtwInventoryTransaction = {
45841
46412
  workspaceId: Scalars['ID']['output'];
45842
46413
  };
45843
46414
 
46415
+ /** An estimate from the caller's own inputs — not a quote from anyone. */
46416
+ export type MtwOwnFleetEstimate = {
46417
+ __typename?: 'MtwOwnFleetEstimate';
46418
+ /** fixedCost + distanceKm * costPerKm. */
46419
+ cost: Scalars['Float']['output'];
46420
+ costPerKm: Scalars['Float']['output'];
46421
+ currency: Scalars['String']['output'];
46422
+ distanceKm: Scalars['Float']['output'];
46423
+ fixedCost: Scalars['Float']['output'];
46424
+ isCheaperThanCouriers: Scalars['Boolean']['output'];
46425
+ /** Cheapest courier price minus this estimate. Positive means running your own vehicle is cheaper. Null when no courier quoted. */
46426
+ savingsVsCheapestCourier?: Maybe<Scalars['Float']['output']>;
46427
+ };
46428
+
45844
46429
  /** Electronic proof-of-delivery (ePOD) capture (BOFF-4399). Signature + recipient name + geo-timestamp are always required; photos are optional and referenced by `wspace-files-svc` File id (never stored as blobs here). */
45845
46430
  export type MtwProofOfDelivery = {
45846
46431
  __typename?: 'MtwProofOfDelivery';
@@ -45905,6 +46490,17 @@ export type MtwRoute = {
45905
46490
  workspaceId: Scalars['ID']['output'];
45906
46491
  };
45907
46492
 
46493
+ export type MtwRouteStats = {
46494
+ __typename?: 'MtwRouteStats';
46495
+ completed: Scalars['Int']['output'];
46496
+ inProgress: Scalars['Int']['output'];
46497
+ optimized: Scalars['Int']['output'];
46498
+ planned: Scalars['Int']['output'];
46499
+ total: Scalars['Int']['output'];
46500
+ totalDistance: Scalars['Float']['output'];
46501
+ totalDuration: Scalars['Float']['output'];
46502
+ };
46503
+
45908
46504
  export type MtwShipment = {
45909
46505
  __typename?: 'MtwShipment';
45910
46506
  actualDelivery?: Maybe<Scalars['DateTime']['output']>;
@@ -45939,6 +46535,11 @@ export type MtwShipment = {
45939
46535
  };
45940
46536
 
45941
46537
 
46538
+ export type MtwShipmentLegsArgs = {
46539
+ pagination?: InputMaybe<PaginationInput>;
46540
+ };
46541
+
46542
+
45942
46543
  export type MtwShipmentTrackingEventsArgs = {
45943
46544
  pagination?: InputMaybe<PaginationInput>;
45944
46545
  };
@@ -45984,6 +46585,36 @@ export type MtwShipmentLeg = {
45984
46585
  workspaceId: Scalars['ID']['output'];
45985
46586
  };
45986
46587
 
46588
+ export type MtwShippingQuote = {
46589
+ __typename?: 'MtwShippingQuote';
46590
+ courierId: Scalars['String']['output'];
46591
+ courierName: Scalars['String']['output'];
46592
+ currency: Scalars['String']['output'];
46593
+ estimatedDeliveryDate?: Maybe<Scalars['String']['output']>;
46594
+ estimatedDeliveryDays?: Maybe<Scalars['Int']['output']>;
46595
+ isCheapest: Scalars['Boolean']['output'];
46596
+ isFastest: Scalars['Boolean']['output'];
46597
+ /** Flagged by the carrier itself as its recommendation. */
46598
+ isRecommended: Scalars['Boolean']['output'];
46599
+ mode?: Maybe<MtwCarrierServiceMode>;
46600
+ price: Scalars['Float']['output'];
46601
+ provider: MtwCarrierProvider;
46602
+ /** 0-5, when the carrier publishes one. */
46603
+ rating?: Maybe<Scalars['Float']['output']>;
46604
+ };
46605
+
46606
+ export type MtwShippingQuoteResult = {
46607
+ __typename?: 'MtwShippingQuoteResult';
46608
+ /** max(dead weight, volumetric weight) actually sent to the carriers. */
46609
+ chargeableWeightKg: Scalars['Float']['output'];
46610
+ /** Present only when the input carried ownFleet. */
46611
+ ownFleet?: Maybe<MtwOwnFleetEstimate>;
46612
+ /** One entry per carrier queried, so a failing carrier is visible rather than silently missing. */
46613
+ providers: Array<MtwCarrierOutcome>;
46614
+ /** Every quote from every connected carrier, cheapest first. */
46615
+ quotes: Array<MtwShippingQuote>;
46616
+ };
46617
+
45987
46618
  export type MtwTrackingAlert = {
45988
46619
  __typename?: 'MtwTrackingAlert';
45989
46620
  alertType: Scalars['String']['output'];
@@ -46022,10 +46653,13 @@ export type MtwVehicle = {
46022
46653
  fuelLevel?: Maybe<Scalars['Float']['output']>;
46023
46654
  fuelType?: Maybe<FuelType>;
46024
46655
  id: Scalars['ID']['output'];
46656
+ lastServiceDate?: Maybe<Scalars['DateTime']['output']>;
46025
46657
  licensePlate?: Maybe<Scalars['String']['output']>;
46026
46658
  make?: Maybe<Scalars['String']['output']>;
46027
46659
  mileage?: Maybe<Scalars['Float']['output']>;
46028
46660
  model?: Maybe<Scalars['String']['output']>;
46661
+ nextServiceDueDate?: Maybe<Scalars['DateTime']['output']>;
46662
+ nextServiceDueMileage?: Maybe<Scalars['Float']['output']>;
46029
46663
  onBehalfOf: Scalars['String']['output'];
46030
46664
  ownershipType?: Maybe<Scalars['String']['output']>;
46031
46665
  status: VehicleStatus;
@@ -46037,6 +46671,13 @@ export type MtwVehicle = {
46037
46671
  year?: Maybe<Scalars['Int']['output']>;
46038
46672
  };
46039
46673
 
46674
+ export type MtwVehicleSuggestion = {
46675
+ __typename?: 'MtwVehicleSuggestion';
46676
+ reasons: Array<Scalars['String']['output']>;
46677
+ score: Scalars['Int']['output'];
46678
+ vehicle: MtwVehicle;
46679
+ };
46680
+
46040
46681
  export type MtwWarehouse = {
46041
46682
  __typename?: 'MtwWarehouse';
46042
46683
  address: Scalars['JSON']['output'];
@@ -46089,6 +46730,13 @@ export type MtwWarehouseLocation = {
46089
46730
  zone?: Maybe<Scalars['String']['output']>;
46090
46731
  };
46091
46732
 
46733
+ export type MtwWarehouseStats = {
46734
+ __typename?: 'MtwWarehouseStats';
46735
+ active: Scalars['Int']['output'];
46736
+ avgUtilization: Scalars['Float']['output'];
46737
+ total: Scalars['Int']['output'];
46738
+ };
46739
+
46092
46740
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
46093
46741
  export type Mutation = {
46094
46742
  __typename?: 'Mutation';
@@ -46263,6 +46911,7 @@ export type Mutation = {
46263
46911
  approveGgnomadDamageClaim: GgnomadDamageClaim;
46264
46912
  /** BOFF-4388 — operator-only (see GGNOMAD_ROLES marketplace-operator): approves a PENDING_REVIEW listing, moving it to ACTIVE. */
46265
46913
  approveGgnomadListing: GgnomadListing;
46914
+ approveHealthyBowlLabourEntry: HealthyBowlLabourEntry;
46266
46915
  approveHousingvistaVerificationItem: HousingVistaVerificationItem;
46267
46916
  approveJoinRequest: GroupMembership;
46268
46917
  approveRequest: TimeApprovalRequest;
@@ -47043,6 +47692,8 @@ export type Mutation = {
47043
47692
  createDataSink: DataSink;
47044
47693
  createDeliveryJob: MtwDeliveryJob;
47045
47694
  createDigitalTwin: DigitalTwin;
47695
+ /** Create a disposable workspace (BOFF-6560): the ONLY supported path that can set `Workspace.isDisposable`. Restricted to service actors — same security model as syncFromGlobal (actorTypes over action/resource RBAC, because the workspace doesn't exist yet and this is M2M-only by design). No user/billing quota is enforced; disposable workspaces are ops/test tooling, not customer seats. Callers (e.g. a product's demo-seed job) are responsible for tearing the workspace down through the normal deleteWorkspace mutation when done. */
47696
+ createDisposableWorkspace: Workspace;
47046
47697
  /** Create a new docs page */
47047
47698
  createDocsPage: VibecontrolsDocsPage;
47048
47699
  createDocsShareLink: ShareGrant;
@@ -47179,6 +47830,7 @@ export type Mutation = {
47179
47830
  /** Sponsor: open a DRAFT aggregation lot for a contract. */
47180
47831
  createHealthyBowlContractAggregationLot: HealthyBowlContractAggregationLot;
47181
47832
  createHealthyBowlCostCenter: HealthyBowlCostCenter;
47833
+ createHealthyBowlCrew: HealthyBowlCrew;
47182
47834
  createHealthyBowlCrop: Crop;
47183
47835
  createHealthyBowlCsaPickupLocation: HealthyBowlPickupLocation;
47184
47836
  createHealthyBowlCsaPlan: CsaPlan;
@@ -47209,6 +47861,8 @@ export type Mutation = {
47209
47861
  createHealthyBowlIrrigationAutomation: IrrigationAutomation;
47210
47862
  createHealthyBowlIrrigationSchedule: IrrigationSchedule;
47211
47863
  createHealthyBowlLedgerAccount: HealthyBowlLedgerAccount;
47864
+ /** BOFF-6077 — add a tranche to a loan's release schedule. */
47865
+ createHealthyBowlLoanMilestone: HealthyBowlLoanMilestone;
47212
47866
  createHealthyBowlMapFeature: MapFeature;
47213
47867
  createHealthyBowlMarketplaceProduct: MarketplaceProduct;
47214
47868
  createHealthyBowlMedicationLibraryItem: MedicationLibraryItem;
@@ -47248,6 +47902,7 @@ export type Mutation = {
47248
47902
  /** Log a watering run (manual now; also called by FluidGrids automation later). */
47249
47903
  createHealthyBowlWateringRun: WateringRun;
47250
47904
  createHealthyBowlWholesaleOrder: WholesaleOrder;
47905
+ createHealthyBowlWorker: HealthyBowlWorker;
47251
47906
  createHousingvistaAmcContract: HousingVistaAmcContract;
47252
47907
  createHousingvistaAreaInsight: HousingVistaAreaInsight;
47253
47908
  createHousingvistaAsset: HousingVistaAsset;
@@ -47429,6 +48084,10 @@ export type Mutation = {
47429
48084
  deactivateVibecontrolsAgent: VibecontrolsAgent;
47430
48085
  /** Deactivate a workflow definition (sets status to DRAFT, disables scheduled triggers) */
47431
48086
  deactivateWorkflowDefinition: WorkflowDefinition;
48087
+ /** Accept or reject a proposal. A BLOCKED proposal cannot be decided at all. */
48088
+ decideHealthyBowlAgronomyDecision: AgronomyDecision;
48089
+ /** BOFF-3676 — record a human verdict on a recommendation. ACCEPTED moves it to ACKNOWLEDGED, not RESOLVED: accepting advice is not doing the work, and resolving it would hide outstanding work from every "what needs doing" read. Re-deciding is refused rather than overwritten — the first verdict is the record of what someone judged. */
48090
+ decideHealthyBowlFarmRecommendation: HealthyBowlFarmRecommendation;
47432
48091
  declareLifeValue: TimeCampusLifeValue;
47433
48092
  /** Decline a file/folder share invitation. */
47434
48093
  declineFileShare: Scalars['Boolean']['output'];
@@ -47596,6 +48255,7 @@ export type Mutation = {
47596
48255
  deleteHealthyBowlCompostBatch: Scalars['Boolean']['output'];
47597
48256
  deleteHealthyBowlContact: Scalars['Boolean']['output'];
47598
48257
  deleteHealthyBowlCostCenter: Scalars['Boolean']['output'];
48258
+ deleteHealthyBowlCrew: Scalars['Boolean']['output'];
47599
48259
  deleteHealthyBowlCrop: Scalars['Boolean']['output'];
47600
48260
  deleteHealthyBowlCsaPlan: Scalars['Boolean']['output'];
47601
48261
  deleteHealthyBowlDeliveryRoute: Scalars['Boolean']['output'];
@@ -47630,6 +48290,7 @@ export type Mutation = {
47630
48290
  deleteHealthyBowlIrrigationAutomation: Scalars['Boolean']['output'];
47631
48291
  deleteHealthyBowlIrrigationSchedule: Scalars['Boolean']['output'];
47632
48292
  deleteHealthyBowlJournalEntry: Scalars['Boolean']['output'];
48293
+ deleteHealthyBowlLabourEntry: Scalars['Boolean']['output'];
47633
48294
  deleteHealthyBowlLedgerAccount: Scalars['Boolean']['output'];
47634
48295
  deleteHealthyBowlMapFeature: Scalars['Boolean']['output'];
47635
48296
  deleteHealthyBowlMarketplaceProduct: Scalars['Boolean']['output'];
@@ -47662,6 +48323,7 @@ export type Mutation = {
47662
48323
  deleteHealthyBowlTreatment: Scalars['Boolean']['output'];
47663
48324
  deleteHealthyBowlVaccination: Scalars['Boolean']['output'];
47664
48325
  deleteHealthyBowlWholesaleOrder: Scalars['Boolean']['output'];
48326
+ deleteHealthyBowlWorker: Scalars['Boolean']['output'];
47665
48327
  /** Delete a saved yield scenario. */
47666
48328
  deleteHealthyBowlYieldScenario: Scalars['Boolean']['output'];
47667
48329
  deleteHousingvistaAmcContract: Scalars['Boolean']['output'];
@@ -47843,6 +48505,8 @@ export type Mutation = {
47843
48505
  dispatchHealthyBowlAccountingSync: Scalars['Int']['output'];
47844
48506
  /** FluidGrids callback: close every LIVE auction in the workspace whose endTime has passed, creating each winner Order. Returns the number of auctions closed. Called anonymously by the workspace's auction-sweep cron over the internal gateway, so it is authorized by an HMAC dispatch secret (HMAC-SHA256 of workspaceId keyed by INTERNAL_SERVICE_TOKEN) rather than by a user token — the same shape as dispatchHealthyBowlWateringRun. */
47845
48507
  dispatchHealthyBowlAuctionSweep: Scalars['Int']['output'];
48508
+ /** FluidGrids callback: send due confirmed-consultation reminders. Authorized by a per-workspace HMAC. */
48509
+ dispatchHealthyBowlConsultReminderSweep: Scalars['Int']['output'];
47846
48510
  /** FluidGrids callback: the flow's action node calls THIS to make the member-facing send. Sends an IN_APP notification via global-notification-svc and stamps notificationSentAt. Guarded by an HMAC(INTERNAL_SERVICE_TOKEN, csaDeliveryId) dispatchSecret (timing-safe compare). Public so the unauthenticated node can reach it through the gateway. */
47847
48511
  dispatchHealthyBowlCsaNotification: Scalars['Boolean']['output'];
47848
48512
  /** Marks the route IN_PROGRESS, flips every stop's CsaDelivery to DISPATCHED, and triggers the FluidGrids flow `healthybowl-csa-box-dispatch` (one run per member) over wspace-int-gateway. Stores the WorkflowRun id on each CsaDelivery. Does NOT send the notification itself — the flow calls back to dispatchHealthyBowlCsaNotification. */
@@ -48108,6 +48772,8 @@ export type Mutation = {
48108
48772
  generateGroupShareLink: GroupShareLink;
48109
48773
  /** AI-assisted (LLM, with deterministic fallback) budget reallocation recommendation. */
48110
48774
  generateHeadshotmarketingAdBudgetRecommendation: HeadshotmarketingAdBudgetRecommendation;
48775
+ /** BOFF-6022 — generate an analytics report over data this workspace already holds. `type` accepts FINANCIAL (cost by crop, from posted ledger lines) and CROP (harvest yield). LIVESTOCK, WEATHER and MARKETPLACE exist on the enum but have no builder yet and are refused with a readable message — emitting an empty document under a real-looking title would recreate the very problem this closes, a surface that appears to work and produces nothing. The figures are snapshotted onto the row, so the report keeps meaning what it meant after the underlying transactions change. */
48776
+ generateHealthyBowlAnalyticsReport: AnalyticsReport;
48111
48777
  generateHealthyBowlCertificateOfOrigin: CertificateOfOrigin;
48112
48778
  /** Build a numbered, ordered route from the SCHEDULED CSA deliveries in a date range. */
48113
48779
  generateHealthyBowlDeliveryRoute: DeliveryRoute;
@@ -48699,6 +49365,7 @@ export type Mutation = {
48699
49365
  /** Freeze an inventory's activity snapshots (DRAFT → LOCKED). */
48700
49366
  lockHealthyBowlGhgInventory: HbGhgInventory;
48701
49367
  lockVault: Vault;
49368
+ logHealthyBowlLabourEntry: HealthyBowlLabourEntry;
48702
49369
  /** Log a medication treatment: computes per-produce clear dates and fires the 'withdrawal started' in-app notification. */
48703
49370
  logHealthyBowlMedicationTreatment: MedicationTreatment;
48704
49371
  /** One-tap "Log to Pest Issues": create a persisted PestIssue pre-filled from a scan's diagnosis, entering the normal open→monitoring→resolved workflow. */
@@ -49133,6 +49800,8 @@ export type Mutation = {
49133
49800
  promptUpdateProvider: PromptProvider;
49134
49801
  promptUpdateTemplate: PromptTemplateDef;
49135
49802
  propagateTagToChildren: Array<UniversalTagAssignment>;
49803
+ /** 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. */
49804
+ proposeHealthyBowlAgronomyDecisions: AgronomyDecisionSweepResult;
49136
49805
  /** 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. */
49137
49806
  proxySandboxRequest: ProxySandboxResponse;
49138
49807
  pswAddTeamAssignment: PswTeamAssignment;
@@ -49285,6 +49954,7 @@ export type Mutation = {
49285
49954
  recordKnowledgeArticleView: KnowledgeArticle;
49286
49955
  recordProvenance: ProvenanceRecord;
49287
49956
  recordTimeCampusImpersonationAudit: TimeCampusImpersonationAuditEntry;
49957
+ recordVehicleService: MtwVehicle;
49288
49958
  recordWorkPattern: WorkPattern;
49289
49959
  /** Redeems points from the calling actor's loyalty account for a discount amount (calculation only — no live payment capture). Throws INSUFFICIENT_LOYALTY_POINTS if the account's balance is below `points`. */
49290
49960
  redeemGgnomadLoyaltyPoints: GgnomadLoyaltyRedemption;
@@ -49350,6 +50020,8 @@ export type Mutation = {
49350
50020
  releaseCrewEscrowRecord: CrewEscrowRecord;
49351
50021
  /** Release a file lock */
49352
50022
  releaseFileLock: ReleaseLockResponse;
50023
+ /** BOFF-6077 — authorise a milestone's release against real farm evidence. The evidence record is resolved **in this workspace** before anything is written; without that a farm could authorise its own tranche by typing any uuid, and the gate would be decorative. Records an authorisation. **Moves no money** — nothing in the platform can hold any. */
50024
+ releaseHealthyBowlLoanMilestone: HealthyBowlLoanMilestone;
49353
50025
  releaseLegalHold: LegalHold;
49354
50026
  /** Release control of a session */
49355
50027
  releaseSessionControl: Scalars['Boolean']['output'];
@@ -49477,6 +50149,8 @@ export type Mutation = {
49477
50149
  reportAiTokenUsage: Scalars['Boolean']['output'];
49478
50150
  /** 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. */
49479
50151
  reportGovAiTokenUsage: Scalars['Boolean']['output'];
50152
+ /** 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. */
50153
+ reportHealthyBowlAiTokenUsage: Scalars['Boolean']['output'];
49480
50154
  reportMessage: ReportMessagePayload;
49481
50155
  reprocessTimeCampusTimeline: TimeCampusAdminMutationResult;
49482
50156
  /** 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. */
@@ -49795,12 +50469,16 @@ export type Mutation = {
49795
50469
  /** Set a view as the default */
49796
50470
  setDefaultView: DashboardView;
49797
50471
  setEventWebhook: WebhookConfig;
50472
+ /** BOFF-6030 — publish or update a consultant's weekly availability. One rule per weekday. */
50473
+ setHealthyBowlConsultAvailability: Scalars['ID']['output'];
49798
50474
  /** Replace the full structured-tag set on a HealthyBowl entity (entity-owned tags, reuse wspace-tags-svc). */
49799
50475
  setHealthyBowlEntityTags: Array<HealthyBowlTag>;
49800
50476
  /** Attach, clear or waive one document slot on an existing policy (BOFF-6079). Works AFTER submit on purpose: PMFBY enrolment windows are short, and a farmer who submits with the optional paperwork outstanding must be able to finish later rather than start again. */
49801
50477
  setHealthyBowlInsuranceDocument: HealthyBowlInsurancePolicy;
49802
50478
  /** Publish (or unpublish) one of YOUR OWN listings to the shared cross-farm market. Workspace-scoped: a farm can only ever change the sharing flag on its own listings. */
49803
50479
  setHealthyBowlListingShared: MarketplaceProduct;
50480
+ /** BOFF-6077 — record what the lender has committed to release across this loan's milestones. */
50481
+ setHealthyBowlLoanEscrowCommitment: HealthyBowlLoanFacilitation;
49804
50482
  /** Set a paddock's own rest target. Writes to the field row, so it uses the field RBAC pair rather than the animal one. */
49805
50483
  setHealthyBowlPaddockRest: HealthyBowlPaddockGrazing;
49806
50484
  /** Replace a product's whole quantity ladder in one transaction (BOFF-6091). Refuses duplicate thresholds. */
@@ -50483,6 +51161,7 @@ export type Mutation = {
50483
51161
  updateHealthyBowlConsultationStatus: Consultation;
50484
51162
  updateHealthyBowlContact: HealthyBowlContact;
50485
51163
  updateHealthyBowlCostCenter: HealthyBowlCostCenter;
51164
+ updateHealthyBowlCrew: HealthyBowlCrew;
50486
51165
  updateHealthyBowlCrop: Crop;
50487
51166
  updateHealthyBowlCsaDelivery: CsaDelivery;
50488
51167
  updateHealthyBowlCsaMembership: CsaMembership;
@@ -50515,6 +51194,7 @@ export type Mutation = {
50515
51194
  updateHealthyBowlIrrigationAutomation: IrrigationAutomation;
50516
51195
  /** Update a schedule; also handles pause/resume via the status field. */
50517
51196
  updateHealthyBowlIrrigationSchedule: IrrigationSchedule;
51197
+ updateHealthyBowlLabourEntry: HealthyBowlLabourEntry;
50518
51198
  updateHealthyBowlLedgerAccount: HealthyBowlLedgerAccount;
50519
51199
  updateHealthyBowlLoanFacilitation: HealthyBowlLoanFacilitation;
50520
51200
  updateHealthyBowlMapFeature: MapFeature;
@@ -50536,6 +51216,7 @@ export type Mutation = {
50536
51216
  updateHealthyBowlRecipe: Recipe;
50537
51217
  /** Update the workspace satellite ingestion settings. */
50538
51218
  updateHealthyBowlSatelliteSettings: HbSatelliteSettings;
51219
+ updateHealthyBowlSchemeApplicationStatus: SchemeApplication;
50539
51220
  updateHealthyBowlSeedLot: SeedLot;
50540
51221
  updateHealthyBowlSensorProbe: SensorProbe;
50541
51222
  updateHealthyBowlSoilTest: SoilTest;
@@ -50550,6 +51231,7 @@ export type Mutation = {
50550
51231
  updateHealthyBowlTreatment: Treatment;
50551
51232
  updateHealthyBowlVaccination: Vaccination;
50552
51233
  updateHealthyBowlWholesaleOrder: WholesaleOrder;
51234
+ updateHealthyBowlWorker: HealthyBowlWorker;
50553
51235
  updateHousingvistaAmcContract: HousingVistaAmcContract;
50554
51236
  updateHousingvistaAreaInsight: HousingVistaAreaInsight;
50555
51237
  updateHousingvistaAsset: HousingVistaAsset;
@@ -51507,6 +52189,13 @@ export type MutationApproveGgnomadListingArgs = {
51507
52189
  };
51508
52190
 
51509
52191
 
52192
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
52193
+ export type MutationApproveHealthyBowlLabourEntryArgs = {
52194
+ context: ContextInput;
52195
+ id: Scalars['ID']['input'];
52196
+ };
52197
+
52198
+
51510
52199
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
51511
52200
  export type MutationApproveHousingvistaVerificationItemArgs = {
51512
52201
  id: Scalars['ID']['input'];
@@ -54966,6 +55655,12 @@ export type MutationCreateDigitalTwinArgs = {
54966
55655
  };
54967
55656
 
54968
55657
 
55658
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
55659
+ export type MutationCreateDisposableWorkspaceArgs = {
55660
+ input: CreateDisposableWorkspaceInput;
55661
+ };
55662
+
55663
+
54969
55664
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
54970
55665
  export type MutationCreateDocsPageArgs = {
54971
55666
  input: CreateVibecontrolsDocsPageInput;
@@ -55515,6 +56210,12 @@ export type MutationCreateHealthyBowlCostCenterArgs = {
55515
56210
  };
55516
56211
 
55517
56212
 
56213
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
56214
+ export type MutationCreateHealthyBowlCrewArgs = {
56215
+ input: CreateHealthyBowlCrewInput;
56216
+ };
56217
+
56218
+
55518
56219
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
55519
56220
  export type MutationCreateHealthyBowlCropArgs = {
55520
56221
  input: CreateCropInput;
@@ -55677,6 +56378,12 @@ export type MutationCreateHealthyBowlLedgerAccountArgs = {
55677
56378
  };
55678
56379
 
55679
56380
 
56381
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
56382
+ export type MutationCreateHealthyBowlLoanMilestoneArgs = {
56383
+ input: CreateHealthyBowlLoanMilestoneInput;
56384
+ };
56385
+
56386
+
55680
56387
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
55681
56388
  export type MutationCreateHealthyBowlMapFeatureArgs = {
55682
56389
  input: CreateHealthyBowlMapFeatureInput;
@@ -55883,6 +56590,12 @@ export type MutationCreateHealthyBowlWholesaleOrderArgs = {
55883
56590
  };
55884
56591
 
55885
56592
 
56593
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
56594
+ export type MutationCreateHealthyBowlWorkerArgs = {
56595
+ input: CreateHealthyBowlWorkerInput;
56596
+ };
56597
+
56598
+
55886
56599
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
55887
56600
  export type MutationCreateHousingvistaAmcContractArgs = {
55888
56601
  input: HousingVistaCreateAmcContractInput;
@@ -56709,6 +57422,18 @@ export type MutationDeactivateWorkflowDefinitionArgs = {
56709
57422
  };
56710
57423
 
56711
57424
 
57425
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57426
+ export type MutationDecideHealthyBowlAgronomyDecisionArgs = {
57427
+ input: DecideAgronomyDecisionInput;
57428
+ };
57429
+
57430
+
57431
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57432
+ export type MutationDecideHealthyBowlFarmRecommendationArgs = {
57433
+ input: DecideHealthyBowlFarmRecommendationInput;
57434
+ };
57435
+
57436
+
56712
57437
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
56713
57438
  export type MutationDeclareLifeValueArgs = {
56714
57439
  input: TimeCampusLifeValueInput;
@@ -57448,6 +58173,13 @@ export type MutationDeleteHealthyBowlCostCenterArgs = {
57448
58173
  };
57449
58174
 
57450
58175
 
58176
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58177
+ export type MutationDeleteHealthyBowlCrewArgs = {
58178
+ context: ContextInput;
58179
+ id: Scalars['ID']['input'];
58180
+ };
58181
+
58182
+
57451
58183
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57452
58184
  export type MutationDeleteHealthyBowlCropArgs = {
57453
58185
  context: ContextInput;
@@ -57673,6 +58405,13 @@ export type MutationDeleteHealthyBowlJournalEntryArgs = {
57673
58405
  };
57674
58406
 
57675
58407
 
58408
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58409
+ export type MutationDeleteHealthyBowlLabourEntryArgs = {
58410
+ context: ContextInput;
58411
+ id: Scalars['ID']['input'];
58412
+ };
58413
+
58414
+
57676
58415
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57677
58416
  export type MutationDeleteHealthyBowlLedgerAccountArgs = {
57678
58417
  context: ContextInput;
@@ -57890,6 +58629,13 @@ export type MutationDeleteHealthyBowlWholesaleOrderArgs = {
57890
58629
  };
57891
58630
 
57892
58631
 
58632
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58633
+ export type MutationDeleteHealthyBowlWorkerArgs = {
58634
+ context: ContextInput;
58635
+ id: Scalars['ID']['input'];
58636
+ };
58637
+
58638
+
57893
58639
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57894
58640
  export type MutationDeleteHealthyBowlYieldScenarioArgs = {
57895
58641
  context: ContextInput;
@@ -58722,6 +59468,12 @@ export type MutationDispatchHealthyBowlAuctionSweepArgs = {
58722
59468
  };
58723
59469
 
58724
59470
 
59471
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
59472
+ export type MutationDispatchHealthyBowlConsultReminderSweepArgs = {
59473
+ input: DispatchHealthyBowlConsultReminderSweepInput;
59474
+ };
59475
+
59476
+
58725
59477
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58726
59478
  export type MutationDispatchHealthyBowlCsaNotificationArgs = {
58727
59479
  input: DispatchHealthyBowlCsaNotificationInput;
@@ -59962,6 +60714,16 @@ export type MutationGenerateHeadshotmarketingAdBudgetRecommendationArgs = {
59962
60714
  };
59963
60715
 
59964
60716
 
60717
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
60718
+ export type MutationGenerateHealthyBowlAnalyticsReportArgs = {
60719
+ context: ContextInput;
60720
+ endDate: Scalars['String']['input'];
60721
+ startDate: Scalars['String']['input'];
60722
+ title?: InputMaybe<Scalars['String']['input']>;
60723
+ type: HealthyBowlGeneratableReportType;
60724
+ };
60725
+
60726
+
59965
60727
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
59966
60728
  export type MutationGenerateHealthyBowlCertificateOfOriginArgs = {
59967
60729
  input: GenerateCertificateOfOriginInput;
@@ -62456,6 +63218,12 @@ export type MutationLockVaultArgs = {
62456
63218
  };
62457
63219
 
62458
63220
 
63221
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
63222
+ export type MutationLogHealthyBowlLabourEntryArgs = {
63223
+ input: LogHealthyBowlLabourEntryInput;
63224
+ };
63225
+
63226
+
62459
63227
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
62460
63228
  export type MutationLogHealthyBowlMedicationTreatmentArgs = {
62461
63229
  input: LogMedicationTreatmentInput;
@@ -64149,6 +64917,12 @@ export type MutationPropagateTagToChildrenArgs = {
64149
64917
  };
64150
64918
 
64151
64919
 
64920
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
64921
+ export type MutationProposeHealthyBowlAgronomyDecisionsArgs = {
64922
+ input: ProposeAgronomyDecisionsInput;
64923
+ };
64924
+
64925
+
64152
64926
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
64153
64927
  export type MutationProxySandboxRequestArgs = {
64154
64928
  input: ProxySandboxRequestInput;
@@ -64786,6 +65560,13 @@ export type MutationRecordTimeCampusImpersonationAuditArgs = {
64786
65560
  };
64787
65561
 
64788
65562
 
65563
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65564
+ export type MutationRecordVehicleServiceArgs = {
65565
+ id: Scalars['ID']['input'];
65566
+ input: RecordVehicleServiceInput;
65567
+ };
65568
+
65569
+
64789
65570
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
64790
65571
  export type MutationRecordWorkPatternArgs = {
64791
65572
  input: RecordWorkPatternInput;
@@ -65047,6 +65828,12 @@ export type MutationReleaseFileLockArgs = {
65047
65828
  };
65048
65829
 
65049
65830
 
65831
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65832
+ export type MutationReleaseHealthyBowlLoanMilestoneArgs = {
65833
+ input: ReleaseHealthyBowlLoanMilestoneInput;
65834
+ };
65835
+
65836
+
65050
65837
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65051
65838
  export type MutationReleaseLegalHoldArgs = {
65052
65839
  id: Scalars['ID']['input'];
@@ -65626,6 +66413,12 @@ export type MutationReportGovAiTokenUsageArgs = {
65626
66413
  };
65627
66414
 
65628
66415
 
66416
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
66417
+ export type MutationReportHealthyBowlAiTokenUsageArgs = {
66418
+ input: ReportHealthyBowlAiTokenUsageInput;
66419
+ };
66420
+
66421
+
65629
66422
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
65630
66423
  export type MutationReportMessageArgs = {
65631
66424
  messageId: Scalars['ID']['input'];
@@ -67000,6 +67793,12 @@ export type MutationSetEventWebhookArgs = {
67000
67793
  };
67001
67794
 
67002
67795
 
67796
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
67797
+ export type MutationSetHealthyBowlConsultAvailabilityArgs = {
67798
+ input: SetHealthyBowlConsultAvailabilityInput;
67799
+ };
67800
+
67801
+
67003
67802
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
67004
67803
  export type MutationSetHealthyBowlEntityTagsArgs = {
67005
67804
  input: SetHealthyBowlEntityTagsInput;
@@ -67020,6 +67819,12 @@ export type MutationSetHealthyBowlListingSharedArgs = {
67020
67819
  };
67021
67820
 
67022
67821
 
67822
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
67823
+ export type MutationSetHealthyBowlLoanEscrowCommitmentArgs = {
67824
+ input: SetHealthyBowlLoanEscrowCommitmentInput;
67825
+ };
67826
+
67827
+
67023
67828
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
67024
67829
  export type MutationSetHealthyBowlPaddockRestArgs = {
67025
67830
  input: SetHealthyBowlPaddockRestInput;
@@ -70164,6 +70969,12 @@ export type MutationUpdateHealthyBowlCostCenterArgs = {
70164
70969
  };
70165
70970
 
70166
70971
 
70972
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
70973
+ export type MutationUpdateHealthyBowlCrewArgs = {
70974
+ input: UpdateHealthyBowlCrewInput;
70975
+ };
70976
+
70977
+
70167
70978
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
70168
70979
  export type MutationUpdateHealthyBowlCropArgs = {
70169
70980
  input: UpdateCropInput;
@@ -70338,6 +71149,12 @@ export type MutationUpdateHealthyBowlIrrigationScheduleArgs = {
70338
71149
  };
70339
71150
 
70340
71151
 
71152
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
71153
+ export type MutationUpdateHealthyBowlLabourEntryArgs = {
71154
+ input: UpdateHealthyBowlLabourEntryInput;
71155
+ };
71156
+
71157
+
70341
71158
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
70342
71159
  export type MutationUpdateHealthyBowlLedgerAccountArgs = {
70343
71160
  input: UpdateHealthyBowlLedgerAccountInput;
@@ -70467,6 +71284,12 @@ export type MutationUpdateHealthyBowlSatelliteSettingsArgs = {
70467
71284
  };
70468
71285
 
70469
71286
 
71287
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
71288
+ export type MutationUpdateHealthyBowlSchemeApplicationStatusArgs = {
71289
+ input: UpdateSchemeApplicationStatusInput;
71290
+ };
71291
+
71292
+
70470
71293
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
70471
71294
  export type MutationUpdateHealthyBowlSeedLotArgs = {
70472
71295
  input: UpdateHealthyBowlSeedLotInput;
@@ -70551,6 +71374,12 @@ export type MutationUpdateHealthyBowlWholesaleOrderArgs = {
70551
71374
  };
70552
71375
 
70553
71376
 
71377
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
71378
+ export type MutationUpdateHealthyBowlWorkerArgs = {
71379
+ input: UpdateHealthyBowlWorkerInput;
71380
+ };
71381
+
71382
+
70554
71383
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
70555
71384
  export type MutationUpdateHousingvistaAmcContractArgs = {
70556
71385
  id: Scalars['ID']['input'];
@@ -73133,6 +73962,16 @@ export enum OverrideType {
73133
73962
  Grant = 'GRANT'
73134
73963
  }
73135
73964
 
73965
+ /** The business's own vehicle cost for the same lane. Nothing is assumed: the estimate exists only when the caller supplies its own cost per km, because inventing a fleet's costs would make the comparison meaningless. */
73966
+ export type OwnFleetInput = {
73967
+ /** The business's own cost to run a vehicle one km (fuel, driver, wear), in INR. */
73968
+ costPerKm: Scalars['Float']['input'];
73969
+ /** Road distance between pickup and delivery, in km. */
73970
+ distanceKm: Scalars['Float']['input'];
73971
+ /** Fixed cost per trip (loading, dispatch), in INR. */
73972
+ fixedCost?: InputMaybe<Scalars['Float']['input']>;
73973
+ };
73974
+
73136
73975
  export enum PackageKind {
73137
73976
  A2AAgent = 'A2A_AGENT',
73138
73977
  Agent = 'AGENT',
@@ -75775,6 +76614,8 @@ export type PlantingPlan = {
75775
76614
  bedId?: Maybe<Scalars['ID']['output']>;
75776
76615
  cropId?: Maybe<Scalars['ID']['output']>;
75777
76616
  cropName: Scalars['String']['output'];
76617
+ /** BOFF-6100 — authoritative plants-per-square-metre derived with the seed figures. */
76618
+ density?: Maybe<Scalars['Float']['output']>;
75778
76619
  endDate?: Maybe<Scalars['String']['output']>;
75779
76620
  expectedYield?: Maybe<Scalars['Float']['output']>;
75780
76621
  fertilizers: Array<Scalars['String']['output']>;
@@ -77204,6 +78045,12 @@ export type PropertyFilterInput = {
77204
78045
  value?: InputMaybe<Scalars['JSON']['input']>;
77205
78046
  };
77206
78047
 
78048
+ export type ProposeAgronomyDecisionsInput = {
78049
+ context: ContextInput;
78050
+ /** IRRIGATION | TREATMENT. */
78051
+ decisionType: Scalars['String']['input'];
78052
+ };
78053
+
77207
78054
  export type ProvenanceRecord = {
77208
78055
  __typename?: 'ProvenanceRecord';
77209
78056
  assetId: Scalars['ID']['output'];
@@ -78771,6 +79618,7 @@ export type Query = {
78771
79618
  assetDeadlineAlerts: Array<AssetDeadlineAlert>;
78772
79619
  assetRegister: Array<Asset>;
78773
79620
  assets: Array<Asset>;
79621
+ assignmentSuggestions: MtwAssignmentSuggestions;
78774
79622
  /** The transcript of one of my assistant chats, oldest first. */
78775
79623
  assistantConversationMessages: Array<AssistantHistoryMessage>;
78776
79624
  /** My assistant chats for one product, newest first. */
@@ -78927,6 +79775,7 @@ export type Query = {
78927
79775
  callSession?: Maybe<CallSession>;
78928
79776
  capacityOverview: CapacityOverview;
78929
79777
  cargoItem?: Maybe<MtwCargoItem>;
79778
+ cargoItemStats: MtwCargoItemStats;
78930
79779
  cargoItems: Array<MtwCargoItem>;
78931
79780
  cargoItemsCount: Scalars['Int']['output'];
78932
79781
  changeRequest?: Maybe<ChangeRequest>;
@@ -79178,6 +80027,7 @@ export type Query = {
79178
80027
  crewfoundryHealth: Scalars['String']['output'];
79179
80028
  customNodes: NodesPaginatedResponse;
79180
80029
  customer?: Maybe<MtwCustomer>;
80030
+ customerStats: MtwCustomerStats;
79181
80031
  customers: Array<MtwCustomer>;
79182
80032
  customersCount: Scalars['Int']['output'];
79183
80033
  dashboard?: Maybe<AnalyticsDashboard>;
@@ -79372,6 +80222,7 @@ export type Query = {
79372
80222
  /** Find shortest path between two nodes */
79373
80223
  findShortestPath?: Maybe<GraphPath>;
79374
80224
  findSynonyms: Array<UniversalTag>;
80225
+ fleetAlerts: Array<MtwFleetAlert>;
79375
80226
  fleetStats: MtwFleetStats;
79376
80227
  /** Tags currently assigned to a FluidGrids entity */
79377
80228
  fluidgridsEntityTags: Array<FluidgridsTagAssignment>;
@@ -79572,7 +80423,11 @@ export type Query = {
79572
80423
  getHealthyBowlActiveWithdrawals: Array<MedicationTreatment>;
79573
80424
  getHealthyBowlAggregationLotDetail: HealthyBowlAggregationLotDetail;
79574
80425
  getHealthyBowlAggregationLots: Array<HealthyBowlAggregationLot>;
80426
+ /** Decisions in this workspace, newest first. */
80427
+ getHealthyBowlAgronomyDecisions: Array<AgronomyDecision>;
79575
80428
  getHealthyBowlAnalyticsData: HealthyBowlAnalyticsDataPayload;
80429
+ /** BOFF-6022 — download a generated analytics report as a PDF. Re-rendered from the snapshot stored on the report row, never from live data: a report downloaded next month must carry the numbers it was generated with, not today's re-derived under an old title. A report belonging to another workspace answers NOT_FOUND, so its existence is not observable. */
80430
+ getHealthyBowlAnalyticsReportExport: HealthyBowlAccountingExport;
79576
80431
  /** Per-animal withdrawal roll-up + treatment history (animal detail / block gates). */
79577
80432
  getHealthyBowlAnimalWithdrawalStatus: AnimalWithdrawalStatus;
79578
80433
  /** BOFF-6026 — what the farm owns, owes and is worth as of a date. The document a lender asks for. */
@@ -79600,6 +80455,8 @@ export type Query = {
79600
80455
  /** Filter by status (OPEN | ACKNOWLEDGED | RESOLVED | DISMISSED) and/or type. */
79601
80456
  getHealthyBowlComplianceFlags: Array<ComplianceFlag>;
79602
80457
  getHealthyBowlComplianceOverview: HealthyBowlComplianceOverviewPayload;
80458
+ /** BOFF-6043 — the whole audit evidence bundle as one PDF: certifications with their checklists, compliance documents and audit history. Says so plainly when it is truncated. A compliance document that quietly omits rows is worse than one that refuses — an auditor reads absence as "this farm has none". */
80459
+ getHealthyBowlCompliancePack: ComplianceExportFile;
79603
80460
  getHealthyBowlCompostBatches: Array<CompostBatch>;
79604
80461
  getHealthyBowlConsultantAssignments: Array<HealthyBowlConsultantAssignment>;
79605
80462
  getHealthyBowlConsultations: Array<Consultation>;
@@ -79621,6 +80478,8 @@ export type Query = {
79621
80478
  getHealthyBowlCoopOverview: HealthyBowlCoopOverview;
79622
80479
  getHealthyBowlCostByCrop: HealthyBowlCostByCropReport;
79623
80480
  getHealthyBowlCostCenters: Array<HealthyBowlCostCenter>;
80481
+ getHealthyBowlCrewTimesheet: HealthyBowlCrewTimesheet;
80482
+ getHealthyBowlCrews: Array<HealthyBowlCrew>;
79624
80483
  /** Fields-list table: every field with its NDVI health score, trend, stressed-zone count and yield estimate. */
79625
80484
  getHealthyBowlCropHealthOverview: HbCropHealthOverview;
79626
80485
  getHealthyBowlCropsData: HealthyBowlCropsDataPayload;
@@ -79640,6 +80499,8 @@ export type Query = {
79640
80499
  /** Distribution dashboard summary (KPI cards + per-channel breakdown). */
79641
80500
  getHealthyBowlDistributionSummary: DistributionSummary;
79642
80501
  getHealthyBowlEudrStatement: HbEudrStatement;
80502
+ /** BOFF-6030 — bookable slots for a consultant, taken ones marked unavailable. Derived from the consultant's weekly rules minus what is already booked, rather than read from a materialised calendar: materialising forward needs a horizon, and a horizon silently runs out. */
80503
+ getHealthyBowlExpertAvailability: Array<ConsultSlot>;
79643
80504
  /** Everything on this farm that wants a human, in one ranked list. `horizonDays` bounds the DATED signals (withdrawal clear dates, scheme deadlines); omitted it defaults to 7 and it is clamped to 1–90. Live signals (sensor alerts, weather events, stressed zones) are not horizon-filtered — they are already now. */
79644
80505
  getHealthyBowlFarmAttentionDigest: HealthyBowlAttentionDigest;
79645
80506
  /** Sponsor: one contract by id. */
@@ -79675,6 +80536,8 @@ export type Query = {
79675
80536
  getHealthyBowlGrowSpaces: Array<GrowSpace>;
79676
80537
  getHealthyBowlIcsData: HealthyBowlIcsDataPayload;
79677
80538
  getHealthyBowlIcsGroupDetail: IcsGroupDetail;
80539
+ /** BOFF-6043 — the ICS group report: members, conversion status and inspection coverage. Grower mobile numbers are deliberately omitted — an auditor verifying an internal control system does not need them, and a downloadable list of farmers' phone numbers in every audit bundle cannot be recalled once it exists. */
80540
+ getHealthyBowlIcsGroupReport: ComplianceExportFile;
79678
80541
  getHealthyBowlIcsGrowerDetail: IcsGrowerDetail;
79679
80542
  /** Budget-vs-Actual + Input-Mix + cost-by-crop analytics rolled up from the plan rows. */
79680
80543
  getHealthyBowlInputBudgetAnalytics: HealthyBowlInputBudgetAnalytics;
@@ -79693,11 +80556,15 @@ export type Query = {
79693
80556
  getHealthyBowlInvoicePdf: HealthyBowlInvoicePdf;
79694
80557
  getHealthyBowlJournalEntries: Array<HealthyBowlJournalEntry>;
79695
80558
  getHealthyBowlJournalEntry?: Maybe<HealthyBowlJournalEntry>;
80559
+ getHealthyBowlLabourEntries: Array<HealthyBowlLabourEntry>;
80560
+ getHealthyBowlLabourSummary: HealthyBowlLabourSummary;
79696
80561
  getHealthyBowlLivestockData: HealthyBowlLivestockDataPayload;
79697
80562
  getHealthyBowlLoanFacilitation: HealthyBowlLoanFacilitation;
79698
80563
  getHealthyBowlLoanFacilitations: Array<HealthyBowlLoanFacilitation>;
79699
80564
  /** Exact balances, immutable schedule, and externally completed money-event history for one loan. */
79700
80565
  getHealthyBowlLoanFinancialDetail: HealthyBowlLoanFinancialDetail;
80566
+ /** BOFF-6077 — the release schedule for one facilitated loan, in sequence order. */
80567
+ getHealthyBowlLoanMilestones: Array<HealthyBowlLoanMilestone>;
79701
80568
  /** Machinery spend AssetHandler holds for this workspace (BOFF-6121), flagged with whether it has already been imported into the HealthyBowl ledger. Reads are best-effort across the service boundary: when AssetHandler is unreachable this returns an empty list rather than failing, so the Financial section stays usable. */
79702
80569
  getHealthyBowlMachinerySpend: Array<HealthyBowlMachinerySpendRow>;
79703
80570
  /** A commodity's daily min/modal/max trend over the trailing `days` window (default 30). */
@@ -79790,6 +80657,7 @@ export type Query = {
79790
80657
  getHealthyBowlWithdrawalCalendar: Array<WithdrawalCalendarEntry>;
79791
80658
  /** The four dashboard stat cards. */
79792
80659
  getHealthyBowlWithdrawalSummary: WithdrawalSummary;
80660
+ getHealthyBowlWorkers: Array<HealthyBowlWorker>;
79793
80661
  /** The live rule-based season yield forecast for a field (computed from stored NDVI history). */
79794
80662
  getHealthyBowlYieldForecast: HbYieldForecast;
79795
80663
  /** Saved yield scenarios for a field. */
@@ -80302,6 +81170,8 @@ export type Query = {
80302
81170
  healthyBowlAnimalDepth: HealthyBowlAnimalDepthRecord;
80303
81171
  /** Animal groups with computed member counts. */
80304
81172
  healthyBowlAnimalGroups: Array<HealthyBowlAnimalGroup>;
81173
+ /** An animal's pedigree — ancestors N generations up, plus its recorded offspring. `ancestorDepth` defaults to 4 and is clamped to 1..8; `offspringDepth` defaults to 1 (direct children) and is clamped to 1..4. A depth outside the range is clamped rather than rejected — it reads as "as much as you can give me" — and the applied value is echoed back on the payload. Culled/sold ancestors are RETURNED with `archived: true` rather than dropped, so a branch does not vanish when a cow is sold (BOFF-6011). Offspring are live-only. Reuses the seeded `healthybowl_animal` resource like every other query here — no new RBAC resource, so no seed-gap 403. */
81174
+ healthyBowlAnimalPedigree: HealthyBowlAnimalPedigree;
80305
81175
  /** Read a single auction by id. A live auction past endTime auto-closes on read. */
80306
81176
  healthyBowlAuction?: Maybe<Auction>;
80307
81177
  /** List auctions for the workspace. Pass status to filter (draft/live/closed/cancelled). Live auctions past endTime auto-close on read. */
@@ -80320,7 +81190,7 @@ export type Query = {
80320
81190
  healthyBowlGrazing: HealthyBowlGrazingView;
80321
81191
  /** Grazing events for one paddock or one animal, newest first. */
80322
81192
  healthyBowlGrazingEvents: Array<HealthyBowlGrazingEvent>;
80323
- /** Deep herd view: one row per animal with group/BCS/ADG/withdrawal + a herd compliance summary. Filter by group or search. */
81193
+ /** Deep herd view: one row per animal with group/BCS/ADG/withdrawal + a herd compliance summary. `search` matches tag number, name or EID (case-insensitive, substring) across the whole herd; `groups[].animalCount` always counts the herd, never the matches. Archived (soft-deleted) animals are excluded unless asked for — they are still valid dam/sire references, which is what `includeArchived` exists for (BOFF-6195). They are additive to `rows` ONLY: `summary` and every `groups[].animalCount` always describe the LIVE herd, so opening a genealogy picker can never move the compliance figures on the herd list. */
80324
81194
  healthyBowlHerdDepth: HealthyBowlHerdDepthView;
80325
81195
  /** Orders placed AGAINST this farm by a buyer in another workspace. Cross-workspace by necessity — the row lives in the buyer's workspace. `sellerWorkspaceId` is pinned to the caller's own workspace, so a farm can only ever see orders naming itself as seller. */
80326
81196
  healthyBowlIncomingOrders: Array<Order>;
@@ -80350,6 +81220,8 @@ export type Query = {
80350
81220
  healthyBowlPlantCatalog: Array<PlantCatalogEntry>;
80351
81221
  /** I-7 — list planting/execution activities, optionally scoped to a plan or bed. */
80352
81222
  healthyBowlPlantingActivities: Array<PlantingActivity>;
81223
+ /** BOFF-6100 — bed capacity and seed rate for a field, derived on the server. The same maths also runs in the browser so a farmer dragging a spacing slider sees numbers move without a round trip. This is the copy that decides what gets *written*: spec 02 §3.8 asks for a pure server-side calculator because two clients could otherwise disagree about plants-per-area for the same field. */
81224
+ healthyBowlPlantingEstimate: HealthyBowlPlantingEstimate;
80353
81225
  /** I-8 — planned-vs-actual execution rollup for a single planting plan. */
80354
81226
  healthyBowlPlantingPlanExecution: HealthyBowlPlanExecution;
80355
81227
  /** Read a single seed lot by id. */
@@ -80503,8 +81375,10 @@ export type Query = {
80503
81375
  introspectNode?: Maybe<NodeIntrospection>;
80504
81376
  inventoryItem?: Maybe<MtwInventoryItem>;
80505
81377
  inventoryItems: Array<MtwInventoryItem>;
81378
+ inventoryItemsCount: Scalars['Int']['output'];
80506
81379
  inventoryStats: MtwInventoryStats;
80507
81380
  inventoryTransactions: Array<MtwInventoryTransaction>;
81381
+ inventoryTransactionsCount: Scalars['Int']['output'];
80508
81382
  /** Get a single invitation by ID. This is the FE invitation-acceptance preview endpoint, so it must work for the invitee before they're a member of the target workspace. We can't gate it on `scopeType: "wspace"` (no workspace token yet), but we MUST require authentication to prevent unauthenticated UUID-enumeration leaking PII (email, roleIds, status). `scopeType: "self"` is the right gateway primitive here — it asserts a valid actor without requiring workspace context — and the resolver enforces the actual ownership predicate (caller is the invitation's recipient OR holds a workspace token for the invitation's workspace). Reviewed: PR #66 claude (HIGH SEC). */
80509
81383
  invitation?: Maybe<Invitation>;
80510
81384
  /** Get multiple invitations with filtering and pagination. Workspace scope is read from gateway context (x-workspace-id header). */
@@ -80777,6 +81651,7 @@ export type Query = {
80777
81651
  myNavPreferences: NavPreferences;
80778
81652
  /** Type C self-list: delivery jobs assigned to the CALLING driver that are out for delivery/in transit and still awaiting ePOD capture. Feeds the driver-facing capture flow's job picker. */
80779
81653
  myPendingEpodDeliveryJobs: Array<MtwDeliveryJob>;
81654
+ myPendingEpodDeliveryJobsCount: Scalars['Int']['output'];
80780
81655
  /** Get all pending invitations for the current authenticated user. Self-scoped: the resolver resolves the invitee email server-side from ctx.actorId; no client-supplied identity is accepted. */
80781
81656
  myPendingInvitations: Array<Invitation>;
80782
81657
  /** Invitee-side: list pending invites whose `inviteeEmail` matches the caller's email (resolved from the tenant backend). `scopeType: "self"` because access is the user's own email — membership in any workspace is irrelevant. */
@@ -81198,6 +82073,7 @@ export type Query = {
81198
82073
  /** List roles with bounded offset metadata for export/reporting clients. */
81199
82074
  rolesPage: RolePage;
81200
82075
  route?: Maybe<MtwRoute>;
82076
+ routeStats: MtwRouteStats;
81201
82077
  routes: Array<MtwRoute>;
81202
82078
  routesCount: Scalars['Int']['output'];
81203
82079
  runningTimers: Array<RunningTimer>;
@@ -81319,6 +82195,7 @@ export type Query = {
81319
82195
  shipmentTracking: Array<MtwTrackingEvent>;
81320
82196
  shipments: Array<MtwShipment>;
81321
82197
  shipmentsCount: Scalars['Int']['output'];
82198
+ shippingQuotes: MtwShippingQuoteResult;
81322
82199
  siemDestinations: Array<SiemDestination>;
81323
82200
  softwareAssets: Array<SoftwareAsset>;
81324
82201
  subAgent?: Maybe<SubAiAgent>;
@@ -81665,6 +82542,7 @@ export type Query = {
81665
82542
  visibilityRules: Array<VisibilityRule>;
81666
82543
  waitForSandboxRunning?: Maybe<Sandbox>;
81667
82544
  warehouse?: Maybe<MtwWarehouse>;
82545
+ warehouseStats: MtwWarehouseStats;
81668
82546
  warehouses: Array<MtwWarehouse>;
81669
82547
  warehousesCount: Scalars['Int']['output'];
81670
82548
  /** Get specific webhook by ID */
@@ -82477,6 +83355,13 @@ export type QueryAssetsArgs = {
82477
83355
  };
82478
83356
 
82479
83357
 
83358
+ /** Base Query type with placeholder field. Extended by individual query files. */
83359
+ export type QueryAssignmentSuggestionsArgs = {
83360
+ limit?: InputMaybe<Scalars['Int']['input']>;
83361
+ routeId: Scalars['ID']['input'];
83362
+ };
83363
+
83364
+
82480
83365
  /** Base Query type with placeholder field. Extended by individual query files. */
82481
83366
  export type QueryAssistantConversationMessagesArgs = {
82482
83367
  conversationId: Scalars['ID']['input'];
@@ -86254,12 +87139,26 @@ export type QueryGetHealthyBowlAggregationLotsArgs = {
86254
87139
  };
86255
87140
 
86256
87141
 
87142
+ /** Base Query type with placeholder field. Extended by individual query files. */
87143
+ export type QueryGetHealthyBowlAgronomyDecisionsArgs = {
87144
+ context: ContextInput;
87145
+ filter?: InputMaybe<AgronomyDecisionFilterInput>;
87146
+ };
87147
+
87148
+
86257
87149
  /** Base Query type with placeholder field. Extended by individual query files. */
86258
87150
  export type QueryGetHealthyBowlAnalyticsDataArgs = {
86259
87151
  context: ContextInput;
86260
87152
  };
86261
87153
 
86262
87154
 
87155
+ /** Base Query type with placeholder field. Extended by individual query files. */
87156
+ export type QueryGetHealthyBowlAnalyticsReportExportArgs = {
87157
+ context: ContextInput;
87158
+ reportId: Scalars['ID']['input'];
87159
+ };
87160
+
87161
+
86263
87162
  /** Base Query type with placeholder field. Extended by individual query files. */
86264
87163
  export type QueryGetHealthyBowlAnimalWithdrawalStatusArgs = {
86265
87164
  animalId: Scalars['ID']['input'];
@@ -86391,6 +87290,12 @@ export type QueryGetHealthyBowlComplianceOverviewArgs = {
86391
87290
  };
86392
87291
 
86393
87292
 
87293
+ /** Base Query type with placeholder field. Extended by individual query files. */
87294
+ export type QueryGetHealthyBowlCompliancePackArgs = {
87295
+ context: ContextInput;
87296
+ };
87297
+
87298
+
86394
87299
  /** Base Query type with placeholder field. Extended by individual query files. */
86395
87300
  export type QueryGetHealthyBowlCompostBatchesArgs = {
86396
87301
  context: ContextInput;
@@ -86485,6 +87390,21 @@ export type QueryGetHealthyBowlCostCentersArgs = {
86485
87390
  };
86486
87391
 
86487
87392
 
87393
+ /** Base Query type with placeholder field. Extended by individual query files. */
87394
+ export type QueryGetHealthyBowlCrewTimesheetArgs = {
87395
+ context: ContextInput;
87396
+ crewId: Scalars['ID']['input'];
87397
+ weekStart?: InputMaybe<Scalars['String']['input']>;
87398
+ };
87399
+
87400
+
87401
+ /** Base Query type with placeholder field. Extended by individual query files. */
87402
+ export type QueryGetHealthyBowlCrewsArgs = {
87403
+ activeOnly?: InputMaybe<Scalars['Boolean']['input']>;
87404
+ context: ContextInput;
87405
+ };
87406
+
87407
+
86488
87408
  /** Base Query type with placeholder field. Extended by individual query files. */
86489
87409
  export type QueryGetHealthyBowlCropHealthOverviewArgs = {
86490
87410
  context: ContextInput;
@@ -86600,6 +87520,13 @@ export type QueryGetHealthyBowlEudrStatementArgs = {
86600
87520
  };
86601
87521
 
86602
87522
 
87523
+ /** Base Query type with placeholder field. Extended by individual query files. */
87524
+ export type QueryGetHealthyBowlExpertAvailabilityArgs = {
87525
+ context: ContextInput;
87526
+ input: HealthyBowlExpertAvailabilityInput;
87527
+ };
87528
+
87529
+
86603
87530
  /** Base Query type with placeholder field. Extended by individual query files. */
86604
87531
  export type QueryGetHealthyBowlFarmAttentionDigestArgs = {
86605
87532
  context: ContextInput;
@@ -86817,6 +87744,13 @@ export type QueryGetHealthyBowlIcsGroupDetailArgs = {
86817
87744
  };
86818
87745
 
86819
87746
 
87747
+ /** Base Query type with placeholder field. Extended by individual query files. */
87748
+ export type QueryGetHealthyBowlIcsGroupReportArgs = {
87749
+ context: ContextInput;
87750
+ icsGroupId: Scalars['ID']['input'];
87751
+ };
87752
+
87753
+
86820
87754
  /** Base Query type with placeholder field. Extended by individual query files. */
86821
87755
  export type QueryGetHealthyBowlIcsGrowerDetailArgs = {
86822
87756
  context: ContextInput;
@@ -86917,6 +87851,27 @@ export type QueryGetHealthyBowlJournalEntryArgs = {
86917
87851
  };
86918
87852
 
86919
87853
 
87854
+ /** Base Query type with placeholder field. Extended by individual query files. */
87855
+ export type QueryGetHealthyBowlLabourEntriesArgs = {
87856
+ context: ContextInput;
87857
+ crewId?: InputMaybe<Scalars['ID']['input']>;
87858
+ endDate?: InputMaybe<Scalars['String']['input']>;
87859
+ limit?: InputMaybe<Scalars['Int']['input']>;
87860
+ offset?: InputMaybe<Scalars['Int']['input']>;
87861
+ startDate?: InputMaybe<Scalars['String']['input']>;
87862
+ status?: InputMaybe<Scalars['String']['input']>;
87863
+ workerId?: InputMaybe<Scalars['ID']['input']>;
87864
+ };
87865
+
87866
+
87867
+ /** Base Query type with placeholder field. Extended by individual query files. */
87868
+ export type QueryGetHealthyBowlLabourSummaryArgs = {
87869
+ context: ContextInput;
87870
+ endDate?: InputMaybe<Scalars['String']['input']>;
87871
+ startDate?: InputMaybe<Scalars['String']['input']>;
87872
+ };
87873
+
87874
+
86920
87875
  /** Base Query type with placeholder field. Extended by individual query files. */
86921
87876
  export type QueryGetHealthyBowlLivestockDataArgs = {
86922
87877
  context: ContextInput;
@@ -86944,6 +87899,13 @@ export type QueryGetHealthyBowlLoanFinancialDetailArgs = {
86944
87899
  };
86945
87900
 
86946
87901
 
87902
+ /** Base Query type with placeholder field. Extended by individual query files. */
87903
+ export type QueryGetHealthyBowlLoanMilestonesArgs = {
87904
+ context: ContextInput;
87905
+ loanId: Scalars['ID']['input'];
87906
+ };
87907
+
87908
+
86947
87909
  /** Base Query type with placeholder field. Extended by individual query files. */
86948
87910
  export type QueryGetHealthyBowlMachinerySpendArgs = {
86949
87911
  context: ContextInput;
@@ -87350,6 +88312,14 @@ export type QueryGetHealthyBowlWithdrawalSummaryArgs = {
87350
88312
  };
87351
88313
 
87352
88314
 
88315
+ /** Base Query type with placeholder field. Extended by individual query files. */
88316
+ export type QueryGetHealthyBowlWorkersArgs = {
88317
+ activeOnly?: InputMaybe<Scalars['Boolean']['input']>;
88318
+ context: ContextInput;
88319
+ search?: InputMaybe<Scalars['String']['input']>;
88320
+ };
88321
+
88322
+
87353
88323
  /** Base Query type with placeholder field. Extended by individual query files. */
87354
88324
  export type QueryGetHealthyBowlYieldForecastArgs = {
87355
88325
  context: ContextInput;
@@ -89530,6 +90500,15 @@ export type QueryHealthyBowlAnimalGroupsArgs = {
89530
90500
  };
89531
90501
 
89532
90502
 
90503
+ /** Base Query type with placeholder field. Extended by individual query files. */
90504
+ export type QueryHealthyBowlAnimalPedigreeArgs = {
90505
+ ancestorDepth?: InputMaybe<Scalars['Int']['input']>;
90506
+ animalId: Scalars['ID']['input'];
90507
+ context: ContextInput;
90508
+ offspringDepth?: InputMaybe<Scalars['Int']['input']>;
90509
+ };
90510
+
90511
+
89533
90512
  /** Base Query type with placeholder field. Extended by individual query files. */
89534
90513
  export type QueryHealthyBowlAuctionArgs = {
89535
90514
  context: ContextInput;
@@ -89607,6 +90586,7 @@ export type QueryHealthyBowlGrazingEventsArgs = {
89607
90586
  export type QueryHealthyBowlHerdDepthArgs = {
89608
90587
  context: ContextInput;
89609
90588
  groupId?: InputMaybe<Scalars['ID']['input']>;
90589
+ includeArchived?: InputMaybe<Scalars['Boolean']['input']>;
89610
90590
  search?: InputMaybe<Scalars['String']['input']>;
89611
90591
  };
89612
90592
 
@@ -89727,6 +90707,13 @@ export type QueryHealthyBowlPlantingActivitiesArgs = {
89727
90707
  };
89728
90708
 
89729
90709
 
90710
+ /** Base Query type with placeholder field. Extended by individual query files. */
90711
+ export type QueryHealthyBowlPlantingEstimateArgs = {
90712
+ context: ContextInput;
90713
+ input: HealthyBowlPlantingEstimateInput;
90714
+ };
90715
+
90716
+
89730
90717
  /** Base Query type with placeholder field. Extended by individual query files. */
89731
90718
  export type QueryHealthyBowlPlantingPlanExecutionArgs = {
89732
90719
  context: ContextInput;
@@ -90529,6 +91516,18 @@ export type QueryInventoryItemsArgs = {
90529
91516
  };
90530
91517
 
90531
91518
 
91519
+ /** Base Query type with placeholder field. Extended by individual query files. */
91520
+ export type QueryInventoryItemsCountArgs = {
91521
+ filter?: InputMaybe<InventoryFilterInput>;
91522
+ };
91523
+
91524
+
91525
+ /** Base Query type with placeholder field. Extended by individual query files. */
91526
+ export type QueryInventoryStatsArgs = {
91527
+ filter?: InputMaybe<InventoryFilterInput>;
91528
+ };
91529
+
91530
+
90532
91531
  /** Base Query type with placeholder field. Extended by individual query files. */
90533
91532
  export type QueryInventoryTransactionsArgs = {
90534
91533
  filter?: InputMaybe<InventoryFilterInput>;
@@ -90536,6 +91535,12 @@ export type QueryInventoryTransactionsArgs = {
90536
91535
  };
90537
91536
 
90538
91537
 
91538
+ /** Base Query type with placeholder field. Extended by individual query files. */
91539
+ export type QueryInventoryTransactionsCountArgs = {
91540
+ filter?: InputMaybe<InventoryFilterInput>;
91541
+ };
91542
+
91543
+
90539
91544
  /** Base Query type with placeholder field. Extended by individual query files. */
90540
91545
  export type QueryInvitationArgs = {
90541
91546
  id: Scalars['ID']['input'];
@@ -94230,6 +95235,12 @@ export type QueryShipmentsCountArgs = {
94230
95235
  };
94231
95236
 
94232
95237
 
95238
+ /** Base Query type with placeholder field. Extended by individual query files. */
95239
+ export type QueryShippingQuotesArgs = {
95240
+ input: ShippingQuoteInput;
95241
+ };
95242
+
95243
+
94233
95244
  /** Base Query type with placeholder field. Extended by individual query files. */
94234
95245
  export type QuerySiemDestinationsArgs = {
94235
95246
  workspaceId: Scalars['ID']['input'];
@@ -96476,6 +97487,17 @@ export type RecordTimeCampusImpersonationInput = {
96476
97487
  workspaceId: Scalars['ID']['input'];
96477
97488
  };
96478
97489
 
97490
+ export type RecordVehicleServiceInput = {
97491
+ /** Days until the next service. Sets nextServiceDueDate. */
97492
+ intervalDays?: InputMaybe<Scalars['Int']['input']>;
97493
+ /** Kilometres until the next service. Sets nextServiceDueMileage (needs mileage). */
97494
+ intervalKm?: InputMaybe<Scalars['Float']['input']>;
97495
+ /** Odometer reading at service. Also updates the vehicle mileage when higher. */
97496
+ mileage?: InputMaybe<Scalars['Float']['input']>;
97497
+ /** When the service was performed. Defaults to now. */
97498
+ serviceDate?: InputMaybe<Scalars['DateTime']['input']>;
97499
+ };
97500
+
96479
97501
  export type RecordWorkPatternInput = {
96480
97502
  breakHours: Scalars['Float']['input'];
96481
97503
  context?: InputMaybe<ContextInput>;
@@ -96753,6 +97775,15 @@ export type Release = {
96753
97775
  workspaceId: Scalars['String']['output'];
96754
97776
  };
96755
97777
 
97778
+ export type ReleaseHealthyBowlLoanMilestoneInput = {
97779
+ context: ContextInput;
97780
+ /** The HarvestRecord or PlantingActivity id proving the milestone. Verified in-workspace. */
97781
+ evidenceId?: InputMaybe<Scalars['ID']['input']>;
97782
+ /** Overrides the milestone's own evidenceType, if it was left unset at creation. */
97783
+ evidenceType?: InputMaybe<Scalars['String']['input']>;
97784
+ id: Scalars['ID']['input'];
97785
+ };
97786
+
96756
97787
  export type ReleaseLockInput = {
96757
97788
  /** Force release (admin only) */
96758
97789
  force?: InputMaybe<Scalars['Boolean']['input']>;
@@ -97053,6 +98084,21 @@ export type ReportGovAiTokenUsageInput = {
97053
98084
  totalTokens?: InputMaybe<Scalars['Int']['input']>;
97054
98085
  };
97055
98086
 
98087
+ /** A completed assistant turn's token usage, reported by the client so it can be charged against `healthybowl.ai.credits`. The credit amount is NEVER client-supplied — the resolver prices the turn from billing's per-model table. These fields only identify the turn and its size. */
98088
+ export type ReportHealthyBowlAiTokenUsageInput = {
98089
+ context: ContextInput;
98090
+ /** Prompt (input) tokens consumed by the turn. */
98091
+ inputTokens: Scalars['Int']['input'];
98092
+ /** The assistant message this turn produced. Forms the idempotency hash with sessionId, so a retried or duplicated report never charges twice. */
98093
+ messageId: Scalars['ID']['input'];
98094
+ /** The turn's model id (e.g. "anthropic/claude-sonnet-4-6"). Selects the per-token prices used to weight the charge; an unknown model falls back to billing's `*default*` row rather than charging nothing. */
98095
+ model: Scalars['String']['input'];
98096
+ /** Completion (output) tokens produced by the turn. */
98097
+ outputTokens: Scalars['Int']['input'];
98098
+ /** The assistant session the tokens were consumed in. */
98099
+ sessionId: Scalars['ID']['input'];
98100
+ };
98101
+
97056
98102
  export type ReportMessagePayload = {
97057
98103
  __typename?: 'ReportMessagePayload';
97058
98104
  messageId: Scalars['ID']['output'];
@@ -98865,6 +99911,8 @@ export type SchemeApplication = {
98865
99911
  appliedDate: Scalars['String']['output'];
98866
99912
  /** The client-generated idempotency key this application was created with (BOFF-4407 offline outbox), null for applications created online before this field existed. */
98867
99913
  clientMutationId?: Maybe<Scalars['String']['output']>;
99914
+ /** The evidence attached to this application, in slot order. Empty for applications created before BOFF-6111, which recorded only a checkbox affirmation in `remarks`. */
99915
+ documents: Array<SchemeApplicationDocument>;
98868
99916
  id: Scalars['ID']['output'];
98869
99917
  remarks?: Maybe<Scalars['String']['output']>;
98870
99918
  schemeId: Scalars['String']['output'];
@@ -98872,6 +99920,26 @@ export type SchemeApplication = {
98872
99920
  status: Scalars['String']['output'];
98873
99921
  };
98874
99922
 
99923
+ /** One supporting document attached to a scheme application (BOFF-6111). */
99924
+ export type SchemeApplicationDocument = {
99925
+ __typename?: 'SchemeApplicationDocument';
99926
+ /** Opaque wspace-files-svc id. Resolve a download URL with `getFileDownloadUrl`. */
99927
+ fileId: Scalars['String']['output'];
99928
+ fileName?: Maybe<Scalars['String']['output']>;
99929
+ /** Which scheme checklist requirement this file satisfies. */
99930
+ slot: Scalars['String']['output'];
99931
+ uploadedAt: Scalars['String']['output'];
99932
+ };
99933
+
99934
+ /** One supporting document being attached to a scheme application (BOFF-6111). */
99935
+ export type SchemeApplicationDocumentInput = {
99936
+ /** Opaque wspace-files-svc id from a completed upload. Blank values are discarded; completed, active workspace files are verified server-side before an application is created. */
99937
+ fileId: Scalars['String']['input'];
99938
+ fileName?: InputMaybe<Scalars['String']['input']>;
99939
+ /** Which scheme checklist requirement this file satisfies. Any other value is rejected with BAD_USER_INPUT. */
99940
+ slot: Scalars['String']['input'];
99941
+ };
99942
+
98875
99943
  /** BOFF-6110 — the eligibility verdict for one scheme against one workspace's farm data. */
98876
99944
  export type SchemeEligibility = {
98877
99945
  __typename?: 'SchemeEligibility';
@@ -100847,6 +101915,19 @@ export type SetAgentVisibilityInput = {
100847
101915
  visibility: VibecontrolsAgentVisibility;
100848
101916
  };
100849
101917
 
101918
+ export type SetHealthyBowlConsultAvailabilityInput = {
101919
+ consultantId: Scalars['String']['input'];
101920
+ context: ContextInput;
101921
+ /** 0 = Sunday … 6 = Saturday. */
101922
+ dayOfWeek: Scalars['Int']['input'];
101923
+ endTime: Scalars['String']['input'];
101924
+ slotMinutes?: InputMaybe<Scalars['Int']['input']>;
101925
+ /** Local wall-clock HH:MM — a consultant's working day does not move when the clocks do. */
101926
+ startTime: Scalars['String']['input'];
101927
+ /** ACTIVE or PAUSED. */
101928
+ status?: InputMaybe<Scalars['String']['input']>;
101929
+ };
101930
+
100850
101931
  export type SetHealthyBowlEntityTagsInput = {
100851
101932
  context: ContextInput;
100852
101933
  entityId: Scalars['ID']['input'];
@@ -100865,6 +101946,13 @@ export type SetHealthyBowlInsuranceDocumentInput = {
100865
101946
  notApplicable?: InputMaybe<Scalars['Boolean']['input']>;
100866
101947
  };
100867
101948
 
101949
+ export type SetHealthyBowlLoanEscrowCommitmentInput = {
101950
+ context: ContextInput;
101951
+ /** What the lender has agreed to release across this loan. Cannot exceed the loan amount. */
101952
+ escrowCommitted: Scalars['Float']['input'];
101953
+ id: Scalars['ID']['input'];
101954
+ };
101955
+
100868
101956
  export type SetHealthyBowlPaddockRestInput = {
100869
101957
  context: ContextInput;
100870
101958
  paddockId: Scalars['ID']['input'];
@@ -101347,11 +102435,13 @@ export type ShipmentFilterInput = {
101347
102435
  carrierId?: InputMaybe<Scalars['ID']['input']>;
101348
102436
  customerId?: InputMaybe<Scalars['ID']['input']>;
101349
102437
  deliveryJobId?: InputMaybe<Scalars['ID']['input']>;
102438
+ driverId?: InputMaybe<Scalars['ID']['input']>;
101350
102439
  isMultiModal?: InputMaybe<Scalars['Boolean']['input']>;
101351
102440
  primaryMode?: InputMaybe<TransportMode>;
101352
102441
  search?: InputMaybe<Scalars['String']['input']>;
101353
102442
  status?: InputMaybe<ShipmentStatus>;
101354
102443
  storeOrderId?: InputMaybe<Scalars['ID']['input']>;
102444
+ vehicleId?: InputMaybe<Scalars['ID']['input']>;
101355
102445
  };
101356
102446
 
101357
102447
  export enum ShipmentLegStatus {
@@ -101372,6 +102462,21 @@ export enum ShipmentStatus {
101372
102462
  Returned = 'RETURNED'
101373
102463
  }
101374
102464
 
102465
+ export type ShippingQuoteInput = {
102466
+ /** Cash on delivery. */
102467
+ cod?: InputMaybe<Scalars['Boolean']['input']>;
102468
+ deliveryPostcode: Scalars['String']['input'];
102469
+ heightCm?: InputMaybe<Scalars['Float']['input']>;
102470
+ /** Optional package size in cm; all three or none. Volumetric weight is applied when larger. */
102471
+ lengthCm?: InputMaybe<Scalars['Float']['input']>;
102472
+ /** When given, the result also carries an own-fleet cost estimate for the same lane. */
102473
+ ownFleet?: InputMaybe<OwnFleetInput>;
102474
+ pickupPostcode: Scalars['String']['input'];
102475
+ /** Dead weight in kg. */
102476
+ weightKg: Scalars['Float']['input'];
102477
+ widthCm?: InputMaybe<Scalars['Float']['input']>;
102478
+ };
102479
+
101375
102480
  /** A registered SIEM export destination. `hmacSecret` is never exposed over GraphQL — only returned once, out-of-band of this type, at creation/rotation time via `SiemDestinationSecretResult`. */
101376
102481
  export type SiemDestination = {
101377
102482
  __typename?: 'SiemDestination';
@@ -106614,6 +107719,7 @@ export type TimeCampusDataErasureRequest = {
106614
107719
  __typename?: 'TimeCampusDataErasureRequest';
106615
107720
  completedAt?: Maybe<Scalars['DateTime']['output']>;
106616
107721
  id: Scalars['ID']['output'];
107722
+ notes?: Maybe<Scalars['String']['output']>;
106617
107723
  requestedAt: Scalars['DateTime']['output'];
106618
107724
  requestedBy: Scalars['ID']['output'];
106619
107725
  status: TimeCampusDataErasureStatus;
@@ -108634,6 +109740,8 @@ export type UpdateAssetInput = {
108634
109740
 
108635
109741
  export type UpdateAuditInput = {
108636
109742
  auditor?: InputMaybe<Scalars['String']['input']>;
109743
+ /** The certification this audit was carried out against. Pass null to unlink it — the Active gate must not become permanent once a link is set. */
109744
+ certificationId?: InputMaybe<Scalars['ID']['input']>;
108637
109745
  completedDate?: InputMaybe<Scalars['String']['input']>;
108638
109746
  context: ContextInput;
108639
109747
  criticalFindings?: InputMaybe<Scalars['Int']['input']>;
@@ -110019,6 +111127,8 @@ export type UpdateHarvestRecordInput = {
110019
111127
  fieldId?: InputMaybe<Scalars['ID']['input']>;
110020
111128
  harvestDate?: InputMaybe<Scalars['String']['input']>;
110021
111129
  id: Scalars['ID']['input'];
111130
+ /** BOFF-6056 — attach a banked harvest to the plan it came from, after the fact. `createHarvestRecord` has always accepted this, but the update path did not, so a harvest recorded without it was stranded outside plan-vs-actual forever. That is why `PlanExecutionPanel` renders actual: 0 against a real harvest — the panel is correct, the link was simply never writable a second time. */
111131
+ plantingPlanId?: InputMaybe<Scalars['ID']['input']>;
110022
111132
  pricePerUnit?: InputMaybe<Scalars['Float']['input']>;
110023
111133
  quality?: InputMaybe<Scalars['String']['input']>;
110024
111134
  quantity?: InputMaybe<Scalars['Float']['input']>;
@@ -110255,6 +111365,7 @@ export type UpdateHealthyBowlAnimalDepthInput = {
110255
111365
  context: ContextInput;
110256
111366
  /** Loose link to another animal (dam). Pass null to clear. */
110257
111367
  damId?: InputMaybe<Scalars['ID']['input']>;
111368
+ /** EID / RFID electronic tag. Stored exactly as typed — trimmed, with runs of inner whitespace collapsed to one space — because the spacing is how a farmer reads the tag off the device. Unique per workspace across live animals, compared case-insensitively and ignoring every non-alphanumeric character: `982 000123456789`, `982000123456789` and `982-000123456789` are ONE tag. A clash is rejected with `extensions.code = "CONFLICT"` and a message naming the tag number of the animal that already holds it. A soft-deleted animal does not hold its EID, so a culled animal's tag can be reused. At most 100 characters; only letters, digits, spaces, `-` and `_`, and at least one letter or digit. Anything else is rejected with `BAD_USER_INPUT`. Pass `null` or an empty string to clear it; any number of animals may have no EID. */
110258
111369
  eidTag?: InputMaybe<Scalars['String']['input']>;
110259
111370
  grazingNotes?: InputMaybe<Scalars['String']['input']>;
110260
111371
  grazingPaddock?: InputMaybe<Scalars['String']['input']>;
@@ -110344,6 +111455,15 @@ export type UpdateHealthyBowlCostCenterInput = {
110344
111455
  yieldUnit?: InputMaybe<Scalars['String']['input']>;
110345
111456
  };
110346
111457
 
111458
+ export type UpdateHealthyBowlCrewInput = {
111459
+ context: ContextInput;
111460
+ id: Scalars['ID']['input'];
111461
+ isActive?: InputMaybe<Scalars['Boolean']['input']>;
111462
+ leadWorkerId?: InputMaybe<Scalars['ID']['input']>;
111463
+ name: Scalars['String']['input'];
111464
+ workerIds?: InputMaybe<Array<Scalars['ID']['input']>>;
111465
+ };
111466
+
110347
111467
  export type UpdateHealthyBowlCsaDeliveryInput = {
110348
111468
  context: ContextInput;
110349
111469
  id: Scalars['ID']['input'];
@@ -110492,6 +111612,7 @@ export type UpdateHealthyBowlInsurancePolicyInput = {
110492
111612
  };
110493
111613
 
110494
111614
  export type UpdateHealthyBowlIrrigationAutomationInput = {
111615
+ autoTaskEnabled?: InputMaybe<Scalars['Boolean']['input']>;
110495
111616
  context: ContextInput;
110496
111617
  id: Scalars['ID']['input'];
110497
111618
  notifyInApp?: InputMaybe<Scalars['Boolean']['input']>;
@@ -110515,6 +111636,23 @@ export type UpdateHealthyBowlIrrigationScheduleInput = {
110515
111636
  status?: InputMaybe<Scalars['String']['input']>;
110516
111637
  };
110517
111638
 
111639
+ export type UpdateHealthyBowlLabourEntryInput = {
111640
+ context: ContextInput;
111641
+ costCenterId: Scalars['ID']['input'];
111642
+ crewId?: InputMaybe<Scalars['ID']['input']>;
111643
+ cropId?: InputMaybe<Scalars['ID']['input']>;
111644
+ date?: InputMaybe<Scalars['String']['input']>;
111645
+ fieldId?: InputMaybe<Scalars['ID']['input']>;
111646
+ hours?: InputMaybe<Scalars['Float']['input']>;
111647
+ id: Scalars['ID']['input'];
111648
+ note?: InputMaybe<Scalars['String']['input']>;
111649
+ quantity?: InputMaybe<Scalars['Float']['input']>;
111650
+ rateAmount?: InputMaybe<Scalars['Float']['input']>;
111651
+ rateType?: InputMaybe<Scalars['String']['input']>;
111652
+ taskId?: InputMaybe<Scalars['String']['input']>;
111653
+ workerId: Scalars['ID']['input'];
111654
+ };
111655
+
110518
111656
  export type UpdateHealthyBowlLedgerAccountInput = {
110519
111657
  accountType?: InputMaybe<Scalars['String']['input']>;
110520
111658
  context: ContextInput;
@@ -110706,6 +111844,20 @@ export type UpdateHealthyBowlWholesaleOrderInput = {
110706
111844
  quantityKg?: InputMaybe<Scalars['Float']['input']>;
110707
111845
  };
110708
111846
 
111847
+ export type UpdateHealthyBowlWorkerInput = {
111848
+ context: ContextInput;
111849
+ dailyWage?: InputMaybe<Scalars['Float']['input']>;
111850
+ employmentType?: InputMaybe<Scalars['String']['input']>;
111851
+ hourlyRate?: InputMaybe<Scalars['Float']['input']>;
111852
+ id: Scalars['ID']['input'];
111853
+ isActive?: InputMaybe<Scalars['Boolean']['input']>;
111854
+ linkedActorId?: InputMaybe<Scalars['String']['input']>;
111855
+ name: Scalars['String']['input'];
111856
+ phone?: InputMaybe<Scalars['String']['input']>;
111857
+ piecePrice?: InputMaybe<Scalars['Float']['input']>;
111858
+ skills?: InputMaybe<Array<Scalars['String']['input']>>;
111859
+ };
111860
+
110709
111861
  export type UpdateIcsGroupInput = {
110710
111862
  certificationId?: InputMaybe<Scalars['ID']['input']>;
110711
111863
  code?: InputMaybe<Scalars['String']['input']>;
@@ -111052,24 +112204,31 @@ export type UpdatePipelineStageInput = {
111052
112204
  export type UpdatePlantingPlanInput = {
111053
112205
  /** Optional loose link to a Bed (no FK). */
111054
112206
  bedId?: InputMaybe<Scalars['ID']['input']>;
112207
+ bedWidthM?: InputMaybe<Scalars['Float']['input']>;
111055
112208
  context: ContextInput;
111056
112209
  cropId?: InputMaybe<Scalars['ID']['input']>;
112210
+ /** BOFF-6100 — server-derived density on bed fields; caller fallback only for non-bed/no-area fields. */
112211
+ density?: InputMaybe<Scalars['Float']['input']>;
111057
112212
  endDate?: InputMaybe<Scalars['String']['input']>;
111058
112213
  expectedYield?: InputMaybe<Scalars['Float']['input']>;
111059
112214
  fertilizers?: InputMaybe<Array<Scalars['String']['input']>>;
111060
112215
  fieldId?: InputMaybe<Scalars['ID']['input']>;
111061
112216
  id: Scalars['ID']['input'];
112217
+ pathWidthM?: InputMaybe<Scalars['Float']['input']>;
111062
112218
  /** Optional loose link to a PlantCatalog entry (no FK). */
111063
112219
  plantCatalogId?: InputMaybe<Scalars['ID']['input']>;
112220
+ /** Optional geometry. Supplying any of these causes the server to derive all plan figures together. */
112221
+ plantSpacingCm?: InputMaybe<Scalars['Float']['input']>;
111064
112222
  /** I-5 seed-rate result — total plants required. */
111065
112223
  plantsNeeded?: InputMaybe<Scalars['Int']['input']>;
111066
112224
  priority?: InputMaybe<Scalars['String']['input']>;
112225
+ rowSpacingCm?: InputMaybe<Scalars['Float']['input']>;
111067
112226
  /** Growing season. Must be one of: KHARIF, RABI, ZAID, PERENNIAL (case-insensitive). */
111068
112227
  season?: InputMaybe<Scalars['String']['input']>;
111069
112228
  /** I-5 seed-rate result — grams of seed required. */
111070
112229
  seedGrams?: InputMaybe<Scalars['Float']['input']>;
111071
112230
  seedRequired?: InputMaybe<Scalars['Float']['input']>;
111072
- /** I-5 seed-rate result — seedlings/transplants to raise. */
112231
+ /** I-5 seed-rate result — seedlings/transplants to raise. Server-derived when this update touches planting inputs. */
111073
112232
  seedlingsToRaise?: InputMaybe<Scalars['Int']['input']>;
111074
112233
  /** Sow/nursery-start date (ISO); distinct from the transplant startDate. */
111075
112234
  sowDate?: InputMaybe<Scalars['String']['input']>;
@@ -111436,6 +112595,15 @@ export type UpdateScheduledJobInput = {
111436
112595
  timezone?: InputMaybe<Scalars['String']['input']>;
111437
112596
  };
111438
112597
 
112598
+ export type UpdateSchemeApplicationStatusInput = {
112599
+ context: ContextInput;
112600
+ id: Scalars['ID']['input'];
112601
+ /** Officer-visible reason; applicant notes remain unchanged. */
112602
+ remarks?: InputMaybe<Scalars['String']['input']>;
112603
+ /** SUBMITTED | UNDER_REVIEW | APPROVED | REJECTED | DISBURSED. */
112604
+ status: Scalars['String']['input'];
112605
+ };
112606
+
111439
112607
  export enum UpdateScope {
111440
112608
  AllEvents = 'ALL_EVENTS',
111441
112609
  ThisAndFuture = 'THIS_AND_FUTURE',
@@ -111873,10 +113041,13 @@ export type UpdateVehicleInput = {
111873
113041
  fuelEfficiencyLPer100Km?: InputMaybe<Scalars['Float']['input']>;
111874
113042
  fuelLevel?: InputMaybe<Scalars['Float']['input']>;
111875
113043
  fuelType?: InputMaybe<FuelType>;
113044
+ lastServiceDate?: InputMaybe<Scalars['DateTime']['input']>;
111876
113045
  licensePlate?: InputMaybe<Scalars['String']['input']>;
111877
113046
  make?: InputMaybe<Scalars['String']['input']>;
111878
113047
  mileage?: InputMaybe<Scalars['Float']['input']>;
111879
113048
  model?: InputMaybe<Scalars['String']['input']>;
113049
+ nextServiceDueDate?: InputMaybe<Scalars['DateTime']['input']>;
113050
+ nextServiceDueMileage?: InputMaybe<Scalars['Float']['input']>;
111880
113051
  ownershipType?: InputMaybe<Scalars['String']['input']>;
111881
113052
  status?: InputMaybe<VehicleStatus>;
111882
113053
  type?: InputMaybe<VehicleType>;
@@ -112459,6 +113630,8 @@ export type UpsertHealthyBowlSoilCarbonEstimateInput = {
112459
113630
  export type UpsertHealthyBowlWeatherAlertSettingsInput = {
112460
113631
  advisoryLanguage?: InputMaybe<Scalars['String']['input']>;
112461
113632
  aiAdvisoryEnabled?: InputMaybe<Scalars['Boolean']['input']>;
113633
+ /** Destination for EMAIL alerts. Rejected with BAD_USER_INPUT if it is not a usable address. */
113634
+ alertEmail?: InputMaybe<Scalars['String']['input']>;
112462
113635
  alertLeadTimeHours?: InputMaybe<Scalars['Int']['input']>;
112463
113636
  baselineYears?: InputMaybe<Scalars['Int']['input']>;
112464
113637
  context: ContextInput;
@@ -112469,6 +113642,8 @@ export type UpsertHealthyBowlWeatherAlertSettingsInput = {
112469
113642
  quietHoursEnabled?: InputMaybe<Scalars['Boolean']['input']>;
112470
113643
  quietHoursEnd?: InputMaybe<Scalars['String']['input']>;
112471
113644
  quietHoursStart?: InputMaybe<Scalars['String']['input']>;
113645
+ /** IANA zone the quiet window is evaluated in. Null means UTC, which is rarely what a farm means. */
113646
+ quietHoursTimezone?: InputMaybe<Scalars['String']['input']>;
112472
113647
  smsEnabled?: InputMaybe<Scalars['Boolean']['input']>;
112473
113648
  smsNumber?: InputMaybe<Scalars['String']['input']>;
112474
113649
  units?: InputMaybe<Scalars['String']['input']>;
@@ -115390,6 +116565,8 @@ export type WeatherAlertSettings = {
115390
116565
  __typename?: 'WeatherAlertSettings';
115391
116566
  advisoryLanguage: Scalars['String']['output'];
115392
116567
  aiAdvisoryEnabled: Scalars['Boolean']['output'];
116568
+ /** Where an EMAIL alert is sent. Without it `emailEnabled` cannot deliver anything (BOFF-6027). */
116569
+ alertEmail?: Maybe<Scalars['String']['output']>;
115393
116570
  alertLeadTimeHours: Scalars['Int']['output'];
115394
116571
  baselineYears: Scalars['Int']['output'];
115395
116572
  deviationThresholdPct: Scalars['Int']['output'];
@@ -115399,9 +116576,13 @@ export type WeatherAlertSettings = {
115399
116576
  historyLastSyncedAt?: Maybe<Scalars['DateTime']['output']>;
115400
116577
  historyStartYear?: Maybe<Scalars['Int']['output']>;
115401
116578
  inAppEnabled: Scalars['Boolean']['output'];
116579
+ /** True once a human has saved these settings. Until then the quiet window is NOT enforced — the toggle defaults on and the row is auto-created, so acting on the default would mute farms that never chose it (BOFF-6027). */
116580
+ quietHoursConfigured: Scalars['Boolean']['output'];
115402
116581
  quietHoursEnabled: Scalars['Boolean']['output'];
115403
116582
  quietHoursEnd: Scalars['String']['output'];
115404
116583
  quietHoursStart: Scalars['String']['output'];
116584
+ /** IANA zone the window is evaluated in. Null means UTC. */
116585
+ quietHoursTimezone?: Maybe<Scalars['String']['output']>;
115405
116586
  smsEnabled: Scalars['Boolean']['output'];
115406
116587
  smsNumber?: Maybe<Scalars['String']['output']>;
115407
116588
  /** metric or imperial. */
@@ -116880,6 +118061,8 @@ export type Workspace = {
116880
118061
  id: Scalars['ID']['output'];
116881
118062
  /** Apps installed in this workspace */
116882
118063
  installedApps: Array<WorkspaceInstalledApp>;
118064
+ /** Platform-controlled disposable-workspace marker (BOFF-6560). true only for workspaces created through createDisposableWorkspace (service-actor-only); every other workspace — including ones with a "test"/"demo"-looking name — is false and cannot be reclassified after creation. wspace services use this as the authoritative precondition before running destructive demo/test-only seed or teardown operations against a workspace. */
118065
+ isDisposable: Scalars['Boolean']['output'];
116883
118066
  /** Display name of the workspace */
116884
118067
  name: Scalars['String']['output'];
116885
118068
  /** Organization ID if part of an organization (opaque reference) */