@deepintel-ltd/farmpro-contracts 1.5.11 → 1.5.13
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.
- package/dist/routes/agent-workflows.routes.d.ts +48 -42
- package/dist/routes/agent-workflows.routes.d.ts.map +1 -1
- package/dist/routes/agent-workflows.routes.js +17 -20
- package/dist/routes/agents.routes.d.ts +30 -17
- package/dist/routes/agents.routes.d.ts.map +1 -1
- package/dist/routes/agents.routes.js +32 -14
- package/dist/routes/field-observations.routes.d.ts +56 -48
- package/dist/routes/field-observations.routes.d.ts.map +1 -1
- package/dist/routes/finance.routes.d.ts +107 -2
- package/dist/routes/finance.routes.d.ts.map +1 -1
- package/dist/routes/finance.routes.js +2 -2
- package/dist/routes/soil-tests.routes.d.ts +688 -0
- package/dist/routes/soil-tests.routes.d.ts.map +1 -1
- package/dist/routes/soil-tests.routes.js +20 -0
- package/dist/routes/team.routes.d.ts +73 -3
- package/dist/routes/team.routes.d.ts.map +1 -1
- package/dist/routes/team.routes.js +2 -1
- package/dist/schemas/agents.schemas.d.ts +8 -0
- package/dist/schemas/agents.schemas.d.ts.map +1 -1
- package/dist/schemas/agents.schemas.js +3 -0
- package/dist/schemas/field-observations.schemas.d.ts +38 -24
- package/dist/schemas/field-observations.schemas.d.ts.map +1 -1
- package/dist/schemas/field-observations.schemas.js +9 -11
- package/dist/schemas/finance.schemas.d.ts +116 -0
- package/dist/schemas/finance.schemas.d.ts.map +1 -1
- package/dist/schemas/finance.schemas.js +11 -0
- package/package.json +1 -1
|
@@ -9,32 +9,36 @@ import { z } from 'zod';
|
|
|
9
9
|
export declare const agentWorkflowsRouter: {
|
|
10
10
|
listWorkflows: {
|
|
11
11
|
query: z.ZodObject<{
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
'page[number]': z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
13
|
+
'page[size]': z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
14
|
+
'filter[startDate]': z.ZodOptional<z.ZodString>;
|
|
15
|
+
'filter[endDate]': z.ZodOptional<z.ZodString>;
|
|
16
|
+
'filter[crop]': z.ZodOptional<z.ZodString>;
|
|
17
|
+
} & {
|
|
18
|
+
'filter[farmId]': z.ZodOptional<z.ZodString>;
|
|
19
|
+
'filter[fieldId]': z.ZodOptional<z.ZodString>;
|
|
20
|
+
'filter[status]': z.ZodOptional<z.ZodEnum<["in_progress", "completed", "failed"]>>;
|
|
21
|
+
'filter[triggerEvent]': z.ZodOptional<z.ZodString>;
|
|
20
22
|
}, "strip", z.ZodTypeAny, {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
'page[number]'?: number | undefined;
|
|
24
|
+
'page[size]'?: number | undefined;
|
|
25
|
+
'filter[startDate]'?: string | undefined;
|
|
26
|
+
'filter[endDate]'?: string | undefined;
|
|
27
|
+
'filter[status]'?: "completed" | "in_progress" | "failed" | undefined;
|
|
28
|
+
'filter[crop]'?: string | undefined;
|
|
29
|
+
'filter[fieldId]'?: string | undefined;
|
|
30
|
+
'filter[farmId]'?: string | undefined;
|
|
31
|
+
'filter[triggerEvent]'?: string | undefined;
|
|
29
32
|
}, {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
'page[number]'?: number | undefined;
|
|
34
|
+
'page[size]'?: number | undefined;
|
|
35
|
+
'filter[startDate]'?: string | undefined;
|
|
36
|
+
'filter[endDate]'?: string | undefined;
|
|
37
|
+
'filter[status]'?: "completed" | "in_progress" | "failed" | undefined;
|
|
38
|
+
'filter[crop]'?: string | undefined;
|
|
39
|
+
'filter[fieldId]'?: string | undefined;
|
|
40
|
+
'filter[farmId]'?: string | undefined;
|
|
41
|
+
'filter[triggerEvent]'?: string | undefined;
|
|
38
42
|
}>;
|
|
39
43
|
summary: "List agent workflows with filters";
|
|
40
44
|
method: "GET";
|
|
@@ -1341,17 +1345,18 @@ export declare const agentWorkflowsRouter: {
|
|
|
1341
1345
|
};
|
|
1342
1346
|
getWorkflowsByFarm: {
|
|
1343
1347
|
query: z.ZodObject<{
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1348
|
+
'page[number]': z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
1349
|
+
'page[size]': z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
1350
|
+
} & {
|
|
1351
|
+
'filter[status]': z.ZodOptional<z.ZodEnum<["in_progress", "completed", "failed"]>>;
|
|
1347
1352
|
}, "strip", z.ZodTypeAny, {
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
status?: "completed" | "in_progress" | "failed" | undefined;
|
|
1353
|
+
'page[number]'?: number | undefined;
|
|
1354
|
+
'page[size]'?: number | undefined;
|
|
1355
|
+
'filter[status]'?: "completed" | "in_progress" | "failed" | undefined;
|
|
1351
1356
|
}, {
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1357
|
+
'page[number]'?: number | undefined;
|
|
1358
|
+
'page[size]'?: number | undefined;
|
|
1359
|
+
'filter[status]'?: "completed" | "in_progress" | "failed" | undefined;
|
|
1355
1360
|
}>;
|
|
1356
1361
|
summary: "Get all workflows for a farm";
|
|
1357
1362
|
method: "GET";
|
|
@@ -2006,17 +2011,18 @@ export declare const agentWorkflowsRouter: {
|
|
|
2006
2011
|
};
|
|
2007
2012
|
getWorkflowsByField: {
|
|
2008
2013
|
query: z.ZodObject<{
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2014
|
+
'page[number]': z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
2015
|
+
'page[size]': z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
2016
|
+
} & {
|
|
2017
|
+
'filter[status]': z.ZodOptional<z.ZodEnum<["in_progress", "completed", "failed"]>>;
|
|
2012
2018
|
}, "strip", z.ZodTypeAny, {
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
status?: "completed" | "in_progress" | "failed" | undefined;
|
|
2019
|
+
'page[number]'?: number | undefined;
|
|
2020
|
+
'page[size]'?: number | undefined;
|
|
2021
|
+
'filter[status]'?: "completed" | "in_progress" | "failed" | undefined;
|
|
2016
2022
|
}, {
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2023
|
+
'page[number]'?: number | undefined;
|
|
2024
|
+
'page[size]'?: number | undefined;
|
|
2025
|
+
'filter[status]'?: "completed" | "in_progress" | "failed" | undefined;
|
|
2020
2026
|
}>;
|
|
2021
2027
|
summary: "Get all workflows for a field";
|
|
2022
2028
|
method: "GET";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-workflows.routes.d.ts","sourceRoot":"","sources":["../../src/routes/agent-workflows.routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-workflows.routes.d.ts","sourceRoot":"","sources":["../../src/routes/agent-workflows.routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2J/B,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { initContract } from '@ts-rest/core';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { agentWorkflowResponseSchema, agentWorkflowListResponseSchema, agentWorkflowStatusSchema, } from '../schemas/agent-workflows.schemas';
|
|
4
|
+
import { jsonApiPaginationQuerySchema, jsonApiFilterQuerySchema, } from '../schemas/common.schemas';
|
|
4
5
|
const c = initContract();
|
|
5
6
|
/**
|
|
6
7
|
* Agent Workflows Routes
|
|
@@ -16,16 +17,14 @@ export const agentWorkflowsRouter = c.router({
|
|
|
16
17
|
listWorkflows: {
|
|
17
18
|
method: 'GET',
|
|
18
19
|
path: '/agent-workflows',
|
|
19
|
-
query:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
offset: z.coerce.number().int().min(0).default(0),
|
|
28
|
-
}),
|
|
20
|
+
query: jsonApiPaginationQuerySchema
|
|
21
|
+
.merge(jsonApiFilterQuerySchema)
|
|
22
|
+
.merge(z.object({
|
|
23
|
+
'filter[farmId]': z.string().uuid().optional(),
|
|
24
|
+
'filter[fieldId]': z.string().uuid().optional(),
|
|
25
|
+
'filter[status]': agentWorkflowStatusSchema.optional(),
|
|
26
|
+
'filter[triggerEvent]': z.string().optional(), // e.g., 'observation.analysis.completed'
|
|
27
|
+
})),
|
|
29
28
|
responses: {
|
|
30
29
|
200: agentWorkflowListResponseSchema,
|
|
31
30
|
400: z.object({
|
|
@@ -64,11 +63,10 @@ export const agentWorkflowsRouter = c.router({
|
|
|
64
63
|
getWorkflowsByFarm: {
|
|
65
64
|
method: 'GET',
|
|
66
65
|
path: '/farms/:farmId/agent-workflows',
|
|
67
|
-
query:
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}),
|
|
66
|
+
query: jsonApiPaginationQuerySchema
|
|
67
|
+
.merge(z.object({
|
|
68
|
+
'filter[status]': agentWorkflowStatusSchema.optional(),
|
|
69
|
+
})),
|
|
72
70
|
responses: {
|
|
73
71
|
200: agentWorkflowListResponseSchema,
|
|
74
72
|
404: z.object({
|
|
@@ -88,11 +86,10 @@ export const agentWorkflowsRouter = c.router({
|
|
|
88
86
|
getWorkflowsByField: {
|
|
89
87
|
method: 'GET',
|
|
90
88
|
path: '/fields/:fieldId/agent-workflows',
|
|
91
|
-
query:
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}),
|
|
89
|
+
query: jsonApiPaginationQuerySchema
|
|
90
|
+
.merge(z.object({
|
|
91
|
+
'filter[status]': agentWorkflowStatusSchema.optional(),
|
|
92
|
+
})),
|
|
96
93
|
responses: {
|
|
97
94
|
200: agentWorkflowListResponseSchema,
|
|
98
95
|
404: z.object({
|
|
@@ -1,28 +1,17 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
export declare const agentsRouter: {
|
|
3
3
|
chatWithAgronomics: {
|
|
4
|
-
metadata: {
|
|
5
|
-
openapi: {
|
|
6
|
-
parameters: {
|
|
7
|
-
name: string;
|
|
8
|
-
in: string;
|
|
9
|
-
required: boolean;
|
|
10
|
-
schema: {
|
|
11
|
-
type: string;
|
|
12
|
-
enum: string[];
|
|
13
|
-
};
|
|
14
|
-
}[];
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
4
|
summary: "Chat with the agronomics AI agent";
|
|
18
|
-
description: "Send a message to the agronomics agent and receive AI-powered farming advice based on your
|
|
5
|
+
description: "Send a message to the agronomics agent and receive AI-powered farming advice. Supports file uploads for soil tests and documents. The agent can create soil tests and tasks based on your requests.";
|
|
19
6
|
method: "POST";
|
|
7
|
+
contentType: "multipart/form-data";
|
|
20
8
|
body: z.ZodObject<{
|
|
21
|
-
data: z.ZodObject<{
|
|
9
|
+
data: z.ZodUnion<[z.ZodObject<{
|
|
22
10
|
type: z.ZodLiteral<"agent-chat-requests">;
|
|
23
11
|
attributes: z.ZodObject<{
|
|
24
12
|
message: z.ZodString;
|
|
25
13
|
farmId: z.ZodOptional<z.ZodString>;
|
|
14
|
+
fieldId: z.ZodOptional<z.ZodString>;
|
|
26
15
|
conversationId: z.ZodOptional<z.ZodString>;
|
|
27
16
|
conversationHistory: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
28
17
|
role: z.ZodEnum<["user", "assistant"]>;
|
|
@@ -37,6 +26,7 @@ export declare const agentsRouter: {
|
|
|
37
26
|
}, "strip", z.ZodTypeAny, {
|
|
38
27
|
message: string;
|
|
39
28
|
farmId?: string | undefined;
|
|
29
|
+
fieldId?: string | undefined;
|
|
40
30
|
conversationId?: string | undefined;
|
|
41
31
|
conversationHistory?: {
|
|
42
32
|
role: "user" | "assistant";
|
|
@@ -45,6 +35,7 @@ export declare const agentsRouter: {
|
|
|
45
35
|
}, {
|
|
46
36
|
message: string;
|
|
47
37
|
farmId?: string | undefined;
|
|
38
|
+
fieldId?: string | undefined;
|
|
48
39
|
conversationId?: string | undefined;
|
|
49
40
|
conversationHistory?: {
|
|
50
41
|
role: "user" | "assistant";
|
|
@@ -56,6 +47,7 @@ export declare const agentsRouter: {
|
|
|
56
47
|
attributes: {
|
|
57
48
|
message: string;
|
|
58
49
|
farmId?: string | undefined;
|
|
50
|
+
fieldId?: string | undefined;
|
|
59
51
|
conversationId?: string | undefined;
|
|
60
52
|
conversationHistory?: {
|
|
61
53
|
role: "user" | "assistant";
|
|
@@ -67,19 +59,35 @@ export declare const agentsRouter: {
|
|
|
67
59
|
attributes: {
|
|
68
60
|
message: string;
|
|
69
61
|
farmId?: string | undefined;
|
|
62
|
+
fieldId?: string | undefined;
|
|
70
63
|
conversationId?: string | undefined;
|
|
71
64
|
conversationHistory?: {
|
|
72
65
|
role: "user" | "assistant";
|
|
73
66
|
content: string;
|
|
74
67
|
}[] | undefined;
|
|
75
68
|
};
|
|
76
|
-
}
|
|
69
|
+
}>, z.ZodEffects<z.ZodString, {
|
|
70
|
+
type: "agent-chat-requests";
|
|
71
|
+
attributes: {
|
|
72
|
+
message: string;
|
|
73
|
+
farmId?: string | undefined;
|
|
74
|
+
fieldId?: string | undefined;
|
|
75
|
+
conversationId?: string | undefined;
|
|
76
|
+
conversationHistory?: {
|
|
77
|
+
role: "user" | "assistant";
|
|
78
|
+
content: string;
|
|
79
|
+
}[] | undefined;
|
|
80
|
+
};
|
|
81
|
+
}, string>]>;
|
|
82
|
+
file: z.ZodOptional<z.ZodType<import("buffer").File, z.ZodTypeDef, import("buffer").File>>;
|
|
83
|
+
files: z.ZodOptional<z.ZodUnion<[z.ZodType<import("buffer").File, z.ZodTypeDef, import("buffer").File>, z.ZodArray<z.ZodType<import("buffer").File, z.ZodTypeDef, import("buffer").File>, "many">]>>;
|
|
77
84
|
}, "strip", z.ZodTypeAny, {
|
|
78
85
|
data: {
|
|
79
86
|
type: "agent-chat-requests";
|
|
80
87
|
attributes: {
|
|
81
88
|
message: string;
|
|
82
89
|
farmId?: string | undefined;
|
|
90
|
+
fieldId?: string | undefined;
|
|
83
91
|
conversationId?: string | undefined;
|
|
84
92
|
conversationHistory?: {
|
|
85
93
|
role: "user" | "assistant";
|
|
@@ -87,12 +95,15 @@ export declare const agentsRouter: {
|
|
|
87
95
|
}[] | undefined;
|
|
88
96
|
};
|
|
89
97
|
};
|
|
98
|
+
file?: import("buffer").File | undefined;
|
|
99
|
+
files?: import("buffer").File | import("buffer").File[] | undefined;
|
|
90
100
|
}, {
|
|
91
|
-
data: {
|
|
101
|
+
data: string | {
|
|
92
102
|
type: "agent-chat-requests";
|
|
93
103
|
attributes: {
|
|
94
104
|
message: string;
|
|
95
105
|
farmId?: string | undefined;
|
|
106
|
+
fieldId?: string | undefined;
|
|
96
107
|
conversationId?: string | undefined;
|
|
97
108
|
conversationHistory?: {
|
|
98
109
|
role: "user" | "assistant";
|
|
@@ -100,6 +111,8 @@ export declare const agentsRouter: {
|
|
|
100
111
|
}[] | undefined;
|
|
101
112
|
};
|
|
102
113
|
};
|
|
114
|
+
file?: import("buffer").File | undefined;
|
|
115
|
+
files?: import("buffer").File | import("buffer").File[] | undefined;
|
|
103
116
|
}>;
|
|
104
117
|
path: "/agents/agronomics/chat";
|
|
105
118
|
responses: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.routes.d.ts","sourceRoot":"","sources":["../../src/routes/agents.routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,YAAY
|
|
1
|
+
{"version":3,"file":"agents.routes.d.ts","sourceRoot":"","sources":["../../src/routes/agents.routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmFvB,CAAC"}
|
|
@@ -8,7 +8,37 @@ export const agentsRouter = c.router({
|
|
|
8
8
|
chatWithAgronomics: {
|
|
9
9
|
method: 'POST',
|
|
10
10
|
path: '/agents/agronomics/chat',
|
|
11
|
-
|
|
11
|
+
contentType: 'multipart/form-data', // Support file uploads
|
|
12
|
+
body: z.object({
|
|
13
|
+
// In multipart/form-data, 'data' comes as a JSON string that needs to be parsed
|
|
14
|
+
// Accept both string (from form-data) and object (already parsed) for flexibility
|
|
15
|
+
data: z.union([
|
|
16
|
+
chatRequestSchema, // Already an object
|
|
17
|
+
z.string().transform((str, ctx) => {
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(str);
|
|
20
|
+
return chatRequestSchema.parse(parsed);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error instanceof z.ZodError) {
|
|
24
|
+
ctx.addIssue({
|
|
25
|
+
code: z.ZodIssueCode.custom,
|
|
26
|
+
message: `Invalid data structure: ${error.errors.map(e => e.message).join(', ')}`,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
ctx.addIssue({
|
|
31
|
+
code: z.ZodIssueCode.custom,
|
|
32
|
+
message: 'Invalid JSON in data field',
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return z.NEVER;
|
|
36
|
+
}
|
|
37
|
+
}),
|
|
38
|
+
]),
|
|
39
|
+
file: z.instanceof(File).optional(),
|
|
40
|
+
files: z.union([z.instanceof(File), z.array(z.instanceof(File))]).optional(),
|
|
41
|
+
}),
|
|
12
42
|
responses: {
|
|
13
43
|
200: agentChatResponseSchema,
|
|
14
44
|
400: jsonApiErrorResponseSchema,
|
|
@@ -16,19 +46,7 @@ export const agentsRouter = c.router({
|
|
|
16
46
|
500: jsonApiErrorResponseSchema,
|
|
17
47
|
},
|
|
18
48
|
summary: 'Chat with the agronomics AI agent',
|
|
19
|
-
description: 'Send a message to the agronomics agent and receive AI-powered farming advice based on your
|
|
20
|
-
metadata: {
|
|
21
|
-
openapi: {
|
|
22
|
-
parameters: [
|
|
23
|
-
{
|
|
24
|
-
name: 'Content-Type',
|
|
25
|
-
in: 'header',
|
|
26
|
-
required: true,
|
|
27
|
-
schema: { type: 'string', enum: ['application/vnd.api+json'] },
|
|
28
|
-
},
|
|
29
|
-
],
|
|
30
|
-
},
|
|
31
|
-
},
|
|
49
|
+
description: 'Send a message to the agronomics agent and receive AI-powered farming advice. Supports file uploads for soil tests and documents. The agent can create soil tests and tasks based on your requests.',
|
|
32
50
|
},
|
|
33
51
|
// Get conversation history
|
|
34
52
|
getConversationHistory: {
|
|
@@ -1001,32 +1001,36 @@ export declare const fieldObservationsRouter: {
|
|
|
1001
1001
|
};
|
|
1002
1002
|
listFieldObservations: {
|
|
1003
1003
|
query: z.ZodObject<{
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1004
|
+
'page[number]': z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
1005
|
+
'page[size]': z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
1006
|
+
'filter[startDate]': z.ZodOptional<z.ZodString>;
|
|
1007
|
+
'filter[endDate]': z.ZodOptional<z.ZodString>;
|
|
1008
|
+
'filter[crop]': z.ZodOptional<z.ZodString>;
|
|
1009
|
+
} & {
|
|
1010
|
+
'filter[fieldId]': z.ZodOptional<z.ZodString>;
|
|
1011
|
+
'filter[status]': z.ZodOptional<z.ZodEnum<["pending", "processing", "completed", "failed"]>>;
|
|
1012
|
+
'filter[observationType]': z.ZodOptional<z.ZodString>;
|
|
1013
|
+
'filter[severity]': z.ZodOptional<z.ZodEnum<["low", "medium", "high", "critical"]>>;
|
|
1012
1014
|
}, "strip", z.ZodTypeAny, {
|
|
1013
|
-
|
|
1014
|
-
page
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
observationType?: string | undefined;
|
|
1015
|
+
'page[number]'?: number | undefined;
|
|
1016
|
+
'page[size]'?: number | undefined;
|
|
1017
|
+
'filter[startDate]'?: string | undefined;
|
|
1018
|
+
'filter[endDate]'?: string | undefined;
|
|
1019
|
+
'filter[status]'?: "pending" | "completed" | "failed" | "processing" | undefined;
|
|
1020
|
+
'filter[crop]'?: string | undefined;
|
|
1021
|
+
'filter[fieldId]'?: string | undefined;
|
|
1022
|
+
'filter[observationType]'?: string | undefined;
|
|
1023
|
+
'filter[severity]'?: "critical" | "low" | "medium" | "high" | undefined;
|
|
1021
1024
|
}, {
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1025
|
+
'page[number]'?: number | undefined;
|
|
1026
|
+
'page[size]'?: number | undefined;
|
|
1027
|
+
'filter[startDate]'?: string | undefined;
|
|
1028
|
+
'filter[endDate]'?: string | undefined;
|
|
1029
|
+
'filter[status]'?: "pending" | "completed" | "failed" | "processing" | undefined;
|
|
1030
|
+
'filter[crop]'?: string | undefined;
|
|
1031
|
+
'filter[fieldId]'?: string | undefined;
|
|
1032
|
+
'filter[observationType]'?: string | undefined;
|
|
1033
|
+
'filter[severity]'?: "critical" | "low" | "medium" | "high" | undefined;
|
|
1030
1034
|
}>;
|
|
1031
1035
|
summary: "List all observations for a field";
|
|
1032
1036
|
method: "GET";
|
|
@@ -1854,32 +1858,36 @@ export declare const fieldObservationsRouter: {
|
|
|
1854
1858
|
};
|
|
1855
1859
|
listFarmObservations: {
|
|
1856
1860
|
query: z.ZodObject<{
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1861
|
+
'page[number]': z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
1862
|
+
'page[size]': z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
1863
|
+
'filter[startDate]': z.ZodOptional<z.ZodString>;
|
|
1864
|
+
'filter[endDate]': z.ZodOptional<z.ZodString>;
|
|
1865
|
+
'filter[crop]': z.ZodOptional<z.ZodString>;
|
|
1866
|
+
} & {
|
|
1867
|
+
'filter[fieldId]': z.ZodOptional<z.ZodString>;
|
|
1868
|
+
'filter[status]': z.ZodOptional<z.ZodEnum<["pending", "processing", "completed", "failed"]>>;
|
|
1869
|
+
'filter[observationType]': z.ZodOptional<z.ZodString>;
|
|
1870
|
+
'filter[severity]': z.ZodOptional<z.ZodEnum<["low", "medium", "high", "critical"]>>;
|
|
1865
1871
|
}, "strip", z.ZodTypeAny, {
|
|
1866
|
-
|
|
1867
|
-
page
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
observationType?: string | undefined;
|
|
1872
|
+
'page[number]'?: number | undefined;
|
|
1873
|
+
'page[size]'?: number | undefined;
|
|
1874
|
+
'filter[startDate]'?: string | undefined;
|
|
1875
|
+
'filter[endDate]'?: string | undefined;
|
|
1876
|
+
'filter[status]'?: "pending" | "completed" | "failed" | "processing" | undefined;
|
|
1877
|
+
'filter[crop]'?: string | undefined;
|
|
1878
|
+
'filter[fieldId]'?: string | undefined;
|
|
1879
|
+
'filter[observationType]'?: string | undefined;
|
|
1880
|
+
'filter[severity]'?: "critical" | "low" | "medium" | "high" | undefined;
|
|
1874
1881
|
}, {
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1882
|
+
'page[number]'?: number | undefined;
|
|
1883
|
+
'page[size]'?: number | undefined;
|
|
1884
|
+
'filter[startDate]'?: string | undefined;
|
|
1885
|
+
'filter[endDate]'?: string | undefined;
|
|
1886
|
+
'filter[status]'?: "pending" | "completed" | "failed" | "processing" | undefined;
|
|
1887
|
+
'filter[crop]'?: string | undefined;
|
|
1888
|
+
'filter[fieldId]'?: string | undefined;
|
|
1889
|
+
'filter[observationType]'?: string | undefined;
|
|
1890
|
+
'filter[severity]'?: "critical" | "low" | "medium" | "high" | undefined;
|
|
1883
1891
|
}>;
|
|
1884
1892
|
summary: "List all observations across all farm fields";
|
|
1885
1893
|
method: "GET";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-observations.routes.d.ts","sourceRoot":"","sources":["../../src/routes/field-observations.routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,uBAAuB
|
|
1
|
+
{"version":3,"file":"field-observations.routes.d.ts","sourceRoot":"","sources":["../../src/routes/field-observations.routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoHlC,CAAC"}
|