@burdenoff/microfe-movethewheels 2026.920.3 → 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 (77) hide show
  1. package/dist/components/CarbonFootprintPanel.js +1 -1
  2. package/dist/components/CustomerPicker.js +76 -65
  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 +3 -1
  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/pages/CreateOrderPage.js +207 -201
  31. package/dist/pages/CustomersPage.js +61 -54
  32. package/dist/pages/DeliveryCapturePage.js +131 -109
  33. package/dist/pages/DriversPage.js +100 -92
  34. package/dist/pages/InventoryPage.js +239 -236
  35. package/dist/pages/MultiModalShipmentPage.js +163 -130
  36. package/dist/pages/OrderDetailsPage.js +224 -208
  37. package/dist/pages/OrdersListPage.js +66 -60
  38. package/dist/pages/ProductDetailsPage.js +241 -200
  39. package/dist/pages/ProductsPage.js +59 -52
  40. package/dist/pages/RouteDetailsPage.js +343 -321
  41. package/dist/pages/RoutesPage.js +55 -48
  42. package/dist/pages/VehiclesPage.js +63 -56
  43. package/dist/pages/WarehousesPage.js +60 -53
  44. package/package.json +1 -1
  45. package/src/generated/wspace-types.ts +1188 -5
  46. package/src/movethewheels/components/CarbonFootprintPanel.tsx +0 -1
  47. package/src/movethewheels/components/CustomerPicker.tsx +14 -0
  48. package/src/movethewheels/components/DataTable.tsx +34 -18
  49. package/src/movethewheels/components/DocumentsCard.tsx +6 -1
  50. package/src/movethewheels/components/maps/leaflet-setup.ts +1 -8
  51. package/src/movethewheels/hooks/useAnalytics.ts +27 -0
  52. package/src/movethewheels/hooks/useCustomers.ts +64 -24
  53. package/src/movethewheels/hooks/useDebouncedValue.ts +12 -0
  54. package/src/movethewheels/hooks/useEntityDocuments.ts +43 -25
  55. package/src/movethewheels/hooks/useEpod.ts +14 -7
  56. package/src/movethewheels/hooks/useFleet.ts +58 -37
  57. package/src/movethewheels/hooks/useFleetIntelligence.ts +1 -4
  58. package/src/movethewheels/hooks/useInventory.ts +211 -90
  59. package/src/movethewheels/hooks/useMultiModalShipments.ts +15 -11
  60. package/src/movethewheels/hooks/useOrders.ts +13 -14
  61. package/src/movethewheels/hooks/useRoutes.ts +80 -23
  62. package/src/movethewheels/hooks/useTracking.ts +130 -98
  63. package/src/movethewheels/pages/CreateOrderPage.tsx +9 -1
  64. package/src/movethewheels/pages/CustomersPage.tsx +11 -1
  65. package/src/movethewheels/pages/DeliveryCapturePage.tsx +31 -1
  66. package/src/movethewheels/pages/DriversPage.tsx +24 -12
  67. package/src/movethewheels/pages/InventoryPage.tsx +57 -32
  68. package/src/movethewheels/pages/MultiModalShipmentPage.tsx +52 -3
  69. package/src/movethewheels/pages/OrderDetailsPage.tsx +17 -1
  70. package/src/movethewheels/pages/OrdersListPage.tsx +20 -3
  71. package/src/movethewheels/pages/ProductDetailsPage.tsx +52 -3
  72. package/src/movethewheels/pages/ProductsPage.tsx +11 -1
  73. package/src/movethewheels/pages/RouteDetailsPage.tsx +35 -5
  74. package/src/movethewheels/pages/RoutesPage.tsx +11 -1
  75. package/src/movethewheels/pages/VehiclesPage.tsx +19 -2
  76. package/src/movethewheels/pages/WarehousesPage.tsx +11 -1
  77. package/src/movethewheels/types/index.ts +7 -5
@@ -1994,6 +1994,64 @@ export declare enum AgentVisibility {
1994
1994
  Public = "PUBLIC",
1995
1995
  Workspace = "WORKSPACE"
1996
1996
  }
