@deepintel-ltd/farmpro-contracts 1.5.8 → 1.5.9

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 (53) hide show
  1. package/dist/index.js +50 -92
  2. package/dist/routes/admin.routes.js +13 -16
  3. package/dist/routes/agent-workflows.routes.js +81 -84
  4. package/dist/routes/agents.routes.js +29 -32
  5. package/dist/routes/analytics.routes.js +11 -14
  6. package/dist/routes/auth.routes.js +55 -58
  7. package/dist/routes/categories.routes.js +23 -26
  8. package/dist/routes/documents.routes.js +67 -70
  9. package/dist/routes/equipment.routes.js +55 -58
  10. package/dist/routes/farms.routes.js +32 -35
  11. package/dist/routes/field-monitoring.routes.js +70 -73
  12. package/dist/routes/field-observations.routes.js +41 -44
  13. package/dist/routes/fields.routes.js +44 -47
  14. package/dist/routes/finance.routes.js +121 -124
  15. package/dist/routes/harvest.routes.js +46 -49
  16. package/dist/routes/health.routes.js +6 -9
  17. package/dist/routes/index.js +51 -54
  18. package/dist/routes/input-usage.routes.js +14 -17
  19. package/dist/routes/inventory.routes.js +57 -60
  20. package/dist/routes/seasonal-plans.routes.js +14 -17
  21. package/dist/routes/soil-tests.routes.js +45 -48
  22. package/dist/routes/suppliers.routes.js +70 -73
  23. package/dist/routes/tasks.routes.js +65 -68
  24. package/dist/routes/team.routes.js +57 -60
  25. package/dist/routes/users.routes.js +13 -16
  26. package/dist/routes/weather.routes.js +10 -13
  27. package/dist/schemas/admin.schemas.js +43 -46
  28. package/dist/schemas/agent-workflows.schemas.js +34 -37
  29. package/dist/schemas/agents.schemas.js +46 -49
  30. package/dist/schemas/analytics.schemas.js +51 -54
  31. package/dist/schemas/auth.schemas.js +96 -99
  32. package/dist/schemas/categories.schemas.js +27 -30
  33. package/dist/schemas/common.schemas.js +89 -95
  34. package/dist/schemas/documents.schemas.js +59 -62
  35. package/dist/schemas/equipment.schemas.js +86 -89
  36. package/dist/schemas/farms.schemas.js +40 -43
  37. package/dist/schemas/field-monitoring.schemas.js +207 -210
  38. package/dist/schemas/field-observations.schemas.js +93 -96
  39. package/dist/schemas/fields.schemas.js +82 -85
  40. package/dist/schemas/finance.schemas.js +134 -137
  41. package/dist/schemas/harvest.schemas.js +46 -49
  42. package/dist/schemas/health.schemas.js +14 -17
  43. package/dist/schemas/input-usage.schemas.js +21 -24
  44. package/dist/schemas/inventory.schemas.js +58 -61
  45. package/dist/schemas/recommendations.schemas.js +22 -25
  46. package/dist/schemas/seasonal-plans.schemas.js +21 -24
  47. package/dist/schemas/soil-tests.schemas.js +70 -73
  48. package/dist/schemas/suppliers.schemas.js +90 -93
  49. package/dist/schemas/tasks.schemas.js +93 -96
  50. package/dist/schemas/team.schemas.js +35 -38
  51. package/dist/schemas/users.schemas.js +19 -22
  52. package/dist/schemas/weather.schemas.js +32 -35
  53. package/package.json +9 -1
@@ -1,66 +1,63 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.farmListResponseSchema = exports.farmDetailResponseSchema = exports.farmResponseSchema = exports.farmDetailResourceSchema = exports.farmResourceSchema = exports.updateFarmSchema = exports.createFarmSchema = exports.updateFarmAttributesSchema = exports.createFarmAttributesSchema = exports.farmAttributesSchema = exports.currencySchema = void 0;
4
- const zod_1 = require("zod");
5
- const common_schemas_1 = require("./common.schemas");
1
+ import { z } from 'zod';
2
+ import { geoJSONGeometrySchema, timestampsSchema, createJsonApiResourceSchema, jsonApiSingleResponseSchema, jsonApiCollectionResponseSchema } from './common.schemas';
6
3
  /**
7
4
  * Farm schemas - JSON:API compliant
8
5
  */
9
6
  // Currency enum for supported currencies
