gm-mcp 1.3.7 → 1.3.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.
- package/dist/index.js +126 -90
- package/package.json +1 -1
- package/src/index.ts +127 -129
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@ exports.server = void 0;
|
|
|
17
17
|
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
18
18
|
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
19
19
|
const tools_1 = require("./tools");
|
|
20
|
-
const
|
|
20
|
+
const v4_1 = __importDefault(require("zod/v4"));
|
|
21
21
|
const env_1 = require("./env");
|
|
22
22
|
const lark_tool_1 = require("./tools/lark-tool");
|
|
23
23
|
const product_type_1 = require("./services/constants/product-type");
|
|
@@ -39,56 +39,65 @@ exports.server.tool("statistic_salary_x3_this_week", "Get statistic salary x3 th
|
|
|
39
39
|
return (0, tools_1.statisticX3WeekTool)({ sendMessageToLark: (0, env_1.getEnv)().SEND_MESSAGE_TO_LARK === "true" });
|
|
40
40
|
}));
|
|
41
41
|
exports.server.tool("statistic_salary_x3_month", `Get statistic salary x3 with month`, {
|
|
42
|
-
month:
|
|
42
|
+
month: v4_1.default.string().describe("Month to statistic, month must be represented with format MM/yyyy"),
|
|
43
43
|
}, (args) => __awaiter(void 0, void 0, void 0, function* () {
|
|
44
44
|
return (0, tools_1.statisticX3MonthTool)({ sendMessageToLark: (0, env_1.getEnv)().SEND_MESSAGE_TO_LARK === "true", month: args.month });
|
|
45
45
|
}));
|
|
46
46
|
exports.server.tool("statistic_salary_x3_this_month", `Get statistic salary x3 this month`, {}, (args) => __awaiter(void 0, void 0, void 0, function* () {
|
|
47
47
|
return (0, tools_1.statisticX3ThisMonthTool)({ sendMessageToLark: (0, env_1.getEnv)().SEND_MESSAGE_TO_LARK === "true" });
|
|
48
48
|
}));
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
49
|
+
// server.tool(
|
|
50
|
+
// "statistic_salary_x3",
|
|
51
|
+
// "Get statistic salary x3 with specific date,date must be formated in dd/mm/yyy or dd-mm-yyyy",
|
|
52
|
+
// {
|
|
53
|
+
// date: z.string({
|
|
54
|
+
// description: "Date to statistic with format dd/mm/yyy or dd-mm-yyyy",
|
|
55
|
+
// }),
|
|
56
|
+
// },
|
|
57
|
+
// async (args) => {
|
|
58
|
+
// return statisticX3Tool({
|
|
59
|
+
// date: args.date,
|
|
60
|
+
// sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true",
|
|
61
|
+
// });
|
|
62
|
+
// }
|
|
63
|
+
// );
|
|
64
|
+
// server.tool(
|
|
65
|
+
// "statistic_salary_x3_in_range",
|
|
66
|
+
// "Get statistic salary x3 with range of date,date must be formated in dd/mm/yyy or dd-mm-yyyy",
|
|
67
|
+
// {
|
|
68
|
+
// start_date: z.string({
|
|
69
|
+
// description: "Start date to statistic with format dd/mm/yyy or dd-mm-yyyy",
|
|
70
|
+
// }),
|
|
71
|
+
// end_date: z.string({
|
|
72
|
+
// description: "End date to statistic with format dd/mm/yyy or dd-mm-yyyy",
|
|
73
|
+
// }),
|
|
74
|
+
// },
|
|
75
|
+
// async (args) => {
|
|
76
|
+
// return statisticX3RangeTool({
|
|
77
|
+
// startDateStr: args.start_date,
|
|
78
|
+
// endDateStr: args.end_date,
|
|
79
|
+
// sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true",
|
|
80
|
+
// });
|
|
81
|
+
// }
|
|
82
|
+
// );
|
|
73
83
|
exports.server.registerTool("debt_collection", {
|
|
74
84
|
description: `
|
|
75
85
|
The company's debt collection, follow by these criteria:
|
|
76
86
|
- compnany name
|
|
77
87
|
- year (optional), if it is not provided use default value
|
|
78
88
|
- product (optional), if it is not provided use default value
|
|
89
|
+
with optional criteria try to use default value, don't ask again
|
|
79
90
|
`,
|
|
80
|
-
inputSchema:
|
|
81
|
-
company_name:
|
|
82
|
-
year:
|
|
83
|
-
.string(
|
|
84
|
-
|
|
85
|
-
})
|
|
91
|
+
inputSchema: v4_1.default.object({
|
|
92
|
+
company_name: v4_1.default.string().describe("Company name to get data"),
|
|
93
|
+
year: v4_1.default
|
|
94
|
+
.string()
|
|
95
|
+
.describe("Year to get company debt collection,if year is not provided use this year (vietname time zone)")
|
|
86
96
|
.default("2025")
|
|
87
97
|
.optional(),
|
|
88
|
-
product_type:
|
|
89
|
-
.string(
|
|
90
|
-
|
|
91
|
-
})
|
|
98
|
+
product_type: v4_1.default
|
|
99
|
+
.string()
|
|
100
|
+
.describe("Product type to get data one of follow values EWA 02 - 03 | EWA 04 | Lương X3 | Lương X3 - EVF ")
|
|
92
101
|
.default(product_type_1.PRODUCT_TYPE.EWA_02_03)
|
|
93
102
|
.optional(),
|
|
94
103
|
}),
|
|
@@ -100,60 +109,87 @@ exports.server.registerTool("debt_collection", {
|
|
|
100
109
|
productType: product_type,
|
|
101
110
|
});
|
|
102
111
|
}));
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
},
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
})
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
112
|
+
// server.tool(
|
|
113
|
+
// "debt_collection_with_month",
|
|
114
|
+
// "The company's debt collection information with month",
|
|
115
|
+
// {
|
|
116
|
+
// month: z
|
|
117
|
+
// .string()
|
|
118
|
+
// .describe(
|
|
119
|
+
// "Month to get data,if year is not provided, please use current year (in Vietnam timezone) instead of, month is represented with format MM/yyyy"
|
|
120
|
+
// ),
|
|
121
|
+
// company_name: z.string({ description: "Company name to get data" }),
|
|
122
|
+
// },
|
|
123
|
+
// async (args) => {
|
|
124
|
+
// const { month, company_name } = args;
|
|
125
|
+
// return debtCollectionRateTool({
|
|
126
|
+
// sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true",
|
|
127
|
+
// monthDate: month,
|
|
128
|
+
// companyName: company_name,
|
|
129
|
+
// productType: PRODUCT_TYPE.EWA_02_03,
|
|
130
|
+
// });
|
|
131
|
+
// }
|
|
132
|
+
// );
|
|
133
|
+
// server.tool(
|
|
134
|
+
// "debt_collection_ewa_02",
|
|
135
|
+
// "The company's debt collection information with EWA 02 - 03 product type",
|
|
136
|
+
// {
|
|
137
|
+
// company_name: z.string({ description: "Company name to get data" }),
|
|
138
|
+
// },
|
|
139
|
+
// async (args) => {
|
|
140
|
+
// const { company_name } = args;
|
|
141
|
+
// return debtCollectionRateTool({
|
|
142
|
+
// sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true",
|
|
143
|
+
// companyName: company_name,
|
|
144
|
+
// productType: PRODUCT_TYPE.EWA_02_03,
|
|
145
|
+
// });
|
|
146
|
+
// }
|
|
147
|
+
// );
|
|
148
|
+
// server.tool(
|
|
149
|
+
// "debt_collection_ewa_04",
|
|
150
|
+
// "The company's debt collection information with EWA 04 product type",
|
|
151
|
+
// {
|
|
152
|
+
// company_name: z.string({ description: "Company name to get data" }),
|
|
153
|
+
// },
|
|
154
|
+
// async (args) => {
|
|
155
|
+
// const { company_name } = args;
|
|
156
|
+
// return debtCollectionRateTool({
|
|
157
|
+
// sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true",
|
|
158
|
+
// companyName: company_name,
|
|
159
|
+
// productType: PRODUCT_TYPE.EWA_04,
|
|
160
|
+
// });
|
|
161
|
+
// }
|
|
162
|
+
// );
|
|
163
|
+
// server.tool(
|
|
164
|
+
// "debt_collection_x3",
|
|
165
|
+
// "The company's debt collection information with Lương X3 product type",
|
|
166
|
+
// {
|
|
167
|
+
// company_name: z.string({ description: "Company name to get data" }),
|
|
168
|
+
// },
|
|
169
|
+
// async (args) => {
|
|
170
|
+
// const { company_name } = args;
|
|
171
|
+
// return debtCollectionRateTool({
|
|
172
|
+
// sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true",
|
|
173
|
+
// companyName: company_name,
|
|
174
|
+
// productType: PRODUCT_TYPE.X3,
|
|
175
|
+
// });
|
|
176
|
+
// }
|
|
177
|
+
// );
|
|
178
|
+
// server.tool(
|
|
179
|
+
// "debt_collection_x3_evf",
|
|
180
|
+
// "The company's debt collection information with Lương X3 - EVF product type",
|
|
181
|
+
// {
|
|
182
|
+
// company_name: z.string({ description: "Company name to get data" }),
|
|
183
|
+
// },
|
|
184
|
+
// async (args) => {
|
|
185
|
+
// const { company_name } = args;
|
|
186
|
+
// return debtCollectionRateTool({
|
|
187
|
+
// sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true",
|
|
188
|
+
// companyName: company_name,
|
|
189
|
+
// productType: PRODUCT_TYPE.X3_EVF,
|
|
190
|
+
// });
|
|
191
|
+
// }
|
|
192
|
+
// );
|
|
157
193
|
function bootstap() {
|
|
158
194
|
(0, env_1.ensureEnvVariables)();
|
|
159
195
|
const transport = new stdio_js_1.StdioServerTransport();
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
statisticX3WeekTool,
|
|
11
11
|
statisticX3YesterdayTool,
|
|
12
12
|
} from "./tools";
|
|
13
|
-
import z from "zod";
|
|
13
|
+
import z from "zod/v4";
|
|
14
14
|
import { ensureEnvVariables, getEnv } from "./env";
|
|
15
15
|
import { debtCollectionRateTool } from "./tools/lark-tool";
|
|
16
16
|
import { PRODUCT_TYPE } from "./services/constants/product-type";
|
|
@@ -54,41 +54,41 @@ server.tool("statistic_salary_x3_this_month", `Get statistic salary x3 this mont
|
|
|
54
54
|
return statisticX3ThisMonthTool({ sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true" });
|
|
55
55
|
});
|
|
56
56
|
|
|
57
|
-
server.tool(
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
server.tool(
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
);
|
|
57
|
+
// server.tool(
|
|
58
|
+
// "statistic_salary_x3",
|
|
59
|
+
// "Get statistic salary x3 with specific date,date must be formated in dd/mm/yyy or dd-mm-yyyy",
|
|
60
|
+
// {
|
|
61
|
+
// date: z.string({
|
|
62
|
+
// description: "Date to statistic with format dd/mm/yyy or dd-mm-yyyy",
|
|
63
|
+
// }),
|
|
64
|
+
// },
|
|
65
|
+
// async (args) => {
|
|
66
|
+
// return statisticX3Tool({
|
|
67
|
+
// date: args.date,
|
|
68
|
+
// sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true",
|
|
69
|
+
// });
|
|
70
|
+
// }
|
|
71
|
+
// );
|
|
72
|
+
|
|
73
|
+
// server.tool(
|
|
74
|
+
// "statistic_salary_x3_in_range",
|
|
75
|
+
// "Get statistic salary x3 with range of date,date must be formated in dd/mm/yyy or dd-mm-yyyy",
|
|
76
|
+
// {
|
|
77
|
+
// start_date: z.string({
|
|
78
|
+
// description: "Start date to statistic with format dd/mm/yyy or dd-mm-yyyy",
|
|
79
|
+
// }),
|
|
80
|
+
// end_date: z.string({
|
|
81
|
+
// description: "End date to statistic with format dd/mm/yyy or dd-mm-yyyy",
|
|
82
|
+
// }),
|
|
83
|
+
// },
|
|
84
|
+
// async (args) => {
|
|
85
|
+
// return statisticX3RangeTool({
|
|
86
|
+
// startDateStr: args.start_date,
|
|
87
|
+
// endDateStr: args.end_date,
|
|
88
|
+
// sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true",
|
|
89
|
+
// });
|
|
90
|
+
// }
|
|
91
|
+
// );
|
|
92
92
|
|
|
93
93
|
server.registerTool(
|
|
94
94
|
"debt_collection",
|
|
@@ -98,20 +98,18 @@ server.registerTool(
|
|
|
98
98
|
- compnany name
|
|
99
99
|
- year (optional), if it is not provided use default value
|
|
100
100
|
- product (optional), if it is not provided use default value
|
|
101
|
+
with optional criteria try to use default value, don't ask again
|
|
101
102
|
`,
|
|
102
103
|
inputSchema: z.object({
|
|
103
|
-
company_name: z.string(
|
|
104
|
+
company_name: z.string().describe("Company name to get data"),
|
|
104
105
|
year: z
|
|
105
|
-
.string(
|
|
106
|
-
|
|
107
|
-
})
|
|
106
|
+
.string()
|
|
107
|
+
.describe("Year to get company debt collection,if year is not provided use this year (vietname time zone)")
|
|
108
108
|
.default("2025")
|
|
109
109
|
.optional(),
|
|
110
110
|
product_type: z
|
|
111
|
-
.string(
|
|
112
|
-
|
|
113
|
-
"Product type to get data one of follow values EWA 02 - 03 | EWA 04 | Lương X3 | Lương X3 - EVF ",
|
|
114
|
-
})
|
|
111
|
+
.string()
|
|
112
|
+
.describe("Product type to get data one of follow values EWA 02 - 03 | EWA 04 | Lương X3 | Lương X3 - EVF ")
|
|
115
113
|
.default(PRODUCT_TYPE.EWA_02_03)
|
|
116
114
|
.optional(),
|
|
117
115
|
}),
|
|
@@ -126,91 +124,91 @@ server.registerTool(
|
|
|
126
124
|
}
|
|
127
125
|
);
|
|
128
126
|
|
|
129
|
-
server.tool(
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
);
|
|
150
|
-
|
|
151
|
-
server.tool(
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
);
|
|
166
|
-
|
|
167
|
-
server.tool(
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
);
|
|
182
|
-
|
|
183
|
-
server.tool(
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
);
|
|
198
|
-
|
|
199
|
-
server.tool(
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
);
|
|
127
|
+
// server.tool(
|
|
128
|
+
// "debt_collection_with_month",
|
|
129
|
+
// "The company's debt collection information with month",
|
|
130
|
+
// {
|
|
131
|
+
// month: z
|
|
132
|
+
// .string()
|
|
133
|
+
// .describe(
|
|
134
|
+
// "Month to get data,if year is not provided, please use current year (in Vietnam timezone) instead of, month is represented with format MM/yyyy"
|
|
135
|
+
// ),
|
|
136
|
+
// company_name: z.string({ description: "Company name to get data" }),
|
|
137
|
+
// },
|
|
138
|
+
// async (args) => {
|
|
139
|
+
// const { month, company_name } = args;
|
|
140
|
+
// return debtCollectionRateTool({
|
|
141
|
+
// sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true",
|
|
142
|
+
// monthDate: month,
|
|
143
|
+
// companyName: company_name,
|
|
144
|
+
// productType: PRODUCT_TYPE.EWA_02_03,
|
|
145
|
+
// });
|
|
146
|
+
// }
|
|
147
|
+
// );
|
|
148
|
+
|
|
149
|
+
// server.tool(
|
|
150
|
+
// "debt_collection_ewa_02",
|
|
151
|
+
// "The company's debt collection information with EWA 02 - 03 product type",
|
|
152
|
+
// {
|
|
153
|
+
// company_name: z.string({ description: "Company name to get data" }),
|
|
154
|
+
// },
|
|
155
|
+
// async (args) => {
|
|
156
|
+
// const { company_name } = args;
|
|
157
|
+
// return debtCollectionRateTool({
|
|
158
|
+
// sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true",
|
|
159
|
+
// companyName: company_name,
|
|
160
|
+
// productType: PRODUCT_TYPE.EWA_02_03,
|
|
161
|
+
// });
|
|
162
|
+
// }
|
|
163
|
+
// );
|
|
164
|
+
|
|
165
|
+
// server.tool(
|
|
166
|
+
// "debt_collection_ewa_04",
|
|
167
|
+
// "The company's debt collection information with EWA 04 product type",
|
|
168
|
+
// {
|
|
169
|
+
// company_name: z.string({ description: "Company name to get data" }),
|
|
170
|
+
// },
|
|
171
|
+
// async (args) => {
|
|
172
|
+
// const { company_name } = args;
|
|
173
|
+
// return debtCollectionRateTool({
|
|
174
|
+
// sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true",
|
|
175
|
+
// companyName: company_name,
|
|
176
|
+
// productType: PRODUCT_TYPE.EWA_04,
|
|
177
|
+
// });
|
|
178
|
+
// }
|
|
179
|
+
// );
|
|
180
|
+
|
|
181
|
+
// server.tool(
|
|
182
|
+
// "debt_collection_x3",
|
|
183
|
+
// "The company's debt collection information with Lương X3 product type",
|
|
184
|
+
// {
|
|
185
|
+
// company_name: z.string({ description: "Company name to get data" }),
|
|
186
|
+
// },
|
|
187
|
+
// async (args) => {
|
|
188
|
+
// const { company_name } = args;
|
|
189
|
+
// return debtCollectionRateTool({
|
|
190
|
+
// sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true",
|
|
191
|
+
// companyName: company_name,
|
|
192
|
+
// productType: PRODUCT_TYPE.X3,
|
|
193
|
+
// });
|
|
194
|
+
// }
|
|
195
|
+
// );
|
|
196
|
+
|
|
197
|
+
// server.tool(
|
|
198
|
+
// "debt_collection_x3_evf",
|
|
199
|
+
// "The company's debt collection information with Lương X3 - EVF product type",
|
|
200
|
+
// {
|
|
201
|
+
// company_name: z.string({ description: "Company name to get data" }),
|
|
202
|
+
// },
|
|
203
|
+
// async (args) => {
|
|
204
|
+
// const { company_name } = args;
|
|
205
|
+
// return debtCollectionRateTool({
|
|
206
|
+
// sendMessageToLark: getEnv().SEND_MESSAGE_TO_LARK === "true",
|
|
207
|
+
// companyName: company_name,
|
|
208
|
+
// productType: PRODUCT_TYPE.X3_EVF,
|
|
209
|
+
// });
|
|
210
|
+
// }
|
|
211
|
+
// );
|
|
214
212
|
|
|
215
213
|
function bootstap() {
|
|
216
214
|
ensureEnvVariables();
|