1997
+ /** A decision the engine proposed, with the evidence and rails behind it. */
1998
+ export type AgronomyDecision = {
1999
+ __typename?: 'AgronomyDecision';
2000
+ /** Why a rail blocked it, in words a farmer can act on. Null unless BLOCKED. */
2001
+ blockedReason?: Maybe<Scalars['String']['output']>;
2002
+ /** 0..1, or null when nothing honest could be reported. */
2003
+ confidence?: Maybe<Scalars['Float']['output']>;
2004
+ createdAt: Scalars['String']['output'];
2005
+ decidedAt?: Maybe<Scalars['String']['output']>;
2006
+ decidedBy?: Maybe<Scalars['String']['output']>;
2007
+ /** One of: IRRIGATION | TREATMENT. */
2008
+ decisionType: Scalars['String']['output'];
2009
+ fieldId?: Maybe<Scalars['ID']['output']>;
2010
+ id: Scalars['ID']['output'];
2011
+ /** 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. */
2012
+ inputs?: Maybe<Scalars['JSON']['output']>;
2013
+ modelName?: Maybe<Scalars['String']['output']>;
2014
+ modelProvider?: Maybe<Scalars['String']['output']>;
2015
+ plantScanId?: Maybe<Scalars['ID']['output']>;
2016
+ railChecks: Array<AgronomyRailCheck>;
2017
+ rationale: Scalars['String']['output'];
2018
+ /** Recommended irrigation depth in mm. Null for non-irrigation decisions, and zero when the recommendation is to hold off. */
2019
+ recommendedMm?: Maybe<Scalars['Int']['output']>;
2020
+ /** MODEL | HEURISTIC — whether a model actually produced this wording. */
2021
+ source: Scalars['String']['output'];
2022
+ /** 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. */
2023
+ status: Scalars['String']['output'];
2024
+ /** The field or plant scan this is about. */
2025
+ subjectId: Scalars['ID']['output'];
2026
+ /** FIELD | PLANT_SCAN. */
2027
+ subjectType: Scalars['String']['output'];
2028
+ title: Scalars['String']['output'];
2029
+ updatedAt: Scalars['String']['output'];
2030
+ };
2031
+ export type AgronomyDecisionFilterInput = {
2032
+ /** IRRIGATION | TREATMENT. */
2033
+ decisionType?: InputMaybe<Scalars['String']['input']>;
2034
+ limit?: InputMaybe<Scalars['Int']['input']>;
2035
+ /** PROPOSED | ACCEPTED | REJECTED | BLOCKED. */
2036
+ status?: InputMaybe<Scalars['String']['input']>;
2037
+ };
2038
+ /** Result of a sweep. */
2039
+ export type AgronomyDecisionSweepResult = {
2040
+ __typename?: 'AgronomyDecisionSweepResult';
2041
+ decisions: Array<AgronomyDecision>;
2042
+ /** Subjects the sweep did not reach, so "no proposals" is never confused with "not looked at". */
2043
+ skipped: Scalars['Int']['output'];
2044
+ skippedReason?: Maybe<Scalars['String']['output']>;
2045
+ };
2046
+ /** 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. */
2047
+ export type AgronomyRailCheck = {
2048
+ __typename?: 'AgronomyRailCheck';
2049
+ detail: Scalars['String']['output'];
2050
+ /** One of: PASS | BLOCKED | NOT_APPLICABLE. */
2051
+ outcome: Scalars['String']['output'];
2052
+ /** Rail identifier, e.g. PROHIBITED_SUBSTANCE | MEDICATION_WITHDRAWAL. */
2053
+ rail: Scalars['String']['output'];
2054
+ };
1997
2055
  export type AiContext = {
1998
2056
  __typename?: 'AiContext';
1999
2057
  content: Scalars['String']['output'];
@@ -4258,6 +4316,8 @@ export type Auction = {
4258
4316
  export type Audit = {
4259
4317
  __typename?: 'Audit';
4260
4318
  auditor: Scalars['String']['output'];
4319
+ /** 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. */
4320
+ certificationId?: Maybe<Scalars['ID']['output']>;
4261
4321
  completedDate?: Maybe<Scalars['String']['output']>;
4262
4322
  criticalFindings: Scalars['Int']['output'];
4263
4323
  findings: Scalars['Int']['output'];
@@ -10056,6 +10116,17 @@ export type ComplianceDocument = {
10056
10116
  type: Scalars['String']['output'];
10057
10117
  uploadedDate: Scalars['String']['output'];
10058
10118
  };
10119
+ /** 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. */
10120
+ export type ComplianceExportFile = {
10121
+ __typename?: 'ComplianceExportFile';
10122
+ byteSize: Scalars['Int']['output'];
10123
+ /** Base64-encoded file bytes. */
10124
+ contentBase64: Scalars['String']['output'];
10125
+ filename: Scalars['String']['output'];
10126
+ /** PDF */
10127
+ format: Scalars['String']['output'];
10128
+ mimeType: Scalars['String']['output'];
10129
+ };
10059
10130
  /** A compliance finding: a domain observation, not a notification. Alerts are dispatched via the platform notification service. */
10060
10131
  export type ComplianceFlag = {
10061
10132
  __typename?: 'ComplianceFlag';
@@ -10399,6 +10470,14 @@ export type ConsoleValidationResult = {
10399
10470
  errors: Array<ConsoleValidationError>;
10400
10471
  valid: Scalars['Boolean']['output'];
10401
10472
  };
10473
+ /** A bookable appointment window (BOFF-6030). */
10474
+ export type ConsultSlot = {
10475
+ __typename?: 'ConsultSlot';
10476
+ /** 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. */
10477
+ available: Scalars['Boolean']['output'];
10478
+ end: Scalars['String']['output'];
10479
+ start: Scalars['String']['output'];
10480
+ };
10402
10481
  export type Consultation = {
10403
10482
  __typename?: 'Consultation';
10404
10483
  consultantId: Scalars['String']['output'];
@@ -10409,7 +10488,11 @@ export type Consultation = {
10409
10488
  id: Scalars['ID']['output'];
10410
10489
  mode: Scalars['String']['output'];
10411
10490
  notes?: Maybe<Scalars['String']['output']>;
10491
+ /** The requested day. Kept alongside `slotStart`: consultations booked before BOFF-6030 carry a day and no time, and must keep rendering. */
10412
10492
  requestedDate: Scalars['String']['output'];
10493
+ slotEnd?: Maybe<Scalars['String']['output']>;
10494
+ /** BOFF-6030 — the agreed appointment window. Null on a consultation booked before slots existed. */
10495
+ slotStart?: Maybe<Scalars['String']['output']>;
10413
10496
  status: ConsultationStatus;
10414
10497
  topic: Scalars['String']['output'];
10415
10498
  };
@@ -12280,6 +12363,8 @@ export type CreateAssetTransactionInput = {
12280
12363
  };
12281
12364
  export type CreateAuditInput = {
12282
12365
  auditor: Scalars['String']['input'];
12366
+ /** 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. */
12367
+ certificationId?: InputMaybe<Scalars['ID']['input']>;
12283
12368
  context: ContextInput;
12284
12369
  scheduledDate: Scalars['String']['input'];
12285
12370
  title: Scalars['String']['input'];
@@ -12750,6 +12835,8 @@ export type CreateConsultationInput = {
12750
12835
  /** 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. */
12751
12836
  plantScanId?: InputMaybe<Scalars['ID']['input']>;
12752
12837
  requestedDate: Scalars['String']['input'];
12838
+ /** BOFF-6030 — ISO instant for the chosen slot. Optional; `slotEnd` is derived from the rule. */
12839
+ slotStart?: InputMaybe<Scalars['String']['input']>;
12753
12840
  topic: Scalars['String']['input'];
12754
12841
  };
12755
12842
  export type CreateConversationInput = {
@@ -13172,6 +13259,19 @@ export type CreateDigitalTwinInput = {
13172
13259
  modelRef: Scalars['String']['input'];
13173
13260
  properties?: InputMaybe<Scalars['JSONObject']['input']>;
13174
13261
  };
13262
+ /** 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. */
13263
+ export type CreateDisposableWorkspaceInput = {
13264
+ /** Display name of the disposable workspace */
13265
+ name: Scalars['String']['input'];
13266
+ /** Organization ID this disposable workspace belongs to */
13267
+ orgId: Scalars['ID']['input'];
13268
+ /** Owner user ID for the disposable workspace (the operator/service identity responsible for its lifecycle, not necessarily an end-user) */
13269
+ ownerId: Scalars['ID']['input'];
13270
+ /** Tenant ID this disposable workspace belongs to */
13271
+ tenantId: Scalars['ID']['input'];
13272
+ /** Type of workspace (defaults to WORKSPACE) */
13273
+ type?: InputMaybe<WorkspaceType>;
13274
+ };
13175
13275
  export type CreateDriverInput = {
13176
13276
  certifications?: InputMaybe<Scalars['JSON']['input']>;
13177
13277
  context?: InputMaybe<ContextInput>;
@@ -14232,6 +14332,13 @@ export type CreateHealthyBowlCostCenterInput = {
14232
14332
  yieldQuantity?: InputMaybe<Scalars['Float']['input']>;
14233
14333
  yieldUnit?: InputMaybe<Scalars['String']['input']>;
14234
14334
  };
14335
+ export type CreateHealthyBowlCrewInput = {
14336
+ context: ContextInput;
14337
+ isActive?: InputMaybe<Scalars['Boolean']['input']>;
14338
+ leadWorkerId?: InputMaybe<Scalars['ID']['input']>;
14339
+ name: Scalars['String']['input'];
14340
+ workerIds?: InputMaybe<Array<Scalars['ID']['input']>>;
14341
+ };
14235
14342
  export type CreateHealthyBowlCsaPickupLocationInput = {
14236
14343
  /** Same JSON shape as CsaMembership.deliveryAddress. */
14237
14344
  address?: InputMaybe<Scalars['JSON']['input']>;
@@ -14278,9 +14385,15 @@ export type CreateHealthyBowlDiseaseWarningRuleInput = {
14278
14385
  status?: InputMaybe<Scalars['String']['input']>;
14279
14386
  };
14280
14387
  export type CreateHealthyBowlFarmRecommendationInput = {
14388
+ /** 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. */
14389
+ authorKind?: InputMaybe<Scalars['String']['input']>;
14390
+ confidence?: InputMaybe<Scalars['Float']['input']>;
14281
14391
  detail: Scalars['String']['input'];
14282
14392
  domain: Scalars['String']['input'];
14393
+ /** Only meaningful when authorKind is MODEL; ignored otherwise. */
14394
+ modelName?: InputMaybe<Scalars['String']['input']>;
14283
14395
  priority?: InputMaybe<HealthyBowlFarmRecommendationPriority>;
14396
+ rationale?: InputMaybe<Scalars['String']['input']>;
14284
14397
  title: Scalars['String']['input'];
14285
14398
  /** The CLIENT workspace this recommendation is written onto (the consultant must hold an active assignment to it). */
14286
14399
  workspaceId: Scalars['ID']['input'];
@@ -14327,6 +14440,7 @@ export type CreateHealthyBowlInputPlanInput = {
14327
14440
  season: Scalars['String']['input'];
14328
14441
  };
14329
14442
  export type CreateHealthyBowlIrrigationAutomationInput = {
14443
+ autoTaskEnabled?: InputMaybe<Scalars['Boolean']['input']>;
14330
14444
  context: ContextInput;
14331
14445
  notifyInApp?: InputMaybe<Scalars['Boolean']['input']>;
14332
14446
  rainProbThreshold?: InputMaybe<Scalars['Int']['input']>;
@@ -14354,6 +14468,15 @@ export type CreateHealthyBowlLedgerAccountInput = {
14354
14468
  name: Scalars['String']['input'];
14355
14469
  sortOrder?: InputMaybe<Scalars['Int']['input']>;
14356
14470
  };
14471
+ export type CreateHealthyBowlLoanMilestoneInput = {
14472
+ context: ContextInput;
14473
+ description?: InputMaybe<Scalars['String']['input']>;
14474
+ /** HARVEST or PLANTING_ACTIVITY. Optional at creation; required by the time it is released. */
14475
+ evidenceType?: InputMaybe<Scalars['String']['input']>;
14476
+ label: Scalars['String']['input'];
14477
+ loanId: Scalars['ID']['input'];
14478
+ releaseAmount: Scalars['Float']['input'];
14479
+ };
14357
14480
  export type CreateHealthyBowlMapFeatureInput = {
14358
14481
  color?: InputMaybe<Scalars['String']['input']>;
14359
14482
  context: ContextInput;
@@ -14483,6 +14606,7 @@ export type CreateHealthyBowlStorageLocationInput = {
14483
14606
  export type CreateHealthyBowlSuccessionPlanInput = {
14484
14607
  /** Optional loose link to a Bed (no FK). */
14485
14608
  bedId?: InputMaybe<Scalars['ID']['input']>;
14609
+ bedWidthM?: InputMaybe<Scalars['Float']['input']>;
14486
14610
  context: ContextInput;
14487
14611
  /** Number of successions to generate (>= 1). */
14488
14612
  count: Scalars['Int']['input'];
@@ -14492,9 +14616,13 @@ export type CreateHealthyBowlSuccessionPlanInput = {
14492
14616
  /** Days between successive sowings. */
14493
14617
  intervalDays: Scalars['Int']['input'];
14494
14618
  notes?: InputMaybe<Scalars['String']['input']>;
14619
+ pathWidthM?: InputMaybe<Scalars['Float']['input']>;
14495
14620
  /** Optional loose link to a PlantCatalog entry (no FK). */
14496
14621
  plantCatalogId?: InputMaybe<Scalars['ID']['input']>;
14622
+ /** BOFF-6100 — geometry supplied by the succession form; server derives one set of figures for every child. */
14623
+ plantSpacingCm?: InputMaybe<Scalars['Float']['input']>;
14497
14624
  plantsNeeded?: InputMaybe<Scalars['Int']['input']>;
14625
+ rowSpacingCm?: InputMaybe<Scalars['Float']['input']>;
14498
14626
  /** Growing season. Must be one of: KHARIF, RABI, ZAID, PERENNIAL (case-insensitive). */
14499
14627
  season?: InputMaybe<Scalars['String']['input']>;
14500
14628
  seedGrams?: InputMaybe<Scalars['Float']['input']>;
@@ -14567,6 +14695,18 @@ export type CreateHealthyBowlWholesaleOrderInput = {
14567
14695
  productName: Scalars['String']['input'];
14568
14696
  quantityKg: Scalars['Float']['input'];
14569
14697
  };
14698
+ export type CreateHealthyBowlWorkerInput = {
14699
+ context: ContextInput;
14700
+ dailyWage?: InputMaybe<Scalars['Float']['input']>;
14701
+ employmentType?: InputMaybe<Scalars['String']['input']>;
14702
+ hourlyRate?: InputMaybe<Scalars['Float']['input']>;
14703
+ isActive?: InputMaybe<Scalars['Boolean']['input']>;
14704
+ linkedActorId?: InputMaybe<Scalars['String']['input']>;
14705
+ name: Scalars['String']['input'];
14706
+ phone?: InputMaybe<Scalars['String']['input']>;
14707
+ piecePrice?: InputMaybe<Scalars['Float']['input']>;
14708
+ skills?: InputMaybe<Array<Scalars['String']['input']>>;
14709
+ };
14570
14710
  export type CreateIcsGroupInput = {
14571
14711
  certificationId?: InputMaybe<Scalars['ID']['input']>;
14572
14712
  /** Unique within the workspace. */
@@ -14925,23 +15065,30 @@ export type CreatePipelineStageInput = {
14925
15065
  export type CreatePlantingPlanInput = {
14926
15066
  /** Optional loose link to a Bed (no FK). */
14927
15067
  bedId?: InputMaybe<Scalars['ID']['input']>;
15068
+ bedWidthM?: InputMaybe<Scalars['Float']['input']>;
14928
15069
  context: ContextInput;
14929
15070
  cropId?: InputMaybe<Scalars['ID']['input']>;
15071
+ /** BOFF-6100 — caller fallback only for non-bed/no-area fields; server-derived otherwise. */
15072
+ density?: InputMaybe<Scalars['Float']['input']>;
14930
15073
  endDate?: InputMaybe<Scalars['String']['input']>;
14931
15074
  expectedYield?: InputMaybe<Scalars['Float']['input']>;
14932
15075
  fertilizers?: InputMaybe<Array<Scalars['String']['input']>>;
14933
15076
  fieldId: Scalars['ID']['input'];
15077
+ pathWidthM?: InputMaybe<Scalars['Float']['input']>;
14934
15078
  /** Optional loose link to a PlantCatalog entry (no FK). */
14935
15079
  plantCatalogId?: InputMaybe<Scalars['ID']['input']>;
14936
- /** I-5 seed-rate result — total plants required. */
15080
+ /** 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. */
15081
+ plantSpacingCm?: InputMaybe<Scalars['Float']['input']>;
15082
+ /** 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. */
14937
15083
  plantsNeeded?: InputMaybe<Scalars['Int']['input']>;
14938
15084
  priority?: InputMaybe<Scalars['String']['input']>;
15085
+ rowSpacingCm?: InputMaybe<Scalars['Float']['input']>;
14939
15086
  /** Growing season. Must be one of: KHARIF, RABI, ZAID, PERENNIAL (case-insensitive). */
14940
15087
  season: Scalars['String']['input'];
14941
- /** I-5 seed-rate result — grams of seed required. */
15088
+ /** I-5 seed-rate result — grams of seed required. Server-derived where possible; see plantsNeeded. */
14942
15089
  seedGrams?: InputMaybe<Scalars['Float']['input']>;
14943
15090
  seedRequired?: InputMaybe<Scalars['Float']['input']>;
14944
- /** I-5 seed-rate result — seedlings/transplants to raise. */
15091
+ /** I-5 seed-rate result — seedlings/transplants to raise. Server-derived where possible. */
14945
15092
  seedlingsToRaise?: InputMaybe<Scalars['Int']['input']>;
14946
15093
  /** Sow/nursery-start date (ISO); distinct from the transplant startDate. */
14947
15094
  sowDate?: InputMaybe<Scalars['String']['input']>;
@@ -15263,6 +15410,8 @@ export type CreateSchemeApplicationInput = {
15263
15410
  context: ContextInput;
15264
15411
  /** Must be true for a new submission; omitted values are rejected server-side. */
15265
15412
  declarationAccepted?: InputMaybe<Scalars['Boolean']['input']>;
15413
+ /** 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. */
15414
+ documents?: InputMaybe<Array<SchemeApplicationDocumentInput>>;
15266
15415
  /** Farm identity is validated server-side; whitespace-only or omitted values are rejected. */
15267
15416
  farmName?: InputMaybe<Scalars['String']['input']>;
15268
15417
  notes?: InputMaybe<Scalars['String']['input']>;
@@ -15750,10 +15899,13 @@ export type CreateVehicleInput = {
15750
15899
  fuelEfficiencyLPer100Km?: InputMaybe<Scalars['Float']['input']>;
15751
15900
  fuelLevel?: InputMaybe<Scalars['Float']['input']>;
15752
15901
  fuelType?: InputMaybe<FuelType>;
15902
+ lastServiceDate?: InputMaybe<Scalars['DateTime']['input']>;
15753
15903
  licensePlate?: InputMaybe<Scalars['String']['input']>;
15754
15904
  make?: InputMaybe<Scalars['String']['input']>;
15755
15905
  mileage?: InputMaybe<Scalars['Float']['input']>;
15756
15906
  model?: InputMaybe<Scalars['String']['input']>;
15907
+ nextServiceDueDate?: InputMaybe<Scalars['DateTime']['input']>;
15908
+ nextServiceDueMileage?: InputMaybe<Scalars['Float']['input']>;
15757
15909
  ownershipType?: InputMaybe<Scalars['String']['input']>;
15758
15910
  status?: InputMaybe<VehicleStatus>;
15759
15911
  type: VehicleType;
@@ -16865,6 +17017,12 @@ export type CsaDelivery = {
16865
17017
  notes?: Maybe<Scalars['String']['output']>;
16866
17018
  notificationSentAt?: Maybe<Scalars['String']['output']>;
16867
17019
  orderId?: Maybe<Scalars['ID']['output']>;
17020
+ /** When the linked Order settled, null until paid. */
17021
+ paidAt?: Maybe<Scalars['String']['output']>;
17022
+ /** Gateway-verified payment reference, null until the linked Order settles. */
17023
+ paymentReference?: Maybe<Scalars['String']['output']>;
17024
+ /** PENDING | PAID | FAILED — mirrored from the linked Order; the UI never writes this. */
17025
+ paymentStatus?: Maybe<Scalars['String']['output']>;
16868
17026
  /** The location this box went to. Null for a home delivery. */
16869
17027
  pickupLocationId?: Maybe<Scalars['ID']['output']>;
16870
17028
  /** 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. */
@@ -18100,6 +18258,18 @@ export type DeadLetterQueueConnection = {
18100
18258
  nextCursor?: Maybe<Scalars['String']['output']>;
18101
18259
  total: Scalars['Int']['output'];
18102
18260
  };
18261
+ export type DecideAgronomyDecisionInput = {
18262
+ context: ContextInput;
18263
+ id: Scalars['ID']['input'];
18264
+ /** ACCEPTED | REJECTED. */
18265
+ verdict: Scalars['String']['input'];
18266
+ };
18267
+ export type DecideHealthyBowlFarmRecommendationInput = {
18268
+ context: ContextInput;
18269
+ /** ACCEPTED | REJECTED | ESCALATED */
18270
+ decision: Scalars['String']['input'];
18271
+ id: Scalars['ID']['input'];
18272
+ };
18103
18273
  /** Returned when explicitly decrypting a secret value. */
18104
18274
  export type DecryptedSecret = {
18105
18275
  __typename?: 'DecryptedSecret';
@@ -18153,6 +18323,7 @@ export type DeliveryJobFilterInput = {
18153
18323
  search?: InputMaybe<Scalars['String']['input']>;
18154
18324
  status?: InputMaybe<DeliveryJobStatus>;
18155
18325
  storeOrderId?: InputMaybe<Scalars['ID']['input']>;
18326
+ unassigned?: InputMaybe<Scalars['Boolean']['input']>;
18156
18327
  vehicleId?: InputMaybe<Scalars['ID']['input']>;
18157
18328
  };
18158
18329
  export declare enum DeliveryJobStatus {
@@ -18428,6 +18599,12 @@ export type DispatchHealthyBowlAuctionSweepInput = {
18428
18599
  dispatchSecret: Scalars['String']['input'];
18429
18600
  workspaceId: Scalars['ID']['input'];
18430
18601
  };
18602
+ /** Authorization envelope for the anonymous consultation-reminder sweep callback. */
18603
+ export type DispatchHealthyBowlConsultReminderSweepInput = {
18604
+ /** Domain-separated HMAC-SHA256(INTERNAL_SERVICE_TOKEN, `consult-reminder:${workspaceId}`). */
18605
+ dispatchSecret: Scalars['String']['input'];
18606
+ workspaceId: Scalars['ID']['input'];
18607
+ };
18431
18608
  export type DispatchHealthyBowlCsaNotificationInput = {
18432
18609
  /** CsaDelivery id. */
18433
18610
  csaDeliveryId: Scalars['ID']['input'];
@@ -18529,6 +18706,7 @@ export type DraftMessage = {
18529
18706
  userId: Scalars['ID']['output'];
18530
18707
  };
18531
18708
  export type DriverFilterInput = {
18709
+ licenseClass?: InputMaybe<Scalars['String']['input']>;
18532
18710
  search?: InputMaybe<Scalars['String']['input']>;
18533
18711
  status?: InputMaybe<DriverStatus>;
18534
18712
  vehicleId?: InputMaybe<Scalars['ID']['input']>;
@@ -21810,6 +21988,8 @@ export type File = {
21810
21988
  marketingWidth?: Maybe<Scalars['Int']['output']>;
21811
21989
  mimeType: Scalars['String']['output'];
21812
21990
  name: Scalars['String']['output'];
21991
+ /** 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. */
21992
+ publicUrl?: Maybe<Scalars['String']['output']>;
21813
21993
  s3Bucket: Scalars['String']['output'];
21814
21994
  s3Key: Scalars['String']['output'];
21815
21995
  sha256Hash?: Maybe<Scalars['String']['output']>;
@@ -30735,6 +30915,24 @@ export type HealthyBowlAnimalGroup = {
30735
30915
  smartRule?: Maybe<Scalars['JSON']['output']>;
30736
30916
  updatedAt: Scalars['String']['output'];
30737
30917
  };
30918
+ /** 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. */
30919
+ export type HealthyBowlAnimalPedigree = {
30920
+ __typename?: 'HealthyBowlAnimalPedigree';
30921
+ /** Ancestor depth actually applied after clamping (1..8). */
30922
+ ancestorDepth: Scalars['Int']['output'];
30923
+ /** 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. */
30924
+ ancestors: Array<HealthyBowlPedigreeNode>;
30925
+ /** 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. */
30926
+ cycleDetected: Scalars['Boolean']['output'];
30927
+ /** Recorded offspring, oldest first. */
30928
+ offspring: Array<HealthyBowlOffspringNode>;
30929
+ /** Offspring depth actually applied after clamping (1..4). */
30930
+ offspringDepth: Scalars['Int']['output'];
30931
+ /** The animal the walk started from, at generation 0. */
30932
+ root: HealthyBowlPedigreeNode;
30933
+ /** 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. */
30934
+ truncated: Scalars['Boolean']['output'];
30935
+ };
30738
30936
  /** Per-animal medication-withdrawal roll-up (reused from BOFF-2885), for the compliance badge. */
30739
30937
  export type HealthyBowlAnimalWithdrawalBadge = {
30740
30938
  __typename?: 'HealthyBowlAnimalWithdrawalBadge';
@@ -31316,6 +31514,25 @@ export type HealthyBowlCostCenter = {
31316
31514
  yieldQuantity: Scalars['Float']['output'];
31317
31515
  yieldUnit: Scalars['String']['output'];
31318
31516
  };
31517
+ export type HealthyBowlCrew = {
31518
+ __typename?: 'HealthyBowlCrew';
31519
+ createdAt: Scalars['String']['output'];
31520
+ id: Scalars['ID']['output'];
31521
+ isActive: Scalars['Boolean']['output'];
31522
+ leadWorkerId?: Maybe<Scalars['ID']['output']>;
31523
+ name: Scalars['String']['output'];
31524
+ workerIds: Array<Scalars['ID']['output']>;
31525
+ };
31526
+ export type HealthyBowlCrewTimesheet = {
31527
+ __typename?: 'HealthyBowlCrewTimesheet';
31528
+ crewId: Scalars['ID']['output'];
31529
+ crewName: Scalars['String']['output'];
31530
+ rows: Array<HealthyBowlWeeklyTimesheetRow>;
31531
+ totalCost: Scalars['Float']['output'];
31532
+ totalHours: Scalars['Float']['output'];
31533
+ weekEnd: Scalars['String']['output'];
31534
+ weekStart: Scalars['String']['output'];
31535
+ };
31319
31536
  export type HealthyBowlCropProfitability = {
31320
31537
  __typename?: 'HealthyBowlCropProfitability';
31321
31538
  code: Scalars['String']['output'];
@@ -31409,18 +31626,39 @@ export type HealthyBowlDueSoon = {
31409
31626
  /** What is physically written on the animal, and how she is found in the shed (BOFF-6283). Nullable on purpose: a dam culled since her service still appears here only if she is in the herd, but an unnamed or untagged animal must degrade to the id rather than blank the row. This is the one actionable section of the card — before these existed it answered "who do I check on this week" with a raw UUID. */
31410
31627
  tagNumber?: Maybe<Scalars['String']['output']>;
31411
31628
  };
31629
+ export type HealthyBowlExpertAvailabilityInput = {
31630
+ consultantId: Scalars['String']['input'];
31631
+ /** How many days forward. Defaults to 14, capped at 60 — a farmer picking a time does not scroll a year. */
31632
+ days?: InputMaybe<Scalars['Int']['input']>;
31633
+ /** First day to offer, ISO. Defaults to today. */
31634
+ from?: InputMaybe<Scalars['String']['input']>;
31635
+ };
31412
31636
  export type HealthyBowlFarmRecommendation = {
31413
31637
  __typename?: 'HealthyBowlFarmRecommendation';
31414
31638
  authorActorId: Scalars['String']['output'];
31639
+ /** 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. */
31640
+ authorKind: Scalars['String']['output'];
31415
31641
  authorName?: Maybe<Scalars['String']['output']>;
31642
+ /** 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. */
31643
+ confidence?: Maybe<Scalars['Float']['output']>;
31416
31644
  createdAt: Scalars['String']['output'];
31645
+ decidedAt?: Maybe<Scalars['String']['output']>;
31646
+ decidedBy?: Maybe<Scalars['String']['output']>;
31647
+ /** ACCEPTED | REJECTED | ESCALATED — the human's verdict. Null until someone decides. */
31648
+ decision?: Maybe<Scalars['String']['output']>;
31417
31649
  detail: Scalars['String']['output'];
31418
31650
  domain: Scalars['String']['output'];
31419
31651
  id: Scalars['ID']['output'];
31652
+ /** The model that produced it, when authorKind is MODEL. */
31653
+ modelName?: Maybe<Scalars['String']['output']>;
31420
31654
  priority: Scalars['String']['output'];
31655
+ /** Why the model suggested this. A recommendation with no rationale is one a farmer cannot evaluate. */
31656
+ rationale?: Maybe<Scalars['String']['output']>;
31421
31657
  status: Scalars['String']['output'];
31422
31658
  title: Scalars['String']['output'];
31423
31659
  updatedAt: Scalars['String']['output'];
31660
+ /** 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. */
31661
+ warnings: Array<Scalars['String']['output']>;
31424
31662
  workspaceId: Scalars['ID']['output'];
31425
31663
  };
31426
31664
  export declare enum HealthyBowlFarmRecommendationPriority {
@@ -31569,6 +31807,13 @@ export type HealthyBowlGeneralLedgerRow = {
31569
31807
  reference?: Maybe<Scalars['String']['output']>;
31570
31808
  runningBalance: Scalars['Float']['output'];
31571
31809
  };
31810
+ /** 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. */
31811
+ export declare enum HealthyBowlGeneratableReportType {
31812
+ /** Harvest yield by crop, over recorded harvests. */
31813
+ Crop = "CROP",
31814
+ /** Cost by crop, over posted ledger lines. */
31815
+ Financial = "FINANCIAL"
31816
+ }
31572
31817
  export type HealthyBowlGovernmentDataPayload = {
31573
31818
  __typename?: 'HealthyBowlGovernmentDataPayload';
31574
31819
  activity: Array<GovernmentActivityItem>;
@@ -31717,6 +31962,7 @@ export type HealthyBowlHerdComplianceSummary = {
31717
31962
  animalsInWithdrawal: Scalars['Int']['output'];
31718
31963
  /** e.g. '2 animals in medication withdrawal — do not sell milk'. Empty when none are withdrawn. */
31719
31964
  complianceMessage: Scalars['String']['output'];
31965
+ /** Animals MATCHING the current `groupId`/`search` filters — not the herd total. The herd totals are on `groups[].animalCount`. */
31720
31966
  totalAnimals: Scalars['Int']['output'];
31721
31967
  };
31722
31968
  /** What the herd is made of, as of the window end. Only observed categories are emitted for species/sex/status: an unlisted species is not "0 animals" — the workspace simply does not farm it. The age bands are the exception, because they are a scale rather than a ranking; all five are returned in age order so an empty band is visible. */
@@ -31750,6 +31996,8 @@ export type HealthyBowlHerdDepthRow = {
31750
31996
  /** Average daily gain (kg/day) from weight history; null with < 2 weight records. */
31751
31997
  adgKgPerDay?: Maybe<Scalars['Float']['output']>;
31752
31998
  animalId: Scalars['ID']['output'];
31999
+ /** 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. */
32000
+ archived: Scalars['Boolean']['output'];
31753
32001
  bodyConditionScore?: Maybe<Scalars['Float']['output']>;
31754
32002
  eidTag?: Maybe<Scalars['String']['output']>;
31755
32003
  groupId?: Maybe<Scalars['ID']['output']>;
@@ -31768,6 +32016,8 @@ export type HealthyBowlHerdDepthView = {
31768
32016
  groups: Array<HealthyBowlAnimalGroup>;
31769
32017
  rows: Array<HealthyBowlHerdDepthRow>;
31770
32018
  summary: HealthyBowlHerdComplianceSummary;
32019
+ /** 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. */
32020
+ truncated: Scalars['Boolean']['output'];
31771
32021
  };
31772
32022
  /** 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. */
31773
32023
  export type HealthyBowlHerdProductionPerHead = {
@@ -32122,6 +32372,40 @@ export type HealthyBowlJournalLineInput = {
32122
32372
  debit?: InputMaybe<Scalars['Float']['input']>;
32123
32373
  description?: InputMaybe<Scalars['String']['input']>;
32124
32374
  };
32375
+ export type HealthyBowlLabourEntry = {
32376
+ __typename?: 'HealthyBowlLabourEntry';
32377
+ computedCost: Scalars['Float']['output'];
32378
+ /** Mandatory: cost-by-crop ignores journal lines without it. */
32379
+ costCenterId: Scalars['ID']['output'];
32380
+ crewId?: Maybe<Scalars['ID']['output']>;
32381
+ cropId?: Maybe<Scalars['ID']['output']>;
32382
+ date: Scalars['String']['output'];
32383
+ fieldId?: Maybe<Scalars['ID']['output']>;
32384
+ hours: Scalars['Float']['output'];
32385
+ id: Scalars['ID']['output'];
32386
+ journalEntryId?: Maybe<Scalars['ID']['output']>;
32387
+ note?: Maybe<Scalars['String']['output']>;
32388
+ quantity?: Maybe<Scalars['Float']['output']>;
32389
+ rateAmount: Scalars['Float']['output'];
32390
+ /** DAY | HOUR | PIECE */
32391
+ rateType: Scalars['String']['output'];
32392
+ /** DRAFT | APPROVED. Only APPROVED has reached the ledger. */
32393
+ status: Scalars['String']['output'];
32394
+ /** Opaque PlanMagnet task id; not a HealthyBowl UUID. */
32395
+ taskId?: Maybe<Scalars['String']['output']>;
32396
+ workerId: Scalars['ID']['output'];
32397
+ workerName: Scalars['String']['output'];
32398
+ };
32399
+ export type HealthyBowlLabourSummary = {
32400
+ __typename?: 'HealthyBowlLabourSummary';
32401
+ approvedEntries: Scalars['Int']['output'];
32402
+ draftEntries: Scalars['Int']['output'];
32403
+ /** Cost from APPROVED entries only; this agrees with the ledger. */
32404
+ totalCost: Scalars['Float']['output'];
32405
+ totalEntries: Scalars['Int']['output'];
32406
+ /** Hours from APPROVED entries only; draft work is not yet financial history. */
32407
+ totalHours: Scalars['Float']['output'];
32408
+ };
32125
32409
  export type HealthyBowlLedgerAccount = {
32126
32410
  __typename?: 'HealthyBowlLedgerAccount';
32127
32411
  /** ASSET | LIABILITY | EQUITY | INCOME | EXPENSE */
@@ -32264,6 +32548,9 @@ export type HealthyBowlLoanFacilitation = {
32264
32548
  communityFunded: Scalars['Boolean']['output'];
32265
32549
  createdAt: Scalars['String']['output'];
32266
32550
  currency: Scalars['String']['output'];
32551
+ /** 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`. */
32552
+ escrowCommitted: Scalars['Float']['output'];
32553
+ escrowReleased: Scalars['Float']['output'];
32267
32554
  expiresAt?: Maybe<Scalars['String']['output']>;
32268
32555
  financierActorId?: Maybe<Scalars['String']['output']>;
32269
32556
  /** FinancierAccessGrant that backs this loan's consent (time-bounded, revocable). */
@@ -32316,6 +32603,26 @@ export type HealthyBowlLoanInstallment = {
32316
32603
  remainingDue: Scalars['String']['output'];
32317
32604
  totalDue: Scalars['String']['output'];
32318
32605
  };
32606
+ /** 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. */
32607
+ export type HealthyBowlLoanMilestone = {
32608
+ __typename?: 'HealthyBowlLoanMilestone';
32609
+ createdAt: Scalars['String']['output'];
32610
+ description?: Maybe<Scalars['String']['output']>;
32611
+ evidenceId?: Maybe<Scalars['ID']['output']>;
32612
+ /** HARVEST | PLANTING_ACTIVITY — the kind of farm record that proves this milestone. */
32613
+ evidenceType?: Maybe<Scalars['String']['output']>;
32614
+ id: Scalars['ID']['output'];
32615
+ label: Scalars['String']['output'];
32616
+ loanId: Scalars['ID']['output'];
32617
+ releaseAmount: Scalars['Float']['output'];
32618
+ releasedAt?: Maybe<Scalars['String']['output']>;
32619
+ releasedBy?: Maybe<Scalars['String']['output']>;
32620
+ /** 1-based position in the release sequence. */
32621
+ sequence: Scalars['Int']['output'];
32622
+ /** PENDING | RELEASED | CANCELLED */
32623
+ status: Scalars['String']['output'];
32624
+ updatedAt: Scalars['String']['output'];
32625
+ };
32319
32626
  /** An immutable allocation for a repayment completed outside HealthyBowl; POSTED may only become VOID. */
32320
32627
  export type HealthyBowlLoanRepayment = {
32321
32628
  __typename?: 'HealthyBowlLoanRepayment';
@@ -32447,6 +32754,25 @@ export type HealthyBowlNotifyMentionInput = {
32447
32754
  taskId: Scalars['ID']['input'];
32448
32755
  taskTitle?: InputMaybe<Scalars['String']['input']>;
32449
32756
  };
32757
+ /** One recorded offspring of the root animal. */
32758
+ export type HealthyBowlOffspringNode = {
32759
+ __typename?: 'HealthyBowlOffspringNode';
32760
+ animalId: Scalars['ID']['output'];
32761
+ /** Offspring are read live-only, so this is always false. Present for symmetry with the ancestors. */
32762
+ archived: Scalars['Boolean']['output'];
32763
+ dateOfBirth?: Maybe<Scalars['String']['output']>;
32764
+ gender: Scalars['String']['output'];
32765
+ generation: Scalars['Int']['output'];
32766
+ name: Scalars['String']['output'];
32767
+ /** The immediately preceding descendant in the walk. Null at generation 1, where the root is implicit. */
32768
+ parentAnimalId?: Maybe<Scalars['ID']['output']>;
32769
+ /** All immediately preceding descendants that match this node's dam/sire links. Empty at generation 1. */
32770
+ parentAnimalIds: Array<Scalars['ID']['output']>;
32771
+ tagNumber: Scalars['String']['output'];
32772
+ type: Scalars['String']['output'];
32773
+ /** 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. */
32774
+ viaParent: Scalars['String']['output'];
32775
+ };
32450
32776
  /** 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). */
32451
32777
  export type HealthyBowlOrderCheckout = {
32452
32778
  __typename?: 'HealthyBowlOrderCheckout';
@@ -32552,6 +32878,30 @@ export type HealthyBowlPaginationInput = {
32552
32878
  sortBy?: InputMaybe<Scalars['String']['input']>;
32553
32879
  sortOrder?: InputMaybe<Scalars['String']['input']>;
32554
32880
  };
32881
+ /** 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. */
32882
+ export type HealthyBowlPedigreeNode = {
32883
+ __typename?: 'HealthyBowlPedigreeNode';
32884
+ animalId: Scalars['ID']['output'];
32885
+ /** 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. */
32886
+ archived: Scalars['Boolean']['output'];
32887
+ breed?: Maybe<Scalars['String']['output']>;
32888
+ /** 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. */
32889
+ childAnimalId?: Maybe<Scalars['ID']['output']>;
32890
+ /** 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. */
32891
+ childAnimalIds: Array<Scalars['ID']['output']>;
32892
+ /** ISO date, or null — `Animal.dateOfBirth` is nullable and a missing date is not a claim. */
32893
+ dateOfBirth?: Maybe<Scalars['String']['output']>;
32894
+ /** MALE | FEMALE. */
32895
+ gender: Scalars['String']['output'];
32896
+ /** Hops from the root animal. 0 on the root, >= 1 on every ancestor. */
32897
+ generation: Scalars['Int']['output'];
32898
+ name: Scalars['String']['output'];
32899
+ /** DAM | SIRE — which side of THIS node's own child it sits on. SELF on the root. */
32900
+ relation: Scalars['String']['output'];
32901
+ tagNumber: Scalars['String']['output'];
32902
+ /** Species (CATTLE|BUFFALO|GOAT|SHEEP|PIG|POULTRY). */
32903
+ type: Scalars['String']['output'];
32904
+ };
32555
32905
  export type HealthyBowlPestDataPayload = {
32556
32906
  __typename?: 'HealthyBowlPestDataPayload';
32557
32907
  pestIssues: Array<PestIssue>;
@@ -32702,6 +33052,49 @@ export type HealthyBowlPlannedVsSpentPoint = {
32702
33052
  planned: Scalars['Float']['output'];
32703
33053
  spent: Scalars['Float']['output'];
32704
33054
  };
33055
+ /** Bed-geometry capacity for a field (BOFF-6100). */
33056
+ export type HealthyBowlPlantingCapacity = {
33057
+ __typename?: 'HealthyBowlPlantingCapacity';
33058
+ areaSqm: Scalars['Float']['output'];
33059
+ bedCount: Scalars['Int']['output'];
33060
+ bedLengthM: Scalars['Float']['output'];
33061
+ bedWidthM: Scalars['Float']['output'];
33062
+ cultivableAreaSqm: Scalars['Float']['output'];
33063
+ densityPlantsPerSqm: Scalars['Float']['output'];
33064
+ pathWidthM: Scalars['Float']['output'];
33065
+ plantSpacingCm: Scalars['Float']['output'];
33066
+ plantsPerBed: Scalars['Int']['output'];
33067
+ plantsPerRow: Scalars['Int']['output'];
33068
+ rowSpacingCm: Scalars['Float']['output'];
33069
+ rowsPerBed: Scalars['Int']['output'];
33070
+ seedlingTarget: Scalars['Int']['output'];
33071
+ totalPlants: Scalars['Int']['output'];
33072
+ };
33073
+ /** 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. */
33074
+ export type HealthyBowlPlantingEstimate = {
33075
+ __typename?: 'HealthyBowlPlantingEstimate';
33076
+ appliesToBedGeometry: Scalars['Boolean']['output'];
33077
+ capacity?: Maybe<HealthyBowlPlantingCapacity>;
33078
+ /** Why there are no numbers. Null when the estimate is real. */
33079
+ notApplicableReason?: Maybe<Scalars['String']['output']>;
33080
+ seedRate?: Maybe<HealthyBowlSeedRate>;
33081
+ /** The spacing preset actually used, so the caller can show what was assumed. */
33082
+ spacingPresetLabel: Scalars['String']['output'];
33083
+ };
33084
+ /** 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. */
33085
+ export type HealthyBowlPlantingEstimateInput = {
33086
+ /** Optional unsaved drawn-boundary area in the Field's stored unit. Used only when positive; never persisted by this estimate read. */
33087
+ areaOverride?: InputMaybe<Scalars['Float']['input']>;
33088
+ bedWidthM?: InputMaybe<Scalars['Float']['input']>;
33089
+ /** Crop whose name/category/variety selects a spacing preset when no catalog entry is given. */
33090
+ cropId?: InputMaybe<Scalars['ID']['input']>;
33091
+ fieldId: Scalars['ID']['input'];
33092
+ pathWidthM?: InputMaybe<Scalars['Float']['input']>;
33093
+ /** Master Plant List entry, for seeds/gram, germination rate and its recorded spacing. */
33094
+ plantCatalogId?: InputMaybe<Scalars['ID']['input']>;
33095
+ plantSpacingCm?: InputMaybe<Scalars['Float']['input']>;
33096
+ rowSpacingCm?: InputMaybe<Scalars['Float']['input']>;
33097
+ };
32705
33098
  export type HealthyBowlPooledCropVolume = {
32706
33099
  __typename?: 'HealthyBowlPooledCropVolume';
32707
33100
  crop: Scalars['String']['output'];
@@ -32865,6 +33258,15 @@ export type HealthyBowlSavedTraceLabel = {
32865
33258
  fileId: Scalars['ID']['output'];
32866
33259
  fileName: Scalars['String']['output'];
32867
33260
  };
33261
+ /** Seed and nursery quantities for a plant target (BOFF-6100). */
33262
+ export type HealthyBowlSeedRate = {
33263
+ __typename?: 'HealthyBowlSeedRate';
33264
+ /** Null when the variety has no seeds-per-gram recorded. A guessed weight is worse than none. */
33265
+ seedGrams?: Maybe<Scalars['Float']['output']>;
33266
+ seedlingsToRaise: Scalars['Int']['output'];
33267
+ seedsNeeded: Scalars['Int']['output'];
33268
+ trays?: Maybe<Scalars['Int']['output']>;
33269
+ };
32868
33270
  export type HealthyBowlSettlementDeductionInput = {
32869
33271
  amount: Scalars['Float']['input'];
32870
33272
  label: Scalars['String']['input'];
@@ -33218,6 +33620,16 @@ export type HealthyBowlWeatherDataPayload = {
33218
33620
  updatedAt: Scalars['DateTime']['output'];
33219
33621
  weather: WeatherData;
33220
33622
  };
33623
+ export type HealthyBowlWeeklyTimesheetRow = {
33624
+ __typename?: 'HealthyBowlWeeklyTimesheetRow';
33625
+ /** Seven buckets, Monday first. */
33626
+ hoursByDay: Array<Scalars['Float']['output']>;
33627
+ /** Approved labour only, so this agrees with the ledger. */
33628
+ totalCost: Scalars['Float']['output'];
33629
+ totalHours: Scalars['Float']['output'];
33630
+ workerId: Scalars['ID']['output'];
33631
+ workerName: Scalars['String']['output'];
33632
+ };
33221
33633
  /** A single weight measurement in an animal's history. */
33222
33634
  export type HealthyBowlWeightRecord = {
33223
33635
  __typename?: 'HealthyBowlWeightRecord';
@@ -33230,6 +33642,22 @@ export type HealthyBowlWeightRecord = {
33230
33642
  notes?: Maybe<Scalars['String']['output']>;
33231
33643
  weightKg: Scalars['Float']['output'];
33232
33644
  };
33645
+ /** 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. */
33646
+ export type HealthyBowlWorker = {
33647
+ __typename?: 'HealthyBowlWorker';
33648
+ createdAt: Scalars['String']['output'];
33649
+ dailyWage?: Maybe<Scalars['Float']['output']>;
33650
+ /** PERMANENT | SEASONAL | CONTRACT | FAMILY | GIG */
33651
+ employmentType: Scalars['String']['output'];
33652
+ hourlyRate?: Maybe<Scalars['Float']['output']>;
33653
+ id: Scalars['ID']['output'];
33654
+ isActive: Scalars['Boolean']['output'];
33655
+ linkedActorId?: Maybe<Scalars['String']['output']>;
33656
+ name: Scalars['String']['output'];
33657
+ phone?: Maybe<Scalars['String']['output']>;
33658
+ piecePrice?: Maybe<Scalars['Float']['output']>;
33659
+ skills: Array<Scalars['String']['output']>;
33660
+ };
33233
33661
  /** A single (bucket-key -> aggregate) row for a device/territory/language breakdown. */
33234
33662
  export type HokAnalyticsBucket = {
33235
33663
  __typename?: 'HokAnalyticsBucket';
@@ -37230,6 +37658,7 @@ export type InvalidateDataSinkCacheResult = {
37230
37658
  export type InventoryFilterInput = {
37231
37659
  cargoItemId?: InputMaybe<Scalars['ID']['input']>;
37232
37660
  locationId?: InputMaybe<Scalars['ID']['input']>;
37661
+ lowStock?: InputMaybe<Scalars['Boolean']['input']>;
37233
37662
  search?: InputMaybe<Scalars['String']['input']>;
37234
37663
  warehouseId?: InputMaybe<Scalars['ID']['input']>;
37235
37664
  };
@@ -37715,6 +38144,8 @@ export type IotThresholdRuleInput = {
37715
38144
  /** 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. */
37716
38145
  export type IrrigationAutomation = {
37717
38146
  __typename?: 'IrrigationAutomation';
38147
+ /** 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. */
38148
+ autoTaskEnabled: Scalars['Boolean']['output'];
37718
38149
  fieldId: Scalars['ID']['output'];
37719
38150
  id: Scalars['ID']['output'];
37720
38151
  /** Timestamp of the last evaluation as an ISO-8601 string. */
@@ -39617,8 +40048,14 @@ export type ListWorkflowDefinitionsInput = {
39617
40048
  };
39618
40049
  /** Input for listing runs */
39619
40050
  export type ListWorkflowRunsInput = {
40051
+ /** Filter runs created at-or-before this instant (inclusive). Bound to `createdAt` on WorkflowRun. */
40052
+ endDate?: InputMaybe<Scalars['DateTime']['input']>;
39620
40053
  limit?: InputMaybe<Scalars['Int']['input']>;
39621
40054
  offset?: InputMaybe<Scalars['Int']['input']>;
40055
+ /** 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. */
40056
+ search?: InputMaybe<Scalars['String']['input']>;
40057
+ /** Filter runs created at-or-after this instant (inclusive). Bound to `createdAt` on WorkflowRun. */
40058
+ startDate?: InputMaybe<Scalars['DateTime']['input']>;
39622
40059
  status?: InputMaybe<RunStatus>;
39623
40060
  workflowKey?: InputMaybe<Scalars['String']['input']>;
39624
40061
  };
@@ -39710,6 +40147,21 @@ export type LogFilterInput = {
39710
40147
  level?: InputMaybe<LogLevel>;
39711
40148
  startDate?: InputMaybe<Scalars['DateTime']['input']>;
39712
40149
  };
40150
+ export type LogHealthyBowlLabourEntryInput = {
40151
+ context: ContextInput;
40152
+ costCenterId: Scalars['ID']['input'];
40153
+ crewId?: InputMaybe<Scalars['ID']['input']>;
40154
+ cropId?: InputMaybe<Scalars['ID']['input']>;
40155
+ date?: InputMaybe<Scalars['String']['input']>;
40156
+ fieldId?: InputMaybe<Scalars['ID']['input']>;
40157
+ hours?: InputMaybe<Scalars['Float']['input']>;
40158
+ note?: InputMaybe<Scalars['String']['input']>;
40159
+ quantity?: InputMaybe<Scalars['Float']['input']>;
40160
+ rateAmount?: InputMaybe<Scalars['Float']['input']>;
40161
+ rateType?: InputMaybe<Scalars['String']['input']>;
40162
+ taskId?: InputMaybe<Scalars['String']['input']>;
40163
+ workerId: Scalars['ID']['input'];
40164
+ };
39713
40165
  export declare enum LogLevel {
39714
40166
  Debug = "DEBUG",
39715
40167
  Error = "ERROR",
@@ -41616,6 +42068,13 @@ export type MtwAnalyticsSeries = {
41616
42068
  orderTrend: Array<MtwAnalyticsPoint>;
41617
42069
  revenueTrend: Array<MtwAnalyticsPoint>;
41618
42070
  };
42071
+ /** Ranked vehicles and drivers that can take a route right now, best first. */
42072
+ export type MtwAssignmentSuggestions = {
42073
+ __typename?: 'MtwAssignmentSuggestions';
42074
+ drivers: Array<MtwDriverSuggestion>;
42075
+ routeId: Scalars['ID']['output'];
42076
+ vehicles: Array<MtwVehicleSuggestion>;
42077
+ };
41619
42078
  /** 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. */
41620
42079
  export type MtwCargoItem = {
41621
42080
  __typename?: 'MtwCargoItem';
@@ -41640,6 +42099,27 @@ export type MtwCargoItem = {
41640
42099
  weight?: Maybe<Scalars['Float']['output']>;
41641
42100
  workspaceId: Scalars['ID']['output'];
41642
42101
  };
42102
+ export type MtwCargoItemStats = {
42103
+ __typename?: 'MtwCargoItemStats';
42104
+ specialHandling: Scalars['Int']['output'];
42105
+ temperatureControlled: Scalars['Int']['output'];
42106
+ total: Scalars['Int']['output'];
42107
+ };
42108
+ /** How one carrier fared for a quote request. */
42109
+ export type MtwCarrierOutcome = {
42110
+ __typename?: 'MtwCarrierOutcome';
42111
+ errorMessage?: Maybe<Scalars['String']['output']>;
42112
+ ok: Scalars['Boolean']['output'];
42113
+ provider: MtwCarrierProvider;
42114
+ quoteCount: Scalars['Int']['output'];
42115
+ };
42116
+ export declare enum MtwCarrierProvider {
42117
+ Shiprocket = "SHIPROCKET"
42118
+ }
42119
+ export declare enum MtwCarrierServiceMode {
42120
+ Air = "AIR",
42121
+ Surface = "SURFACE"
42122
+ }
41643
42123
  export type MtwCustomer = {
41644
42124
  __typename?: 'MtwCustomer';
41645
42125
  address?: Maybe<Scalars['JSON']['output']>;
@@ -41661,6 +42141,15 @@ export type MtwCustomer = {
41661
42141
  updatedBy?: Maybe<Scalars['String']['output']>;
41662
42142
  workspaceId: Scalars['ID']['output'];
41663
42143
  };
42144
+ export type MtwCustomerStats = {
42145
+ __typename?: 'MtwCustomerStats';
42146
+ active: Scalars['Int']['output'];
42147
+ avgRating: Scalars['Float']['output'];
42148
+ b2b: Scalars['Int']['output'];
42149
+ b2c: Scalars['Int']['output'];
42150
+ inactive: Scalars['Int']['output'];
42151
+ total: Scalars['Int']['output'];
42152
+ };
41664
42153
  export type MtwDashboardMetrics = {
41665
42154
  __typename?: 'MtwDashboardMetrics';
41666
42155
  activeDeliveries: Scalars['Int']['output'];
@@ -41712,11 +42201,16 @@ export type MtwDeliveryJobStatusHistoryArgs = {
41712
42201
  };
41713
42202
  export type MtwDeliveryJobStats = {
41714
42203
  __typename?: 'MtwDeliveryJobStats';
42204
+ assigned: Scalars['Int']['output'];
41715
42205
  cancelled: Scalars['Int']['output'];
42206
+ confirmed: Scalars['Int']['output'];
41716
42207
  delivered: Scalars['Int']['output'];
41717
42208
  failed: Scalars['Int']['output'];
41718
42209
  inTransit: Scalars['Int']['output'];
42210
+ outForDelivery: Scalars['Int']['output'];
41719
42211
  pending: Scalars['Int']['output'];
42212
+ pickedUp: Scalars['Int']['output'];
42213
+ returned: Scalars['Int']['output'];
41720
42214
  total: Scalars['Int']['output'];
41721
42215
  };
41722
42216
  export type MtwDeliveryJobStatusHistory = {
@@ -41788,6 +42282,12 @@ export type MtwDriver = {
41788
42282
  vehicleId?: Maybe<Scalars['String']['output']>;
41789
42283
  workspaceId: Scalars['ID']['output'];
41790
42284
  };
42285
+ export type MtwDriverSuggestion = {
42286
+ __typename?: 'MtwDriverSuggestion';
42287
+ driver: MtwDriver;
42288
+ reasons: Array<Scalars['String']['output']>;
42289
+ score: Scalars['Int']['output'];
42290
+ };
41791
42291
  export type MtwEmissionsBreakdown = {
41792
42292
  __typename?: 'MtwEmissionsBreakdown';
41793
42293
  co2eKg: Scalars['Float']['output'];
@@ -41822,6 +42322,36 @@ export type MtwFinanceMetrics = {
41822
42322
  openInvoices: Scalars['Int']['output'];
41823
42323
  revenue: MtwRevenueMetrics;
41824
42324
  };
42325
+ /** A compliance or maintenance item that needs attention, computed live from vehicle service markers and driver licence expiry. */
42326
+ export type MtwFleetAlert = {
42327
+ __typename?: 'MtwFleetAlert';
42328
+ /** Negative when already past due. */
42329
+ daysUntilDue?: Maybe<Scalars['Int']['output']>;
42330
+ dueDate?: Maybe<Scalars['DateTime']['output']>;
42331
+ id: Scalars['ID']['output'];
42332
+ /** Negative when the due mileage has already been passed. Vehicles only. */
42333
+ kmUntilDue?: Maybe<Scalars['Float']['output']>;
42334
+ message: Scalars['String']['output'];
42335
+ severity: MtwFleetAlertSeverity;
42336
+ subjectId: Scalars['ID']['output'];
42337
+ subjectName: Scalars['String']['output'];
42338
+ subjectType: MtwFleetAlertSubjectType;
42339
+ type: MtwFleetAlertType;
42340
+ };
42341
+ export declare enum MtwFleetAlertSeverity {
42342
+ Critical = "CRITICAL",
42343
+ Warning = "WARNING"
42344
+ }
42345
+ export declare enum MtwFleetAlertSubjectType {
42346
+ Driver = "DRIVER",
42347
+ Vehicle = "VEHICLE"
42348
+ }
42349
+ export declare enum MtwFleetAlertType {
42350
+ LicenseExpired = "LICENSE_EXPIRED",
42351
+ LicenseExpiring = "LICENSE_EXPIRING",
42352
+ MaintenanceDueSoon = "MAINTENANCE_DUE_SOON",
42353
+ MaintenanceOverdue = "MAINTENANCE_OVERDUE"
42354
+ }
41825
42355
  export type MtwFleetStats = {
41826
42356
  __typename?: 'MtwFleetStats';
41827
42357
  activeVehicles: Scalars['Int']['output'];
@@ -41949,6 +42479,19 @@ export type MtwInventoryTransaction = {
41949
42479
  warehouseId: Scalars['ID']['output'];
41950
42480
  workspaceId: Scalars['ID']['output'];
41951
42481
  };
42482
+ /** An estimate from the caller's own inputs — not a quote from anyone. */
42483
+ export type MtwOwnFleetEstimate = {
42484
+ __typename?: 'MtwOwnFleetEstimate';
42485
+ /** fixedCost + distanceKm * costPerKm. */
42486
+ cost: Scalars['Float']['output'];
42487
+ costPerKm: Scalars['Float']['output'];
42488
+ currency: Scalars['String']['output'];
42489
+ distanceKm: Scalars['Float']['output'];
42490
+ fixedCost: Scalars['Float']['output'];
42491
+ isCheaperThanCouriers: Scalars['Boolean']['output'];
42492
+ /** Cheapest courier price minus this estimate. Positive means running your own vehicle is cheaper. Null when no courier quoted. */
42493
+ savingsVsCheapestCourier?: Maybe<Scalars['Float']['output']>;
42494
+ };
41952
42495
  /** 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). */
41953
42496
  export type MtwProofOfDelivery = {
41954
42497
  __typename?: 'MtwProofOfDelivery';
@@ -42010,6 +42553,16 @@ export type MtwRoute = {
42010
42553
  waypoints: Scalars['JSON']['output'];
42011
42554
  workspaceId: Scalars['ID']['output'];
42012
42555
  };
42556
+ export type MtwRouteStats = {
42557
+ __typename?: 'MtwRouteStats';
42558
+ completed: Scalars['Int']['output'];
42559
+ inProgress: Scalars['Int']['output'];
42560
+ optimized: Scalars['Int']['output'];
42561
+ planned: Scalars['Int']['output'];
42562
+ total: Scalars['Int']['output'];
42563
+ totalDistance: Scalars['Float']['output'];
42564
+ totalDuration: Scalars['Float']['output'];
42565
+ };
42013
42566
  export type MtwShipment = {
42014
42567
  __typename?: 'MtwShipment';
42015
42568
  actualDelivery?: Maybe<Scalars['DateTime']['output']>;
@@ -42042,6 +42595,9 @@ export type MtwShipment = {
42042
42595
  updatedBy?: Maybe<Scalars['String']['output']>;
42043
42596
  workspaceId: Scalars['ID']['output'];
42044
42597
  };
42598
+ export type MtwShipmentLegsArgs = {
42599
+ pagination?: InputMaybe<PaginationInput>;
42600
+ };
42045
42601
  export type MtwShipmentTrackingEventsArgs = {
42046
42602
  pagination?: InputMaybe<PaginationInput>;
42047
42603
  };
@@ -42085,6 +42641,34 @@ export type MtwShipmentLeg = {
42085
42641
  widthCm?: Maybe<Scalars['Float']['output']>;
42086
42642
  workspaceId: Scalars['ID']['output'];
42087
42643
  };
42644
+ export type MtwShippingQuote = {
42645
+ __typename?: 'MtwShippingQuote';
42646
+ courierId: Scalars['String']['output'];
42647
+ courierName: Scalars['String']['output'];
42648
+ currency: Scalars['String']['output'];
42649
+ estimatedDeliveryDate?: Maybe<Scalars['String']['output']>;
42650
+ estimatedDeliveryDays?: Maybe<Scalars['Int']['output']>;
42651
+ isCheapest: Scalars['Boolean']['output'];
42652
+ isFastest: Scalars['Boolean']['output'];
42653
+ /** Flagged by the carrier itself as its recommendation. */
42654
+ isRecommended: Scalars['Boolean']['output'];
42655
+ mode?: Maybe<MtwCarrierServiceMode>;
42656
+ price: Scalars['Float']['output'];
42657
+ provider: MtwCarrierProvider;
42658
+ /** 0-5, when the carrier publishes one. */
42659
+ rating?: Maybe<Scalars['Float']['output']>;
42660
+ };
42661
+ export type MtwShippingQuoteResult = {
42662
+ __typename?: 'MtwShippingQuoteResult';
42663
+ /** max(dead weight, volumetric weight) actually sent to the carriers. */
42664
+ chargeableWeightKg: Scalars['Float']['output'];
42665
+ /** Present only when the input carried ownFleet. */
42666
+ ownFleet?: Maybe<MtwOwnFleetEstimate>;
42667
+ /** One entry per carrier queried, so a failing carrier is visible rather than silently missing. */
42668
+ providers: Array<MtwCarrierOutcome>;
42669
+ /** Every quote from every connected carrier, cheapest first. */
42670
+ quotes: Array<MtwShippingQuote>;
42671
+ };
42088
42672
  export type MtwTrackingAlert = {
42089
42673
  __typename?: 'MtwTrackingAlert';
42090
42674
  alertType: Scalars['String']['output'];
@@ -42121,10 +42705,13 @@ export type MtwVehicle = {
42121
42705
  fuelLevel?: Maybe<Scalars['Float']['output']>;
42122
42706
  fuelType?: Maybe<FuelType>;
42123
42707
  id: Scalars['ID']['output'];
42708
+ lastServiceDate?: Maybe<Scalars['DateTime']['output']>;
42124
42709
  licensePlate?: Maybe<Scalars['String']['output']>;
42125
42710
  make?: Maybe<Scalars['String']['output']>;
42126
42711
  mileage?: Maybe<Scalars['Float']['output']>;
42127
42712
  model?: Maybe<Scalars['String']['output']>;
42713
+ nextServiceDueDate?: Maybe<Scalars['DateTime']['output']>;
42714
+ nextServiceDueMileage?: Maybe<Scalars['Float']['output']>;
42128
42715
  onBehalfOf: Scalars['String']['output'];
42129
42716
  ownershipType?: Maybe<Scalars['String']['output']>;
42130
42717
  status: VehicleStatus;
@@ -42135,6 +42722,12 @@ export type MtwVehicle = {
42135
42722
  workspaceId: Scalars['ID']['output'];
42136
42723
  year?: Maybe<Scalars['Int']['output']>;
42137
42724
  };
42725
+ export type MtwVehicleSuggestion = {
42726
+ __typename?: 'MtwVehicleSuggestion';
42727
+ reasons: Array<Scalars['String']['output']>;
42728
+ score: Scalars['Int']['output'];
42729
+ vehicle: MtwVehicle;
42730
+ };
42138
42731
  export type MtwWarehouse = {
42139
42732
  __typename?: 'MtwWarehouse';
42140
42733
  address: Scalars['JSON']['output'];
@@ -42183,6 +42776,12 @@ export type MtwWarehouseLocation = {
42183
42776
  workspaceId: Scalars['ID']['output'];
42184
42777
  zone?: Maybe<Scalars['String']['output']>;
42185
42778
  };
42779
+ export type MtwWarehouseStats = {
42780
+ __typename?: 'MtwWarehouseStats';
42781
+ active: Scalars['Int']['output'];
42782
+ avgUtilization: Scalars['Float']['output'];
42783
+ total: Scalars['Int']['output'];
42784
+ };
42186
42785
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
42187
42786
  export type Mutation = {
42188
42787
  __typename?: 'Mutation';
@@ -42357,6 +42956,7 @@ export type Mutation = {
42357
42956
  approveGgnomadDamageClaim: GgnomadDamageClaim;
42358
42957
  /** BOFF-4388 — operator-only (see GGNOMAD_ROLES marketplace-operator): approves a PENDING_REVIEW listing, moving it to ACTIVE. */
42359
42958
  approveGgnomadListing: GgnomadListing;
42959
+ approveHealthyBowlLabourEntry: HealthyBowlLabourEntry;
42360
42960
  approveHousingvistaVerificationItem: HousingVistaVerificationItem;
42361
42961
  approveJoinRequest: GroupMembership;
42362
42962
  approveRequest: TimeApprovalRequest;
@@ -43137,6 +43737,8 @@ export type Mutation = {
43137
43737
  createDataSink: DataSink;
43138
43738
  createDeliveryJob: MtwDeliveryJob;
43139
43739
  createDigitalTwin: DigitalTwin;
43740
+ /** 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. */
43741
+ createDisposableWorkspace: Workspace;
43140
43742
  /** Create a new docs page */
43141
43743
  createDocsPage: VibecontrolsDocsPage;
43142
43744
  createDocsShareLink: ShareGrant;
@@ -43273,6 +43875,7 @@ export type Mutation = {
43273
43875
  /** Sponsor: open a DRAFT aggregation lot for a contract. */
43274
43876
  createHealthyBowlContractAggregationLot: HealthyBowlContractAggregationLot;
43275
43877
  createHealthyBowlCostCenter: HealthyBowlCostCenter;
43878
+ createHealthyBowlCrew: HealthyBowlCrew;
43276
43879
  createHealthyBowlCrop: Crop;
43277
43880
  createHealthyBowlCsaPickupLocation: HealthyBowlPickupLocation;
43278
43881
  createHealthyBowlCsaPlan: CsaPlan;
@@ -43303,6 +43906,8 @@ export type Mutation = {
43303
43906
  createHealthyBowlIrrigationAutomation: IrrigationAutomation;
43304
43907
  createHealthyBowlIrrigationSchedule: IrrigationSchedule;
43305
43908
  createHealthyBowlLedgerAccount: HealthyBowlLedgerAccount;
43909
+ /** BOFF-6077 — add a tranche to a loan's release schedule. */
43910
+ createHealthyBowlLoanMilestone: HealthyBowlLoanMilestone;
43306
43911
  createHealthyBowlMapFeature: MapFeature;
43307
43912
  createHealthyBowlMarketplaceProduct: MarketplaceProduct;
43308
43913
  createHealthyBowlMedicationLibraryItem: MedicationLibraryItem;
@@ -43342,6 +43947,7 @@ export type Mutation = {
43342
43947
  /** Log a watering run (manual now; also called by FluidGrids automation later). */
43343
43948
  createHealthyBowlWateringRun: WateringRun;
43344
43949
  createHealthyBowlWholesaleOrder: WholesaleOrder;
43950
+ createHealthyBowlWorker: HealthyBowlWorker;
43345
43951
  createHousingvistaAmcContract: HousingVistaAmcContract;
43346
43952
  createHousingvistaAreaInsight: HousingVistaAreaInsight;
43347
43953
  createHousingvistaAsset: HousingVistaAsset;
@@ -43523,6 +44129,10 @@ export type Mutation = {
43523
44129
  deactivateVibecontrolsAgent: VibecontrolsAgent;
43524
44130
  /** Deactivate a workflow definition (sets status to DRAFT, disables scheduled triggers) */
43525
44131
  deactivateWorkflowDefinition: WorkflowDefinition;
44132
+ /** Accept or reject a proposal. A BLOCKED proposal cannot be decided at all. */
44133
+ decideHealthyBowlAgronomyDecision: AgronomyDecision;
44134
+ /** 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. */
44135
+ decideHealthyBowlFarmRecommendation: HealthyBowlFarmRecommendation;
43526
44136
  declareLifeValue: TimeCampusLifeValue;
43527
44137
  /** Decline a file/folder share invitation. */
43528
44138
  declineFileShare: Scalars['Boolean']['output'];
@@ -43690,6 +44300,7 @@ export type Mutation = {
43690
44300
  deleteHealthyBowlCompostBatch: Scalars['Boolean']['output'];
43691
44301
  deleteHealthyBowlContact: Scalars['Boolean']['output'];
43692
44302
  deleteHealthyBowlCostCenter: Scalars['Boolean']['output'];
44303
+ deleteHealthyBowlCrew: Scalars['Boolean']['output'];
43693
44304
  deleteHealthyBowlCrop: Scalars['Boolean']['output'];
43694
44305
  deleteHealthyBowlCsaPlan: Scalars['Boolean']['output'];
43695
44306
  deleteHealthyBowlDeliveryRoute: Scalars['Boolean']['output'];
@@ -43724,6 +44335,7 @@ export type Mutation = {
43724
44335
  deleteHealthyBowlIrrigationAutomation: Scalars['Boolean']['output'];
43725
44336
  deleteHealthyBowlIrrigationSchedule: Scalars['Boolean']['output'];
43726
44337
  deleteHealthyBowlJournalEntry: Scalars['Boolean']['output'];
44338
+ deleteHealthyBowlLabourEntry: Scalars['Boolean']['output'];
43727
44339
  deleteHealthyBowlLedgerAccount: Scalars['Boolean']['output'];
43728
44340
  deleteHealthyBowlMapFeature: Scalars['Boolean']['output'];
43729
44341
  deleteHealthyBowlMarketplaceProduct: Scalars['Boolean']['output'];
@@ -43756,6 +44368,7 @@ export type Mutation = {
43756
44368
  deleteHealthyBowlTreatment: Scalars['Boolean']['output'];
43757
44369
  deleteHealthyBowlVaccination: Scalars['Boolean']['output'];
43758
44370
  deleteHealthyBowlWholesaleOrder: Scalars['Boolean']['output'];
44371
+ deleteHealthyBowlWorker: Scalars['Boolean']['output'];
43759
44372
  /** Delete a saved yield scenario. */
43760
44373
  deleteHealthyBowlYieldScenario: Scalars['Boolean']['output'];
43761
44374
  deleteHousingvistaAmcContract: Scalars['Boolean']['output'];
@@ -43937,6 +44550,8 @@ export type Mutation = {
43937
44550
  dispatchHealthyBowlAccountingSync: Scalars['Int']['output'];
43938
44551
  /** 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. */
43939
44552
  dispatchHealthyBowlAuctionSweep: Scalars['Int']['output'];
44553
+ /** FluidGrids callback: send due confirmed-consultation reminders. Authorized by a per-workspace HMAC. */
44554
+ dispatchHealthyBowlConsultReminderSweep: Scalars['Int']['output'];
43940
44555
  /** 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. */
43941
44556
  dispatchHealthyBowlCsaNotification: Scalars['Boolean']['output'];
43942
44557
  /** 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. */
@@ -44202,6 +44817,8 @@ export type Mutation = {
44202
44817
  generateGroupShareLink: GroupShareLink;
44203
44818
  /** AI-assisted (LLM, with deterministic fallback) budget reallocation recommendation. */
44204
44819
  generateHeadshotmarketingAdBudgetRecommendation: HeadshotmarketingAdBudgetRecommendation;
44820
+ /** 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. */
44821
+ generateHealthyBowlAnalyticsReport: AnalyticsReport;
44205
44822
  generateHealthyBowlCertificateOfOrigin: CertificateOfOrigin;
44206
44823
  /** Build a numbered, ordered route from the SCHEDULED CSA deliveries in a date range. */
44207
44824
  generateHealthyBowlDeliveryRoute: DeliveryRoute;
@@ -44793,6 +45410,7 @@ export type Mutation = {
44793
45410
  /** Freeze an inventory's activity snapshots (DRAFT → LOCKED). */
44794
45411
  lockHealthyBowlGhgInventory: HbGhgInventory;
44795
45412
  lockVault: Vault;
45413
+ logHealthyBowlLabourEntry: HealthyBowlLabourEntry;
44796
45414
  /** Log a medication treatment: computes per-produce clear dates and fires the 'withdrawal started' in-app notification. */
44797
45415
  logHealthyBowlMedicationTreatment: MedicationTreatment;
44798
45416
  /** One-tap "Log to Pest Issues": create a persisted PestIssue pre-filled from a scan's diagnosis, entering the normal open→monitoring→resolved workflow. */
@@ -45227,6 +45845,8 @@ export type Mutation = {
45227
45845
  promptUpdateProvider: PromptProvider;
45228
45846
  promptUpdateTemplate: PromptTemplateDef;
45229
45847
  propagateTagToChildren: Array<UniversalTagAssignment>;
45848
+ /** 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. */
45849
+ proposeHealthyBowlAgronomyDecisions: AgronomyDecisionSweepResult;
45230
45850
  /** 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. */
45231
45851
  proxySandboxRequest: ProxySandboxResponse;
45232
45852
  pswAddTeamAssignment: PswTeamAssignment;
@@ -45379,6 +45999,7 @@ export type Mutation = {
45379
45999
  recordKnowledgeArticleView: KnowledgeArticle;
45380
46000
  recordProvenance: ProvenanceRecord;
45381
46001
  recordTimeCampusImpersonationAudit: TimeCampusImpersonationAuditEntry;
46002
+ recordVehicleService: MtwVehicle;
45382
46003
  recordWorkPattern: WorkPattern;
45383
46004
  /** 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`. */
45384
46005
  redeemGgnomadLoyaltyPoints: GgnomadLoyaltyRedemption;
@@ -45444,6 +46065,8 @@ export type Mutation = {
45444
46065
  releaseCrewEscrowRecord: CrewEscrowRecord;
45445
46066
  /** Release a file lock */
45446
46067
  releaseFileLock: ReleaseLockResponse;
46068
+ /** 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. */
46069
+ releaseHealthyBowlLoanMilestone: HealthyBowlLoanMilestone;
45447
46070
  releaseLegalHold: LegalHold;
45448
46071
  /** Release control of a session */
45449
46072
  releaseSessionControl: Scalars['Boolean']['output'];
@@ -45571,6 +46194,8 @@ export type Mutation = {
45571
46194
  reportAiTokenUsage: Scalars['Boolean']['output'];
45572
46195
  /** 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. */
45573
46196
  reportGovAiTokenUsage: Scalars['Boolean']['output'];
46197
+ /** 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. */
46198
+ reportHealthyBowlAiTokenUsage: Scalars['Boolean']['output'];
45574
46199
  reportMessage: ReportMessagePayload;
45575
46200
  reprocessTimeCampusTimeline: TimeCampusAdminMutationResult;
45576
46201
  /** 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. */
@@ -45889,12 +46514,16 @@ export type Mutation = {
45889
46514
  /** Set a view as the default */
45890
46515
  setDefaultView: DashboardView;
45891
46516
  setEventWebhook: WebhookConfig;
46517
+ /** BOFF-6030 — publish or update a consultant's weekly availability. One rule per weekday. */
46518
+ setHealthyBowlConsultAvailability: Scalars['ID']['output'];
45892
46519
  /** Replace the full structured-tag set on a HealthyBowl entity (entity-owned tags, reuse wspace-tags-svc). */
45893
46520
  setHealthyBowlEntityTags: Array<HealthyBowlTag>;
45894
46521
  /** 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. */
45895
46522
  setHealthyBowlInsuranceDocument: HealthyBowlInsurancePolicy;
45896
46523
  /** 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. */
45897
46524
  setHealthyBowlListingShared: MarketplaceProduct;
46525
+ /** BOFF-6077 — record what the lender has committed to release across this loan's milestones. */
46526
+ setHealthyBowlLoanEscrowCommitment: HealthyBowlLoanFacilitation;
45898
46527
  /** Set a paddock's own rest target. Writes to the field row, so it uses the field RBAC pair rather than the animal one. */
45899
46528
  setHealthyBowlPaddockRest: HealthyBowlPaddockGrazing;
45900
46529
  /** Replace a product's whole quantity ladder in one transaction (BOFF-6091). Refuses duplicate thresholds. */
@@ -46577,6 +47206,7 @@ export type Mutation = {
46577
47206
  updateHealthyBowlConsultationStatus: Consultation;
46578
47207
  updateHealthyBowlContact: HealthyBowlContact;
46579
47208
  updateHealthyBowlCostCenter: HealthyBowlCostCenter;
47209
+ updateHealthyBowlCrew: HealthyBowlCrew;
46580
47210
  updateHealthyBowlCrop: Crop;
46581
47211
  updateHealthyBowlCsaDelivery: CsaDelivery;
46582
47212
  updateHealthyBowlCsaMembership: CsaMembership;
@@ -46609,6 +47239,7 @@ export type Mutation = {
46609
47239
  updateHealthyBowlIrrigationAutomation: IrrigationAutomation;
46610
47240
  /** Update a schedule; also handles pause/resume via the status field. */
46611
47241
  updateHealthyBowlIrrigationSchedule: IrrigationSchedule;
47242
+ updateHealthyBowlLabourEntry: HealthyBowlLabourEntry;
46612
47243
  updateHealthyBowlLedgerAccount: HealthyBowlLedgerAccount;
46613
47244
  updateHealthyBowlLoanFacilitation: HealthyBowlLoanFacilitation;
46614
47245
  updateHealthyBowlMapFeature: MapFeature;
@@ -46630,6 +47261,7 @@ export type Mutation = {
46630
47261
  updateHealthyBowlRecipe: Recipe;
46631
47262
  /** Update the workspace satellite ingestion settings. */
46632
47263
  updateHealthyBowlSatelliteSettings: HbSatelliteSettings;
47264
+ updateHealthyBowlSchemeApplicationStatus: SchemeApplication;
46633
47265
  updateHealthyBowlSeedLot: SeedLot;
46634
47266
  updateHealthyBowlSensorProbe: SensorProbe;
46635
47267
  updateHealthyBowlSoilTest: SoilTest;
@@ -46644,6 +47276,7 @@ export type Mutation = {
46644
47276
  updateHealthyBowlTreatment: Treatment;
46645
47277
  updateHealthyBowlVaccination: Vaccination;
46646
47278
  updateHealthyBowlWholesaleOrder: WholesaleOrder;
47279
+ updateHealthyBowlWorker: HealthyBowlWorker;
46647
47280
  updateHousingvistaAmcContract: HousingVistaAmcContract;
46648
47281
  updateHousingvistaAreaInsight: HousingVistaAreaInsight;
46649
47282
  updateHousingvistaAsset: HousingVistaAsset;
@@ -47390,6 +48023,11 @@ export type MutationApproveGgnomadListingArgs = {
47390
48023
  note?: InputMaybe<Scalars['String']['input']>;
47391
48024
  };
47392
48025
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
48026
+ export type MutationApproveHealthyBowlLabourEntryArgs = {
48027
+ context: ContextInput;
48028
+ id: Scalars['ID']['input'];
48029
+ };
48030
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
47393
48031
  export type MutationApproveHousingvistaVerificationItemArgs = {
47394
48032
  id: Scalars['ID']['input'];
47395
48033
  notes?: InputMaybe<Scalars['String']['input']>;
@@ -49759,6 +50397,10 @@ export type MutationCreateDigitalTwinArgs = {
49759
50397
  input: CreateDigitalTwinInput;
49760
50398
  };
49761
50399
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
50400
+ export type MutationCreateDisposableWorkspaceArgs = {
50401
+ input: CreateDisposableWorkspaceInput;
50402
+ };
50403
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
49762
50404
  export type MutationCreateDocsPageArgs = {
49763
50405
  input: CreateVibecontrolsDocsPageInput;
49764
50406
  };
@@ -50128,6 +50770,10 @@ export type MutationCreateHealthyBowlCostCenterArgs = {
50128
50770
  input: CreateHealthyBowlCostCenterInput;
50129
50771
  };
50130
50772
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
50773
+ export type MutationCreateHealthyBowlCrewArgs = {
50774
+ input: CreateHealthyBowlCrewInput;
50775
+ };
50776
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
50131
50777
  export type MutationCreateHealthyBowlCropArgs = {
50132
50778
  input: CreateCropInput;
50133
50779
  };
@@ -50236,6 +50882,10 @@ export type MutationCreateHealthyBowlLedgerAccountArgs = {
50236
50882
  input: CreateHealthyBowlLedgerAccountInput;
50237
50883
  };
50238
50884
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
50885
+ export type MutationCreateHealthyBowlLoanMilestoneArgs = {
50886
+ input: CreateHealthyBowlLoanMilestoneInput;
50887
+ };
50888
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
50239
50889
  export type MutationCreateHealthyBowlMapFeatureArgs = {
50240
50890
  input: CreateHealthyBowlMapFeatureInput;
50241
50891
  };
@@ -50374,6 +51024,10 @@ export type MutationCreateHealthyBowlWholesaleOrderArgs = {
50374
51024
  input: CreateHealthyBowlWholesaleOrderInput;
50375
51025
  };
50376
51026
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
51027
+ export type MutationCreateHealthyBowlWorkerArgs = {
51028
+ input: CreateHealthyBowlWorkerInput;
51029
+ };
51030
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
50377
51031
  export type MutationCreateHousingvistaAmcContractArgs = {
50378
51032
  input: HousingVistaCreateAmcContractInput;
50379
51033
  };
@@ -50930,6 +51584,14 @@ export type MutationDeactivateWorkflowDefinitionArgs = {
50930
51584
  id: Scalars['ID']['input'];
50931
51585
  };
50932
51586
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
51587
+ export type MutationDecideHealthyBowlAgronomyDecisionArgs = {
51588
+ input: DecideAgronomyDecisionInput;
51589
+ };
51590
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
51591
+ export type MutationDecideHealthyBowlFarmRecommendationArgs = {
51592
+ input: DecideHealthyBowlFarmRecommendationInput;
51593
+ };
51594
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
50933
51595
  export type MutationDeclareLifeValueArgs = {
50934
51596
  input: TimeCampusLifeValueInput;
50935
51597
  };
@@ -51431,6 +52093,11 @@ export type MutationDeleteHealthyBowlCostCenterArgs = {
51431
52093
  id: Scalars['ID']['input'];
51432
52094
  };
51433
52095
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
52096
+ export type MutationDeleteHealthyBowlCrewArgs = {
52097
+ context: ContextInput;
52098
+ id: Scalars['ID']['input'];
52099
+ };
52100
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
51434
52101
  export type MutationDeleteHealthyBowlCropArgs = {
51435
52102
  context: ContextInput;
51436
52103
  id: Scalars['ID']['input'];
@@ -51592,6 +52259,11 @@ export type MutationDeleteHealthyBowlJournalEntryArgs = {
51592
52259
  id: Scalars['ID']['input'];
51593
52260
  };
51594
52261
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
52262
+ export type MutationDeleteHealthyBowlLabourEntryArgs = {
52263
+ context: ContextInput;
52264
+ id: Scalars['ID']['input'];
52265
+ };
52266
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
51595
52267
  export type MutationDeleteHealthyBowlLedgerAccountArgs = {
51596
52268
  context: ContextInput;
51597
52269
  id: Scalars['ID']['input'];
@@ -51747,6 +52419,11 @@ export type MutationDeleteHealthyBowlWholesaleOrderArgs = {
51747
52419
  id: Scalars['ID']['input'];
51748
52420
  };
51749
52421
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
52422
+ export type MutationDeleteHealthyBowlWorkerArgs = {
52423
+ context: ContextInput;
52424
+ id: Scalars['ID']['input'];
52425
+ };
52426
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
51750
52427
  export type MutationDeleteHealthyBowlYieldScenarioArgs = {
51751
52428
  context: ContextInput;
51752
52429
  id: Scalars['ID']['input'];
@@ -52311,6 +52988,10 @@ export type MutationDispatchHealthyBowlAuctionSweepArgs = {
52311
52988
  input: DispatchHealthyBowlAuctionSweepInput;
52312
52989
  };
52313
52990
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
52991
+ export type MutationDispatchHealthyBowlConsultReminderSweepArgs = {
52992
+ input: DispatchHealthyBowlConsultReminderSweepInput;
52993
+ };
52994
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
52314
52995
  export type MutationDispatchHealthyBowlCsaNotificationArgs = {
52315
52996
  input: DispatchHealthyBowlCsaNotificationInput;
52316
52997
  };
@@ -53165,6 +53846,14 @@ export type MutationGenerateHeadshotmarketingAdBudgetRecommendationArgs = {
53165
53846
  adCampaignId: Scalars['ID']['input'];
53166
53847
  };
53167
53848
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
53849
+ export type MutationGenerateHealthyBowlAnalyticsReportArgs = {
53850
+ context: ContextInput;
53851
+ endDate: Scalars['String']['input'];
53852
+ startDate: Scalars['String']['input'];
53853
+ title?: InputMaybe<Scalars['String']['input']>;
53854
+ type: HealthyBowlGeneratableReportType;
53855
+ };
53856
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
53168
53857
  export type MutationGenerateHealthyBowlCertificateOfOriginArgs = {
53169
53858
  input: GenerateCertificateOfOriginInput;
53170
53859
  };
@@ -54879,6 +55568,10 @@ export type MutationLockVaultArgs = {
54879
55568
  id: Scalars['ID']['input'];
54880
55569
  };
54881
55570
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
55571
+ export type MutationLogHealthyBowlLabourEntryArgs = {
55572
+ input: LogHealthyBowlLabourEntryInput;
55573
+ };
55574
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
54882
55575
  export type MutationLogHealthyBowlMedicationTreatmentArgs = {
54883
55576
  input: LogMedicationTreatmentInput;
54884
55577
  };
@@ -56048,6 +56741,10 @@ export type MutationPropagateTagToChildrenArgs = {
56048
56741
  assignmentId: Scalars['ID']['input'];
56049
56742
  };
56050
56743
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
56744
+ export type MutationProposeHealthyBowlAgronomyDecisionsArgs = {
56745
+ input: ProposeAgronomyDecisionsInput;
56746
+ };
56747
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
56051
56748
  export type MutationProxySandboxRequestArgs = {
56052
56749
  input: ProxySandboxRequestInput;
56053
56750
  };
@@ -56485,6 +57182,11 @@ export type MutationRecordTimeCampusImpersonationAuditArgs = {
56485
57182
  input: RecordTimeCampusImpersonationInput;
56486
57183
  };
56487
57184
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57185
+ export type MutationRecordVehicleServiceArgs = {
57186
+ id: Scalars['ID']['input'];
57187
+ input: RecordVehicleServiceInput;
57188
+ };
57189
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
56488
57190
  export type MutationRecordWorkPatternArgs = {
56489
57191
  input: RecordWorkPatternInput;
56490
57192
  };
@@ -56664,6 +57366,10 @@ export type MutationReleaseFileLockArgs = {
56664
57366
  input: ReleaseLockInput;
56665
57367
  };
56666
57368
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57369
+ export type MutationReleaseHealthyBowlLoanMilestoneArgs = {
57370
+ input: ReleaseHealthyBowlLoanMilestoneInput;
57371
+ };
57372
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
56667
57373
  export type MutationReleaseLegalHoldArgs = {
56668
57374
  id: Scalars['ID']['input'];
56669
57375
  };
@@ -57059,6 +57765,10 @@ export type MutationReportGovAiTokenUsageArgs = {
57059
57765
  input: ReportGovAiTokenUsageInput;
57060
57766
  };
57061
57767
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57768
+ export type MutationReportHealthyBowlAiTokenUsageArgs = {
57769
+ input: ReportHealthyBowlAiTokenUsageInput;
57770
+ };
57771
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
57062
57772
  export type MutationReportMessageArgs = {
57063
57773
  messageId: Scalars['ID']['input'];
57064
57774
  reason: Scalars['String']['input'];
@@ -58001,6 +58711,10 @@ export type MutationSetEventWebhookArgs = {
58001
58711
  eventId: Scalars['ID']['input'];
58002
58712
  };
58003
58713
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58714
+ export type MutationSetHealthyBowlConsultAvailabilityArgs = {
58715
+ input: SetHealthyBowlConsultAvailabilityInput;
58716
+ };
58717
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58004
58718
  export type MutationSetHealthyBowlEntityTagsArgs = {
58005
58719
  input: SetHealthyBowlEntityTagsInput;
58006
58720
  };
@@ -58015,6 +58729,10 @@ export type MutationSetHealthyBowlListingSharedArgs = {
58015
58729
  shared: Scalars['Boolean']['input'];
58016
58730
  };
58017
58731
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58732
+ export type MutationSetHealthyBowlLoanEscrowCommitmentArgs = {
58733
+ input: SetHealthyBowlLoanEscrowCommitmentInput;
58734
+ };
58735
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
58018
58736
  export type MutationSetHealthyBowlPaddockRestArgs = {
58019
58737
  input: SetHealthyBowlPaddockRestInput;
58020
58738
  };
@@ -60191,6 +60909,10 @@ export type MutationUpdateHealthyBowlCostCenterArgs = {
60191
60909
  input: UpdateHealthyBowlCostCenterInput;
60192
60910
  };
60193
60911
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
60912
+ export type MutationUpdateHealthyBowlCrewArgs = {
60913
+ input: UpdateHealthyBowlCrewInput;
60914
+ };
60915
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
60194
60916
  export type MutationUpdateHealthyBowlCropArgs = {
60195
60917
  input: UpdateCropInput;
60196
60918
  };
@@ -60307,6 +61029,10 @@ export type MutationUpdateHealthyBowlIrrigationScheduleArgs = {
60307
61029
  input: UpdateHealthyBowlIrrigationScheduleInput;
60308
61030
  };
60309
61031
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
61032
+ export type MutationUpdateHealthyBowlLabourEntryArgs = {
61033
+ input: UpdateHealthyBowlLabourEntryInput;
61034
+ };
61035
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
60310
61036
  export type MutationUpdateHealthyBowlLedgerAccountArgs = {
60311
61037
  input: UpdateHealthyBowlLedgerAccountInput;
60312
61038
  };
@@ -60398,6 +61124,10 @@ export type MutationUpdateHealthyBowlSatelliteSettingsArgs = {
60398
61124
  input: HbUpdateSatelliteSettingsInput;
60399
61125
  };
60400
61126
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
61127
+ export type MutationUpdateHealthyBowlSchemeApplicationStatusArgs = {
61128
+ input: UpdateSchemeApplicationStatusInput;
61129
+ };
61130
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
60401
61131
  export type MutationUpdateHealthyBowlSeedLotArgs = {
60402
61132
  input: UpdateHealthyBowlSeedLotInput;
60403
61133
  };
@@ -60454,6 +61184,10 @@ export type MutationUpdateHealthyBowlWholesaleOrderArgs = {
60454
61184
  input: UpdateHealthyBowlWholesaleOrderInput;
60455
61185
  };
60456
61186
  /** Base Mutation type with placeholder field. Extended by individual mutation files. */
61187
+ export type MutationUpdateHealthyBowlWorkerArgs = {
61188
+ input: UpdateHealthyBowlWorkerInput;
61189
+ };
61190
+ /** Base Mutation type with placeholder field. Extended by individual mutation files. */
60457
61191
  export type MutationUpdateHousingvistaAmcContractArgs = {
60458
61192
  id: Scalars['ID']['input'];
60459
61193
  input: HousingVistaUpdateAmcContractInput;
@@ -62542,6 +63276,15 @@ export declare enum OverrideType {
62542
63276
  /** Explicitly grant permission (overrides denial) */
62543
63277
  Grant = "GRANT"
62544
63278
  }
63279
+ /** 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. */
63280
+ export type OwnFleetInput = {
63281
+ /** The business's own cost to run a vehicle one km (fuel, driver, wear), in INR. */
63282
+ costPerKm: Scalars['Float']['input'];
63283
+ /** Road distance between pickup and delivery, in km. */
63284
+ distanceKm: Scalars['Float']['input'];
63285
+ /** Fixed cost per trip (loading, dispatch), in INR. */
63286
+ fixedCost?: InputMaybe<Scalars['Float']['input']>;
63287
+ };
62545
63288
  export declare enum PackageKind {
62546
63289
  A2AAgent = "A2A_AGENT",
62547
63290
  Agent = "AGENT",
@@ -64952,6 +65695,8 @@ export type PlantingPlan = {
64952
65695
  bedId?: Maybe<Scalars['ID']['output']>;
64953
65696
  cropId?: Maybe<Scalars['ID']['output']>;
64954
65697
  cropName: Scalars['String']['output'];
65698
+ /** BOFF-6100 — authoritative plants-per-square-metre derived with the seed figures. */
65699
+ density?: Maybe<Scalars['Float']['output']>;
64955
65700
  endDate?: Maybe<Scalars['String']['output']>;
64956
65701
  expectedYield?: Maybe<Scalars['Float']['output']>;
64957
65702
  fertilizers: Array<Scalars['String']['output']>;
@@ -66275,6 +67020,11 @@ export type PropertyFilterInput = {
66275
67020
  property: Scalars['String']['input'];
66276
67021
  value?: InputMaybe<Scalars['JSON']['input']>;
66277
67022
  };
67023
+ export type ProposeAgronomyDecisionsInput = {
67024
+ context: ContextInput;
67025
+ /** IRRIGATION | TREATMENT. */
67026
+ decisionType: Scalars['String']['input'];
67027
+ };
66278
67028
  export type ProvenanceRecord = {
66279
67029
  __typename?: 'ProvenanceRecord';
66280
67030
  assetId: Scalars['ID']['output'];
@@ -67705,6 +68455,7 @@ export type Query = {
67705
68455
  assetDeadlineAlerts: Array<AssetDeadlineAlert>;
67706
68456
  assetRegister: Array<Asset>;
67707
68457
  assets: Array<Asset>;
68458
+ assignmentSuggestions: MtwAssignmentSuggestions;
67708
68459
  /** The transcript of one of my assistant chats, oldest first. */
67709
68460
  assistantConversationMessages: Array<AssistantHistoryMessage>;
67710
68461
  /** My assistant chats for one product, newest first. */
@@ -67861,6 +68612,7 @@ export type Query = {
67861
68612
  callSession?: Maybe<CallSession>;
67862
68613
  capacityOverview: CapacityOverview;
67863
68614
  cargoItem?: Maybe<MtwCargoItem>;
68615
+ cargoItemStats: MtwCargoItemStats;
67864
68616
  cargoItems: Array<MtwCargoItem>;
67865
68617
  cargoItemsCount: Scalars['Int']['output'];
67866
68618
  changeRequest?: Maybe<ChangeRequest>;
@@ -68112,6 +68864,7 @@ export type Query = {
68112
68864
  crewfoundryHealth: Scalars['String']['output'];
68113
68865
  customNodes: NodesPaginatedResponse;
68114
68866
  customer?: Maybe<MtwCustomer>;
68867
+ customerStats: MtwCustomerStats;
68115
68868
  customers: Array<MtwCustomer>;
68116
68869
  customersCount: Scalars['Int']['output'];
68117
68870
  dashboard?: Maybe<AnalyticsDashboard>;
@@ -68306,6 +69059,7 @@ export type Query = {
68306
69059
  /** Find shortest path between two nodes */
68307
69060
  findShortestPath?: Maybe<GraphPath>;
68308
69061
  findSynonyms: Array<UniversalTag>;
69062
+ fleetAlerts: Array<MtwFleetAlert>;
68309
69063
  fleetStats: MtwFleetStats;
68310
69064
  /** Tags currently assigned to a FluidGrids entity */
68311
69065
  fluidgridsEntityTags: Array<FluidgridsTagAssignment>;
@@ -68506,7 +69260,11 @@ export type Query = {
68506
69260
  getHealthyBowlActiveWithdrawals: Array<MedicationTreatment>;
68507
69261
  getHealthyBowlAggregationLotDetail: HealthyBowlAggregationLotDetail;
68508
69262
  getHealthyBowlAggregationLots: Array<HealthyBowlAggregationLot>;
69263
+ /** Decisions in this workspace, newest first. */
69264
+ getHealthyBowlAgronomyDecisions: Array<AgronomyDecision>;
68509
69265
  getHealthyBowlAnalyticsData: HealthyBowlAnalyticsDataPayload;
69266
+ /** 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. */
69267
+ getHealthyBowlAnalyticsReportExport: HealthyBowlAccountingExport;
68510
69268
  /** Per-animal withdrawal roll-up + treatment history (animal detail / block gates). */
68511
69269
  getHealthyBowlAnimalWithdrawalStatus: AnimalWithdrawalStatus;
68512
69270
  /** BOFF-6026 — what the farm owns, owes and is worth as of a date. The document a lender asks for. */
@@ -68534,6 +69292,8 @@ export type Query = {
68534
69292
  /** Filter by status (OPEN | ACKNOWLEDGED | RESOLVED | DISMISSED) and/or type. */
68535
69293
  getHealthyBowlComplianceFlags: Array<ComplianceFlag>;
68536
69294
  getHealthyBowlComplianceOverview: HealthyBowlComplianceOverviewPayload;
69295
+ /** 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". */
69296
+ getHealthyBowlCompliancePack: ComplianceExportFile;
68537
69297
  getHealthyBowlCompostBatches: Array<CompostBatch>;
68538
69298
  getHealthyBowlConsultantAssignments: Array<HealthyBowlConsultantAssignment>;
68539
69299
  getHealthyBowlConsultations: Array<Consultation>;
@@ -68555,6 +69315,8 @@ export type Query = {
68555
69315
  getHealthyBowlCoopOverview: HealthyBowlCoopOverview;
68556
69316
  getHealthyBowlCostByCrop: HealthyBowlCostByCropReport;
68557
69317
  getHealthyBowlCostCenters: Array<HealthyBowlCostCenter>;
69318
+ getHealthyBowlCrewTimesheet: HealthyBowlCrewTimesheet;
69319
+ getHealthyBowlCrews: Array<HealthyBowlCrew>;
68558
69320
  /** Fields-list table: every field with its NDVI health score, trend, stressed-zone count and yield estimate. */
68559
69321
  getHealthyBowlCropHealthOverview: HbCropHealthOverview;
68560
69322
  getHealthyBowlCropsData: HealthyBowlCropsDataPayload;
@@ -68574,6 +69336,8 @@ export type Query = {
68574
69336
  /** Distribution dashboard summary (KPI cards + per-channel breakdown). */
68575
69337
  getHealthyBowlDistributionSummary: DistributionSummary;
68576
69338
  getHealthyBowlEudrStatement: HbEudrStatement;
69339
+ /** 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. */
69340
+ getHealthyBowlExpertAvailability: Array<ConsultSlot>;
68577
69341
  /** 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. */
68578
69342
  getHealthyBowlFarmAttentionDigest: HealthyBowlAttentionDigest;
68579
69343
  /** Sponsor: one contract by id. */
@@ -68609,6 +69373,8 @@ export type Query = {
68609
69373
  getHealthyBowlGrowSpaces: Array<GrowSpace>;
68610
69374
  getHealthyBowlIcsData: HealthyBowlIcsDataPayload;
68611
69375
  getHealthyBowlIcsGroupDetail: IcsGroupDetail;
69376
+ /** 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. */
69377
+ getHealthyBowlIcsGroupReport: ComplianceExportFile;
68612
69378
  getHealthyBowlIcsGrowerDetail: IcsGrowerDetail;
68613
69379
  /** Budget-vs-Actual + Input-Mix + cost-by-crop analytics rolled up from the plan rows. */
68614
69380
  getHealthyBowlInputBudgetAnalytics: HealthyBowlInputBudgetAnalytics;
@@ -68627,11 +69393,15 @@ export type Query = {
68627
69393
  getHealthyBowlInvoicePdf: HealthyBowlInvoicePdf;
68628
69394
  getHealthyBowlJournalEntries: Array<HealthyBowlJournalEntry>;
68629
69395
  getHealthyBowlJournalEntry?: Maybe<HealthyBowlJournalEntry>;
69396
+ getHealthyBowlLabourEntries: Array<HealthyBowlLabourEntry>;
69397
+ getHealthyBowlLabourSummary: HealthyBowlLabourSummary;
68630
69398
  getHealthyBowlLivestockData: HealthyBowlLivestockDataPayload;
68631
69399
  getHealthyBowlLoanFacilitation: HealthyBowlLoanFacilitation;
68632
69400
  getHealthyBowlLoanFacilitations: Array<HealthyBowlLoanFacilitation>;
68633
69401
  /** Exact balances, immutable schedule, and externally completed money-event history for one loan. */
68634
69402
  getHealthyBowlLoanFinancialDetail: HealthyBowlLoanFinancialDetail;
69403
+ /** BOFF-6077 — the release schedule for one facilitated loan, in sequence order. */
69404
+ getHealthyBowlLoanMilestones: Array<HealthyBowlLoanMilestone>;
68635
69405
  /** 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. */
68636
69406
  getHealthyBowlMachinerySpend: Array<HealthyBowlMachinerySpendRow>;
68637
69407
  /** A commodity's daily min/modal/max trend over the trailing `days` window (default 30). */
@@ -68724,6 +69494,7 @@ export type Query = {
68724
69494
  getHealthyBowlWithdrawalCalendar: Array<WithdrawalCalendarEntry>;
68725
69495
  /** The four dashboard stat cards. */
68726
69496
  getHealthyBowlWithdrawalSummary: WithdrawalSummary;
69497
+ getHealthyBowlWorkers: Array<HealthyBowlWorker>;
68727
69498
  /** The live rule-based season yield forecast for a field (computed from stored NDVI history). */
68728
69499
  getHealthyBowlYieldForecast: HbYieldForecast;
68729
69500
  /** Saved yield scenarios for a field. */
@@ -69236,6 +70007,8 @@ export type Query = {
69236
70007
  healthyBowlAnimalDepth: HealthyBowlAnimalDepthRecord;
69237
70008
  /** Animal groups with computed member counts. */
69238
70009
  healthyBowlAnimalGroups: Array<HealthyBowlAnimalGroup>;
70010
+ /** 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. */
70011
+ healthyBowlAnimalPedigree: HealthyBowlAnimalPedigree;
69239
70012
  /** Read a single auction by id. A live auction past endTime auto-closes on read. */
69240
70013
  healthyBowlAuction?: Maybe<Auction>;
69241
70014
  /** List auctions for the workspace. Pass status to filter (draft/live/closed/cancelled). Live auctions past endTime auto-close on read. */
@@ -69254,7 +70027,7 @@ export type Query = {
69254
70027
  healthyBowlGrazing: HealthyBowlGrazingView;
69255
70028
  /** Grazing events for one paddock or one animal, newest first. */
69256
70029
  healthyBowlGrazingEvents: Array<HealthyBowlGrazingEvent>;
69257
- /** Deep herd view: one row per animal with group/BCS/ADG/withdrawal + a herd compliance summary. Filter by group or search. */
70030
+ /** 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. */
69258
70031
  healthyBowlHerdDepth: HealthyBowlHerdDepthView;
69259
70032
  /** 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. */
69260
70033
  healthyBowlIncomingOrders: Array<Order>;
@@ -69284,6 +70057,8 @@ export type Query = {
69284
70057
  healthyBowlPlantCatalog: Array<PlantCatalogEntry>;
69285
70058
  /** I-7 — list planting/execution activities, optionally scoped to a plan or bed. */
69286
70059
  healthyBowlPlantingActivities: Array<PlantingActivity>;
70060
+ /** 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. */
70061
+ healthyBowlPlantingEstimate: HealthyBowlPlantingEstimate;
69287
70062
  /** I-8 — planned-vs-actual execution rollup for a single planting plan. */
69288
70063
  healthyBowlPlantingPlanExecution: HealthyBowlPlanExecution;
69289
70064
  /** Read a single seed lot by id. */
@@ -69437,8 +70212,10 @@ export type Query = {
69437
70212
  introspectNode?: Maybe<NodeIntrospection>;
69438
70213
  inventoryItem?: Maybe<MtwInventoryItem>;
69439
70214
  inventoryItems: Array<MtwInventoryItem>;
70215
+ inventoryItemsCount: Scalars['Int']['output'];
69440
70216
  inventoryStats: MtwInventoryStats;
69441
70217
  inventoryTransactions: Array<MtwInventoryTransaction>;
70218
+ inventoryTransactionsCount: Scalars['Int']['output'];
69442
70219
  /** 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). */
69443
70220
  invitation?: Maybe<Invitation>;
69444
70221
  /** Get multiple invitations with filtering and pagination. Workspace scope is read from gateway context (x-workspace-id header). */
@@ -69711,6 +70488,7 @@ export type Query = {
69711
70488
  myNavPreferences: NavPreferences;
69712
70489
  /** 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. */
69713
70490
  myPendingEpodDeliveryJobs: Array<MtwDeliveryJob>;
70491
+ myPendingEpodDeliveryJobsCount: Scalars['Int']['output'];
69714
70492
  /** 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. */
69715
70493
  myPendingInvitations: Array<Invitation>;
69716
70494
  /** 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. */
@@ -70132,6 +70910,7 @@ export type Query = {
70132
70910
  /** List roles with bounded offset metadata for export/reporting clients. */
70133
70911
  rolesPage: RolePage;
70134
70912
  route?: Maybe<MtwRoute>;
70913
+ routeStats: MtwRouteStats;
70135
70914
  routes: Array<MtwRoute>;
70136
70915
  routesCount: Scalars['Int']['output'];
70137
70916
  runningTimers: Array<RunningTimer>;
@@ -70253,6 +71032,7 @@ export type Query = {
70253
71032
  shipmentTracking: Array<MtwTrackingEvent>;
70254
71033
  shipments: Array<MtwShipment>;
70255
71034
  shipmentsCount: Scalars['Int']['output'];
71035
+ shippingQuotes: MtwShippingQuoteResult;
70256
71036
  siemDestinations: Array<SiemDestination>;
70257
71037
  softwareAssets: Array<SoftwareAsset>;
70258
71038
  subAgent?: Maybe<SubAiAgent>;
@@ -70599,6 +71379,7 @@ export type Query = {
70599
71379
  visibilityRules: Array<VisibilityRule>;
70600
71380
  waitForSandboxRunning?: Maybe<Sandbox>;
70601
71381
  warehouse?: Maybe<MtwWarehouse>;
71382
+ warehouseStats: MtwWarehouseStats;
70602
71383
  warehouses: Array<MtwWarehouse>;
70603
71384
  warehousesCount: Scalars['Int']['output'];
70604
71385
  /** Get specific webhook by ID */
@@ -71210,6 +71991,11 @@ export type QueryAssetsArgs = {
71210
71991
  pagination?: InputMaybe<AssetHandlerPaginationInput>;
71211
71992
  };
71212
71993
  /** Base Query type with placeholder field. Extended by individual query files. */
71994
+ export type QueryAssignmentSuggestionsArgs = {
71995
+ limit?: InputMaybe<Scalars['Int']['input']>;
71996
+ routeId: Scalars['ID']['input'];
71997
+ };
71998
+ /** Base Query type with placeholder field. Extended by individual query files. */
71213
71999
  export type QueryAssistantConversationMessagesArgs = {
71214
72000
  conversationId: Scalars['ID']['input'];
71215
72001
  first?: InputMaybe<Scalars['Int']['input']>;
@@ -73893,10 +74679,20 @@ export type QueryGetHealthyBowlAggregationLotsArgs = {
73893
74679
  icsGroupId?: InputMaybe<Scalars['ID']['input']>;
73894
74680
  };
73895
74681
  /** Base Query type with placeholder field. Extended by individual query files. */
74682
+ export type QueryGetHealthyBowlAgronomyDecisionsArgs = {
74683
+ context: ContextInput;
74684
+ filter?: InputMaybe<AgronomyDecisionFilterInput>;
74685
+ };
74686
+ /** Base Query type with placeholder field. Extended by individual query files. */
73896
74687
  export type QueryGetHealthyBowlAnalyticsDataArgs = {
73897
74688
  context: ContextInput;
73898
74689
  };
73899
74690
  /** Base Query type with placeholder field. Extended by individual query files. */
74691
+ export type QueryGetHealthyBowlAnalyticsReportExportArgs = {
74692
+ context: ContextInput;
74693
+ reportId: Scalars['ID']['input'];
74694
+ };
74695
+ /** Base Query type with placeholder field. Extended by individual query files. */
73900
74696
  export type QueryGetHealthyBowlAnimalWithdrawalStatusArgs = {
73901
74697
  animalId: Scalars['ID']['input'];
73902
74698
  context: ContextInput;
@@ -73992,6 +74788,10 @@ export type QueryGetHealthyBowlComplianceOverviewArgs = {
73992
74788
  context: ContextInput;
73993
74789
  };
73994
74790
  /** Base Query type with placeholder field. Extended by individual query files. */
74791
+ export type QueryGetHealthyBowlCompliancePackArgs = {
74792
+ context: ContextInput;
74793
+ };
74794
+ /** Base Query type with placeholder field. Extended by individual query files. */
73995
74795
  export type QueryGetHealthyBowlCompostBatchesArgs = {
73996
74796
  context: ContextInput;
73997
74797
  gardenId?: InputMaybe<Scalars['ID']['input']>;
@@ -74060,6 +74860,17 @@ export type QueryGetHealthyBowlCostCentersArgs = {
74060
74860
  kind?: InputMaybe<Scalars['String']['input']>;
74061
74861
  };
74062
74862
  /** Base Query type with placeholder field. Extended by individual query files. */
74863
+ export type QueryGetHealthyBowlCrewTimesheetArgs = {
74864
+ context: ContextInput;
74865
+ crewId: Scalars['ID']['input'];
74866
+ weekStart?: InputMaybe<Scalars['String']['input']>;
74867
+ };
74868
+ /** Base Query type with placeholder field. Extended by individual query files. */
74869
+ export type QueryGetHealthyBowlCrewsArgs = {
74870
+ activeOnly?: InputMaybe<Scalars['Boolean']['input']>;
74871
+ context: ContextInput;
74872
+ };
74873
+ /** Base Query type with placeholder field. Extended by individual query files. */
74063
74874
  export type QueryGetHealthyBowlCropHealthOverviewArgs = {
74064
74875
  context: ContextInput;
74065
74876
  };
@@ -74145,6 +74956,11 @@ export type QueryGetHealthyBowlEudrStatementArgs = {
74145
74956
  id: Scalars['ID']['input'];
74146
74957
  };
74147
74958
  /** Base Query type with placeholder field. Extended by individual query files. */
74959
+ export type QueryGetHealthyBowlExpertAvailabilityArgs = {
74960
+ context: ContextInput;
74961
+ input: HealthyBowlExpertAvailabilityInput;
74962
+ };
74963
+ /** Base Query type with placeholder field. Extended by individual query files. */
74148
74964
  export type QueryGetHealthyBowlFarmAttentionDigestArgs = {
74149
74965
  context: ContextInput;
74150
74966
  horizonDays?: InputMaybe<Scalars['Int']['input']>;
@@ -74308,6 +75124,11 @@ export type QueryGetHealthyBowlIcsGroupDetailArgs = {
74308
75124
  id: Scalars['ID']['input'];
74309
75125
  };
74310
75126
  /** Base Query type with placeholder field. Extended by individual query files. */
75127
+ export type QueryGetHealthyBowlIcsGroupReportArgs = {
75128
+ context: ContextInput;
75129
+ icsGroupId: Scalars['ID']['input'];
75130
+ };
75131
+ /** Base Query type with placeholder field. Extended by individual query files. */
74311
75132
  export type QueryGetHealthyBowlIcsGrowerDetailArgs = {
74312
75133
  context: ContextInput;
74313
75134
  id: Scalars['ID']['input'];
@@ -74382,6 +75203,23 @@ export type QueryGetHealthyBowlJournalEntryArgs = {
74382
75203
  id: Scalars['ID']['input'];
74383
75204
  };
74384
75205
  /** Base Query type with placeholder field. Extended by individual query files. */
75206
+ export type QueryGetHealthyBowlLabourEntriesArgs = {
75207
+ context: ContextInput;
75208
+ crewId?: InputMaybe<Scalars['ID']['input']>;
75209
+ endDate?: InputMaybe<Scalars['String']['input']>;
75210
+ limit?: InputMaybe<Scalars['Int']['input']>;
75211
+ offset?: InputMaybe<Scalars['Int']['input']>;
75212
+ startDate?: InputMaybe<Scalars['String']['input']>;
75213
+ status?: InputMaybe<Scalars['String']['input']>;
75214
+ workerId?: InputMaybe<Scalars['ID']['input']>;
75215
+ };
75216
+ /** Base Query type with placeholder field. Extended by individual query files. */
75217
+ export type QueryGetHealthyBowlLabourSummaryArgs = {
75218
+ context: ContextInput;
75219
+ endDate?: InputMaybe<Scalars['String']['input']>;
75220
+ startDate?: InputMaybe<Scalars['String']['input']>;
75221
+ };
75222
+ /** Base Query type with placeholder field. Extended by individual query files. */
74385
75223
  export type QueryGetHealthyBowlLivestockDataArgs = {
74386
75224
  context: ContextInput;
74387
75225
  };
@@ -74401,6 +75239,11 @@ export type QueryGetHealthyBowlLoanFinancialDetailArgs = {
74401
75239
  loanId: Scalars['ID']['input'];
74402
75240
  };
74403
75241
  /** Base Query type with placeholder field. Extended by individual query files. */
75242
+ export type QueryGetHealthyBowlLoanMilestonesArgs = {
75243
+ context: ContextInput;
75244
+ loanId: Scalars['ID']['input'];
75245
+ };
75246
+ /** Base Query type with placeholder field. Extended by individual query files. */
74404
75247
  export type QueryGetHealthyBowlMachinerySpendArgs = {
74405
75248
  context: ContextInput;
74406
75249
  };
@@ -74693,6 +75536,12 @@ export type QueryGetHealthyBowlWithdrawalSummaryArgs = {
74693
75536
  context: ContextInput;
74694
75537
  };
74695
75538
  /** Base Query type with placeholder field. Extended by individual query files. */
75539
+ export type QueryGetHealthyBowlWorkersArgs = {
75540
+ activeOnly?: InputMaybe<Scalars['Boolean']['input']>;
75541
+ context: ContextInput;
75542
+ search?: InputMaybe<Scalars['String']['input']>;
75543
+ };
75544
+ /** Base Query type with placeholder field. Extended by individual query files. */
74696
75545
  export type QueryGetHealthyBowlYieldForecastArgs = {
74697
75546
  context: ContextInput;
74698
75547
  fieldId: Scalars['ID']['input'];
@@ -76229,6 +77078,13 @@ export type QueryHealthyBowlAnimalGroupsArgs = {
76229
77078
  context: ContextInput;
76230
77079
  };
76231
77080
  /** Base Query type with placeholder field. Extended by individual query files. */
77081
+ export type QueryHealthyBowlAnimalPedigreeArgs = {
77082
+ ancestorDepth?: InputMaybe<Scalars['Int']['input']>;
77083
+ animalId: Scalars['ID']['input'];
77084
+ context: ContextInput;
77085
+ offspringDepth?: InputMaybe<Scalars['Int']['input']>;
77086
+ };
77087
+ /** Base Query type with placeholder field. Extended by individual query files. */
76232
77088
  export type QueryHealthyBowlAuctionArgs = {
76233
77089
  context: ContextInput;
76234
77090
  id: Scalars['ID']['input'];
@@ -76287,6 +77143,7 @@ export type QueryHealthyBowlGrazingEventsArgs = {
76287
77143
  export type QueryHealthyBowlHerdDepthArgs = {
76288
77144
  context: ContextInput;
76289
77145
  groupId?: InputMaybe<Scalars['ID']['input']>;
77146
+ includeArchived?: InputMaybe<Scalars['Boolean']['input']>;
76290
77147
  search?: InputMaybe<Scalars['String']['input']>;
76291
77148
  };
76292
77149
  /** Base Query type with placeholder field. Extended by individual query files. */
@@ -76378,6 +77235,11 @@ export type QueryHealthyBowlPlantingActivitiesArgs = {
76378
77235
  plantingPlanId?: InputMaybe<Scalars['ID']['input']>;
76379
77236
  };
76380
77237
  /** Base Query type with placeholder field. Extended by individual query files. */
77238
+ export type QueryHealthyBowlPlantingEstimateArgs = {
77239
+ context: ContextInput;
77240
+ input: HealthyBowlPlantingEstimateInput;
77241
+ };
77242
+ /** Base Query type with placeholder field. Extended by individual query files. */
76381
77243
  export type QueryHealthyBowlPlantingPlanExecutionArgs = {
76382
77244
  context: ContextInput;
76383
77245
  plantingPlanId: Scalars['ID']['input'];
@@ -76950,11 +77812,23 @@ export type QueryInventoryItemsArgs = {
76950
77812
  pagination?: InputMaybe<PaginationInput>;
76951
77813
  };
76952
77814
  /** Base Query type with placeholder field. Extended by individual query files. */
77815
+ export type QueryInventoryItemsCountArgs = {
77816
+ filter?: InputMaybe<InventoryFilterInput>;
77817
+ };
77818
+ /** Base Query type with placeholder field. Extended by individual query files. */
77819
+ export type QueryInventoryStatsArgs = {
77820
+ filter?: InputMaybe<InventoryFilterInput>;
77821
+ };
77822
+ /** Base Query type with placeholder field. Extended by individual query files. */
76953
77823
  export type QueryInventoryTransactionsArgs = {
76954
77824
  filter?: InputMaybe<InventoryFilterInput>;
76955
77825
  pagination?: InputMaybe<PaginationInput>;
76956
77826
  };
76957
77827
  /** Base Query type with placeholder field. Extended by individual query files. */
77828
+ export type QueryInventoryTransactionsCountArgs = {
77829
+ filter?: InputMaybe<InventoryFilterInput>;
77830
+ };
77831
+ /** Base Query type with placeholder field. Extended by individual query files. */
76958
77832
  export type QueryInvitationArgs = {
76959
77833
  id: Scalars['ID']['input'];
76960
77834
  };
@@ -79607,6 +80481,10 @@ export type QueryShipmentsCountArgs = {
79607
80481
  filter?: InputMaybe<ShipmentFilterInput>;
79608
80482
  };
79609
80483
  /** Base Query type with placeholder field. Extended by individual query files. */
80484
+ export type QueryShippingQuotesArgs = {
80485
+ input: ShippingQuoteInput;
80486
+ };
80487
+ /** Base Query type with placeholder field. Extended by individual query files. */
79610
80488
  export type QuerySiemDestinationsArgs = {
79611
80489
  workspaceId: Scalars['ID']['input'];
79612
80490
  };
@@ -81297,6 +82175,16 @@ export type RecordTimeCampusImpersonationInput = {
81297
82175
  targetUserId: Scalars['ID']['input'];
81298
82176
  workspaceId: Scalars['ID']['input'];
81299
82177
  };
82178
+ export type RecordVehicleServiceInput = {
82179
+ /** Days until the next service. Sets nextServiceDueDate. */
82180
+ intervalDays?: InputMaybe<Scalars['Int']['input']>;
82181
+ /** Kilometres until the next service. Sets nextServiceDueMileage (needs mileage). */
82182
+ intervalKm?: InputMaybe<Scalars['Float']['input']>;
82183
+ /** Odometer reading at service. Also updates the vehicle mileage when higher. */
82184
+ mileage?: InputMaybe<Scalars['Float']['input']>;
82185
+ /** When the service was performed. Defaults to now. */
82186
+ serviceDate?: InputMaybe<Scalars['DateTime']['input']>;
82187
+ };
81300
82188
  export type RecordWorkPatternInput = {
81301
82189
  breakHours: Scalars['Float']['input'];
81302
82190
  context?: InputMaybe<ContextInput>;
@@ -81553,6 +82441,14 @@ export type Release = {
81553
82441
  /** Associated workspace ID */
81554
82442
  workspaceId: Scalars['String']['output'];
81555
82443
  };
82444
+ export type ReleaseHealthyBowlLoanMilestoneInput = {
82445
+ context: ContextInput;
82446
+ /** The HarvestRecord or PlantingActivity id proving the milestone. Verified in-workspace. */
82447
+ evidenceId?: InputMaybe<Scalars['ID']['input']>;
82448
+ /** Overrides the milestone's own evidenceType, if it was left unset at creation. */
82449
+ evidenceType?: InputMaybe<Scalars['String']['input']>;
82450
+ id: Scalars['ID']['input'];
82451
+ };
81556
82452
  export type ReleaseLockInput = {
81557
82453
  /** Force release (admin only) */
81558
82454
  force?: InputMaybe<Scalars['Boolean']['input']>;
@@ -81810,6 +82706,20 @@ export type ReportGovAiTokenUsageInput = {
81810
82706
  /** Deprecated/ignored. Credits are now computed server-side from the model's token prices (input + ~5×output), not from a client-supplied total. Retained (nullable) only so the field removal isn't a breaking schema change. */
81811
82707
  totalTokens?: InputMaybe<Scalars['Int']['input']>;
81812
82708
  };
82709
+ /** 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. */
82710
+ export type ReportHealthyBowlAiTokenUsageInput = {
82711
+ context: ContextInput;
82712
+ /** Prompt (input) tokens consumed by the turn. */
82713
+ inputTokens: Scalars['Int']['input'];
82714
+ /** The assistant message this turn produced. Forms the idempotency hash with sessionId, so a retried or duplicated report never charges twice. */
82715
+ messageId: Scalars['ID']['input'];
82716
+ /** 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. */
82717
+ model: Scalars['String']['input'];
82718
+ /** Completion (output) tokens produced by the turn. */
82719
+ outputTokens: Scalars['Int']['input'];
82720
+ /** The assistant session the tokens were consumed in. */
82721
+ sessionId: Scalars['ID']['input'];
82722
+ };
81813
82723
  export type ReportMessagePayload = {
81814
82724
  __typename?: 'ReportMessagePayload';
81815
82725
  messageId: Scalars['ID']['output'];
@@ -83468,12 +84378,32 @@ export type SchemeApplication = {
83468
84378
  appliedDate: Scalars['String']['output'];
83469
84379
  /** The client-generated idempotency key this application was created with (BOFF-4407 offline outbox), null for applications created online before this field existed. */
83470
84380
  clientMutationId?: Maybe<Scalars['String']['output']>;
84381
+ /** The evidence attached to this application, in slot order. Empty for applications created before BOFF-6111, which recorded only a checkbox affirmation in `remarks`. */
84382
+ documents: Array<SchemeApplicationDocument>;
83471
84383
  id: Scalars['ID']['output'];
83472
84384
  remarks?: Maybe<Scalars['String']['output']>;
83473
84385
  schemeId: Scalars['String']['output'];
83474
84386
  schemeName: Scalars['String']['output'];
83475
84387
  status: Scalars['String']['output'];
83476
84388
  };
84389
+ /** One supporting document attached to a scheme application (BOFF-6111). */
84390
+ export type SchemeApplicationDocument = {
84391
+ __typename?: 'SchemeApplicationDocument';
84392
+ /** Opaque wspace-files-svc id. Resolve a download URL with `getFileDownloadUrl`. */
84393
+ fileId: Scalars['String']['output'];
84394
+ fileName?: Maybe<Scalars['String']['output']>;
84395
+ /** Which scheme checklist requirement this file satisfies. */
84396
+ slot: Scalars['String']['output'];
84397
+ uploadedAt: Scalars['String']['output'];
84398
+ };
84399
+ /** One supporting document being attached to a scheme application (BOFF-6111). */
84400
+ export type SchemeApplicationDocumentInput = {
84401
+ /** 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. */
84402
+ fileId: Scalars['String']['input'];
84403
+ fileName?: InputMaybe<Scalars['String']['input']>;
84404
+ /** Which scheme checklist requirement this file satisfies. Any other value is rejected with BAD_USER_INPUT. */
84405
+ slot: Scalars['String']['input'];
84406
+ };
83477
84407
  /** BOFF-6110 — the eligibility verdict for one scheme against one workspace's farm data. */
83478
84408
  export type SchemeEligibility = {
83479
84409
  __typename?: 'SchemeEligibility';
@@ -85276,6 +86206,18 @@ export type SetAgentVisibilityInput = {
85276
86206
  /** `PRIVATE` = owner only. `WORKSPACE` = every member with the matching `@rbac` permission. */
85277
86207
  visibility: VibecontrolsAgentVisibility;
85278
86208
  };
86209
+ export type SetHealthyBowlConsultAvailabilityInput = {
86210
+ consultantId: Scalars['String']['input'];
86211
+ context: ContextInput;
86212
+ /** 0 = Sunday … 6 = Saturday. */
86213
+ dayOfWeek: Scalars['Int']['input'];
86214
+ endTime: Scalars['String']['input'];
86215
+ slotMinutes?: InputMaybe<Scalars['Int']['input']>;
86216
+ /** Local wall-clock HH:MM — a consultant's working day does not move when the clocks do. */
86217
+ startTime: Scalars['String']['input'];
86218
+ /** ACTIVE or PAUSED. */
86219
+ status?: InputMaybe<Scalars['String']['input']>;
86220
+ };
85279
86221
  export type SetHealthyBowlEntityTagsInput = {
85280
86222
  context: ContextInput;
85281
86223
  entityId: Scalars['ID']['input'];
@@ -85292,6 +86234,12 @@ export type SetHealthyBowlInsuranceDocumentInput = {
85292
86234
  id: Scalars['ID']['input'];
85293
86235
  notApplicable?: InputMaybe<Scalars['Boolean']['input']>;
85294
86236
  };
86237
+ export type SetHealthyBowlLoanEscrowCommitmentInput = {
86238
+ context: ContextInput;
86239
+ /** What the lender has agreed to release across this loan. Cannot exceed the loan amount. */
86240
+ escrowCommitted: Scalars['Float']['input'];
86241
+ id: Scalars['ID']['input'];
86242
+ };
85295
86243
  export type SetHealthyBowlPaddockRestInput = {
85296
86244
  context: ContextInput;
85297
86245
  paddockId: Scalars['ID']['input'];
@@ -85729,11 +86677,13 @@ export type ShipmentFilterInput = {
85729
86677
  carrierId?: InputMaybe<Scalars['ID']['input']>;
85730
86678
  customerId?: InputMaybe<Scalars['ID']['input']>;
85731
86679
  deliveryJobId?: InputMaybe<Scalars['ID']['input']>;
86680
+ driverId?: InputMaybe<Scalars['ID']['input']>;
85732
86681
  isMultiModal?: InputMaybe<Scalars['Boolean']['input']>;
85733
86682
  primaryMode?: InputMaybe<TransportMode>;
85734
86683
  search?: InputMaybe<Scalars['String']['input']>;
85735
86684
  status?: InputMaybe<ShipmentStatus>;
85736
86685
  storeOrderId?: InputMaybe<Scalars['ID']['input']>;
86686
+ vehicleId?: InputMaybe<Scalars['ID']['input']>;
85737
86687
  };
85738
86688
  export declare enum ShipmentLegStatus {
85739
86689
  Arrived = "ARRIVED",
@@ -85751,6 +86701,20 @@ export declare enum ShipmentStatus {
85751
86701
  Planned = "PLANNED",
85752
86702
  Returned = "RETURNED"
85753
86703
  }
86704
+ export type ShippingQuoteInput = {
86705
+ /** Cash on delivery. */
86706
+ cod?: InputMaybe<Scalars['Boolean']['input']>;
86707
+ deliveryPostcode: Scalars['String']['input'];
86708
+ heightCm?: InputMaybe<Scalars['Float']['input']>;
86709
+ /** Optional package size in cm; all three or none. Volumetric weight is applied when larger. */
86710
+ lengthCm?: InputMaybe<Scalars['Float']['input']>;
86711
+ /** When given, the result also carries an own-fleet cost estimate for the same lane. */
86712
+ ownFleet?: InputMaybe<OwnFleetInput>;
86713
+ pickupPostcode: Scalars['String']['input'];
86714
+ /** Dead weight in kg. */
86715
+ weightKg: Scalars['Float']['input'];
86716
+ widthCm?: InputMaybe<Scalars['Float']['input']>;
86717
+ };
85754
86718
  /** 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`. */
85755
86719
  export type SiemDestination = {
85756
86720
  __typename?: 'SiemDestination';
@@ -90360,6 +91324,7 @@ export type TimeCampusDataErasureRequest = {
90360
91324
  __typename?: 'TimeCampusDataErasureRequest';
90361
91325
  completedAt?: Maybe<Scalars['DateTime']['output']>;
90362
91326
  id: Scalars['ID']['output'];
91327
+ notes?: Maybe<Scalars['String']['output']>;
90363
91328
  requestedAt: Scalars['DateTime']['output'];
90364
91329
  requestedBy: Scalars['ID']['output'];
90365
91330
  status: TimeCampusDataErasureStatus;
@@ -92202,6 +93167,8 @@ export type UpdateAssetInput = {
92202
93167
  };
92203
93168
  export type UpdateAuditInput = {
92204
93169
  auditor?: InputMaybe<Scalars['String']['input']>;
93170
+ /** 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. */
93171
+ certificationId?: InputMaybe<Scalars['ID']['input']>;
92205
93172
  completedDate?: InputMaybe<Scalars['String']['input']>;
92206
93173
  context: ContextInput;
92207
93174
  criticalFindings?: InputMaybe<Scalars['Int']['input']>;
@@ -93488,6 +94455,8 @@ export type UpdateHarvestRecordInput = {
93488
94455
  fieldId?: InputMaybe<Scalars['ID']['input']>;
93489
94456
  harvestDate?: InputMaybe<Scalars['String']['input']>;
93490
94457
  id: Scalars['ID']['input'];
94458
+ /** 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. */
94459
+ plantingPlanId?: InputMaybe<Scalars['ID']['input']>;
93491
94460
  pricePerUnit?: InputMaybe<Scalars['Float']['input']>;
93492
94461
  quality?: InputMaybe<Scalars['String']['input']>;
93493
94462
  quantity?: InputMaybe<Scalars['Float']['input']>;
@@ -93705,6 +94674,7 @@ export type UpdateHealthyBowlAnimalDepthInput = {
93705
94674
  context: ContextInput;
93706
94675
  /** Loose link to another animal (dam). Pass null to clear. */
93707
94676
  damId?: InputMaybe<Scalars['ID']['input']>;
94677
+ /** 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. */
93708
94678
  eidTag?: InputMaybe<Scalars['String']['input']>;
93709
94679
  grazingNotes?: InputMaybe<Scalars['String']['input']>;
93710
94680
  grazingPaddock?: InputMaybe<Scalars['String']['input']>;
@@ -93786,6 +94756,14 @@ export type UpdateHealthyBowlCostCenterInput = {
93786
94756
  yieldQuantity?: InputMaybe<Scalars['Float']['input']>;
93787
94757
  yieldUnit?: InputMaybe<Scalars['String']['input']>;
93788
94758
  };
94759
+ export type UpdateHealthyBowlCrewInput = {
94760
+ context: ContextInput;
94761
+ id: Scalars['ID']['input'];
94762
+ isActive?: InputMaybe<Scalars['Boolean']['input']>;
94763
+ leadWorkerId?: InputMaybe<Scalars['ID']['input']>;
94764
+ name: Scalars['String']['input'];
94765
+ workerIds?: InputMaybe<Array<Scalars['ID']['input']>>;
94766
+ };
93789
94767
  export type UpdateHealthyBowlCsaDeliveryInput = {
93790
94768
  context: ContextInput;
93791
94769
  id: Scalars['ID']['input'];
@@ -93923,6 +94901,7 @@ export type UpdateHealthyBowlInsurancePolicyInput = {
93923
94901
  status?: InputMaybe<Scalars['String']['input']>;
93924
94902
  };
93925
94903
  export type UpdateHealthyBowlIrrigationAutomationInput = {
94904
+ autoTaskEnabled?: InputMaybe<Scalars['Boolean']['input']>;
93926
94905
  context: ContextInput;
93927
94906
  id: Scalars['ID']['input'];
93928
94907
  notifyInApp?: InputMaybe<Scalars['Boolean']['input']>;
@@ -93944,6 +94923,22 @@ export type UpdateHealthyBowlIrrigationScheduleInput = {
93944
94923
  /** Set to active / paused to resume or pause the schedule. */
93945
94924
  status?: InputMaybe<Scalars['String']['input']>;
93946
94925
  };
94926
+ export type UpdateHealthyBowlLabourEntryInput = {
94927
+ context: ContextInput;
94928
+ costCenterId: Scalars['ID']['input'];
94929
+ crewId?: InputMaybe<Scalars['ID']['input']>;
94930
+ cropId?: InputMaybe<Scalars['ID']['input']>;
94931
+ date?: InputMaybe<Scalars['String']['input']>;
94932
+ fieldId?: InputMaybe<Scalars['ID']['input']>;
94933
+ hours?: InputMaybe<Scalars['Float']['input']>;
94934
+ id: Scalars['ID']['input'];
94935
+ note?: InputMaybe<Scalars['String']['input']>;
94936
+ quantity?: InputMaybe<Scalars['Float']['input']>;
94937
+ rateAmount?: InputMaybe<Scalars['Float']['input']>;
94938
+ rateType?: InputMaybe<Scalars['String']['input']>;
94939
+ taskId?: InputMaybe<Scalars['String']['input']>;
94940
+ workerId: Scalars['ID']['input'];
94941
+ };
93947
94942
  export type UpdateHealthyBowlLedgerAccountInput = {
93948
94943
  accountType?: InputMaybe<Scalars['String']['input']>;
93949
94944
  context: ContextInput;
@@ -94121,6 +95116,19 @@ export type UpdateHealthyBowlWholesaleOrderInput = {
94121
95116
  pricePerKg?: InputMaybe<Scalars['Float']['input']>;
94122
95117
  quantityKg?: InputMaybe<Scalars['Float']['input']>;
94123
95118
  };
95119
+ export type UpdateHealthyBowlWorkerInput = {
95120
+ context: ContextInput;
95121
+ dailyWage?: InputMaybe<Scalars['Float']['input']>;
95122
+ employmentType?: InputMaybe<Scalars['String']['input']>;
95123
+ hourlyRate?: InputMaybe<Scalars['Float']['input']>;
95124
+ id: Scalars['ID']['input'];
95125
+ isActive?: InputMaybe<Scalars['Boolean']['input']>;
95126
+ linkedActorId?: InputMaybe<Scalars['String']['input']>;
95127
+ name: Scalars['String']['input'];
95128
+ phone?: InputMaybe<Scalars['String']['input']>;
95129
+ piecePrice?: InputMaybe<Scalars['Float']['input']>;
95130
+ skills?: InputMaybe<Array<Scalars['String']['input']>>;
95131
+ };
94124
95132
  export type UpdateIcsGroupInput = {
94125
95133
  certificationId?: InputMaybe<Scalars['ID']['input']>;
94126
95134
  code?: InputMaybe<Scalars['String']['input']>;
@@ -94436,24 +95444,31 @@ export type UpdatePipelineStageInput = {
94436
95444
  export type UpdatePlantingPlanInput = {
94437
95445
  /** Optional loose link to a Bed (no FK). */
94438
95446
  bedId?: InputMaybe<Scalars['ID']['input']>;
95447
+ bedWidthM?: InputMaybe<Scalars['Float']['input']>;
94439
95448
  context: ContextInput;
94440
95449
  cropId?: InputMaybe<Scalars['ID']['input']>;
95450
+ /** BOFF-6100 — server-derived density on bed fields; caller fallback only for non-bed/no-area fields. */
95451
+ density?: InputMaybe<Scalars['Float']['input']>;
94441
95452
  endDate?: InputMaybe<Scalars['String']['input']>;
94442
95453
  expectedYield?: InputMaybe<Scalars['Float']['input']>;
94443
95454
  fertilizers?: InputMaybe<Array<Scalars['String']['input']>>;
94444
95455
  fieldId?: InputMaybe<Scalars['ID']['input']>;
94445
95456
  id: Scalars['ID']['input'];
95457
+ pathWidthM?: InputMaybe<Scalars['Float']['input']>;
94446
95458
  /** Optional loose link to a PlantCatalog entry (no FK). */
94447
95459
  plantCatalogId?: InputMaybe<Scalars['ID']['input']>;
95460
+ /** Optional geometry. Supplying any of these causes the server to derive all plan figures together. */
95461
+ plantSpacingCm?: InputMaybe<Scalars['Float']['input']>;
94448
95462
  /** I-5 seed-rate result — total plants required. */
94449
95463
  plantsNeeded?: InputMaybe<Scalars['Int']['input']>;
94450
95464
  priority?: InputMaybe<Scalars['String']['input']>;
95465
+ rowSpacingCm?: InputMaybe<Scalars['Float']['input']>;
94451
95466
  /** Growing season. Must be one of: KHARIF, RABI, ZAID, PERENNIAL (case-insensitive). */
94452
95467
  season?: InputMaybe<Scalars['String']['input']>;
94453
95468
  /** I-5 seed-rate result — grams of seed required. */
94454
95469
  seedGrams?: InputMaybe<Scalars['Float']['input']>;
94455
95470
  seedRequired?: InputMaybe<Scalars['Float']['input']>;
94456
- /** I-5 seed-rate result — seedlings/transplants to raise. */
95471
+ /** I-5 seed-rate result — seedlings/transplants to raise. Server-derived when this update touches planting inputs. */
94457
95472
  seedlingsToRaise?: InputMaybe<Scalars['Int']['input']>;
94458
95473
  /** Sow/nursery-start date (ISO); distinct from the transplant startDate. */
94459
95474
  sowDate?: InputMaybe<Scalars['String']['input']>;
@@ -94792,6 +95807,14 @@ export type UpdateScheduledJobInput = {
94792
95807
  timeWindows?: InputMaybe<Scalars['JSON']['input']>;
94793
95808
  timezone?: InputMaybe<Scalars['String']['input']>;
94794
95809
  };
95810
+ export type UpdateSchemeApplicationStatusInput = {
95811
+ context: ContextInput;
95812
+ id: Scalars['ID']['input'];
95813
+ /** Officer-visible reason; applicant notes remain unchanged. */
95814
+ remarks?: InputMaybe<Scalars['String']['input']>;
95815
+ /** SUBMITTED | UNDER_REVIEW | APPROVED | REJECTED | DISBURSED. */
95816
+ status: Scalars['String']['input'];
95817
+ };
94795
95818
  export declare enum UpdateScope {
94796
95819
  AllEvents = "ALL_EVENTS",
94797
95820
  ThisAndFuture = "THIS_AND_FUTURE",
@@ -95196,10 +96219,13 @@ export type UpdateVehicleInput = {
95196
96219
  fuelEfficiencyLPer100Km?: InputMaybe<Scalars['Float']['input']>;
95197
96220
  fuelLevel?: InputMaybe<Scalars['Float']['input']>;
95198
96221
  fuelType?: InputMaybe<FuelType>;
96222
+ lastServiceDate?: InputMaybe<Scalars['DateTime']['input']>;
95199
96223
  licensePlate?: InputMaybe<Scalars['String']['input']>;
95200
96224
  make?: InputMaybe<Scalars['String']['input']>;
95201
96225
  mileage?: InputMaybe<Scalars['Float']['input']>;
95202
96226
  model?: InputMaybe<Scalars['String']['input']>;
96227
+ nextServiceDueDate?: InputMaybe<Scalars['DateTime']['input']>;
96228
+ nextServiceDueMileage?: InputMaybe<Scalars['Float']['input']>;
95203
96229
  ownershipType?: InputMaybe<Scalars['String']['input']>;
95204
96230
  status?: InputMaybe<VehicleStatus>;
95205
96231
  type?: InputMaybe<VehicleType>;
@@ -95739,6 +96765,8 @@ export type UpsertHealthyBowlSoilCarbonEstimateInput = {
95739
96765
  export type UpsertHealthyBowlWeatherAlertSettingsInput = {
95740
96766
  advisoryLanguage?: InputMaybe<Scalars['String']['input']>;
95741
96767
  aiAdvisoryEnabled?: InputMaybe<Scalars['Boolean']['input']>;
96768
+ /** Destination for EMAIL alerts. Rejected with BAD_USER_INPUT if it is not a usable address. */
96769
+ alertEmail?: InputMaybe<Scalars['String']['input']>;
95742
96770
  alertLeadTimeHours?: InputMaybe<Scalars['Int']['input']>;
95743
96771
  baselineYears?: InputMaybe<Scalars['Int']['input']>;
95744
96772
  context: ContextInput;
@@ -95749,6 +96777,8 @@ export type UpsertHealthyBowlWeatherAlertSettingsInput = {
95749
96777
  quietHoursEnabled?: InputMaybe<Scalars['Boolean']['input']>;
95750
96778
  quietHoursEnd?: InputMaybe<Scalars['String']['input']>;
95751
96779
  quietHoursStart?: InputMaybe<Scalars['String']['input']>;
96780
+ /** IANA zone the quiet window is evaluated in. Null means UTC, which is rarely what a farm means. */
96781
+ quietHoursTimezone?: InputMaybe<Scalars['String']['input']>;
95752
96782
  smsEnabled?: InputMaybe<Scalars['Boolean']['input']>;
95753
96783
  smsNumber?: InputMaybe<Scalars['String']['input']>;
95754
96784
  units?: InputMaybe<Scalars['String']['input']>;
@@ -98442,6 +99472,8 @@ export type WeatherAlertSettings = {
98442
99472
  __typename?: 'WeatherAlertSettings';
98443
99473
  advisoryLanguage: Scalars['String']['output'];
98444
99474
  aiAdvisoryEnabled: Scalars['Boolean']['output'];
99475
+ /** Where an EMAIL alert is sent. Without it `emailEnabled` cannot deliver anything (BOFF-6027). */
99476
+ alertEmail?: Maybe<Scalars['String']['output']>;
98445
99477
  alertLeadTimeHours: Scalars['Int']['output'];
98446
99478
  baselineYears: Scalars['Int']['output'];
98447
99479
  deviationThresholdPct: Scalars['Int']['output'];
@@ -98451,9 +99483,13 @@ export type WeatherAlertSettings = {
98451
99483
  historyLastSyncedAt?: Maybe<Scalars['DateTime']['output']>;
98452
99484
  historyStartYear?: Maybe<Scalars['Int']['output']>;
98453
99485
  inAppEnabled: Scalars['Boolean']['output'];
99486
+ /** 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). */
99487
+ quietHoursConfigured: Scalars['Boolean']['output'];
98454
99488
  quietHoursEnabled: Scalars['Boolean']['output'];
98455
99489
  quietHoursEnd: Scalars['String']['output'];
98456
99490
  quietHoursStart: Scalars['String']['output'];
99491
+ /** IANA zone the window is evaluated in. Null means UTC. */
99492
+ quietHoursTimezone?: Maybe<Scalars['String']['output']>;
98457
99493
  smsEnabled: Scalars['Boolean']['output'];
98458
99494
  smsNumber?: Maybe<Scalars['String']['output']>;
98459
99495
  /** metric or imperial. */
@@ -99832,6 +100868,8 @@ export type Workspace = {
99832
100868
  id: Scalars['ID']['output'];
99833
100869
  /** Apps installed in this workspace */
99834
100870
  installedApps: Array<WorkspaceInstalledApp>;
100871
+ /** 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. */
100872
+ isDisposable: Scalars['Boolean']['output'];
99835
100873
  /** Display name of the workspace */
99836
100874
  name: Scalars['String']['output'];
99837
100875
  /** Organization ID if part of an organization (opaque reference) */