10
- exports.currencySchema = zod_1.z.enum(['NGN', 'USD']);
7
+ export const currencySchema = z.enum(['NGN', 'USD']);
11
8
  // Farm attributes schema (for JSON:API attributes object)
12
- exports.farmAttributesSchema = zod_1.z.object({
13
- name: zod_1.z.string().min(1).max(100),
14
- location: zod_1.z.string(),
15
- size: zod_1.z.number().nullable(),
16
- boundary: common_schemas_1.geoJSONGeometrySchema.nullable(),
17
- currency: exports.currencySchema,
18
- }).merge(common_schemas_1.timestampsSchema);
9
+ export const farmAttributesSchema = z.object({
10
+ name: z.string().min(1).max(100),
11
+ location: z.string(),
12
+ size: z.number().nullable(),
13
+ boundary: geoJSONGeometrySchema.nullable(),
14
+ currency: currencySchema,
15
+ }).merge(timestampsSchema);
19
16
  // Farm attributes for creation (input)
20
- exports.createFarmAttributesSchema = zod_1.z.object({
21
- name: zod_1.z.string().min(1).max(100),
22
- location: zod_1.z.string().min(1),
23
- size: zod_1.z.number().positive().optional(),
24
- boundary: common_schemas_1.geoJSONGeometrySchema.optional(),
25
- currency: exports.currencySchema.optional().default('NGN'),
17
+ export const createFarmAttributesSchema = z.object({
18
+ name: z.string().min(1).max(100),
19
+ location: z.string().min(1),
20
+ size: z.number().positive().optional(),
21
+ boundary: geoJSONGeometrySchema.optional(),
22
+ currency: currencySchema.optional().default('NGN'),
26
23
  });
27
24
  // Farm attributes for update (input)
28
- exports.updateFarmAttributesSchema = exports.createFarmAttributesSchema.partial();
25
+ export const updateFarmAttributesSchema = createFarmAttributesSchema.partial();
29
26
  // Create farm input (JSON:API format)
30
- exports.createFarmSchema = zod_1.z.object({
31
- type: zod_1.z.literal('farms'),
32
- attributes: exports.createFarmAttributesSchema,
27
+ export const createFarmSchema = z.object({
28
+ type: z.literal('farms'),
29
+ attributes: createFarmAttributesSchema,
33
30
  });
34
31
  // Update farm input (JSON:API format)
35
- exports.updateFarmSchema = zod_1.z.object({
36
- type: zod_1.z.literal('farms'),
37
- id: zod_1.z.string().uuid(),
38
- attributes: exports.updateFarmAttributesSchema,
32
+ export const updateFarmSchema = z.object({
33
+ type: z.literal('farms'),
34
+ id: z.string().uuid(),
35
+ attributes: updateFarmAttributesSchema,
39
36
  });
40
37
  // Farm resource (JSON:API resource object)
41
- exports.farmResourceSchema = (0, common_schemas_1.createJsonApiResourceSchema)('farms', exports.farmAttributesSchema);
38
+ export const farmResourceSchema = createJsonApiResourceSchema('farms', farmAttributesSchema);
42
39
  // Farm detail resource with relationships
43
- exports.farmDetailResourceSchema = exports.farmResourceSchema.extend({
44
- relationships: zod_1.z.object({
45
- fields: zod_1.z.object({
46
- meta: zod_1.z.object({
47
- count: zod_1.z.number().int().nonnegative(),
40
+ export const farmDetailResourceSchema = farmResourceSchema.extend({
41
+ relationships: z.object({
42
+ fields: z.object({
43
+ meta: z.object({
44
+ count: z.number().int().nonnegative(),
48
45
  }),
49
- links: zod_1.z.object({
50
- related: zod_1.z.string(),
46
+ links: z.object({
47
+ related: z.string(),
51
48
  }),
52
49
  }).optional(),
53
- team: zod_1.z.object({
54
- meta: zod_1.z.object({
55
- count: zod_1.z.number().int().nonnegative(),
50
+ team: z.object({
51
+ meta: z.object({
52
+ count: z.number().int().nonnegative(),
56
53
  }),
57
- links: zod_1.z.object({
58
- related: zod_1.z.string(),
54
+ links: z.object({
55
+ related: z.string(),
59
56
  }),
60
57
  }).optional(),
61
58
  }).optional(),
62
59
  });
63
60
  // Farm responses (JSON:API format)
64
- exports.farmResponseSchema = (0, common_schemas_1.jsonApiSingleResponseSchema)(exports.farmResourceSchema);
65
- exports.farmDetailResponseSchema = (0, common_schemas_1.jsonApiSingleResponseSchema)(exports.farmDetailResourceSchema);
66
- exports.farmListResponseSchema = (0, common_schemas_1.jsonApiCollectionResponseSchema)(exports.farmResourceSchema);
61
+ export const farmResponseSchema = jsonApiSingleResponseSchema(farmResourceSchema);
62
+ export const farmDetailResponseSchema = jsonApiSingleResponseSchema(farmDetailResourceSchema);
63
+ export const farmListResponseSchema = jsonApiCollectionResponseSchema(farmResourceSchema);
@@ -1,278 +1,275 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.intelligentSoilProfileSchema = exports.longTermRecommendationSchema = exports.intelligentFertilizerRecommendationSchema = exports.seasonalRecommendationSchema = exports.soilRecommendationSchema = exports.completenessAssessmentSchema = exports.qualityAssessmentSchema = exports.dataSourceInfoSchema = exports.nutrientValueSchema = exports.historicalNDVIDataPointSchema = exports.soilTrendSchema = exports.soilReadingSchema = exports.fieldMonitoringErrorResponseSchema = exports.triggerAnalysisResponseSchema = exports.alertsQuerySchema = exports.ndviTrendQuerySchema = exports.farmMonitoringStatsSchema = exports.fieldComparisonSchema = exports.fieldAlertSchema = exports.weeklyNDVIStatsSchema = exports.ndviTrendDataPointSchema = exports.fieldMonitoringSummarySchema = void 0;
4
- const zod_1 = require("zod");
5
- const recommendations_schemas_1 = require("./recommendations.schemas");
1
+ import { z } from 'zod';
2
+ import { recommendationSchema } from './recommendations.schemas';
6
3
  // Field Monitoring Summary Schema
7
- exports.fieldMonitoringSummarySchema = zod_1.z.object({
8
- id: zod_1.z.string().uuid(),
9
- fieldId: zod_1.z.string().uuid(),
10
- fieldName: zod_1.z.string(),
11
- latestDate: zod_1.z.string().datetime(),
12
- currentNDVI: zod_1.z.number().min(-1).max(1).nullable(),
13
- currentNDWI: zod_1.z.number().min(-1).max(1).nullable(),
14
- currentEVI: zod_1.z.number().nullable(),
15
- currentCropHealth: zod_1.z
4
+ export const fieldMonitoringSummarySchema = z.object({
5
+ id: z.string().uuid(),
6
+ fieldId: z.string().uuid(),
7
+ fieldName: z.string(),
8
+ latestDate: z.string().datetime(),
9
+ currentNDVI: z.number().min(-1).max(1).nullable(),
10
+ currentNDWI: z.number().min(-1).max(1).nullable(),
11
+ currentEVI: z.number().nullable(),
12
+ currentCropHealth: z
16
13
  .enum(['poor', 'fair', 'good', 'excellent'])
17
14
  .nullable(),
18
- currentWaterStress: zod_1.z
15
+ currentWaterStress: z
19
16
  .enum(['none', 'low', 'medium', 'high'])
20
17
  .nullable(),
21
- overallStatus: zod_1.z.enum(['ok', 'warning', 'critical']),
22
- activeAlertCount: zod_1.z.number(),
23
- lastAlertDate: zod_1.z.string().datetime().nullable(),
24
- dataQuality: zod_1.z.enum(['excellent', 'good', 'fair', 'poor']).nullable(),
25
- cloudCover: zod_1.z.number().nullable(),
26
- lastProcessedAt: zod_1.z.string().datetime(),
18
+ overallStatus: z.enum(['ok', 'warning', 'critical']),
19
+ activeAlertCount: z.number(),
20
+ lastAlertDate: z.string().datetime().nullable(),
21
+ dataQuality: z.enum(['excellent', 'good', 'fair', 'poor']).nullable(),
22
+ cloudCover: z.number().nullable(),
23
+ lastProcessedAt: z.string().datetime(),
27
24
  });
28
25
  // NDVI Trend Data Point Schema
29
- exports.ndviTrendDataPointSchema = zod_1.z.object({
30
- time: zod_1.z.string().datetime(),
31
- ndvi: zod_1.z.number().min(-1).max(1),
32
- cloudCover: zod_1.z.number(),
26
+ export const ndviTrendDataPointSchema = z.object({
27
+ time: z.string().datetime(),
28
+ ndvi: z.number().min(-1).max(1),
29
+ cloudCover: z.number(),
33
30
  });
34
31
  // Weekly NDVI Stats Schema
35
- exports.weeklyNDVIStatsSchema = zod_1.z.object({
36
- week: zod_1.z.string().datetime(),
37
- avgNdvi: zod_1.z.number(),
38
- maxNdvi: zod_1.z.number(),
39
- minNdvi: zod_1.z.number(),
32
+ export const weeklyNDVIStatsSchema = z.object({
33
+ week: z.string().datetime(),
34
+ avgNdvi: z.number(),
35
+ maxNdvi: z.number(),
36
+ minNdvi: z.number(),
40
37
  });
41
38
  // Field Alert Schema
42
- exports.fieldAlertSchema = zod_1.z.object({
43
- id: zod_1.z.string().uuid(),
44
- fieldId: zod_1.z.string().uuid(),
45
- fieldName: zod_1.z.string().optional(),
46
- type: zod_1.z.string(),
47
- severity: zod_1.z.enum(['low', 'medium', 'high', 'critical']),
48
- title: zod_1.z.string(),
49
- message: zod_1.z.string(),
50
- recommendations: zod_1.z.array(recommendations_schemas_1.recommendationSchema).nullable(),
51
- status: zod_1.z.enum(['active', 'acknowledged', 'resolved']),
52
- acknowledgedAt: zod_1.z.string().datetime().nullable(),
53
- acknowledgedBy: zod_1.z.string().nullable(),
54
- resolvedAt: zod_1.z.string().datetime().nullable(),
55
- confidence: zod_1.z.number().min(0).max(1).nullable(),
56
- generatedBy: zod_1.z.string(),
57
- createdAt: zod_1.z.string().datetime(),
39
+ export const fieldAlertSchema = z.object({
40
+ id: z.string().uuid(),
41
+ fieldId: z.string().uuid(),
42
+ fieldName: z.string().optional(),
43
+ type: z.string(),
44
+ severity: z.enum(['low', 'medium', 'high', 'critical']),
45
+ title: z.string(),
46
+ message: z.string(),
47
+ recommendations: z.array(recommendationSchema).nullable(),
48
+ status: z.enum(['active', 'acknowledged', 'resolved']),
49
+ acknowledgedAt: z.string().datetime().nullable(),
50
+ acknowledgedBy: z.string().nullable(),
51
+ resolvedAt: z.string().datetime().nullable(),
52
+ confidence: z.number().min(0).max(1).nullable(),
53
+ generatedBy: z.string(),
54
+ createdAt: z.string().datetime(),
58
55
  });
59
56
  // Field Comparison Schema
60
- exports.fieldComparisonSchema = zod_1.z.object({
61
- fieldId: zod_1.z.string().uuid(),
62
- fieldName: zod_1.z.string(),
63
- avgNDVI: zod_1.z.number(),
64
- avgHealthScore: zod_1.z.number(),
65
- rank: zod_1.z.number(),
57
+ export const fieldComparisonSchema = z.object({
58
+ fieldId: z.string().uuid(),
59
+ fieldName: z.string(),
60
+ avgNDVI: z.number(),
61
+ avgHealthScore: z.number(),
62
+ rank: z.number(),
66
63
  });
67
64
  // Farm Monitoring Stats Schema
68
- exports.farmMonitoringStatsSchema = zod_1.z.object({
69
- totalFields: zod_1.z.number(),
70
- healthyFields: zod_1.z.number(),
71
- warningFields: zod_1.z.number(),
72
- criticalFields: zod_1.z.number(),
73
- avgNDVI: zod_1.z.number(),
74
- totalActiveAlerts: zod_1.z.number(),
65
+ export const farmMonitoringStatsSchema = z.object({
66
+ totalFields: z.number(),
67
+ healthyFields: z.number(),
68
+ warningFields: z.number(),
69
+ criticalFields: z.number(),
70
+ avgNDVI: z.number(),
71
+ totalActiveAlerts: z.number(),
75
72
  });
76
73
  // Query Schemas
77
- exports.ndviTrendQuerySchema = zod_1.z.object({
78
- startDate: zod_1.z.string().datetime(),
79
- endDate: zod_1.z.string().datetime(),
80
- interval: zod_1.z.enum(['daily', 'weekly']).default('daily'),
74
+ export const ndviTrendQuerySchema = z.object({
75
+ startDate: z.string().datetime(),
76
+ endDate: z.string().datetime(),
77
+ interval: z.enum(['daily', 'weekly']).default('daily'),
81
78
  });
82
- exports.alertsQuerySchema = zod_1.z.object({
83
- status: zod_1.z.enum(['active', 'acknowledged', 'resolved']).optional(),
79
+ export const alertsQuerySchema = z.object({
80
+ status: z.enum(['active', 'acknowledged', 'resolved']).optional(),
84
81
  });
85
82
  // Response Schemas
86
- exports.triggerAnalysisResponseSchema = zod_1.z.object({
87
- message: zod_1.z.string(),
88
- jobId: zod_1.z.string().nullable(),
89
- nextAvailableAt: zod_1.z.string().datetime().optional(),
83
+ export const triggerAnalysisResponseSchema = z.object({
84
+ message: z.string(),
85
+ jobId: z.string().nullable(),
86
+ nextAvailableAt: z.string().datetime().optional(),
90
87
  });
91
- exports.fieldMonitoringErrorResponseSchema = zod_1.z.object({
92
- message: zod_1.z.string(),
93
- code: zod_1.z.string().optional(),
88
+ export const fieldMonitoringErrorResponseSchema = z.object({
89
+ message: z.string(),
90
+ code: z.string().optional(),
94
91
  });
95
92
  // Soil Monitoring Schemas
96
- exports.soilReadingSchema = zod_1.z.object({
97
- readingDate: zod_1.z.string().datetime(),
98
- soilMoisture: zod_1.z.number().min(0).max(1).nullable(), // m³/m³
99
- surfaceTemp: zod_1.z.number().nullable(), // Kelvins
100
- temp10cm: zod_1.z.number().nullable(), // Kelvins
93
+ export const soilReadingSchema = z.object({
94
+ readingDate: z.string().datetime(),
95
+ soilMoisture: z.number().min(0).max(1).nullable(), // m³/m³
96
+ surfaceTemp: z.number().nullable(), // Kelvins
97
+ temp10cm: z.number().nullable(), // Kelvins
101
98
  });
102
- exports.soilTrendSchema = zod_1.z.object({
103
- fieldId: zod_1.z.string().uuid(),
104
- fieldName: zod_1.z.string(),
105
- readings: zod_1.z.array(exports.soilReadingSchema),
106
- avgMoisture: zod_1.z.number().nullable(),
107
- moistureTrend: zod_1.z.enum(['increasing', 'stable', 'decreasing']).nullable(),
108
- lastReadingDate: zod_1.z.string().datetime().nullable(),
99
+ export const soilTrendSchema = z.object({
100
+ fieldId: z.string().uuid(),
101
+ fieldName: z.string(),
102
+ readings: z.array(soilReadingSchema),
103
+ avgMoisture: z.number().nullable(),
104
+ moistureTrend: z.enum(['increasing', 'stable', 'decreasing']).nullable(),
105
+ lastReadingDate: z.string().datetime().nullable(),
109
106
  });
110
107
  // Historical NDVI Schemas
111
- exports.historicalNDVIDataPointSchema = zod_1.z.object({
112
- date: zod_1.z.string().datetime(),
113
- time: zod_1.z.string().datetime().optional(), // Also include 'time' for consistency with NDVI trend endpoint
114
- ndvi: zod_1.z.number().min(-1).max(1),
115
- source: zod_1.z.enum(['sentinel-2', 'landsat-8', 'modis']),
116
- cloudCoverage: zod_1.z.number().min(0).max(100),
117
- imageCoverage: zod_1.z.number().min(0).max(100),
108
+ export const historicalNDVIDataPointSchema = z.object({
109
+ date: z.string().datetime(),
110
+ time: z.string().datetime().optional(), // Also include 'time' for consistency with NDVI trend endpoint
111
+ ndvi: z.number().min(-1).max(1),
112
+ source: z.enum(['sentinel-2', 'landsat-8', 'modis']),
113
+ cloudCoverage: z.number().min(0).max(100),
114
+ imageCoverage: z.number().min(0).max(100),
118
115
  });
119
116
  // Intelligent Soil Profile Schemas
120
- exports.nutrientValueSchema = zod_1.z.object({
121
- value: zod_1.z.number().nullable(),
122
- unit: zod_1.z.enum(['ppm', 'kg/ha', 'g/kg', '%', 'cmol(c)/kg']),
123
- source: zod_1.z.enum(['manual', 'regional_api', 'global_api', 'predicted']),
124
- confidence: zod_1.z.number().min(0).max(1),
125
- lastUpdated: zod_1.z.string().datetime(),
126
- sourceId: zod_1.z.string().optional(),
117
+ export const nutrientValueSchema = z.object({
118
+ value: z.number().nullable(),
119
+ unit: z.enum(['ppm', 'kg/ha', 'g/kg', '%', 'cmol(c)/kg']),
120
+ source: z.enum(['manual', 'regional_api', 'global_api', 'predicted']),
121
+ confidence: z.number().min(0).max(1),
122
+ lastUpdated: z.string().datetime(),
123
+ sourceId: z.string().optional(),
127
124
  });
128
- exports.dataSourceInfoSchema = zod_1.z.object({
129
- source: zod_1.z.enum(['manual', 'regional_api', 'global_api', 'predicted']),
130
- sourceId: zod_1.z.string().optional(),
131
- priority: zod_1.z.number().min(1).max(4),
132
- confidence: zod_1.z.number().min(0).max(1),
133
- date: zod_1.z.string().datetime(),
134
- notes: zod_1.z.string().optional(),
125
+ export const dataSourceInfoSchema = z.object({
126
+ source: z.enum(['manual', 'regional_api', 'global_api', 'predicted']),
127
+ sourceId: z.string().optional(),
128
+ priority: z.number().min(1).max(4),
129
+ confidence: z.number().min(0).max(1),
130
+ date: z.string().datetime(),
131
+ notes: z.string().optional(),
135
132
  });
136
- exports.qualityAssessmentSchema = zod_1.z.object({
137
- quality: zod_1.z.enum(['excellent', 'good', 'fair', 'poor', 'critical']),
138
- recommendation: zod_1.z.string(),
139
- optimalRange: zod_1.z
133
+ export const qualityAssessmentSchema = z.object({
134
+ quality: z.enum(['excellent', 'good', 'fair', 'poor', 'critical']),
135
+ recommendation: z.string(),
136
+ optimalRange: z
140
137
  .object({
141
- min: zod_1.z.number(),
142
- max: zod_1.z.number(),
138
+ min: z.number(),
139
+ max: z.number(),
143
140
  })
144
141
  .optional(),
145
- currentStatus: zod_1.z.enum(['optimal', 'low', 'high', 'critical']),
142
+ currentStatus: z.enum(['optimal', 'low', 'high', 'critical']),
146
143
  });
147
- exports.completenessAssessmentSchema = zod_1.z.object({
148
- score: zod_1.z.number().min(0).max(1),
149
- missingFields: zod_1.z.array(zod_1.z.string()),
150
- completeness: zod_1.z.enum(['complete', 'mostly_complete', 'partial', 'incomplete']),
144
+ export const completenessAssessmentSchema = z.object({
145
+ score: z.number().min(0).max(1),
146
+ missingFields: z.array(z.string()),
147
+ completeness: z.enum(['complete', 'mostly_complete', 'partial', 'incomplete']),
151
148
  });
152
- exports.soilRecommendationSchema = zod_1.z.object({
153
- priority: zod_1.z.number().min(1).max(5),
154
- action: zod_1.z.string(),
155
- details: zod_1.z.string(),
156
- timing: zod_1.z.string(),
157
- severity: zod_1.z.enum(['low', 'medium', 'high', 'critical']).optional(),
158
- confidence: zod_1.z.number().min(0).max(1).optional(),
149
+ export const soilRecommendationSchema = z.object({
150
+ priority: z.number().min(1).max(5),
151
+ action: z.string(),
152
+ details: z.string(),
153
+ timing: z.string(),
154
+ severity: z.enum(['low', 'medium', 'high', 'critical']).optional(),
155
+ confidence: z.number().min(0).max(1).optional(),
159
156
  });
160
- exports.seasonalRecommendationSchema = zod_1.z.object({
161
- priority: zod_1.z.number().min(1).max(5),
162
- action: zod_1.z.string(),
163
- details: zod_1.z.string(),
164
- timing: zod_1.z.string(),
165
- confidence: zod_1.z.number().min(0).max(1).optional(),
157
+ export const seasonalRecommendationSchema = z.object({
158
+ priority: z.number().min(1).max(5),
159
+ action: z.string(),
160
+ details: z.string(),
161
+ timing: z.string(),
162
+ confidence: z.number().min(0).max(1).optional(),
166
163
  });
167
- exports.intelligentFertilizerRecommendationSchema = zod_1.z.object({
168
- inventoryItemId: zod_1.z.string().uuid().optional(),
169
- productName: zod_1.z.string().optional(),
170
- quantity: zod_1.z.number(),
171
- unit: zod_1.z.string(),
172
- reason: zod_1.z.string(),
173
- estimatedCost: zod_1.z.number().optional(),
174
- applicationTiming: zod_1.z.string().optional(),
175
- confidence: zod_1.z.number().min(0).max(1).optional(),
164
+ export const intelligentFertilizerRecommendationSchema = z.object({
165
+ inventoryItemId: z.string().uuid().optional(),
166
+ productName: z.string().optional(),
167
+ quantity: z.number(),
168
+ unit: z.string(),
169
+ reason: z.string(),
170
+ estimatedCost: z.number().optional(),
171
+ applicationTiming: z.string().optional(),
172
+ confidence: z.number().min(0).max(1).optional(),
176
173
  });
177
- exports.longTermRecommendationSchema = zod_1.z.object({
178
- priority: zod_1.z.number().min(1).max(5),
179
- action: zod_1.z.string(),
180
- details: zod_1.z.string(),
181
- timeframe: zod_1.z.string(),
182
- expectedImpact: zod_1.z.string(),
183
- confidence: zod_1.z.number().min(0).max(1).optional(),
174
+ export const longTermRecommendationSchema = z.object({
175
+ priority: z.number().min(1).max(5),
176
+ action: z.string(),
177
+ details: z.string(),
178
+ timeframe: z.string(),
179
+ expectedImpact: z.string(),
180
+ confidence: z.number().min(0).max(1).optional(),
184
181
  });
185
- exports.intelligentSoilProfileSchema = zod_1.z.object({
186
- fieldId: zod_1.z.string().uuid(),
187
- fieldName: zod_1.z.string(),
188
- coordinates: zod_1.z.object({
189
- latitude: zod_1.z.number(),
190
- longitude: zod_1.z.number(),
182
+ export const intelligentSoilProfileSchema = z.object({
183
+ fieldId: z.string().uuid(),
184
+ fieldName: z.string(),
185
+ coordinates: z.object({
186
+ latitude: z.number(),
187
+ longitude: z.number(),
191
188
  }),
192
- nutrients: zod_1.z.object({
193
- pH: exports.nutrientValueSchema,
194
- nitrogen: exports.nutrientValueSchema,
195
- phosphorus: exports.nutrientValueSchema,
196
- potassium: exports.nutrientValueSchema,
197
- organicMatter: exports.nutrientValueSchema,
198
- organicCarbon: exports.nutrientValueSchema,
199
- cec: exports.nutrientValueSchema,
189
+ nutrients: z.object({
190
+ pH: nutrientValueSchema,
191
+ nitrogen: nutrientValueSchema,
192
+ phosphorus: nutrientValueSchema,
193
+ potassium: nutrientValueSchema,
194
+ organicMatter: nutrientValueSchema,
195
+ organicCarbon: nutrientValueSchema,
196
+ cec: nutrientValueSchema,
200
197
  }),
201
- properties: zod_1.z.object({
202
- texture: zod_1.z.object({
203
- sand: zod_1.z.number(),
204
- silt: zod_1.z.number(),
205
- clay: zod_1.z.number(),
206
- classification: zod_1.z.string(),
198
+ properties: z.object({
199
+ texture: z.object({
200
+ sand: z.number(),
201
+ silt: z.number(),
202
+ clay: z.number(),
203
+ classification: z.string(),
207
204
  }),
208
- bulkDensity: zod_1.z.number(),
205
+ bulkDensity: z.number(),
209
206
  }),
210
- dataSources: zod_1.z.record(zod_1.z.string(), exports.dataSourceInfoSchema),
211
- quality: zod_1.z.object({
212
- overall: zod_1.z.enum(['excellent', 'good', 'fair', 'poor', 'critical']),
213
- score: zod_1.z.number().min(0).max(1),
214
- assessments: zod_1.z.object({
215
- pH: exports.qualityAssessmentSchema,
216
- organicMatter: exports.qualityAssessmentSchema,
217
- completeness: exports.completenessAssessmentSchema,
207
+ dataSources: z.record(z.string(), dataSourceInfoSchema),
208
+ quality: z.object({
209
+ overall: z.enum(['excellent', 'good', 'fair', 'poor', 'critical']),
210
+ score: z.number().min(0).max(1),
211
+ assessments: z.object({
212
+ pH: qualityAssessmentSchema,
213
+ organicMatter: qualityAssessmentSchema,
214
+ completeness: completenessAssessmentSchema,
218
215
  }),
219
216
  }),
220
- temporal: zod_1.z.object({
221
- latestUpdate: zod_1.z.string().datetime(),
222
- testHistory: zod_1.z.array(zod_1.z.object({
223
- id: zod_1.z.string().uuid(),
224
- date: zod_1.z.string().datetime(),
225
- pH: zod_1.z.number(),
226
- nitrogen: zod_1.z.number().nullable(),
227
- phosphorus: zod_1.z.number().nullable(),
228
- potassium: zod_1.z.number().nullable(),
217
+ temporal: z.object({
218
+ latestUpdate: z.string().datetime(),
219
+ testHistory: z.array(z.object({
220
+ id: z.string().uuid(),
221
+ date: z.string().datetime(),
222
+ pH: z.number(),
223
+ nitrogen: z.number().nullable(),
224
+ phosphorus: z.number().nullable(),
225
+ potassium: z.number().nullable(),
229
226
  })),
230
- trends: zod_1.z
227
+ trends: z
231
228
  .object({
232
- pH: zod_1.z
229
+ pH: z
233
230
  .object({
234
- direction: zod_1.z.enum(['increasing', 'decreasing', 'stable']),
235
- rate: zod_1.z.number(),
231
+ direction: z.enum(['increasing', 'decreasing', 'stable']),
232
+ rate: z.number(),
236
233
  })
237
234
  .optional(),
238
- nitrogen: zod_1.z
235
+ nitrogen: z
239
236
  .object({
240
- direction: zod_1.z.enum(['increasing', 'decreasing', 'stable']),
241
- rate: zod_1.z.number(),
237
+ direction: z.enum(['increasing', 'decreasing', 'stable']),
238
+ rate: z.number(),
242
239
  })
243
240
  .optional(),
244
- phosphorus: zod_1.z
241
+ phosphorus: z
245
242
  .object({
246
- direction: zod_1.z.enum(['increasing', 'decreasing', 'stable']),
247
- rate: zod_1.z.number(),
243
+ direction: z.enum(['increasing', 'decreasing', 'stable']),
244
+ rate: z.number(),
248
245
  })
249
246
  .optional(),
250
- potassium: zod_1.z
247
+ potassium: z
251
248
  .object({
252
- direction: zod_1.z.enum(['increasing', 'decreasing', 'stable']),
253
- rate: zod_1.z.number(),
249
+ direction: z.enum(['increasing', 'decreasing', 'stable']),
250
+ rate: z.number(),
254
251
  })
255
252
  .optional(),
256
- organicMatter: zod_1.z
253
+ organicMatter: z
257
254
  .object({
258
- direction: zod_1.z.enum(['increasing', 'decreasing', 'stable']),
259
- rate: zod_1.z.number(),
255
+ direction: z.enum(['increasing', 'decreasing', 'stable']),
256
+ rate: z.number(),
260
257
  })
261
258
  .optional(),
262
259
  })
263
260
  .optional(),
264
261
  }),
265
- recommendations: zod_1.z.object({
266
- immediate: zod_1.z.array(exports.soilRecommendationSchema),
267
- seasonal: zod_1.z.array(exports.seasonalRecommendationSchema),
268
- fertilizer: zod_1.z.array(exports.intelligentFertilizerRecommendationSchema),
269
- longTerm: zod_1.z.array(exports.longTermRecommendationSchema).optional(),
270
- summary: zod_1.z.string().optional(),
262
+ recommendations: z.object({
263
+ immediate: z.array(soilRecommendationSchema),
264
+ seasonal: z.array(seasonalRecommendationSchema),
265
+ fertilizer: z.array(intelligentFertilizerRecommendationSchema),
266
+ longTerm: z.array(longTermRecommendationSchema).optional(),
267
+ summary: z.string().optional(),
271
268
  }),
272
- metadata: zod_1.z.object({
273
- confidence: zod_1.z.number().min(0).max(1),
274
- completeness: zod_1.z.number().min(0).max(1),
275
- lastValidated: zod_1.z.string().datetime(),
276
- nextRecommendedTest: zod_1.z.string().datetime().optional(),
269
+ metadata: z.object({
270
+ confidence: z.number().min(0).max(1),
271
+ completeness: z.number().min(0).max(1),
272
+ lastValidated: z.string().datetime(),
273
+ nextRecommendedTest: z.string().datetime().optional(),
277
274
  }),
278
275
  });